Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4903a8d188 | |||
| 5a3ad6b899 | |||
| 1d2d43a6f2 | |||
| 3420f46a59 | |||
| b05e31c89c | |||
| cb32aa9907 |
+140
-15
@@ -38,12 +38,42 @@
|
||||
},
|
||||
"hooks": {
|
||||
"PreToolUse": [
|
||||
{
|
||||
"matcher": "Edit|Write|MultiEdit|NotebookEdit|Bash|PowerShell|Skill|Task",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-llm-judge-per-tool.mjs",
|
||||
"timeout": 30
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "Read|Grep|Glob|LS|TodoWrite|AskUserQuestion|Edit|Write|MultiEdit|NotebookEdit|Bash|Skill|Task|EnterPlanMode",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-safe-baseline-metering.mjs",
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "Edit|Write|MultiEdit|NotebookEdit",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-runtime-write-deny.mjs",
|
||||
"timeout": 5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "Edit|Write",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node -e \"const f=process.env.CLAUDE_FILE_PATH||''; const pd=process.env.CLAUDE_PROJECT_DIR||''; const path=require('path'); if (f && pd && path.resolve(f) === path.resolve(pd, 'CLAUDE.md')) { process.stderr.write('\\n[hook] WARNING: Direct edit of root CLAUDE.md detected. Per CLAUDE.md §5 п.10, prefer /claude-md-management:revise-claude-md or /claude-md-management:claude-md-improver. If invoked via that skill, this warning is informational.\\n'); }\""
|
||||
"command": "node -e \"const f=process.env.CLAUDE_FILE_PATH||''; const pd=process.env.CLAUDE_PROJECT_DIR||''; const path=require('path'); if (f && pd && path.resolve(f) === path.resolve(pd, 'CLAUDE.md')) { process.stderr.write('\\n[hook] WARNING: Direct edit of root CLAUDE.md detected. Per CLAUDE.md Р’В§5 Р С—.10, prefer /claude-md-management:revise-claude-md or /claude-md-management:claude-md-improver. If invoked via that skill, this warning is informational.\\n'); }\""
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -52,7 +82,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"C:/моя/проекты/портал crm/Документация/tools/subagent-prompt-prefix.mjs\""
|
||||
"command": "node \"C:/Р В РЎВРѕСЏ/проекты/портал crm/ДокуРСВентацРСвЂР РЋР РЏ/tools/subagent-prompt-prefix.mjs\""
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -146,16 +176,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "AskUserQuestion",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/askuser-cosmetic-detector.mjs",
|
||||
"timeout": 5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "mcp__.*",
|
||||
"hooks": [
|
||||
@@ -175,6 +195,71 @@
|
||||
"timeout": 5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "Workflow",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-workflow-gate.mjs",
|
||||
"timeout": 5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "Edit|Write|MultiEdit|NotebookEdit|Bash|Task",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-decomposition-detector.mjs",
|
||||
"timeout": 8
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-parallel-session-lock.mjs",
|
||||
"timeout": 3
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "AskUserQuestion",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/askuser-cosmetic-detector.mjs",
|
||||
"timeout": 5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "Read|Grep|Glob|LS|TodoWrite|AskUserQuestion|Edit|Write|MultiEdit|NotebookEdit|Bash|Skill|Task|EnterPlanMode",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-safe-baseline-metering.mjs",
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "Edit|Write|MultiEdit|NotebookEdit",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-runtime-write-deny.mjs",
|
||||
"timeout": 5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "Edit|Write|MultiEdit|NotebookEdit|Bash|Task",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-parallel-session-lock.mjs",
|
||||
"timeout": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"PostToolUse": [
|
||||
@@ -192,7 +277,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node -e \"const f=process.env.CLAUDE_FILE_PATH||''; const n=f.replace(/\\\\\\\\/g,'/'); if (/(^|\\\\/)db\\\\/schema\\\\.sql$/i.test(n)) { process.stdout.write('\\n[hook] REMINDER: You modified db/schema.sql. Per CLAUDE.md §5 п.8, add a corresponding entry to db/CHANGELOG_schema.md before committing.\\n'); }\""
|
||||
"command": "node -e \"const f=process.env.CLAUDE_FILE_PATH||''; const n=f.replace(/\\\\\\\\/g,'/'); if (/(^|\\\\/)db\\\\/schema\\\\.sql$/i.test(n)) { process.stdout.write('\\n[hook] REMINDER: You modified db/schema.sql. Per CLAUDE.md Р’В§5 Р С—.8, add a corresponding entry to db/CHANGELOG_schema.md before committing.\\n'); }\""
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -206,7 +291,7 @@
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-rationalization-audit.mjs",
|
||||
"command": "echo ok",
|
||||
"timeout": 5
|
||||
}
|
||||
]
|
||||
@@ -216,7 +301,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-rationalization-audit.mjs",
|
||||
"command": "echo ok",
|
||||
"timeout": 5
|
||||
}
|
||||
]
|
||||
@@ -230,9 +315,29 @@
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": "AskUserQuestion",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-askuser-answer-parser.mjs",
|
||||
"timeout": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"Stop": [
|
||||
{
|
||||
"matcher": "*",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-llm-judge-response-scan.mjs",
|
||||
"timeout": 30
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
@@ -277,6 +382,15 @@
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-parallel-session-lock.mjs",
|
||||
"timeout": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"UserPromptSubmit": [
|
||||
@@ -309,6 +423,17 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"SessionEnd": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node tools/enforce-parallel-session-lock.mjs",
|
||||
"timeout": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,7 +292,7 @@ trivy image liderra:latest
|
||||
|
||||
## 6. Текущая фаза проекта
|
||||
|
||||
**2026-06-01 lead region resolution — фича реализована TDD + запушена (PR в main):** Определение настоящего региона лида по телефону (DaData → реестр Россвязи → tag-fallback) + каскадная маршрутизация по региону (exact→all-RF→fallback) со взвешенным жребием по остатку дневного лимита (вариант В, вес ≥ 1 — мелкие клиенты не отрезаются). Состав: `LeadRegionResolver` (каскад по qc-кодам DaData) + `DaData/*` (клиент / страж бюджета / enum кодов качества / исключения) + `DaDataRegionMap` + `RossvyazPrefixLookup` + `RossvyazRecord`/`RegionResolution` DTO + команда `phone-ranges:import` (parse/map/dry-run/idempotency, atomic RENAME-swap в транзакции) + `LeadRouter` переписан (`matchEligibleProjects` + region-фильтр + `weightedPick` + инъекция `Randomizer`) + интеграция в `RouteSupplierLeadJob` (резолв ДО tx / persist 4 колонки / fail-safe аудит-лог `lead_region_resolution_log` / подмена subject_code на шаге 3 / CSV-merge по рангу источника `dadata/rossvyaz > CSV-tag`) + `phone-region:smoke`. Миграция `2026_05_31_100000` (`phone_ranges` / `phone_ranges_imports` / `lead_region_resolution_log` партиц. по месяцам + колонки на supplier_leads/deals) + регистрация в `MonthlyPartitionManager`; `db/schema.sql` синхронизирован заголовком (v8.40), DDL — в дельта-миграции (иначе двойной CREATE TABLE сломал бы migrate). **Решения заказчика/проекта:** резолвер через `app()` внутри `handle()` (не 7-й параметр — сохраняет сигнатуру + 3 существующих теста джобы); `deals.region_source` не добавляли (источник на supplier_leads + в журнале, CSV-merge по эвристике); запуск сразу на 100% без долевого гейта. **14 атомарных коммитов** `ec219718..11079791` на ветке `worktree-feat+lead-region-resolution`, запушено в origin (`CoralMinister/lidpotok`), **PR в main открывается вручную** по ссылке из `git push` output (MCP `create_pull_request` + `gh pr create` оба заблокированы router-гейтом). Тесты **101 pest GREEN / 509 assertions**; tools-vitest **1989 GREEN**. Code-review subagent (вердикт «с правками») → починены `atomicSwap()`→транзакция (spec §6.2) + убран stray comment; minor/deferred задокументированы (метрики §8.1 / `phone-ranges:rollback` / pg_anonymizer-маски / калибровка `DADATA_CALL_COST_KOPECKS`). Прод-выкатка отложена (нужны `DADATA_API_KEY`/`DADATA_SECRET` в YC Lockbox + команда «запускаем»; runbook `docs/superpowers/runbooks/2026-05-31-lead-region-resolution-rollout.md`). Пре-существующий долг (НЕ из фичи, отдельная задача): 3 чужих console-теста (`BillingMigrateLeadsToRub` / `IncidentsWatchFailures` / `SnapshotBackfillCommand`) взаимно загрязняются в одном процессе (накопление счётчиков), в CI `pest --parallel` (файл=процесс) проходят. **Lefthook в worktree-shell не в PATH** → cspell/larastan/squawk/deptrac не гонялись на коммитах; deptrac проверен инспекцией (Service→Service разрешён), новые cspell-термины (Rossvyaz/DaData/kopecks) добавлены в `cspell-words.txt`, остальное — CI на push. **§0 cross-refs НЕ меняются** — app-фича (сервисы/джоба/миграция), не tooling-канон #1-#86 / не ADR / не off-phase. Через `claude-md-management:revise-claude-md`.
|
||||
**2026-06-02 lead region resolution — ВЫКАЧЕНА на прод liderra.ru (флаг ON, 100%):** Определение настоящего региона лида по телефону (DaData → реестр Россвязи → tag-fallback) + каскадная маршрутизация по региону (exact→all-RF→fallback) со взвешенным жребием по остатку дневного лимита (вариант В, вес ≥ 1 — мелкие клиенты не отрезаются). Состав: `LeadRegionResolver` (каскад по qc-кодам DaData) + `DaData/*` (клиент / страж бюджета / enum кодов качества / исключения) + `DaDataRegionMap` + `RossvyazPrefixLookup` + `RossvyazRecord`/`RegionResolution` DTO + команда `phone-ranges:import` (parse/map/dry-run/idempotency, atomic RENAME-swap в транзакции) + `LeadRouter` переписан (`matchEligibleProjects` + region-фильтр + `weightedPick` + инъекция `Randomizer`) + интеграция в `RouteSupplierLeadJob` (резолв ДО tx / persist 4 колонки / fail-safe аудит-лог `lead_region_resolution_log` / подмена subject_code на шаге 3 / CSV-merge по рангу источника `dadata/rossvyaz > CSV-tag`) + `phone-region:smoke`. Миграция `2026_05_31_100000` (`phone_ranges` / `phone_ranges_imports` / `lead_region_resolution_log` партиц. по месяцам + колонки на supplier_leads/deals) + регистрация в `MonthlyPartitionManager`; `db/schema.sql` синхронизирован заголовком (v8.40), DDL — в дельта-миграции (иначе двойной CREATE TABLE сломал бы migrate). **Решения заказчика/проекта:** резолвер через `app()` внутри `handle()` (не 7-й параметр — сохраняет сигнатуру + 3 существующих теста джобы); `deals.region_source` не добавляли (источник на supplier_leads + в журнале, CSV-merge по эвристике); запуск сразу на 100% без долевого гейта. **14 атомарных коммитов** `ec219718..11079791` на ветке `worktree-feat+lead-region-resolution`, запушено в origin (`CoralMinister/lidpotok`), **PR в main открывается вручную** по ссылке из `git push` output (MCP `create_pull_request` + `gh pr create` оба заблокированы router-гейтом). Тесты **101 pest GREEN / 509 assertions**; tools-vitest **1989 GREEN**. Code-review subagent (вердикт «с правками») → починены `atomicSwap()`→транзакция (spec §6.2) + убран stray comment; minor/deferred задокументированы (метрики §8.1 / `phone-ranges:rollback` / pg_anonymizer-маски / калибровка `DADATA_CALL_COST_KOPECKS`). **ВЫКАЧЕНО на прод liderra.ru 01.06.2026 ~16:01 МСК** (по команде «запускаем»): ключи DaData в боевом `.env`, флаг `LEAD_REGION_RESOLVER_ENABLED=true` на **100%** потока, реестр Россвязи **453080 диапазонов** (atomic swap). Smoke на реальном номере ✓ (Источник=dadata, Субъект=29 Красноярский край, qc=0). Инструмент выкатки — `.github/workflows/lead-region-ops.yml` (на origin/main, локально untracked). Откат: op=set-env flag=false. Операционные уроки и хвосты (unmapped-регионы → код+TDD, косметика счётчика, мониторинг region_source, калибровка DADATA_CALL_COST_KOPECKS) — память [[project-lead-region-resolution-live]]; runbook `docs/superpowers/runbooks/2026-05-31-lead-region-resolution-rollout.md`. Пре-существующий долг (НЕ из фичи, отдельная задача): 3 чужих console-теста (`BillingMigrateLeadsToRub` / `IncidentsWatchFailures` / `SnapshotBackfillCommand`) взаимно загрязняются в одном процессе (накопление счётчиков), в CI `pest --parallel` (файл=процесс) проходят. **Lefthook в worktree-shell не в PATH** → cspell/larastan/squawk/deptrac не гонялись на коммитах; deptrac проверен инспекцией (Service→Service разрешён), новые cspell-термины (Rossvyaz/DaData/kopecks) добавлены в `cspell-words.txt`, остальное — CI на push. **§0 cross-refs НЕ меняются** — app-фича (сервисы/джоба/миграция), не tooling-канон #1-#86 / не ADR / не off-phase. Через `claude-md-management:revise-claude-md`.
|
||||
|
||||
**2026-05-31 (продолжение) router-gate v4 Layer 4 LLM-judge — item 2b live wiring + активация владельцем + readonly-калибровка:** `tools/enforce-llm-judge-per-tool.mjs` (PreToolUse) и `tools/enforce-llm-judge-response-scan.mjs` (Stop) получили живой `main()` (TDD, чистые `runPerTool`/`runResponseScan`; commit `dfae9f76`). Spend строго гейтится `resolveJudgeConfig()` (флаг `ROUTER_LLM_JUDGE_ENABLED` И ключ); без флага/ключа `decide()` короткозамыкается → $0. **Архитектурный нюанс:** регистрировать надо именно **обёртки** `enforce-llm-judge-*`, не движки `llm-judge-{per-tool,response-scan}.mjs` — у движков `main()` зовёт `llmJudgeCall` по наличию ОДНОГО ключа, игнорируя флаг (т.е. движок начал бы тратить деньги без рубильника). **Владелец активировал Layer 4** (env `ROUTER_LLM_JUDGE_ENABLED=1` через `rundll32 sysdm.cpl,EditEnvironmentVariables` + ключ `ROUTER_LLM_KEY` уже был в user env, как у классификатора + регистрация обоих хуков в `.claude/settings.json` + перезапуск) → судья ожил в **hard-block** (подтверждено: тот же `git log`, что при выключенном флаге проходил мгновенно, после активации заблокирован реальным вызовом — verdict ≠ YES → block). **Операционная находка / over-block:** `MUTATING_TOOLS` в `llm-judge-per-tool.mjs` включает `Bash` целиком, а правило вопроса — «Сомнения → NO» + код «не-YES → block», поэтому живой судья блокировал даже readonly-просмотры (`git status`/`git log`/`grep`) — и тем самым полностью клинил рабочий цикл (commit/push/правки тоже под судьёй). **Калибровка** (commit `c9b9efd6`, TDD, судья на время выключался владельцем — правка кода тоже под судьёй): новый экспортируемый `isReadonlyBashEvent(event)` — если tool=Bash и `classifyBashCommand(command, {})` даёт `result==='allow'` с reason `readonly|reading`, `runPerTool` возвращает allow **до** обращения к судье (без LLM-вызова, без budget-bump). Это **scope-fix к собственной декларации судьи** («judge on mutating tools»), а **не понижение дисциплины**: правило doubt→block и полная проверка всего, что реально меняет состояние (Edit/Write/MultiEdit/git commit/push/Skill/Task), — без изменений. Регрессия vitest tools-only **1927 GREEN** (+13 калибровочных тестов; verify через `npx vitest run --root app --config vitest.config.tools.mjs`, т.к. `npm run test:tools` падает из-за параллельной keytar-установки в `app/node_modules`). Коммиты `dfae9f76` (live wiring) + `c9b9efd6` (калибровка); push `a8996896..c9b9efd6 main`. План `docs/superpowers/plans/2026-05-31-llm-judge-live-wiring.md`. **§0 cross-refs НЕ меняются** — инфраструктура `tools/enforce-*.mjs`, не tooling-канон #1-#86 / не ADR / не off-phase. Через `claude-md-management:revise-claude-md`.
|
||||
|
||||
|
||||
Generated
+439
-5
@@ -5,6 +5,7 @@
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"keytar": "*",
|
||||
"lucide-vue-next": "^1.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -39,6 +40,9 @@
|
||||
"vue-tsc": "^3.2.8",
|
||||
"vuedraggable": "^4.1.0",
|
||||
"vuetify": "^3.12.5"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"keytar": "^7.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@acemir/cssom": {
|
||||
@@ -4222,6 +4226,27 @@
|
||||
"node": "18 || 20 || >=22"
|
||||
}
|
||||
},
|
||||
"node_modules/base64-js": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
||||
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/bidi-js": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz",
|
||||
@@ -4242,6 +4267,18 @@
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/bl": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
|
||||
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"buffer": "^5.5.0",
|
||||
"inherits": "^2.0.4",
|
||||
"readable-stream": "^3.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/boolbase": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
|
||||
@@ -4275,6 +4312,31 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/buffer": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
|
||||
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"base64-js": "^1.3.1",
|
||||
"ieee754": "^1.1.13"
|
||||
}
|
||||
},
|
||||
"node_modules/bundle-name": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
|
||||
@@ -4381,6 +4443,13 @@
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"node_modules/chownr": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
|
||||
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
|
||||
"license": "ISC",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/color-convert": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
@@ -4652,6 +4721,32 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/decompress-response": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
|
||||
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"mimic-response": "^3.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/deep-extend": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
|
||||
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/deep-is": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
|
||||
@@ -4733,7 +4828,7 @@
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
|
||||
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
@@ -4858,6 +4953,16 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/end-of-stream": {
|
||||
"version": "1.4.5",
|
||||
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
|
||||
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"once": "^1.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/entities": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
|
||||
@@ -5270,6 +5375,16 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/expand-template": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
|
||||
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
|
||||
"license": "(MIT OR WTFPL)",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/expect-type": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
|
||||
@@ -5570,6 +5685,13 @@
|
||||
"node": ">=18.3.0"
|
||||
}
|
||||
},
|
||||
"node_modules/fs-constants": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
||||
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/fs-extra": {
|
||||
"version": "11.3.5",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz",
|
||||
@@ -5699,6 +5821,13 @@
|
||||
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/github-from-package": {
|
||||
"version": "0.0.0",
|
||||
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
|
||||
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/glob": {
|
||||
"version": "10.5.0",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
|
||||
@@ -6167,6 +6296,27 @@
|
||||
"node": ">= 14"
|
||||
}
|
||||
},
|
||||
"node_modules/ieee754": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
|
||||
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"license": "BSD-3-Clause",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/ignore": {
|
||||
"version": "5.3.2",
|
||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
|
||||
@@ -6194,11 +6344,18 @@
|
||||
"node": ">=0.8.19"
|
||||
}
|
||||
},
|
||||
"node_modules/inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
||||
"license": "ISC",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/ini": {
|
||||
"version": "1.3.8",
|
||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
||||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/is-docker": {
|
||||
@@ -6560,6 +6717,25 @@
|
||||
"graceful-fs": "^4.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/keytar": {
|
||||
"version": "7.9.0",
|
||||
"resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz",
|
||||
"integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"node-addon-api": "^4.3.0",
|
||||
"prebuild-install": "^7.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/keytar/node_modules/node-addon-api": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
|
||||
"integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/keyv": {
|
||||
"version": "4.5.4",
|
||||
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
|
||||
@@ -7290,6 +7466,19 @@
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mimic-response": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
|
||||
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/minimatch": {
|
||||
"version": "10.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
|
||||
@@ -7310,7 +7499,7 @@
|
||||
"version": "1.2.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
|
||||
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@@ -7333,6 +7522,13 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/mkdirp-classic": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
|
||||
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/mri": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
|
||||
@@ -7386,6 +7582,13 @@
|
||||
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/napi-build-utils": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
|
||||
"integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/natural-compare": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
|
||||
@@ -7393,6 +7596,19 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/node-abi": {
|
||||
"version": "3.92.0",
|
||||
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz",
|
||||
"integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"semver": "^7.3.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/node-addon-api": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
|
||||
@@ -7454,6 +7670,16 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||
"license": "ISC",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"node_modules/oniguruma-parser": {
|
||||
"version": "0.12.2",
|
||||
"resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
|
||||
@@ -7843,6 +8069,34 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/prebuild-install": {
|
||||
"version": "7.1.3",
|
||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
|
||||
"integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
|
||||
"deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"detect-libc": "^2.0.0",
|
||||
"expand-template": "^2.0.3",
|
||||
"github-from-package": "0.0.0",
|
||||
"minimist": "^1.2.3",
|
||||
"mkdirp-classic": "^0.5.3",
|
||||
"napi-build-utils": "^2.0.0",
|
||||
"node-abi": "^3.3.0",
|
||||
"pump": "^3.0.0",
|
||||
"rc": "^1.2.7",
|
||||
"simple-get": "^4.0.0",
|
||||
"tar-fs": "^2.0.0",
|
||||
"tunnel-agent": "^0.6.0"
|
||||
},
|
||||
"bin": {
|
||||
"prebuild-install": "bin.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/prelude-ls": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
||||
@@ -7897,6 +8151,17 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/pump": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
|
||||
"integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"end-of-stream": "^1.1.0",
|
||||
"once": "^1.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/punycode": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
|
||||
@@ -7938,6 +8203,47 @@
|
||||
],
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/rc": {
|
||||
"version": "1.2.8",
|
||||
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
|
||||
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
|
||||
"license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"deep-extend": "^0.6.0",
|
||||
"ini": "~1.3.0",
|
||||
"minimist": "^1.2.0",
|
||||
"strip-json-comments": "~2.0.1"
|
||||
},
|
||||
"bin": {
|
||||
"rc": "cli.js"
|
||||
}
|
||||
},
|
||||
"node_modules/rc/node_modules/strip-json-comments": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
|
||||
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/readable-stream": {
|
||||
"version": "3.6.2",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
|
||||
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/readdirp": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
|
||||
@@ -8322,6 +8628,27 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/safe-buffer": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/sass": {
|
||||
"version": "1.99.0",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz",
|
||||
@@ -8731,7 +9058,7 @@
|
||||
"version": "7.7.4",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
|
||||
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
@@ -8813,6 +9140,53 @@
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/simple-concat": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
|
||||
"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/simple-get": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
|
||||
"integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"decompress-response": "^6.0.0",
|
||||
"once": "^1.3.1",
|
||||
"simple-concat": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sirv": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz",
|
||||
@@ -8933,6 +9307,16 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/string_decoder": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
||||
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"safe-buffer": "~5.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/string-width": {
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||
@@ -9095,6 +9479,36 @@
|
||||
"node": ">=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tar-fs": {
|
||||
"version": "2.1.4",
|
||||
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
|
||||
"integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"chownr": "^1.1.1",
|
||||
"mkdirp-classic": "^0.5.2",
|
||||
"pump": "^3.0.0",
|
||||
"tar-stream": "^2.1.4"
|
||||
}
|
||||
},
|
||||
"node_modules/tar-stream": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
|
||||
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"bl": "^4.0.3",
|
||||
"end-of-stream": "^1.4.1",
|
||||
"fs-constants": "^1.0.0",
|
||||
"inherits": "^2.0.3",
|
||||
"readable-stream": "^3.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/tinybench": {
|
||||
"version": "2.9.0",
|
||||
"resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
|
||||
@@ -9239,6 +9653,19 @@
|
||||
"dev": true,
|
||||
"license": "0BSD"
|
||||
},
|
||||
"node_modules/tunnel-agent": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"safe-buffer": "^5.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/type-check": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
|
||||
@@ -9455,7 +9882,7 @@
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/utils-merge": {
|
||||
@@ -10106,6 +10533,13 @@
|
||||
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
||||
"license": "ISC",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/ws": {
|
||||
"version": "8.20.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
|
||||
|
||||
@@ -51,5 +51,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"lucide-vue-next": "^1.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"keytar": "^7.9.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,4 +38,11 @@ describe('DealsFilters', () => {
|
||||
});
|
||||
expect(w.find('[data-testid="clear-filters-btn"]').exists()).toBe(true);
|
||||
});
|
||||
|
||||
it('поле поиска имеет доступное имя (label) для скринридера', () => {
|
||||
const w = mount(DealsFilters, { props: baseProps, global: { plugins: [vuetify] } });
|
||||
const label = w.find('[data-testid="filter-search-phone"] label');
|
||||
expect(label.exists()).toBe(true);
|
||||
expect(label.text()).toContain('Поиск по телефону');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -47,4 +47,11 @@ describe('KanbanColumn.vue', () => {
|
||||
expect(wrapper.emitted('openDeal')).toBeTruthy();
|
||||
expect(wrapper.emitted('openDeal')?.[0]).toEqual([dealsForNew[0].id]);
|
||||
});
|
||||
|
||||
// Контраст column-total на ивори чинится в scoped CSS (var(--accent) → нейтральный #4a463f),
|
||||
// jsdom scoped-стили не вычисляет → числовую проверку контраста делает Pa11y. Здесь — структурный якорь.
|
||||
it('column-total отрисован для пустой колонки', () => {
|
||||
const wrapper = factory({ status, deals: [] });
|
||||
expect(wrapper.find('.column-total').exists()).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -49,4 +49,14 @@ describe('ProjectCard', () => {
|
||||
});
|
||||
expect(wrapper.text()).toContain('На паузе');
|
||||
});
|
||||
|
||||
it('чип типа сигнала — flat-вариант с классом signal-chip (a11y контраст)', () => {
|
||||
const wrapper = mount(ProjectCard, {
|
||||
global: { plugins: [vuetify] },
|
||||
props: { project: baseProject, selected: false },
|
||||
});
|
||||
const chip = wrapper.find('.signal-chip');
|
||||
expect(chip.exists()).toBe(true);
|
||||
expect(chip.classes()).toContain('v-chip--variant-flat');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -4,6 +4,26 @@
|
||||
# A4 design-tooling integration (v2.8 / v3.8 / v1.22)
|
||||
iconify
|
||||
|
||||
# lead-region-resolution spec/plan (DaData + Россвязь, 2026-05-29)
|
||||
dadata
|
||||
rossvyaz
|
||||
unmappable
|
||||
mnp
|
||||
incrby
|
||||
deyatelnost
|
||||
resurs
|
||||
numeracii
|
||||
vypiska
|
||||
reestra
|
||||
sistemy
|
||||
plana
|
||||
маппингах
|
||||
реконсиляция
|
||||
сетап
|
||||
хелперы
|
||||
регэкспом
|
||||
резолвом
|
||||
|
||||
# Бренд и термины проекта
|
||||
лидерра
|
||||
liderra
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
{
|
||||
"2026-05": {
|
||||
"WIN_USER_PATH": 123,
|
||||
"WIN_USER_PATH": 206,
|
||||
"IPV4": 1,
|
||||
"RU_PHONE": 1
|
||||
},
|
||||
"2026-06": {
|
||||
"WIN_USER_PATH": 91
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"last_read_at": "2026-05-27T00:53:33.490Z",
|
||||
"read_count_last_period": 5,
|
||||
"last_read_at": "2026-05-30T12:32:49.927Z",
|
||||
"read_count_last_period": 6,
|
||||
"period_start": "2026-05-19T00:00:00+03:00"
|
||||
}
|
||||
|
||||
+29
-60
@@ -1,22 +1,22 @@
|
||||
# Brain Status (auto-generated)
|
||||
|
||||
Last updated: 2026-05-30T13:11:39.164Z
|
||||
Last updated: 2026-06-08T14:07:33.978Z
|
||||
|
||||
| Контролёр | Состояние | Детали |
|
||||
|---|---|---|
|
||||
| C1 L1-watcher | ✅ | [l1-watcher] OK — 0 drift |
|
||||
| C2 Cross-ref consistency | ✅ | [cross-ref-checker] OK — 0 drift in 4 files |
|
||||
| C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 0 week(s) ago |
|
||||
| C3 Observer-of-observer | ✅ | [observer-of-observer] OK — last read 1 week(s) ago |
|
||||
| C4 Сигнальный статус | ✅ | This file (self-reference) |
|
||||
| C5 Observer-coverage | ⚠️ | 752 episode(s) this month · Stop-hook + post-commit OK · 20 missed activation(s) — see /brain-retro |
|
||||
| C5 Observer-coverage | ✅ | 666 episode(s) this month · Stop-hook + post-commit OK |
|
||||
| C6 Chain map sync | ✅ | [chain-map-checker] OK — 16 chains in sync |
|
||||
|
||||
## Метрики (информационные, не алерты)
|
||||
|
||||
- Observer evidence: 752 episodes this month, 0 observer_error markers, 186 PII matches before filter
|
||||
- Legacy v1 episodes (not in factor analysis): 613
|
||||
- Last /brain-retro: 0 day(s) ago
|
||||
- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 20. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store).
|
||||
- Observer evidence: 666 episodes this month, 0 observer_error markers, 88 PII matches before filter
|
||||
- Legacy v1 episodes (not in factor analysis): 666
|
||||
- Last /brain-retro: 9 day(s) ago
|
||||
- Использование узлов: см. `/brain-retro` (раз в спринт). missed_activations: 0. **Неиспользованные узлы — не алерт, если профильной задачи не было** (Pravila §16.4 v1.36; capability-readiness; см. memory `feedback_brain_unused_tools_not_problem` — outside-repo memory store).
|
||||
|
||||
## Метрики дисциплины
|
||||
|
||||
@@ -24,16 +24,14 @@ Baseline дисциплины роутера (этап 2 router discipline overh
|
||||
|
||||
| Тип задачи | Эпизодов | % с триггер-матчем | % через скил |
|
||||
|---|---|---|---|
|
||||
| analysis | 34 | 23.5% | 14.7% |
|
||||
| planning | 25 | 12.0% | 16.0% |
|
||||
| bugfix | 25 | 24.0% | 20.0% |
|
||||
| feature | 19 | 10.5% | 0.0% |
|
||||
| cleanup | 6 | 0.0% | 0.0% |
|
||||
| refactor | 1 | 0.0% | 0.0% |
|
||||
| planning | 96 | 10.4% | 13.5% |
|
||||
| analysis | 33 | 6.1% | 0.0% |
|
||||
| bugfix | 26 | 15.4% | 19.2% |
|
||||
| feature | 24 | 12.5% | 4.2% |
|
||||
|
||||
Router step distribution: 1: 330, 2: 279, 3: 67, 5: 67
|
||||
Router step distribution: 1: 321, 2: 261, 3: 18, 5: 55
|
||||
|
||||
Boundaries applied (ADR / границы): 76 of 743 эпизодов (10.2%).
|
||||
Boundaries applied (ADR / границы): 7 of 655 эпизодов (1.1%).
|
||||
|
||||
## Активные многоэтапные проекты
|
||||
|
||||
@@ -45,22 +43,16 @@ Boundaries applied (ADR / границы): 76 of 743 эпизодов (10.2%).
|
||||
|
||||
## Длинные сессии
|
||||
|
||||
⚠️ Сегодня (2026-05-30 UTC) есть сессии с ≥50 ходов — корреляция с падением дисциплины роутинга (retro #5 candidate B).
|
||||
|
||||
| session_id | макс. ход | % regulated | последний эпизод |
|
||||
|---|---|---|---|
|
||||
| `52b2b52d` | 75 | 3% | 2026-05-30T11:45:39.213Z |
|
||||
|
||||
Long sessions correlate with discipline drift. Если % regulated просел в текущей сессии — рассмотри перезапуск.
|
||||
Ни одной сессии с >50 ходов сегодня (UTC). ✅
|
||||
|
||||
## Стоимость месяца
|
||||
|
||||
| Компонент | Токены (in/out) | USD |
|
||||
|---|---|---|
|
||||
| Classifier (Sonnet 4.6) | 12550/86494 | $1.34 |
|
||||
| Classifier (Sonnet 4.6) | 41653/183234 | $2.87 |
|
||||
| Self-assessment (Sonnet 4.6) | 0/0 | $0.00 |
|
||||
| Reviewer (Opus 4.7 + fallback) | 0/0 | $0.00 |
|
||||
| **Итого** | | **$1.34** |
|
||||
| **Итого** | | **$2.87** |
|
||||
|
||||
## Аномалии классификатора
|
||||
|
||||
@@ -73,50 +65,20 @@ Episodes since last run: 542 / threshold: 10
|
||||
|
||||
## Reviewer: субагент vs fallback
|
||||
|
||||
0 эпизодов проверено из 752.
|
||||
0 эпизодов проверено из 666.
|
||||
|
||||
## Reviewer findings
|
||||
|
||||
Проверено: 372 эпизодов. **69 actionable** (wrong_skill + wrong_chain_order).
|
||||
|
||||
### error_root_cause
|
||||
|
||||
| cause | count |
|
||||
|---|---:|
|
||||
| n/a | 271 |
|
||||
| wrong_skill | 55 |
|
||||
| external_failure | 28 |
|
||||
| wrong_chain_order | 14 |
|
||||
| wrong_tool | 4 |
|
||||
|
||||
### Топ alternative_better
|
||||
|
||||
| recommended | count |
|
||||
|---|---:|
|
||||
| #19 | 18 |
|
||||
| #25 | 15 |
|
||||
| #34 | 8 |
|
||||
| #18 | 8 |
|
||||
| #33 | 3 |
|
||||
|
||||
### node_quality
|
||||
|
||||
| judgment | count |
|
||||
|---|---:|
|
||||
| disputable | 207 |
|
||||
| correct | 120 |
|
||||
| wrong_node | 40 |
|
||||
| underkill | 3 |
|
||||
| overkill | 2 |
|
||||
(нет проверенных эпизодов в текущем периоде)
|
||||
|
||||
## Использование override-фраз
|
||||
|
||||
⚠️ Превышен порог override-использования сегодня (≥5/день)
|
||||
|
||||
|
||||
| Фраза | За всё время | За сегодня |
|
||||
|---|---|---|
|
||||
| `recovery` | 2302 | 23 ⚠️ |
|
||||
| `без скилов` | 507 | 40 ⚠️ |
|
||||
| `recovery` | 2302 | 0 |
|
||||
| `без скилов` | 507 | 0 |
|
||||
| `ремонт инфраструктуры` | 331 | 0 |
|
||||
| `срочно` | 225 | 0 |
|
||||
| `memory dump` | 46 | 0 |
|
||||
@@ -125,7 +87,14 @@ Episodes since last run: 542 / threshold: 10
|
||||
|
||||
## System Health
|
||||
|
||||
Долго работающих процессов нет (порог CPU > 1ч).
|
||||
Топ-3 процессов с CPU > 1ч:
|
||||
|
||||
| PID | Имя | CPU-время | Возраст |
|
||||
|---|---|---|---|
|
||||
| 3916 | MsMpEng | 1.99ч | NaNч |
|
||||
| 15260 | Code | 1.71ч | 0.0ч |
|
||||
|
||||
⚠️ Проверь, не «осиротевшие» ли это процессы от завершённых Claude-сессий.
|
||||
|
||||
## Алерт-индикаторы
|
||||
|
||||
|
||||
@@ -1,168 +0,0 @@
|
||||
# Каталог данных «мозга» Лидерры
|
||||
|
||||
Полный перечень всего, что новый «мозг» (наблюдатель + защиты router-gate v4) **способен фиксировать**: журнал эпизодов, числовые параметры/счётчики и все оси для факторного анализа.
|
||||
|
||||
**Статус проверки:** разделы A–E сверены по исходному коду `tools/` (31.05.2026). Раздел F сверен по коду хуков. Все цитаты — `file:line` от корня репозитория.
|
||||
|
||||
---
|
||||
|
||||
## A. Эпизод журнала — `docs/observer/episodes-YYYY-MM.jsonl` (схема v4.4, schema_minor 4)
|
||||
|
||||
Один эпизод = один цикл «промпт заказчика → ответ Claude». Append-only, по строке на эпизод. ПДн вырезаются до записи (`observer-pii-filter.mjs`). Сборка — `observer-transcript-parser.mjs:888` (`parseTranscript`).
|
||||
|
||||
### A.1. Идентификация и время
|
||||
| Поле | Тип / значения | Смысл |
|
||||
|---|---|---|
|
||||
| `schema_version` | `4` | версия схемы |
|
||||
| `schema_minor` | `3` | подверсия |
|
||||
| `task_id` / `task_ref` | string (sessionId) | привязка к сессии |
|
||||
| `timestamps.started_at` / `ended_at` | ISO | начало/конец хода |
|
||||
|
||||
### A.2. Кто и что выбрал
|
||||
| Поле | Значения | Смысл |
|
||||
|---|---|---|
|
||||
| `path_type` | `regulated` / `improvised` | был ли вызван навык superpowers |
|
||||
| `decision_provenance.kind` | `autonomous` / `user_directed_method` / `user_chose_from_options` | кто выбрал маршрут — Claude сам / навязан заказчиком / заказчик выбрал из предложенного |
|
||||
| `decision_provenance.claude_would_have_chosen` | string / null | контрфактуал — что выбрал бы Claude сам |
|
||||
|
||||
### A.3. Исход
|
||||
| Поле | Значения | Смысл |
|
||||
|---|---|---|
|
||||
| `outcome` | при записи `unknown` | исход (выводится позже, см. C) |
|
||||
| `outcome_reviewed` | null → метка | исход по ревью /brain-retro |
|
||||
| `outcome_reviewed_source` | null / source | кто проставил ревью |
|
||||
|
||||
### A.4. Сигнал заказчика
|
||||
| Поле | Значения | Смысл |
|
||||
|---|---|---|
|
||||
| `prompt_signal` | `correction` / `approval` / `new_task` / `neutral` | тон следующего/текущего промпта |
|
||||
| `prompt_embedding_base64` | null → вектор | смысловой вектор первого промпта (дозаполняется асинхронно) |
|
||||
|
||||
### A.5. Обстановка (`environment`)
|
||||
| Поле | Значения | Смысл |
|
||||
|---|---|---|
|
||||
| `economy_level` | 0 / 5 / 100 / null | режим экономии |
|
||||
| `model` | имя модели | модель контроллера |
|
||||
| `post_compaction` | bool | был ли сжат контекст до хода |
|
||||
| `session_turn` | int | номер хода после последнего сжатия |
|
||||
| `parallel_session` | bool | признак второй активной сессии |
|
||||
| `classifier_model` | имя / null | модель LLM-классификатора |
|
||||
|
||||
### A.6. Размер (`task_size`)
|
||||
`tool_calls` (всего вызовов инструментов) · `files_touched` (уникальных файлов) · `files[]` (список путей). — `observer-transcript-parser.mjs:423`.
|
||||
|
||||
### A.7. Стоимость и токены (`task_cost`)
|
||||
`observer-transcript-parser.mjs:472`. Базовые: `input_tokens` · `output_tokens` · `cache_read_input_tokens` · `cache_creation_input_tokens` · `web_search_requests` · `web_fetch_requests` · `iterations` (детектор extended-thinking).
|
||||
Слой LLM-агентов (дозаполняется): `classifier_input_tokens` · `classifier_output_tokens` · `self_assessment_input_tokens` · `self_assessment_output_tokens` · `reviewer_input_tokens` · `reviewer_output_tokens` · `reviewer_subagent_usd` · `reviewer_direct_fallback_usd` · `judge_spend_usd` (✅ NEW — `judge_calls × JUDGE_PER_CALL_USD`).
|
||||
|
||||
### A.8. Мета (`task_meta`)
|
||||
`prompt_length_chars` · `mcp_servers_used[]` · `file_type_distribution` по корзинам `src / test / config / spec / norm / data / other` (`classifyFilePath` — `observer-transcript-parser.mjs:358`).
|
||||
|
||||
### A.9. Классификатор (`classifier_output`) + `degraded_mode`
|
||||
`observer-state-enricher.mjs:52`. `task_type` · `recommended_node` · `recommended_chain` · `recommended_chain_id` · `no_skill_found` · `source` (llm/regex/prefilter/cache) · `reasoning` (≤600 симв.) · `confidence` · `latency_ms` · `retry_count_internal` · `llm_error` · `alternatives_considered[]` (топ-3). Отдельно `degraded_mode` (bool, LLM→regex fallback).
|
||||
|
||||
### A.10. Рассуждение маршрута (`primary_rationale`)
|
||||
`step` · `node_chosen` · `chain_ref` · `triggers_matched[]` · `candidates_considered[]` · `boundaries_applied[]` · `hard_floor{invoked, rules[]}` · `task_classification` · `recommended_node` · `recommended_chain` · `chain_progress` · `chain_completed`.
|
||||
|
||||
**`task_classification` — 12 значений** (`observer-transcript-parser.mjs:208`): `memory-sync`, `regulatory-bump`, `planning`, `release`, `refactor`, `bugfix`, `feature`, `docs`, `analysis`, `cleanup`, `monitoring`, `question`, `other`.
|
||||
|
||||
### A.11. События (`events[]`) — 11 видов
|
||||
`skill_invoked` (skill) · `tool_summary` (counts) · `error` (tool, summary) · `hook_fired` (counts, scripts, errors) · `interrupt` · `retry` · `time_burn` (ход > 15 мин) · `parse_gap` (> 10% битых строк) · `unrecovered_error` (ход кончился на ошибке) · `ask_user_question` (question_count, answer_kind: `option`/`custom`/`no_answer`) · `subagent_invoked` (subagent_type, model, description).
|
||||
|
||||
### A.12. Сигналы защит router-gate v4 (`v4_signals`) — ✅ NEW (schema_minor 4)
|
||||
Поднимаются в эпизод ридером `observer-v4-signals.mjs` по окну хода `[started_at, ended_at]`: `rationalization_flag_count` (число пойманных самооправданий в окне) · `judge_verdict` (`YES`/`NO`/`block`/`null` — последний вердикт судьи в окне) · `safe_baseline_action` (`allow`/`soft_flag`/`hard_block`/`null` — худшее действие safe-baseline в окне) · `judge_calls` (кумулятивно за сессию из бюджета судьи).
|
||||
|
||||
---
|
||||
|
||||
## B. Факторные оси — `FACTOR_FNS` (`brain-retro-analyzer.mjs:326`) — 27 осей + `chain_ref`
|
||||
|
||||
Каждая ось раскладывает эпизоды по корзинам и строит матрицу «значение фактора × распределение исходов» (`buildFactorMatrix`, `brain-retro-analyzer.mjs:384`).
|
||||
|
||||
**Pass 0 (из ядра эпизода):** `decision_provenance` · `economy_level` · `model` · `post_compaction` · `session_segment_turn` · `parallel_session` · `task_size` · `node_chosen` · `task_classification` · `recommended_node_for_direct`.
|
||||
|
||||
**Pass 1 (дешёвые оси из v4):** `prompt_signal` · `classifier_source` · `degraded_mode` · `path_type` · `retry_count` · `error_count` · `hard_floor_invoked` · `iterations_bucket`.
|
||||
|
||||
**Pass 2 (метрики классификатора):** `latency_bucket` (fast<500 / medium<2000 / slow<10000 / very_slow) · `error_type`.
|
||||
|
||||
**Pass 3 (динамика):** `prompt_length_bucket` (short<100 / medium<1000 / long<2500 / huge) · `time_of_day_bucket` (night/morning/afternoon/evening, UTC) · `day_of_week` · `inter_prompt_gap_bucket` (<1m / 1-10m / 10-60m / 60m+) · `mcp_server_used` (any/none) · `file_type_main` · `skill_invocations_bucket` (0/1/2+) · `subagent_spawns_bucket` (0/1/2+).
|
||||
|
||||
**Pass 4 (семантика):** `similar_past_outcome_majority` (исход большинства соседей по смысловому вектору; `no_neighbors` если вектора нет).
|
||||
|
||||
**Pass 5 (✅ NEW — сигналы router-gate v4):** `rationalization_flag_count` (0/1/2+) · `judge_verdict` (YES/NO/block/null) · `safe_baseline_action` (allow/soft_flag/hard_block/null) · `judge_calls_bucket` (0 / 1-9 / 10+).
|
||||
|
||||
**Отдельно:** `chain_ref` — мульти-значный (эпизод считается по разу на каждую цепочку).
|
||||
|
||||
---
|
||||
|
||||
## C. Вывод исхода — `inferOutcome` (`brain-retro-analyzer.mjs:95`) — 5 меток
|
||||
- `blocked` — ход кончился на неисправленной ошибке (`unrecovered_error`).
|
||||
- `rework` — следующий эпизод имеет `prompt_signal = correction`.
|
||||
- `success` — следующий = `approval` или `new_task`.
|
||||
- `soft_success` — следующий = `neutral` (тихий успех).
|
||||
- `unknown` — следующего эпизода ещё нет.
|
||||
|
||||
---
|
||||
|
||||
## D. Аналитические срезы (Cuts) `/brain-retro` (`brain-retro-analyzer.mjs`)
|
||||
| Срез | Функция | Что агрегирует |
|
||||
|---|---|---|
|
||||
| Факторная матрица | `buildFactorMatrix` | 27 осей × распределение исходов |
|
||||
| Cut 8 — Class × canon coverage | `buildClassCanonCoverage:448` | по классу задачи: count, канон-узлы, как часто роутер рекомендовал, что взял Claude, попало ли в канон, rework |
|
||||
| Cut 9 — Router vs Opus | `buildRouterVsOpus:498` | расхождение роутера и Opus-ревьюера (3 секции) |
|
||||
| Cut 10 — Chain-ignore breakdown | `buildChainIgnoreBreakdown:559` | % игнора цепочек + rework-rate по длине (1 / 2 / 3+) |
|
||||
| Cut 11 — Chain-hook effectiveness | `analyzeChainHookEffectiveness:36` + `buildChainHookEffectiveness:59` | исходы срабатывания chain-хука по ledger |
|
||||
| Router-gate hook effectiveness | `buildRouterGateHookEffectiveness:617` | эффективность router-gate |
|
||||
| Self-fabrication signals | `buildSelfFabricationSignals:643` | признаки фейковых результатов |
|
||||
|
||||
---
|
||||
|
||||
## E. Числовые счётчики и деньги (вне эпизода)
|
||||
|
||||
### E.1. `~/.claude/runtime/cost-daily.json` (per-date)
|
||||
`cost-aggregator.mjs:13`. Поля: `classifier_usd` · `self_assessment_usd` · `reviewer_subagent_usd` · `reviewer_direct_fallback_usd` · `self_retrospect_usd` · `total_usd` · `episode_count`.
|
||||
|
||||
### E.2. `PRICING` (`cost-pricing.mjs`)
|
||||
Sonnet — $3/Mtok вход, $15/Mtok выход. Opus — $15/Mtok вход, $75/Mtok выход.
|
||||
|
||||
### E.3. `~/.claude/runtime/hook-outcomes.jsonl`
|
||||
6 корзин исхода хука (`classifyOutcome`): `blocked` / `passed-with-skill` / `passed-inline-override` / `passed-global-override` / `passed-short-chain` / `passed-no-mutating`. Строка: rule, outcome, sessionId, timestamp.
|
||||
|
||||
### E.4. `~/.claude/runtime/override-usage.jsonl`
|
||||
Лог override-фраз. Порог 5/день на фразу (6-я блокируется `enforce-override-limit`). Байпас — фраза «лимит снят».
|
||||
|
||||
### E.5. Контролёр C5 (`observer-coverage-checker.mjs`) — warn-only
|
||||
`coverage` (хук зарегистрирован, но 0 эпизодов за месяц) · `registration` (Stop-хук + post-commit на месте) · `missed.totalMissed` (промахи активации узлов, `missed-activations.mjs`).
|
||||
|
||||
### E.6. Три счётчика в `docs/observer/`
|
||||
`.pii-counters.json` (сколько ПДн вырезано) · `.read-counter.json` (когда читали файлы наблюдателя; алерт через 54 недели тишины) · `.self-retrospect-counter.json` (`episodes_since_last`, порог 50 → предложить саморазбор).
|
||||
|
||||
---
|
||||
|
||||
## F. Сигналы новых защит router-gate v4
|
||||
|
||||
> **Обновление 31.05.2026:** F.1–F.3 ✅ **заведены в эпизод** (`v4_signals`, см. A.12) и в факторный анализ (Pass 5, раздел B) через ридер `observer-v4-signals.mjs`. F.4/F.5 — пока только на диске.
|
||||
|
||||
### F.1. Rationalization-audit (`enforce-rationalization-audit.mjs`)
|
||||
`~/.claude/runtime/rationalization-flags-<session>.jsonl`. Строка: `{kind, evidence}`. Виды (`kind`): `rationalization-phrase` (фраза-самооправдание) · `prod-edit-without-test` (правка прод-кода без теста в том же ходе) · `weak-commit-message` (commit с сообщением < 12 симв.). Блокирует на 3-м флаге за сессию (`decide:112`). Перед сопоставлением снимает цитаты/код (`stripQuotedContext:51`).
|
||||
|
||||
### F.2. Safe-baseline metering (`enforce-safe-baseline-metering.mjs`)
|
||||
`~/.claude/runtime/safe-baseline-ledger-<sess>.json` (per-task счётчики вызовов safe-инструментов Read/Grep/Glob/LS/TodoWrite/AskUser + `skill_match_within_task` + `lastKeywords`) и `safe-baseline-flags-<sess>.jsonl` (`{ts, tool, reason}`). Действия: `allow` / `soft_flag` / `hard_block` (мутирующий инструмент за порогом без навыка). Escape — любой Skill / EnterPlanMode.
|
||||
|
||||
### F.3. LLM-судья Layer 4 (`enforce-llm-judge-per-tool.mjs` + `-response-scan.mjs`)
|
||||
Вердикт по каждому мутирующему инструменту: `YES → allow`, `NO`/сомнение → `block`. Spend гейтится `resolveJudgeConfig` (флаг `ROUTER_LLM_JUDGE_ENABLED` И ключ) + per-session бюджет `JUDGE_SESSION_BUDGET` (инкремент только на реальный вызов). Исключения из проверки (scope-fix, не понижение дисциплины): `isReadonlyBashEvent` (readonly git/cat/grep/ls) и `isTestRunnerBashEvent` (vitest/pest/phpunit/artisan test/composer test/npm test без цепочки).
|
||||
|
||||
### F.4. Router-state writer (`router-prehook.mjs:156`)
|
||||
`~/.claude/runtime/router-state-<session>.json`: `classification` (вывод классификатора — task_type/recommended_node/recommended_chain/source/confidence/reasoning/…) · `chainProgress[]` · `chainCompleted` · `task_cost` (токены классификатора). Это источник, из которого `observer-state-enricher` обогащает эпизод (A.9–A.10).
|
||||
|
||||
### F.5. Прочие runtime-сигналы
|
||||
`expected-branch-<session>` (защита от угона ветки, `enforce-branch-switch`) · `verify-pass-<session>` (свежесть регрессии перед push, `enforce-verify-before-push`) · `askuser-decisions-<session>.jsonl` (одобрения git-операций) · `session-lock-<workspaceHash>.json` (замок параллельной сессии, `enforce-parallel-session-lock`) · `router-gate-mode.json` и набор `*-mode.json` (рубильники слоёв).
|
||||
|
||||
---
|
||||
|
||||
## Кандидаты на расширение факторного анализа
|
||||
|
||||
✅ **Реализовано 31.05.2026** (план `docs/superpowers/plans/2026-05-31-brain-factor-analysis-f-candidates.md`): следующие 4 оси заведены в эпизод (`v4_signals`) и в `FACTOR_FNS` (Pass 5):
|
||||
- `rationalization_flag_count` (F.1) — число самооправданий за ход/сессию.
|
||||
- `safe_baseline_action` (F.2) — allow / soft_flag / hard_block.
|
||||
- `judge_verdict` (F.3) — YES / block / disabled (когда Layer 4 активен).
|
||||
- `judge_spend_usd` (F.3) — расход судьи (добавить компонентом в `task_cost` и в `cost-daily.json`).
|
||||
File diff suppressed because one or more lines are too long
@@ -1,18 +0,0 @@
|
||||
# Shadow-replay отчёт
|
||||
|
||||
## М5 пол — GREEN
|
||||
events: 954 | over-block: 0 | real-catch: 5 | allow: 949 | miss: 0
|
||||
|
||||
## М6 снимок — GREEN
|
||||
events: 951 | over-block: 0 | real-catch: 2 | allow: 949 | miss: 0
|
||||
|
||||
## М2 стена — GREEN
|
||||
events: 5 | over-block: 0 | real-catch: 2 | allow: 3 | miss: 0
|
||||
|
||||
## М4 судья — GREEN
|
||||
events: 5 | over-block: 0 | real-catch: 2 | allow: 3 | miss: 0
|
||||
|
||||
## М3 роутер — расхождение (реальные эпизоды)
|
||||
total: 884 | followed: 2 | diverged: 88 | no-rec: 794
|
||||
|
||||
> М1 журнал: вне холостого прогона (runtime read-protected); целостность — unit-тест (пин 5782ede3).
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "21st-magic",
|
||||
"kind": "external",
|
||||
"needs": ["намерение UI-шаблона (компонент / лейаут / форма)"],
|
||||
"produces": ["стартовый UI-шаблон (LLM-сгенерированный)"],
|
||||
"constraints": ["генератор шаблонов через PSR_v1 R14.4 pipeline", "Pa11y проверка обязательна после генерации", "стек-фильтр R6.0"],
|
||||
"preview-form": "mockup",
|
||||
"defaults": ["после генерации — обязательный Pa11y"],
|
||||
"key-decisions": ["какой шаблон; адаптация под Vue+Vuetify"],
|
||||
"acceptance-criteria": ["шаблон в стеке Vue+Vuetify, Pa11y 0 нарушений"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "adr-kit",
|
||||
"kind": "external",
|
||||
"needs": ["архитектурное решение для фиксации/проверки"],
|
||||
"produces": ["ADR в docs/adr/ + enforcement через adr-judge"],
|
||||
"constraints": ["ADR + adr-judge lefthook job 9 (без LLM)", "НЕ диаграммы (mermaid)", "НЕ справочник паттернов (architecture-patterns)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["adr-judge декларативно, без --llm"],
|
||||
"key-decisions": ["что фиксировать как ADR; статус решения"],
|
||||
"acceptance-criteria": ["решение зафиксировано ADR, adr-judge проходит"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "architecture-patterns",
|
||||
"kind": "external",
|
||||
"needs": ["вопрос выбора архитектурного паттерна"],
|
||||
"produces": ["описание паттернов + критерии выбора (Clean/Hexagonal/DDD/CQRS/...)"],
|
||||
"constraints": ["справочник паттернов (knowledge)", "НЕ фиксация решения (adr-kit)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["давать критерии выбора, не догму"],
|
||||
"key-decisions": ["какой паттерн под контекст"],
|
||||
"acceptance-criteria": ["паттерн обоснован под контекст задачи"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "billing-audit",
|
||||
"kind": "own",
|
||||
"needs": ["код/диф биллинга для аудита денежной корректности"],
|
||||
"produces": ["отчёт о money-инвариантах биллинга"],
|
||||
"constraints": ["self-authored; аудит кода биллинга (bcmath/идемпотентность/tier/charge_source)", "ADR-012: НЕ налоги (ru-tax), НЕ процесс (process-*), НЕ security (D3)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["проверять потерю копеек, двойное списание, tier-резолюцию, дрейф reconcile"],
|
||||
"key-decisions": ["какие денежные инварианты в scope"],
|
||||
"acceptance-criteria": ["каждый денежный путь проверен на потерю копеек и двойное списание"]
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "boost",
|
||||
"kind": "external",
|
||||
"needs": ["SQL/Eloquent-запрос к dev-БД или вопрос по docs Laravel/пакета"],
|
||||
"produces": ["результат SQL/Eloquent или релевантная документация Laravel"],
|
||||
"constraints": ["MCP к dev-БД через Roster auto-detect", "НЕ подключать к production DB", "заменил PostgreSQL MCP (#1)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["read-first; serverить только установленные пакеты (Roster)"],
|
||||
"key-decisions": ["источник: только dev-БД, не прод"],
|
||||
"acceptance-criteria": ["запрос/доки отданы из правильного (dev) источника"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "brand-voice",
|
||||
"kind": "external",
|
||||
"needs": ["текст/коммуникация для проверки голоса бренда"],
|
||||
"produces": ["вербальные brand guidelines / проверка тональности"],
|
||||
"constraints": ["вербальный бренд (ADR-015 MKT6) НЕ Brandbook визуальный", "взаимодополняют"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["единый тон коммуникации Лидерры"],
|
||||
"key-decisions": ["тональность под канал/аудиторию"],
|
||||
"acceptance-criteria": ["текст соответствует голосу бренда"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "ccpm",
|
||||
"kind": "external",
|
||||
"needs": ["идея фичи для управления (PRD→эпик→issue→код)"],
|
||||
"produces": ["PRD/эпики/issues в .claude/prds/ + .claude/epics/"],
|
||||
"constraints": ["вендоренный скил, 14 bash-скриптов без хуков", "GitHub-issues через GitHub MCP", "НЕ продуктовые церемонии (product-management)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["PRD → эпик → issues → код"],
|
||||
"key-decisions": ["декомпозиция эпика на issues"],
|
||||
"acceptance-criteria": ["фича прослежена PRD→issue→код"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "claude-code-setup",
|
||||
"kind": "external",
|
||||
"needs": ["паттерны использования Claude Code для рекомендаций"],
|
||||
"produces": ["рекомендации автоматизаций (hooks/permissions/settings)"],
|
||||
"constraints": ["READ-ONLY рекомендатель, не меняет конфиг"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["предлагает, не применяет"],
|
||||
"key-decisions": ["какие автоматизации предложить"],
|
||||
"acceptance-criteria": ["рекомендации релевантны паттернам использования"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "claude-md-management",
|
||||
"kind": "external",
|
||||
"needs": ["намерение правки CLAUDE.md (audit / capture learnings)"],
|
||||
"produces": ["обновлённый CLAUDE.md (через claude-md-improver / revise-claude-md)"],
|
||||
"constraints": ["единственный разрешённый канал правки CLAUDE.md (§5 п.10)", "синхронизировать Pravila + Tooling (п.7)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["claude-md-improver для структурных, revise для learnings"],
|
||||
"key-decisions": ["audit-правка vs захват learnings"],
|
||||
"acceptance-criteria": ["CLAUDE.md обновлён через плагин, нормативка синхронна"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "context7",
|
||||
"kind": "external",
|
||||
"needs": ["вопрос по API/доке конкретной библиотеки/SDK"],
|
||||
"produces": ["актуальная документация библиотеки/SDK"],
|
||||
"constraints": ["первый выбор для доков известной библиотеки", "WebFetch — fallback на URL; WebSearch — без знания библиотеки"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["resolve-library-id → query-docs"],
|
||||
"key-decisions": ["какая библиотека/тема"],
|
||||
"acceptance-criteria": ["актуальная дока по API получена"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "cspell",
|
||||
"kind": "external",
|
||||
"needs": ["Markdown-текст для проверки орфографии", "пользовательский словарь проекта"],
|
||||
"produces": ["отчёт о неизвестных словах"],
|
||||
"constraints": ["ru/en орфография .md с пользовательским словарём", "НЕ стиль (markdownlint)", "НЕ грамматика"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["учитывать cspell-words.txt"],
|
||||
"key-decisions": ["новый валидный термин → в словарь, а не подавлять находку"],
|
||||
"acceptance-criteria": ["0 неизвестных слов вне словаря"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "data-scientist",
|
||||
"kind": "external",
|
||||
"needs": ["датасет + ML-задача (классификация/регрессия/анализ)"],
|
||||
"produces": ["ML-результат: модель, метрики, визуализация"],
|
||||
"constraints": ["вендоренный скил; классический ML-воркфлоу", "требует датасета, не доменной БД портала"],
|
||||
"preview-form": "sample",
|
||||
"defaults": ["загрузка → feature engineering → обучение → оценка"],
|
||||
"key-decisions": ["алгоритм и метрики под задачу"],
|
||||
"acceptance-criteria": ["модель оценена метриками, результат воспроизводим"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "dataforseo-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["SEO-вопрос по РФ (SERP/ключевые/бэклинки)"],
|
||||
"produces": ["SEO-данные РФ: SERP-позиции, бэклинки, конкурентный анализ"],
|
||||
"constraints": ["DEFERRED — платный, pending Б-1", "комплементарен Wordstat #79"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["при платном аккаунте"],
|
||||
"key-decisions": ["какие SEO-данные нужны"],
|
||||
"acceptance-criteria": ["SEO-данные РФ получены (при доступе)"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "dependabot",
|
||||
"kind": "external",
|
||||
"needs": ["Composer/npm-зависимости"],
|
||||
"produces": ["auto-PR при обнаружении CVE в зависимости"],
|
||||
"constraints": ["авто-PR через .github/dependabot.yml", "НЕ блок install (Roave)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["настройка через .github/dependabot.yml"],
|
||||
"key-decisions": ["принять/отклонить предложенное обновление"],
|
||||
"acceptance-criteria": ["CVE-зависимости имеют открытый update-PR"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "deptrac",
|
||||
"kind": "external",
|
||||
"needs": ["PHP-слои для проверки направления зависимостей"],
|
||||
"produces": ["отчёт о нарушениях границ слоёв"],
|
||||
"constraints": ["граф слоёв по app/deptrac.yaml; lefthook job 10", "НЕ типовой анализ (Larastan)", "НЕ декларативный ADR (adr-judge)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["конфиг 13 слоёв, консервативный ruleset"],
|
||||
"key-decisions": ["допустимые направления зависимостей"],
|
||||
"acceptance-criteria": ["0 нарушений границ слоёв"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "design-plugin",
|
||||
"kind": "external",
|
||||
"needs": ["дизайн-вопрос pre-code (критика / UX-копирайт / research synthesis)"],
|
||||
"produces": ["дизайн-критика / UX-копирайт / research synthesis"],
|
||||
"constraints": ["pre-code; a11y-принципы дизайн-уровня", "технический a11y SoT — Pa11y (#9)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["до написания кода"],
|
||||
"key-decisions": ["критика, копирайт или synthesis"],
|
||||
"acceptance-criteria": ["дизайн-замечания/копирайт учтены до кода"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "discovery-interview",
|
||||
"kind": "own",
|
||||
"needs": ["задача до проектирования: фича (интервью заказчика) или ориентация в системе"],
|
||||
"produces": ["discovery-brief (FEATURE) или snapshot мета-слоя (SYSTEM)"],
|
||||
"constraints": ["self-authored; FEATURE=JTBD-интервью человека, SYSTEM=ориентация по мета-слою", "ADR-009 граница с process-analysis (#53): человек vs код"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["FEATURE → discovery-brief в brainstorming; SYSTEM → snapshot в docs/discovery/"],
|
||||
"key-decisions": ["режим FEATURE или SYSTEM"],
|
||||
"acceptance-criteria": ["проблема/контекст вскрыты до проектирования"]
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "eslint-prettier",
|
||||
"kind": "external",
|
||||
"needs": ["JS/Vue-код для линта+форматирования"],
|
||||
"produces": ["исправленный/проверенный JS/Vue по ESLint+Prettier"],
|
||||
"constraints": ["связка lint+format JS/Vue", "НЕ CSS (Stylelint)", "НЕ типы (vue-tsc)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["flat-config + plugin-vue; config-prettier разводит конфликты"],
|
||||
"key-decisions": ["scope: staged-файлы vs весь js/vue"],
|
||||
"acceptance-criteria": ["0 ESLint-ошибок, формат единообразен"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "figma-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["Figma-файл с дизайн-токенами/компонентами"],
|
||||
"produces": ["извлечённые дизайн-токены/компоненты/стили"],
|
||||
"constraints": ["DEFERRED — нет Figma-аккаунта; источник — статический handoff Платона", "extract-only, code-gen за Frontend Design (#30)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["на поддерживаемом источнике: extract-only"],
|
||||
"key-decisions": ["какие токены извлекать"],
|
||||
"acceptance-criteria": ["токены извлечены из Figma-источника (когда доступен)"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "finance-plugin",
|
||||
"kind": "external",
|
||||
"needs": ["финансовая задача (сверка/variance/проводки/отчётность)"],
|
||||
"produces": ["сверка / variance-анализ / проводки / финотчётность"],
|
||||
"constraints": ["US-GAAP-ориентирован, частично применим РФ; SOX not-applicable", "РФ-налоги — за ru-tax-accounting (#63); ADR-012 граница C6/C7", "warehouse-MCP DEFERRED"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["reconciliation/variance применимы; US-GAAP-скилы с осторожностью"],
|
||||
"key-decisions": ["применим ли скил для РФ-контекста"],
|
||||
"acceptance-criteria": ["финансовая операция корректна, РФ-ограничения учтены"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "frontend-design",
|
||||
"kind": "external",
|
||||
"needs": ["UI-задача: компонент / паттерн / состояние / a11y-принцип"],
|
||||
"produces": ["доменное решение UI/UX (компоненты, паттерны, a11y-принципы)"],
|
||||
"constraints": ["доменная база UI для Vue+Vuetify; обязательный стек-фильтр R6.0", "paired со #19", "технический a11y — за Pa11y, не здесь"],
|
||||
"preview-form": "mockup",
|
||||
"defaults": ["срезать React/Tailwind/shadcn → Vue 3 + Vuetify 3; палитра Forest из Brandbook"],
|
||||
"key-decisions": ["компонент/паттерн под задачу в рамках стека"],
|
||||
"acceptance-criteria": ["решение в стеке Vue+Vuetify, бренд Forest соблюдён"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "github-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["ссылка на repo/issue/PR", "намерение операции"],
|
||||
"produces": ["результат чтения или записи issue/PR/комментария"],
|
||||
"constraints": ["внешний MCP — операции через GitHub API", "НЕ локальный git-флоу (это git/PowerShell)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["read-first перед мутацией"],
|
||||
"key-decisions": ["scope операции: чтение или запись"],
|
||||
"acceptance-criteria": ["операция отражена в GitHub и подтверждена ответом API"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "gitleaks",
|
||||
"kind": "external",
|
||||
"needs": ["git diff или история репозитория"],
|
||||
"produces": ["находки утечек секретов (ключи/токены/пароли/DSN)"],
|
||||
"constraints": ["сканирует секреты в diff/истории через lefthook pre-commit/pre-push", "НЕ SAST-уязвимости кода (Semgrep)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["protect --staged на pre-commit; полная история на pre-push"],
|
||||
"key-decisions": ["реальный секрет vs тестовая фикстура (false-positive)"],
|
||||
"acceptance-criteria": ["0 утечек секретов в diff/истории"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "graphifyy",
|
||||
"kind": "external",
|
||||
"needs": ["структурный/cross-layer вопрос по проекту (docs+code)"],
|
||||
"produces": ["ответ из knowledge-graph портала (узлы/рёбра/source_location)"],
|
||||
"constraints": ["user-level CLI; backend GEMINI/GOOGLE key ИЛИ Claude subagent", "ADR-017: KG1 НЕ context7 #60 (внутренний vs внешний), KG2 НЕ Boost #10 (static vs runtime), KG3 НЕ openapi #47, KG4 НЕ Sentry #34, KG5 НЕ adr-kit/mermaid (auto vs manual)", "артефакты graphify-out*/ gitignored; только manual --update"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["query/explain/path read-only; перед открытым codebase-вопросом сначала graphify"],
|
||||
"key-decisions": ["структурный вопрос vs известный путь (Read/Grep)"],
|
||||
"acceptance-criteria": ["структурный вопрос отвечен с source_location-цитатами"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "histoire",
|
||||
"kind": "external",
|
||||
"needs": ["Vue-компонент для каталога stories"],
|
||||
"produces": ["визуальный каталог stories/variants"],
|
||||
"constraints": ["каталог компонентов (не Storybook)", "Vuetify через setupFile"],
|
||||
"preview-form": "sample",
|
||||
"defaults": ["npm run story"],
|
||||
"key-decisions": ["какие компоненты/variants в каталоге"],
|
||||
"acceptance-criteria": ["stories собираются и рендерятся"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "hookify",
|
||||
"kind": "external",
|
||||
"needs": ["явный /hookify + поведение для предотвращения"],
|
||||
"produces": ["сгенерированный Claude Code хук (PreToolUse/PostToolUse/Stop/...)"],
|
||||
"constraints": ["только по явному /hookify", "HK1 pre-check коллизий с существующими хуками (ADR-010)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["HK1 pre-check до генерации"],
|
||||
"key-decisions": ["тип события хука и условие"],
|
||||
"acceptance-criteria": ["хук генерируется без коллизий с существующей архитектурой"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "ide-helper",
|
||||
"kind": "external",
|
||||
"needs": ["Laravel-проект (facades/модели/хелперы)"],
|
||||
"produces": ["IDE-заглушки (@mixin IdeHelper*) для autocomplete/type-inference"],
|
||||
"constraints": ["генерация stubs для IDE", "НЕ влияет на рантайм"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["ide-helper:generate + models -W -M -N"],
|
||||
"key-decisions": ["когда перегенерировать (после изменения моделей)"],
|
||||
"acceptance-criteria": ["autocomplete/type-inference покрывают facades+модели"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "jupyter-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["Jupyter-ноутбук для исполнения"],
|
||||
"produces": ["результат исполнения ячеек ноутбука"],
|
||||
"constraints": ["DEFERRED — нет Python ML-окружения на native-Windows"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["на поддерживаемой среде с Python ML"],
|
||||
"key-decisions": ["какие ячейки исполнять"],
|
||||
"acceptance-criteria": ["ноутбук исполнен, результаты получены (на поддерживаемой среде)"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "larastan",
|
||||
"kind": "external",
|
||||
"needs": ["PHP-код для статанализа типов"],
|
||||
"produces": ["отчёт об ошибках типов/сигнатур/undefined-переменных"],
|
||||
"constraints": ["типовой анализ PHPStan+Laravel", "НЕ стиль (Pint)", "НЕ граф слоёв (deptrac)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["уровень + baseline проекта"],
|
||||
"key-decisions": ["новая ошибка vs baseline-долг"],
|
||||
"acceptance-criteria": ["0 новых ошибок типов сверх baseline"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "laravel-backend-patterns",
|
||||
"kind": "own",
|
||||
"needs": ["backend-задача Лидерры (controller/service/job/RLS/деньги)"],
|
||||
"produces": ["проектные backend-конвенции (слоистость, RLS-aware, bcmath, идемпотентность, partition-aware)"],
|
||||
"constraints": ["self-authored справочник проектных конвенций", "ADR-013: BT5 НЕ architecture-patterns #38 (проектные vs generic), BT6 НЕ billing-audit #62"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["controller→service→job; RLS-aware; деньги через bcmath/LedgerService"],
|
||||
"key-decisions": ["паттерн под слой задачи"],
|
||||
"acceptance-criteria": ["backend-код следует конвенциям Лидерры"]
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "lychee",
|
||||
"kind": "external",
|
||||
"needs": ["Markdown-файлы со ссылками"],
|
||||
"produces": ["отчёт о битых URL и якорях"],
|
||||
"constraints": ["внутренние + внешние ссылки и якоря .md", "НЕ стиль/орфография"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["проверять и внутренние якоря, и внешние URL"],
|
||||
"key-decisions": ["внешний временно недоступный vs реально битый — различать"],
|
||||
"acceptance-criteria": ["0 битых ссылок/якорей"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "markdownlint",
|
||||
"kind": "external",
|
||||
"needs": ["Markdown-файлы для линта"],
|
||||
"produces": ["отчёт о нарушениях стиля Markdown"],
|
||||
"constraints": ["внешний CLI — стиль .md (заголовки/таблицы/пробелы/переносы)", "НЕ орфография (cspell)", "НЕ ссылки (lychee)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["авто-fix где возможно (--fix), кроме корневого CLAUDE.md"],
|
||||
"key-decisions": ["scope: какие .md в проверке"],
|
||||
"acceptance-criteria": ["0 нарушений стиля по правилам markdownlint"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "marketing-plugin",
|
||||
"kind": "external",
|
||||
"needs": ["маркетинговая задача (контент/кампания/SEO/email/бриф)"],
|
||||
"produces": ["маркетинговый артефакт (контент/email-цепочка/SEO-аудит/бриф/отчёт)"],
|
||||
"constraints": ["первичный resolver C1 (8 скилов)", "ADR-015: MKT3 решатель, материал — marketingskills #75; MKT2 НЕ product-management #42"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["скил под тип задачи C1"],
|
||||
"key-decisions": ["какой маркетинг-скил под задачу"],
|
||||
"acceptance-criteria": ["маркетинговый артефакт готов и таргетирован"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "marketing-ru",
|
||||
"kind": "own",
|
||||
"needs": ["маркетинговая задача для РФ-рынка (Директ/ВК/Telegram/лендинг/152-ФЗ)"],
|
||||
"produces": ["РФ-маркетинг: каналы, конверсия лендинга, 152-ФЗ согласия"],
|
||||
"constraints": ["self-authored; РФ-специфика (ADR-015 MKT9, 152-ФЗ cross-ref #71)", "НЕ generic marketing #74"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["РФ-каналы: Яндекс.Директ/ВК/Telegram; согласия по 152-ФЗ"],
|
||||
"key-decisions": ["канал и РФ-ограничения"],
|
||||
"acceptance-criteria": ["маркетинг учитывает РФ-каналы и 152-ФЗ"]
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "marketingskills",
|
||||
"kind": "external",
|
||||
"needs": ["маркетинговая задача, требующая фреймворка (AIDA/PAS/CRO/...)"],
|
||||
"produces": ["маркетинговые фреймворки как материал (40 шт)"],
|
||||
"constraints": ["материал/резерв-библиотека, не решатель (ADR-015 MKT3)", "решатель — marketing #74"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["материал отбирается, решение за marketing #74"],
|
||||
"key-decisions": ["какой фреймворк под задачу"],
|
||||
"acceptance-criteria": ["фреймворк отобран как материал для решателя"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "mermaid",
|
||||
"kind": "external",
|
||||
"needs": ["требование к диаграмме (C4 / flow / sequence / ...)"],
|
||||
"produces": ["диаграмма в нотации Mermaid/C4"],
|
||||
"constraints": ["вендоренный скил; диаграммы в docs/architecture/", "НЕ фиксация решения (adr-kit)"],
|
||||
"preview-form": "diagram",
|
||||
"defaults": ["C4: context/container/component"],
|
||||
"key-decisions": ["тип и уровень диаграммы"],
|
||||
"acceptance-criteria": ["диаграмма рендерится и отражает систему"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "n8n-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["workflow для движка n8n"],
|
||||
"produces": ["автоматизация процесса через n8n"],
|
||||
"constraints": ["DEFERRED — n8n не в стеке; движок процессов = очередь Laravel", "принятие n8n — отдельное архитектурное решение"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["на среде с n8n"],
|
||||
"key-decisions": ["принятие n8n как движка — отдельный ADR"],
|
||||
"acceptance-criteria": ["workflow исполняется в n8n (когда принят)"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "nightowl",
|
||||
"kind": "external",
|
||||
"needs": ["сквозная корреляция request/job/query трассировок"],
|
||||
"produces": ["коррелированный runtime-трейс (self-hosted)"],
|
||||
"constraints": ["DEFERRED — нет pcntl/posix на native-Windows; pending Б-1/Linux", "ADR-013 BT7 НЕ Sentry #34 (трейс vs ошибки), BT8 НЕ Pail/Boost"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["на Linux-среде с pcntl/posix"],
|
||||
"key-decisions": ["scope корреляции трассировок"],
|
||||
"acceptance-criteria": ["request/job/query скоррелированы в трейс (на поддерживаемой среде)"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "normative-sync",
|
||||
"kind": "own",
|
||||
"needs": ["завершённая интеграция/ADR/brain-артефакт для синка нормативки"],
|
||||
"produces": ["синхронизированные Pravila/PSR_v1/Tooling/CLAUDE.md (version bumps, §0 cross-refs, footer, §9)"],
|
||||
"constraints": ["project-агент; звать после закрытия крупной off-phase интеграции/ADR (Pravila §2.4)", "парный с #85; не в Tooling-каноне счётчиков"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["синк 4 нормативных файлов с version bumps"],
|
||||
"key-decisions": ["какие version bumps/cross-refs нужны"],
|
||||
"acceptance-criteria": ["4 нормативных документа синхронны, cross-refs сходятся"]
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "nuclei",
|
||||
"kind": "external",
|
||||
"needs": ["работающий хост для скана по шаблонам"],
|
||||
"produces": ["находки известных уязвимостей (CVE/экспозиция/слабый TLS/misconfig)"],
|
||||
"constraints": ["CLI bin/nuclei.exe; цель 127.0.0.1 не localhost", "ADR-014 IS2 НЕ ZAP #68 (широта vs глубина)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["низкий rate-limit для dev"],
|
||||
"key-decisions": ["набор шаблонов"],
|
||||
"acceptance-criteria": ["0 известных уязвимостей по шаблонам"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "openapi-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["OpenAPI/REST-спецификация интеграции"],
|
||||
"produces": ["эндпоинты/схемы/параметры как MCP-ресурсы (чтение)"],
|
||||
"constraints": ["READ-ONLY интроспекция спеки", "НЕ генерация кода"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["read-only через .mcp.json"],
|
||||
"key-decisions": ["какой эндпоинт/схему смотреть"],
|
||||
"acceptance-criteria": ["структура API понята из спеки"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "operations:process-doc",
|
||||
"kind": "external",
|
||||
"needs": ["as-is process description"],
|
||||
"produces": ["structured process documentation"],
|
||||
"constraints": ["marketplace skill — outputs doc only"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["follow operations plugin process-doc template"],
|
||||
"key-decisions": ["scope of the process being documented"],
|
||||
"acceptance-criteria": ["doc covers all process steps and owners"],
|
||||
"source": { "version": "1.2.0", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "operations",
|
||||
"kind": "external",
|
||||
"needs": ["задача по бизнес-процессу (документ/runbook/риск/capacity)"],
|
||||
"produces": ["процессный артефакт (process-doc/runbook/risk/capacity/...)"],
|
||||
"constraints": ["зонтик 9 скилов, 0 lifecycle-хуков", "process-doc → Mermaid-исходник рендерит mermaid (#37)", "НЕ as-is анализ из кода (process-analysis)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["скил под тип артефакта"],
|
||||
"key-decisions": ["какой из 9 скилов под задачу"],
|
||||
"acceptance-criteria": ["процессный артефакт полон (шаги/владельцы)"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "owasp-zap",
|
||||
"kind": "external",
|
||||
"needs": ["работающий веб-портал для DAST"],
|
||||
"produces": ["DAST-отчёт (инъекции/XSS/обход входа/IDOR)"],
|
||||
"constraints": ["активное динамическое тестирование; цель 127.0.0.1", "ADR-014: IS1 НЕ Semgrep #25 (динамика vs статика), IS2 НЕ Nuclei #69 (глубина vs широта)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["цель 127.0.0.1, не localhost"],
|
||||
"key-decisions": ["scope активного скана"],
|
||||
"acceptance-criteria": ["DAST не нашёл критичных уязвимостей"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "pa11y",
|
||||
"kind": "external",
|
||||
"needs": ["отрендеренная веб-страница / URL"],
|
||||
"produces": ["отчёт о нарушениях доступности WCAG 2.1 AA"],
|
||||
"constraints": ["единственный технический SoT a11y в проекте", "НЕ через Lighthouse", "НЕ визуальный смок (Playwright)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["проверять контраст / alt / роли / фокус-порядок по WCAG 2.1 AA"],
|
||||
"key-decisions": ["какие страницы/URL в a11y-прогоне"],
|
||||
"acceptance-criteria": ["0 нарушений WCAG 2.1 AA на проверяемых страницах"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "pdn-152fz-audit",
|
||||
"kind": "own",
|
||||
"needs": ["задача аудита ПДн / 152-ФЗ"],
|
||||
"produces": ["аудит ПДн: инвентаризация, согласия, маскирование, логи доступа, pd_subject_request"],
|
||||
"constraints": ["self-authored; режим техника + закон", "ADR-014: IS4 НЕ pg_anonymizer #29 (аудит vs инструмент), IS5 НЕ D2 (техника vs юр.оформление)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["инвентаризация ПДн в схеме/коде → проверка соответствия"],
|
||||
"key-decisions": ["режим: техника или закон"],
|
||||
"acceptance-criteria": ["ПДн инвентаризированы, соответствие 152-ФЗ проверено"]
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "pest",
|
||||
"kind": "external",
|
||||
"needs": ["PHP-тесты (unit/feature/RLS)"],
|
||||
"produces": ["результат прогона тестов (pass/fail/assertions)"],
|
||||
"constraints": ["Pest 4: unit/feature/RLS/parallel/browser/stress/mutation", "НЕ Vue-тесты (Vitest)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["composer test; --parallel в CI"],
|
||||
"key-decisions": ["scope: какие тесты, parallel vs serial"],
|
||||
"acceptance-criteria": ["все тесты зелёные, без регрессий"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "pg-anonymizer",
|
||||
"kind": "external",
|
||||
"needs": ["дамп БД с персональными данными"],
|
||||
"produces": ["маскированный дамп (телефоны/имена/email)"],
|
||||
"constraints": ["загрузка по требованию LOAD 'anon' (не db-wide preload)", "на проде liderra.ru"],
|
||||
"preview-form": "sample",
|
||||
"defaults": ["маски по требованию для выгрузок"],
|
||||
"key-decisions": ["какие поля маскировать"],
|
||||
"acceptance-criteria": ["ПДн в выгрузке замаскированы"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "pg-audit",
|
||||
"kind": "external",
|
||||
"needs": ["DDL/DML/DCL операции БД"],
|
||||
"produces": ["аудит-журнал операций на уровне БД"],
|
||||
"constraints": ["pgaudit.log=ddl,role,write; log_parameter=off (ПДн не логируются)", "на проде liderra.ru; закрывает 152-ФЗ"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["журнал в /var/log/postgresql"],
|
||||
"key-decisions": ["scope логируемых операций"],
|
||||
"acceptance-criteria": ["аудит-журнал БД ведётся, ПДн не в логах"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "pg-formatter",
|
||||
"kind": "external",
|
||||
"needs": ["SQL-файл для форматирования"],
|
||||
"produces": ["отформатированный SQL (отступы/регистр/выравнивание)"],
|
||||
"constraints": ["форматирование SQL по хуку на db/schema.sql", "НЕ линт опасных паттернов (squawk)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["стандарт pgFormatter"],
|
||||
"key-decisions": ["scope: какой SQL форматировать"],
|
||||
"acceptance-criteria": ["SQL приведён к стандарту pgFormatter"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "pg-partman",
|
||||
"kind": "external",
|
||||
"needs": ["расписание партиционирования таблиц"],
|
||||
"produces": ["авто-создание/удаление partition-таблиц по расписанию"],
|
||||
"constraints": ["dormant — недоступно на native-Windows PG", "заменён Artisan partitions:create-months"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["на поддерживаемой среде — по расписанию; на dev заменён ручным cron'ом"],
|
||||
"key-decisions": ["окно/гранулярность партиций"],
|
||||
"acceptance-criteria": ["партиции созданы/удалены по расписанию (на поддерживаемой среде)"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "php-insights",
|
||||
"kind": "external",
|
||||
"needs": ["PHP-код для метрик качества"],
|
||||
"produces": ["метрики: сложность, архитектура, code style score"],
|
||||
"constraints": ["on-demand/CI, не блокирует; пороги 78/79/73", "ADR-013 BT4 НЕ Pint/Larastan; уникум — оси complexity+architecture"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["composer insights; baseline-пороги"],
|
||||
"key-decisions": ["какие оси/пороги важны"],
|
||||
"acceptance-criteria": ["метрики не ниже baseline-порогов"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "pint",
|
||||
"kind": "external",
|
||||
"needs": ["PHP-код для форматирования"],
|
||||
"produces": ["отформатированный PHP по PSR-12 + Laravel style"],
|
||||
"constraints": ["только форматирование стиля", "НЕ статанализ типов (Larastan)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["применять Laravel preset"],
|
||||
"key-decisions": ["scope: staged-файлы vs весь php"],
|
||||
"acceptance-criteria": ["0 расхождений со стилем Pint"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "playwright-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["URL или HTML-файл для управления", "намерение: скриншот / взаимодействие / сетевой трейс"],
|
||||
"produces": ["скриншот / результат взаимодействия / снимок console+network"],
|
||||
"constraints": ["внешний MCP — управляет headless-браузером", "НЕ a11y-проверка (это Pa11y)", "НЕ замена unit/e2e-тестам"],
|
||||
"preview-form": "sample",
|
||||
"defaults": ["read-first: снять снимок/состояние страницы до действия"],
|
||||
"key-decisions": ["что проверяем: визуал, взаимодействие или сетевой трейс"],
|
||||
"acceptance-criteria": ["ожидаемое состояние страницы подтверждено снимком/снапшотом"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "plugin-dev",
|
||||
"kind": "external",
|
||||
"needs": ["намерение разработать marketplace Claude-плагин"],
|
||||
"produces": ["scaffold плагина (plugin.json, MCP, хуки, доки, публикация)"],
|
||||
"constraints": ["8 sub-skills + 3 агента", "НЕ standalone-скилы (skill-creator)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["plugin.json + структура компонентов"],
|
||||
"key-decisions": ["состав компонентов плагина"],
|
||||
"acceptance-criteria": ["плагин валиден и публикуем"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "postgres-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["исторический SQL-запрос к dev-БД"],
|
||||
"produces": ["результат SQL (исторически)"],
|
||||
"constraints": ["historic — заменён Laravel Boost (#10); не используется"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["заменён Boost #10"],
|
||||
"key-decisions": ["использовать Boost #10 вместо этого узла"],
|
||||
"acceptance-criteria": ["SQL-запросы идут через Boost #10, не через этот узел"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "postiz",
|
||||
"kind": "external",
|
||||
"needs": ["контент-календарь / план публикаций в соцсети"],
|
||||
"produces": ["запланированные публикации в 30+ соцсетях (VK/Telegram)"],
|
||||
"constraints": ["self-host AGPL-3.0 без дистрибуции (ADR-015 MKT7)", "покрывает VK-постинг"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["контент-календарь, self-host"],
|
||||
"key-decisions": ["каналы и расписание публикаций"],
|
||||
"acceptance-criteria": ["публикации запланированы по календарю"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "process-analysis",
|
||||
"kind": "own",
|
||||
"needs": ["as-is процесс для discovery из кода Laravel"],
|
||||
"produces": ["реконструкция as-is процесса + узкие места"],
|
||||
"constraints": ["self-authored project skill; discovery из app-кода (routes/controllers/jobs)", "ADR-009 граница с discovery-interview (#55): код vs человек", "НЕ моделирование to-be (process-modeling)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["discovery из маршрутов/контроллеров/джобов/очередей"],
|
||||
"key-decisions": ["scope процесса для реконструкции"],
|
||||
"acceptance-criteria": ["as-is процесс восстановлен, узкие места выявлены"]
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "process-modeling",
|
||||
"kind": "own",
|
||||
"needs": ["to-be бизнес-процесс для моделирования"],
|
||||
"produces": ["BPMN 2.0 модель (swimlane/события/шлюзы) в docs/process/"],
|
||||
"constraints": ["self-authored project skill; нотация BPMN", "НЕ as-is анализ из кода (process-analysis)", "рендер диаграмм — через свой вывод/mermaid"],
|
||||
"preview-form": "diagram",
|
||||
"defaults": ["BPMN 2.0; результаты в docs/process/"],
|
||||
"key-decisions": ["границы и дорожки процесса"],
|
||||
"acceptance-criteria": ["to-be модель покрывает поток управления и роли"]
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "prod-deploy-validator",
|
||||
"kind": "own",
|
||||
"needs": ["намерение выката на боевой liderra.ru"],
|
||||
"produces": ["вердикт GO/NO-GO + результаты 8 SSH pre-flight проверок"],
|
||||
"constraints": ["project-агент; READ-ONLY по дизайну; звать перед любым выкатом (Pravila §2.4)", "парный с #84; не в Tooling-каноне"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["8 READ-ONLY SSH-проверок: конфиг/сервисы/БД/очереди"],
|
||||
"key-decisions": ["go/no-go по результатам проверок"],
|
||||
"acceptance-criteria": ["вердикт GO/NO-GO обоснован pre-flight проверками"]
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "product-management",
|
||||
"kind": "external",
|
||||
"needs": ["продуктовая церемония (спека / роадмап / метрики)"],
|
||||
"produces": ["спецификация / роадмап / анализ метрик / конкурентный бриф"],
|
||||
"constraints": ["продуктовые церемонии (write-spec/roadmap/metrics)", "НЕ dev-issues (CCPM)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["/write-spec, /roadmap-update, /metrics-review"],
|
||||
"key-decisions": ["какая церемония под запрос"],
|
||||
"acceptance-criteria": ["артефакт церемонии готов и обоснован"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "promptfoo",
|
||||
"kind": "external",
|
||||
"needs": ["LLM-промпт + тест-кейсы для eval"],
|
||||
"produces": ["результат eval/регрессии промпта (ассерты/judge/red-team)"],
|
||||
"constraints": ["только вручную/CI, никогда в хук (платные вызовы)", "НЕ SAST (Semgrep)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["запуск вручную или в CI"],
|
||||
"key-decisions": ["метрики/ассерты eval"],
|
||||
"acceptance-criteria": ["промпт прошёл регрессию/eval по критериям"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "rector",
|
||||
"kind": "external",
|
||||
"needs": ["PHP-код для авто-рефакторинга/version-upgrade"],
|
||||
"produces": ["трансформированный PHP (upgrade/dead-code/modernization)"],
|
||||
"constraints": ["вручную/CI, не блокирует коммит", "ADR-013: BT1 НЕ Pint (трансформация vs формат), BT2 комплементарен Larastan, BT3 НЕ deptrac"],
|
||||
"preview-form": "dry-run",
|
||||
"defaults": ["dry-run baseline; conservative ruleset"],
|
||||
"key-decisions": ["какие правила трансформации"],
|
||||
"acceptance-criteria": ["код трансформирован, тесты зелёные"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "redis-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["вопрос о состоянии Redis/Memurai (ключи/очереди/TTL)"],
|
||||
"produces": ["состояние Redis (чтение): ключи, очереди, TTL, паттерны"],
|
||||
"constraints": ["READ-ONLY MCP к Redis/Memurai", "НЕ prod-ошибки (Sentry MCP)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["read-only инспекция кэша/очередей"],
|
||||
"key-decisions": ["что инспектировать: кэш, очередь, race"],
|
||||
"acceptance-criteria": ["состояние кэша/очереди/race локализовано"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "roave-security",
|
||||
"kind": "external",
|
||||
"needs": ["composer install/update"],
|
||||
"produces": ["блок установки пакета с известным CVE"],
|
||||
"constraints": ["conflict-список CVE на install/update", "НЕ SAST кода (Semgrep)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["срабатывает автоматически на composer"],
|
||||
"key-decisions": ["нет ручного выбора — автоматический conflict-гейт"],
|
||||
"acceptance-criteria": ["установка с известным CVE заблокирована"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "ru-tax-accounting",
|
||||
"kind": "own",
|
||||
"needs": ["вопрос по РСБУ/НК РФ (НДС/УСН/налоговая база/проводки)"],
|
||||
"produces": ["РСБУ/налоговый контекст: расчёты, проводки ДТ/КТ, выгрузки бухгалтеру"],
|
||||
"constraints": ["self-authored; закрывает РФ-gap finance-plugin (#61)", "ADR-012: НЕ billing-audit #62 (код), НЕ D1/D2 (право)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["НДС/УСН по НК РФ; проводки по РСБУ"],
|
||||
"key-decisions": ["налоговый режим и база"],
|
||||
"acceptance-criteria": ["налоговый расчёт/проводка корректны по НК РФ/РСБУ"]
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "security-go-live",
|
||||
"kind": "own",
|
||||
"needs": ["портал перед выходом в интернет (go/no-go)"],
|
||||
"produces": ["вердикт GO/NO-GO + сводка проверок безопасности"],
|
||||
"constraints": ["self-authored оркестратор #68-72 + D3", "ADR-014 IS7 НЕ audit-portal (только security+go-live vs полный 14-фазный аудит)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["оркеструет ZAP/Nuclei/Ward/pdn-152fz/threat-model + Semgrep"],
|
||||
"key-decisions": ["go/no-go порог"],
|
||||
"acceptance-criteria": ["вердикт GO/NO-GO обоснован результатами проверок"]
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "security-guidance",
|
||||
"kind": "external",
|
||||
"needs": ["правка файла с потенциально уязвимым паттерном"],
|
||||
"produces": ["inline-предупреждение + блок правки (sys.exit 2)"],
|
||||
"constraints": ["блокирующий PreToolUse-хук, speed-bump per файл+правило", "НЕ глубокий аудит (Trail of Bits)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["одноразовый блок, retry проходит"],
|
||||
"key-decisions": ["реальная уязвимость vs false-positive"],
|
||||
"acceptance-criteria": ["уязвимый паттерн замечен до коммита"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "semgrep",
|
||||
"kind": "external",
|
||||
"needs": ["PHP/JS/Vue-код для SAST"],
|
||||
"produces": ["отчёт об уязвимостях кода (инъекции, небезопасная конфигурация, XSS)"],
|
||||
"constraints": ["SAST бинарь + MCP", "НЕ секреты в diff (gitleaks)", "НЕ глубокий on-demand аудит (Trail of Bits)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["npm run sast"],
|
||||
"key-decisions": ["scope скана; реальная уязвимость vs false-positive"],
|
||||
"acceptance-criteria": ["0 уязвимостей высокого риска"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "sentry-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["production runtime ошибка для диагностики"],
|
||||
"produces": ["события/ошибки/трассировки из Sentry (чтение)"],
|
||||
"constraints": ["READ-ONLY MCP к self-hosted Sentry", "pending активации Б-1", "НЕ Redis-состояние (Redis MCP)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["read-only диагностика"],
|
||||
"key-decisions": ["какое событие/трассировку смотреть"],
|
||||
"acceptance-criteria": ["причина prod-ошибки локализована по событию Sentry"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "skill-creator",
|
||||
"kind": "external",
|
||||
"needs": ["намерение создать standalone Claude-скил"],
|
||||
"produces": ["scaffold SKILL.md + evals.json + references/"],
|
||||
"constraints": ["конструктор скилов с eval-набором", "НЕ плагины (plugin-dev)", "НЕ хуки (hookify)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["скил с eval-набором для проверки точности"],
|
||||
"key-decisions": ["scope и триггеры скила"],
|
||||
"acceptance-criteria": ["скил оформлен, eval проходит"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "squawk",
|
||||
"kind": "external",
|
||||
"needs": ["SQL-миграция PostgreSQL"],
|
||||
"produces": ["отчёт об опасных паттернах миграции (блокировки, без CONCURRENTLY, ненадёжный DEFAULT)"],
|
||||
"constraints": ["линт миграций в pre-commit для database/migrations", "НЕ форматирование (pgFormatter)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["прогон на staged миграциях"],
|
||||
"key-decisions": ["блокирующая операция vs допустимая"],
|
||||
"acceptance-criteria": ["0 опасных паттернов в миграции"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "stylelint",
|
||||
"kind": "external",
|
||||
"needs": ["CSS-код в .vue SFC или .css-файлах"],
|
||||
"produces": ["отчёт о нарушениях стиля CSS"],
|
||||
"constraints": ["CSS в .vue SFC + css-файлы", "НЕ JS/TS (ESLint)", "НЕ a11y (Pa11y)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["порядок свойств + именование по конфигу проекта"],
|
||||
"key-decisions": ["scope: staged-файлы vs весь css"],
|
||||
"acceptance-criteria": ["0 нарушений стиля CSS"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "superpowers",
|
||||
"kind": "own",
|
||||
"needs": ["задача разработки, требующая процесса (TDD/debug/plan/review/brainstorm/worktree)"],
|
||||
"produces": ["дисциплинированный процесс: тест-первый, план, ревью, верификация"],
|
||||
"constraints": ["мета-процесс (зонтик 14 sub-skills), не доменный решатель", "hard-floor источник (ADR-011)", "paired со #30 Frontend Design"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["skill инвоцируется ПЕРВЫМ для подходящей задачи"],
|
||||
"key-decisions": ["какой sub-skill под задачу (tdd/debugging/writing-plans/brainstorming/...)"],
|
||||
"acceptance-criteria": ["процесс-скил применён ДО реализации, дисциплина соблюдена"]
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "telegram-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["пост/действие в Telegram-канале"],
|
||||
"produces": ["публикация/редактирование/аналитика Telegram-канала"],
|
||||
"constraints": ["выделенный аккаунт через SESSION_STRING (только .env)", "ADR-015 MKT8"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["выделенный аккаунт, SESSION_STRING в .env"],
|
||||
"key-decisions": ["канал и контент поста"],
|
||||
"acceptance-criteria": ["пост опубликован / аналитика получена"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "threat-model",
|
||||
"kind": "own",
|
||||
"needs": ["портал для моделирования угроз перед публикацией"],
|
||||
"produces": ["STRIDE-модель: attack surface + приоритеты защиты"],
|
||||
"constraints": ["self-authored; STRIDE going-public", "ADR-014 IS6 НЕ Trail of Bits #39 (портал+STRIDE vs generic deep-audit)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["карта точек входа → приоритизация по STRIDE"],
|
||||
"key-decisions": ["что защищать первым перед публикацией"],
|
||||
"acceptance-criteria": ["attack surface картирован, защита приоритизирована"]
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "trail-of-bits",
|
||||
"kind": "external",
|
||||
"needs": ["diff/код для глубокого security-аудита"],
|
||||
"produces": ["глубокий аудит-отчёт (diff-review / supply-chain / variant / static)"],
|
||||
"constraints": ["on-demand глубокий аудит (8 скилов)", "НЕ inline-блок (Security Guidance)", "НЕ быстрый SAST (Semgrep)"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["on-demand кампания, не в хуке"],
|
||||
"key-decisions": ["какой аудит-скил под задачу"],
|
||||
"acceptance-criteria": ["аудит покрыл diff/supply-chain/варианты"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "trivy",
|
||||
"kind": "external",
|
||||
"needs": ["Docker-образ для скана"],
|
||||
"produces": ["отчёт о CVE в OS-пакетах и зависимостях образа"],
|
||||
"constraints": ["скан Docker-образов в CI перед push в registry", "НЕ скан кода (Semgrep)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["trivy image перед push в Yandex Container Registry"],
|
||||
"key-decisions": ["порог severity для блока"],
|
||||
"acceptance-criteria": ["0 критичных CVE в образе"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "ui-ux-pro-max",
|
||||
"kind": "external",
|
||||
"needs": ["UI-задача, требующая материала (стиль / палитра / UX-гайд / график)"],
|
||||
"produces": ["UI-материалы: стили, палитры, UX-гайдлайны, паттерны графиков"],
|
||||
"constraints": ["материал, не решатель; только через PSR_v1 R14.3 pipeline", "не параллельно с Frontend Design (#30)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["активация только через R14.3 pipeline"],
|
||||
"key-decisions": ["какой материал нужен под задачу"],
|
||||
"acceptance-criteria": ["материал отобран, решение принимает Frontend Design"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "unisender-go-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["массовая email-рассылка через Unisender Go"],
|
||||
"produces": ["отправка маркетинговой email-рассылки"],
|
||||
"constraints": ["DEFERRED — нет upstream MCP, нужна своя обёртка", "ADR-015 MKT5: маркетинговые рассылки НЕ транзакционный email; 152-ФЗ согласия cross-ref #77/#71"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["при наличии обёртки"],
|
||||
"key-decisions": ["сегмент и согласия рассылки"],
|
||||
"acceptance-criteria": ["рассылка отправлена с соблюдением 152-ФЗ согласий (при наличии обёртки)"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "universal-icons-mcp",
|
||||
"kind": "external",
|
||||
"needs": ["потребность в SVG-иконке (не-Lucide коллекция)"],
|
||||
"produces": ["SVG-иконка из коллекции (Material/Tabler/Phosphor/...)"],
|
||||
"constraints": ["только не-Lucide коллекции (ADR-006: Lucide → lucide-vue-next)", "raw-SVG, не компонент"],
|
||||
"preview-form": "sample",
|
||||
"defaults": ["для Lucide использовать lucide-vue-next, не этот MCP"],
|
||||
"key-decisions": ["коллекция и конкретная иконка"],
|
||||
"acceptance-criteria": ["иконка вставлена из не-Lucide коллекции корректно"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "vitest",
|
||||
"kind": "external",
|
||||
"needs": ["Vue-компоненты/модули для unit/component-тестов"],
|
||||
"produces": ["результат прогона Vitest (pass/fail)"],
|
||||
"constraints": ["тесты Vue (jsdom, @vue/test-utils, Pinia)", "НЕ PHP-тесты (Pest)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["npm run test:vue"],
|
||||
"key-decisions": ["scope тестов"],
|
||||
"acceptance-criteria": ["все Vue-тесты зелёные"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "volar",
|
||||
"kind": "external",
|
||||
"needs": ["открытый .vue-файл в VSCode"],
|
||||
"produces": ["IntelliSense / go-to-definition / hover / диагностика типов в редакторе"],
|
||||
"constraints": ["VSCode-расширение (редактор-only)", "НЕ CI type-check (vue-tsc)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["работает в редакторе автоматически"],
|
||||
"key-decisions": ["нет ручного выбора — редакторная служба"],
|
||||
"acceptance-criteria": ["навигация/диагностика по .vue работают в редакторе"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "vue-tsc",
|
||||
"kind": "external",
|
||||
"needs": [".vue-компоненты для проверки типов"],
|
||||
"produces": ["отчёт о несоответствиях типов в шаблонах/script"],
|
||||
"constraints": ["полный type-check только в CI", "НЕ редакторная служба (Volar)"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["прогон в CI"],
|
||||
"key-decisions": ["scope проверки типов"],
|
||||
"acceptance-criteria": ["0 ошибок типов vue-tsc"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"skill": "ward",
|
||||
"kind": "external",
|
||||
"needs": ["Laravel-проект (.env/config/cookie/secrets/deps)"],
|
||||
"produces": ["аудит-отчёт безопасности настроек Laravel"],
|
||||
"constraints": ["Go CLI bin/ward.exe; заменил Enlightn (abandoned)", "ADR-014 IS3 НЕ Larastan #12/Semgrep #25"],
|
||||
"preview-form": "none",
|
||||
"defaults": ["скан .env/config/заголовков/secrets"],
|
||||
"key-decisions": ["какие настройки критичны"],
|
||||
"acceptance-criteria": ["настройки Laravel безопасны (нет High-находок)"],
|
||||
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"skill": "writing-plans",
|
||||
"kind": "own",
|
||||
"needs": ["spec or requirements", "file structure decisions"],
|
||||
"produces": ["implementation-plan with bite-sized TDD tasks"],
|
||||
"constraints": ["only writes the plan file", "no code, no reads beyond plan authoring"],
|
||||
"preview-form": "outline",
|
||||
"defaults": ["one action per step (2-5 min)", "test->RED->code->GREEN->commit"],
|
||||
"key-decisions": ["file structure / decomposition", "task granularity"],
|
||||
"acceptance-criteria": ["every step has concrete content (no placeholders)", "types consistent across tasks"]
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user