diff --git a/docs/registry/contracts/claude-md-management.contract.json b/docs/registry/contracts/claude-md-management.contract.json deleted file mode 100644 index f36b8e5..0000000 --- a/docs/registry/contracts/claude-md-management.contract.json +++ /dev/null @@ -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": "" } -} diff --git a/docs/registry/contracts/claude-md-management__claude-md-improver.contract.json b/docs/registry/contracts/claude-md-management__claude-md-improver.contract.json new file mode 100644 index 0000000..2fdda9c --- /dev/null +++ b/docs/registry/contracts/claude-md-management__claude-md-improver.contract.json @@ -0,0 +1,12 @@ +{ + "skill": "claude-md-management:claude-md-improver", + "kind": "external", + "needs": ["намерение проверить/улучшить CLAUDE.md (audit или точечные правки структуры/правил §5)"], + "produces": ["quality-report по CLAUDE.md (rubric) + targeted-правки файла"], + "constraints": ["один из двух входов плагина claude-md-management", "правка CLAUDE.md — только через этот канал (§5 п.10)", "внутри flow — синхрон Pravila+Tooling (п.7)"], + "preview-form": "none", + "defaults": ["claude-md-improver — для структурных изменений, добавления/удаления секций, правок правил §5 и версии в шапке"], + "key-decisions": ["audit целиком vs точечная правка конкретной секции"], + "acceptance-criteria": ["quality-report выдан ДО правок; правки targeted; нормативка синхронна"], + "source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" } +} diff --git a/docs/registry/contracts/claude-md-management__revise-claude-md.contract.json b/docs/registry/contracts/claude-md-management__revise-claude-md.contract.json new file mode 100644 index 0000000..f62ac0a --- /dev/null +++ b/docs/registry/contracts/claude-md-management__revise-claude-md.contract.json @@ -0,0 +1,12 @@ +{ + "skill": "claude-md-management:revise-claude-md", + "kind": "external", + "needs": ["намерение захватить learnings текущей сессии в CLAUDE.md"], + "produces": ["CLAUDE.md дополнен session-learnings (новые quirks/команды/паттерны)"], + "constraints": ["один из двух входов плагина claude-md-management", "правка CLAUDE.md — только через этот канал (§5 п.10)", "внутри flow — синхрон Pravila+Tooling (п.7)"], + "preview-form": "none", + "defaults": ["revise-claude-md — для захвата learnings из текущей сессии"], + "key-decisions": ["что из сессии достойно CLAUDE.md, а что — memory"], + "acceptance-criteria": ["learnings внесены через плагин; нормативка синхронна"], + "source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" } +} diff --git a/docs/registry/nodes.yaml b/docs/registry/nodes.yaml index 74eb85e..a73c832 100644 --- a/docs/registry/nodes.yaml +++ b/docs/registry/nodes.yaml @@ -565,16 +565,34 @@ nodes: tooling_section: "§4.6 #32" conflicts_with: ["frontend-design", "ui-ux-pro-max"] - - id: "#33" - name: "claude-md-management" - slug: "claude-md-management" + - id: "#33a" + name: "claude-md-improver" + slug: "claude-md-management:claude-md-improver" category: "off-phase" subcategory: "infrastructure" status: "active" dormancy_reason: null - capabilities: "Плагин для управления файлом `CLAUDE.md`: аудит, целевые правки (claude-md-improver) и захват learnings из сессии (revise-claude-md); единственный разрешённый канал изменения CLAUDE.md." + capabilities: "Аудит и целевые правки CLAUDE.md: quality-report по rubric + targeted-обновления секций и правил §5. Один из двух входов плагина claude-md-management (единственный канал правки CLAUDE.md)." triggers: + - {keyword: "аудит claude.md", weight: 1.0} - {keyword: "правки claude.md", weight: 1.0} + boundaries: + - {relation: "CLAUDE.md §5 п.10 + PSR_v1 R10.1"} + chain_membership: ["L12"] + attributes: + tooling_section: "§4.7 #33" + install: "enabledPlugins.claude-md-management@claude-plugins-official в ~/.claude/settings.json" + + - id: "#33b" + name: "revise-claude-md" + slug: "claude-md-management:revise-claude-md" + category: "off-phase" + subcategory: "infrastructure" + status: "active" + dormancy_reason: null + capabilities: "Захват learnings текущей сессии в CLAUDE.md (новые quirks/команды/паттерны). Второй вход плагина claude-md-management." + triggers: + - {keyword: "захват learnings", weight: 1.0} - {keyword: "обязательный канал", weight: 1.0} boundaries: - {relation: "CLAUDE.md §5 п.10 + PSR_v1 R10.1"} @@ -1875,7 +1893,7 @@ chains: L12: name: "CLAUDE.md capture chain" sequence: - - "#33" + - "claude-md-management:claude-md-improver" - "claude-md-management:revise-claude-md" L13: diff --git a/docs/registry/schema.json b/docs/registry/schema.json index 56b75d1..382d0dd 100644 --- a/docs/registry/schema.json +++ b/docs/registry/schema.json @@ -22,7 +22,7 @@ "type": "object", "required": ["id", "name", "slug", "category", "status", "triggers"], "properties": { - "id": { "type": "string", "pattern": "^#\\d+$" }, + "id": { "type": "string", "pattern": "^#\\d+[a-z]?$" }, "name": { "type": "string", "minLength": 3 }, "slug": { "type": "string", "pattern": "^[a-z0-9-]+(:[a-z0-9-]+)*$" }, "category": { "enum": ["phase-0", "phase-1", "phase-2", "phase-3", "off-phase"] }, diff --git a/docs/registry/splitting-inventory.md b/docs/registry/splitting-inventory.md new file mode 100644 index 0000000..b29305d --- /dev/null +++ b/docs/registry/splitting-inventory.md @@ -0,0 +1,107 @@ +# Инвентаризация расщепления комков (разведка 2026-06-18) + +> Эпик «роутер-реестр», спека v2 §2 (D2). Источник: 4 субагента-разведчика сверили +> наши контракты `docs/registry/contracts/*.contract.json` (91 шт) с реальными навыками +> плагинов в `~/.claude/plugins/cache/`. Read-only разведка. Кодовая фраза «роутер-реестр». +> +> **Статус:** черновик до решений владельца (развилки внизу). Числа под-навыков — фактические. + +## Комки к расщеплению (плагин-зонтик → отдельные навыки `плагин:навык`) + +| # | Контракт (комок) | Плагин | Под-навыков | Уже вынесено | Новых файлов | +|---|---|---|---|---|---| +| 1 | superpowers | superpowers-dev | 14 | writing-plans | 13 | +| 2 | plugin-dev | claude-plugins-official | 7 | — | 7 | +| 3 | adr-kit | rvdbreemen-adr-kit | 8 (3 служебных) | — | 2–5 (решение B) | +| 4 | claude-md-management | claude-plugins-official | 2 | — | 2 | +| 5 | hookify | claude-plugins-official | 1–2 (+команды) | — | 1–2 | +| 6 | product-management | knowledge-work-plugins | 8 | — | 8 | +| 7 | design-plugin | knowledge-work-plugins | 7 | — | 7 | +| 8 | marketing-plugin | knowledge-work-plugins | 8 | — | 8 | +| 9 | operations | knowledge-work-plugins | 9 | operations-process-doc | 8 | +| 10 | finance-plugin | knowledge-work-plugins | 8 (журнал ×2?) | — | 7–8 | +| 11 | brand-voice | knowledge-work-plugins | 3 | — | 3 | + +Под-навыки по комкам: +- **superpowers (14):** using-superpowers, brainstorming, dispatching-parallel-agents, executing-plans, finishing-a-development-branch, receiving-code-review, requesting-code-review, subagent-driven-development, systematic-debugging, test-driven-development, writing-plans*, using-git-worktrees, verification-before-completion, writing-skills. (*writing-plans уже отдельным контрактом.) +- **plugin-dev (7):** agent-development, command-development, hook-development, mcp-integration, plugin-structure, plugin-settings, skill-development. +- **adr-kit (8):** adr, judge — содержательные; init, install-hooks, lint, migrate, setup, upgrade — служебные/инфра (кандидаты на исключение, развилка B). +- **claude-md-management (2):** claude-md-improver, revise-claude-md. +- **hookify:** содержательный навык writing-rules + главный hookify; configure/list/help — команды, не навыки. +- **product-management (8):** write-spec, roadmap-update, metrics-review, product-brainstorming, sprint-planning, stakeholder-update, synthesize-research, competitive-brief. +- **design-plugin (7):** accessibility-review, design-critique, design-handoff, design-system, research-synthesis, user-research, ux-copy. (Контракт сейчас покрывает лишь 3 — несоответствие.) +- **marketing-plugin (8):** brand-review, campaign-plan, competitive-brief, content-creation, draft-content, email-sequence, performance-report, seo-audit. +- **operations (9):** capacity-plan, change-request, compliance-tracking, process-doc*, process-optimization, risk-assessment, runbook, status-report, vendor-review. (*process-doc уже вынесен в operations-process-doc.) +- **finance-plugin (8):** audit-support, close-management, financial-statements, journal-entry, journal-entry-prep, reconciliation, sox-testing, variance-analysis. (journal-entry vs journal-entry-prep — возможный дубль, уточнить.) +- **brand-voice (3):** brand-voice-enforcement, discover-brand, guideline-generation. + +## НЕ расщеплять (атомарные / материал / оркестратор) + +- **ui-ux-pro-max** — физически 7 навыков (banner-design, brand, design, design-system, slides, ui-styling, ui-ux-pro-max), НО по нормативке (CLAUDE.md §5.5, PSR R10.1/R11.5/R14.3) это **резерв-библиотека-материал, не решатель** — как marketingskills. Оставляем атомарным маркером-материалом. (Развилка C — подтвердить.) +- **marketingskills** — библиотека 40 фреймворков-материалов (ADR-015 MKT3). Атомарный. +- **marketing-ru** — self-authored РФ-навык (own). Атомарный. +- **security-go-live** — НЕ комок, а композитный оркестратор (needs 5 выходов owasp-zap/nuclei/ward/pdn-152fz/threat-model). Уже правильный. Не трогать. +- **ccpm, postiz, discovery-interview, 21st-magic, frontend-design, skill-creator, architecture-patterns, normative-sync, prod-deploy-validator, data-scientist, laravel-backend-patterns, process-analysis, process-modeling, billing-audit, ru-tax-accounting, security-guidance, trail-of-bits, owasp-zap, nuclei, threat-model, ward, pdn-152fz-audit, roave-security, trivy, nightowl** + все *-mcp / pg-* / линтеры (gitleaks, vitest, pest, pint, larastan, php-insights, rector, deptrac, eslint-prettier, stylelint, markdownlint, lychee, cspell, mermaid, squawk, ide-helper, volar, vue-tsc, pa11y, histoire, boost, context7, dependabot) — одиночные инструменты/навыки. + +## Аномалии и недопокрытия (отдельно от расщепления) + +- **semgrep** — представляет 1 из 3 навыков плагина static-analysis (есть ещё codeql, sarif-parsing). Это НЕДОПОКРЫТИЕ охвата, не расщепление. Решить отдельно: заводить ли codeql/sarif-parsing. +- **operations-process-doc** — уже вынесенный под-навык operations (name `operations:process-doc`). При расщеплении operations — не плодить дубль, переиспользовать. +- **design-plugin** — контракт описывает 3 из 7 реальных навыков (рассогласование «контракт ↔ плагин»). +- **finance journal-entry vs journal-entry-prep** — похожие описания, проверить на дубль. +- **trail-of-bits пакет** — в кэше 8 security-плагинов (static-analysis×3, differential-review, audit-context-building, variant-analysis, supply-chain-risk-auditor, insecure-defaults, sharp-edges, agentic-actions-auditor). У нас контракт только trail-of-bits (атомарный) + semgrep. Вопрос охвата, не расщепления. + +## Подсчёт «91 → ~150» + +- Комков: **11** (если ui-ux-pro-max оставить материалом). +- Под-навыков в комках: ≈ 14+7+8+2+2+8+7+8+9+8+3 = **76** (с adr-kit полным) или ≈ **70** (adr-kit только adr/judge). +- Уже вынесено: 2 (writing-plans, operations-process-doc). +- Итог реестра: 91 − 11 зонтиков + ~76 под-навыков ≈ **156** (или ~150 при урезании служебных adr-kit). + +→ «91» = файлов сейчас; «~150» = навыков после расщепления. Сходится. + +## Решения владельца (зафиксировано 2026-06-18) + +- **A. Зонтик-контракт → УБРАТЬ** (по спеке v2 §2: растворяется в под-навыки). После разворачивания удаляем `superpowers.contract.json`, `product-management.contract.json` и т.п. +- **B. adr-kit → только `adr` + `judge`** (содержательные «решатели», роутер их подбирает). Служебные init/install-hooks/lint/migrate/setup/upgrade — инфра-команды разовой настройки, в реестр НЕ тащим (роутеру нечего подбирать). *(Принято по логике «что произойдёт при вызове»; если владелец захочет иначе — поправить.)* +- **C. ui-ux-pro-max → РАЗВЕРНУТЬ на 7 с пометкой роли + правка PSR (путь 2).** По сути под-навыки (banner/slides/design-system/ui-styling…) — разные задачи, роутер подберёт точнее. НО в каждом под-контракте `constraints` фиксируют роль: «материал/решение по UI; стек приводить к Vue+Vuetify (R6.0); финальный код — Frontend Design (paired-stack)». Разворачивание UPM **тянет правку PSR** (сейчас PSR говорит «UPM — материал, не разворачивать») — отдельный аккуратный шаг нормативного синхрона. +- **D. Мелочь:** finance journal-entry vs journal-entry-prep — проверить на дубль при разворачивании (свести или оставить оба с разными визитками); semgrep-недопокрытие (codeql/sarif-parsing) — отдельной задачей охвата, не в этом разворачивании. + +## Итоговый список к разворачиванию (12 комков) + +| # | Комок | Новых под-навыков | Примечание | +|---|---|---|---| +| 1 | superpowers | 13 | writing-plans уже есть | +| 2 | plugin-dev | 7 | | +| 3 | adr-kit | 2 | только adr, judge | +| 4 | claude-md-management | 2 | | +| 5 | hookify | 1–2 | writing-rules (+hookify); команды не навыки | +| 6 | product-management | 8 | | +| 7 | design-plugin | 7 | контракт покрывал 3 из 7 | +| 8 | marketing-plugin | 8 | | +| 9 | operations | 8 | process-doc уже вынесен | +| 10 | finance-plugin | 7–8 | journal дубль? | +| 11 | brand-voice | 3 | | +| 12 | ui-ux-pro-max | 7 | + правка PSR | + +Сумма ≈ **73–75** новых под-навыков. Реестр: 91 − 12 зонтиков + ~75 ≈ **~154**. Сходится с «~150». + +## Инженерные заметки для плана (решить в плане) + +- **Имя файла vs поле skill.** Поле `skill` = `плагин:навык` (с двоеточием, спека §2). НО двоеточие в имени файла на Windows запрещено → имя файла без двоеточия. Прецеденты: `writing-plans.contract.json` (просто slug), `operations-process-doc.contract.json` (дефис). **Коллизия:** `competitive-brief` есть И у product-management, И у marketing — значит имя файла ОБЯЗАНО нести плагин. Предлагаемая конвенция: `<плагин>__<навык>.contract.json` (двойное подчёркивание), поле `skill` внутри = `<плагин>:<навык>`. +- **needs/produces** на этапе разворачивания — временно прозой/скелетом; токены словаря надеваем на этапе графа (порядок «расщепить → потом граф»). Замок словаря опционален → регрессию не ломает. +- **Контент полей** под-контракта (визитка, constraints, defaults, key-decisions, acceptance) — из frontmatter `name:`/`description:` + тела SKILL.md плагина; для own-навыков — из наших источников. + +## Конвенция разворачивания — ВЫВЕРЕНА пилотом claude-md-management (2026-06-18) + +Пилот `claude-md-management` (2 навыка) прошёл зелёным (полная регрессия 4361 passed, 0 failed). Подтверждённый рецепт для остальных 11 комков — разворачивание трогает **ДВА файла + схему + один тест-счётчик**: + +1. **Карточка** `docs/registry/contracts/<плагин>__<навык>.contract.json` (двойное подчёркивание в имени; двоеточие в имени файла Windows не держит). Поле `skill: "<плагин>:<навык>"`. `kind:external` + `source{version:"n/a", hash:<64 нуля>, path:""}` (G4 инертен). needs/produces пока краткой прозой. +2. **Узел** в `docs/registry/nodes.yaml`: зонтик `#NN` → дочерние `#NNa`, `#NNb`, … . Поля узла: `id`, `name` (≥3 симв), `slug:"<плагин>:<навык>"`, `category`, `status`, `triggers` (обязательны) + `capabilities`/`boundaries`/`chain_membership`/`attributes`. +3. **Схема** `docs/registry/schema.json`: паттерн `id` расширен на `^#\d+[a-z]?$` (допускает дочерний суффикс) — **уже сделано пилотом, для всех комков работает**. `slug` паттерн `^[a-z0-9-]+(:[a-z0-9-]+)*$` двоеточие уже допускал. +4. **Зонтик удаляется** в ОБОИХ местах: карточка (`<плагин>.contract.json`) + узел `#NN`. Карточку удалять скриптом-файлом (`node tools/_del.mjs` с `unlinkSync`) — пол режет `rm`. +5. **Цепочки L** (`chain_membership` + ссылки на `#NN` в `chains:`): трогать минимально (заменить ссылку `#NN` на slug под-узла). **Полный снос L1-L17 — отдельный эпик** (спека §2): затрагивает `registry-load.mjs` (`chains`/`findChainsByNode`), `node-graph.mjs` (`relatedByChain`), `schema.json` (`chains` в `required`), их тесты. НЕ смешивать с разворачиванием. +6. **Счётчик узлов:** `tools/registry-load.test.mjs` хардкодит число узлов (`toHaveLength(N)`) и активных — обновлять на каждый комок (разворачивание `#NN`→k под-узлов даёт +(k−1) узлов и активных). +7. **Инвариант-сторож** `tools/m3e-card-coverage-invariants.test.mjs` ловит рассинхрон «узел↔карточка» — НЕ глушить, а синхронизировать оба места. + +**Артефакты пилота:** план `docs/superpowers/plans/2026-06-18-split-pilot-claude-md-management.md`, тест `tools/split-pilot-claude-md.test.mjs`. Контракты: `claude-md-management__claude-md-improver`, `claude-md-management__revise-claude-md`. Узлы: `#33a`, `#33b`. **Не закоммичено** (коммит — терминал владельца). diff --git a/docs/superpowers/plans/2026-06-18-split-pilot-claude-md-management.md b/docs/superpowers/plans/2026-06-18-split-pilot-claude-md-management.md new file mode 100644 index 0000000..8f15c84 --- /dev/null +++ b/docs/superpowers/plans/2026-06-18-split-pilot-claude-md-management.md @@ -0,0 +1,138 @@ +# Пилот разворачивания комка: claude-md-management — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Развернуть комок `claude-md-management.contract.json` (зонтик плагина) в 2 отдельные карточки-навыка `claude-md-management:claude-md-improver` и `claude-md-management:revise-claude-md`, удалив зонтик — и тем самым **выверить конвенцию разворачивания** для остальных 11 комков эпика. + +**Architecture:** Каждый под-навык — отдельный `.contract.json`. Поле `skill` = `<плагин>:<навык>` (двоеточие; валидатор `validateContract` его допускает — проверено). Имя файла двоеточие на Windows не держит → конвенция имени `<плагин>__<навык>.contract.json` (двойное подчёркивание; нужно, т.к. короткий slug коллизирует — `competitive-brief` есть и у product-management, и у marketing). Зонтик-контракт удаляется (спека v2 §2: растворяется в под-навыки). `needs/produces` пока краткой прозой — токены словаря наденем на этапе графа (порядок эпика «расщепить → потом граф»; замок словаря опционален, регрессию не ломает). `kind: external` + `source{version:"n/a", hash:<64 нуля>, path:""}` как у текущего зонтика → G4-страж дрейфа инертен (официальный плагин, версию не сторожим). + +**Tech Stack:** Node ESM, vitest, JSON-контракты в `docs/registry/contracts/`, модули `tools/skill-contract.mjs` + `tools/skill-contract-registry.mjs`. + +--- + +## File Structure + +- **Create:** `docs/registry/contracts/claude-md-management__claude-md-improver.contract.json` — карточка навыка audit/targeted-updates. +- **Create:** `docs/registry/contracts/claude-md-management__revise-claude-md.contract.json` — карточка навыка захвата learnings. +- **Delete:** `docs/registry/contracts/claude-md-management.contract.json` — зонтик (растворён). +- **Create (test):** `tools/split-pilot-claude-md.test.mjs` — проверяет: оба под-контракта валидны и грузятся реестром; зонтик отсутствует; весь каталог формо-валиден (errors === []). + +--- + +## Цель + +Выверить на самом маленьком комке (2 навыка) полную механику разворачивания: имя файла без двоеточия, поле `skill` с двоеточием, удаление зонтика, прохождение валидатора, отсутствие регрессии в реестре/охвате. Конвенция, подтверждённая пилотом, переиспользуется планами кластеров (superpowers, product-management, …). Источник — спека v2 §2 (D2) + реестр `docs/registry/splitting-inventory.md`. + +--- + +### Task 1: Тест пилота (RED) + +**Files:** +- Create: `tools/split-pilot-claude-md.test.mjs` + +- [ ] **Шаг 1: Написать падающий тест** + +```js +import { describe, it, expect } from 'vitest'; +import { loadRegistry } from './skill-contract-registry.mjs'; + +const DIR = 'docs/registry/contracts'; + +describe('пилот разворачивания claude-md-management', () => { + const reg = loadRegistry({ dir: DIR }); + const skills = reg.contracts.map((c) => c.skill); + + it('весь каталог контрактов формо-валиден (нет ошибок сборки)', () => { + expect(reg.errors).toEqual([]); + }); + + it('зонтик claude-md-management удалён', () => { + expect(skills).not.toContain('claude-md-management'); + }); + + it('оба под-навыка заведены с адресацией плагин:навык', () => { + expect(skills).toContain('claude-md-management:claude-md-improver'); + expect(skills).toContain('claude-md-management:revise-claude-md'); + }); +}); +``` + +- [ ] **Шаг 2: Прогнать тест — убедиться, что падает** + +Run: `npx vitest run tools/split-pilot-claude-md.test.mjs` +Expected: FAIL — зонтик ещё на месте (`skills` содержит `claude-md-management`), под-навыков ещё нет. + +### Task 2: Создать карточку claude-md-improver + +**Files:** +- Create: `docs/registry/contracts/claude-md-management__claude-md-improver.contract.json` + +- [ ] **Шаг 3: Записать контракт** + +```json +{ + "skill": "claude-md-management:claude-md-improver", + "kind": "external", + "needs": ["намерение проверить/улучшить CLAUDE.md (audit или точечные правки структуры/правил §5)"], + "produces": ["quality-report по CLAUDE.md (rubric) + targeted-правки файла"], + "constraints": ["один из двух входов плагина claude-md-management", "правка CLAUDE.md — только через этот канал (§5 п.10)", "внутри flow — синхрон Pravila+Tooling (п.7)"], + "preview-form": "none", + "defaults": ["claude-md-improver — для структурных изменений, добавления/удаления секций, правок правил §5 и версии в шапке"], + "key-decisions": ["audit целиком vs точечная правка конкретной секции"], + "acceptance-criteria": ["quality-report выдан ДО правок; правки targeted; нормативка синхронна"], + "source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" } +} +``` + +### Task 3: Создать карточку revise-claude-md + +**Files:** +- Create: `docs/registry/contracts/claude-md-management__revise-claude-md.contract.json` + +- [ ] **Шаг 4: Записать контракт** + +```json +{ + "skill": "claude-md-management:revise-claude-md", + "kind": "external", + "needs": ["намерение захватить learnings текущей сессии в CLAUDE.md"], + "produces": ["CLAUDE.md дополнен session-learnings (новые quirks/команды/паттерны)"], + "constraints": ["один из двух входов плагина claude-md-management", "правка CLAUDE.md — только через этот канал (§5 п.10)", "внутри flow — синхрон Pravila+Tooling (п.7)"], + "preview-form": "none", + "defaults": ["revise-claude-md — для захвата learnings из текущей сессии"], + "key-decisions": ["что из сессии достойно CLAUDE.md, а что — memory"], + "acceptance-criteria": ["learnings внесены через плагин; нормативка синхронна"], + "source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" } +} +``` + +### Task 4: Удалить зонтик + +**Files:** +- Delete: `docs/registry/contracts/claude-md-management.contract.json` + +- [ ] **Шаг 5: Удалить файл зонтика** + +Удалить `docs/registry/contracts/claude-md-management.contract.json` (через файловую операцию; под полом — скриптом-файлом `os.remove`, не `rm`). + +### Task 5: Зелёный прогон + регрессия + +- [ ] **Шаг 6: Прогнать тест пилота — убедиться, что проходит** + +Run: `npx vitest run tools/split-pilot-claude-md.test.mjs` +Expected: PASS — все 3 теста зелёные. + +- [ ] **Шаг 7: Полная регрессия реестра/охвата** + +Run: `npx vitest run` (полный свод из корня claude-brain — было 118 зелёных) +Expected: PASS — ни один тест не опирался на зонтик `claude-md-management`; число контрактов выросло на 1 (−1 зонтик +2 под-навыка). Если какой-то тест ассертит точное число контрактов или наличие `claude-md-management` — поправить тот тест (ожидаемое следствие разворачивания, зафиксировать в плане кластера). + +--- + +## Само-ревью (по навыку) + +- **Покрытие спеки:** план реализует §2 спеки v2 (адресация `плагин:навык`, растворение зонтика) в режиме пилота на 1 комке — для выверки конвенции перед массовой раскаткой (§8 «стадийно»). +- **Плейсхолдеры:** нет — тест-код и оба контракта приведены целиком с реальным контентом из SKILL.md / нашей нормативки. +- **Согласованность типов:** поле `skill` со значением `плагин:навык` проходит `validateContract` (требует лишь non-empty string); `kind:external` требует `source{version,hash}` — заданы (hash 64-hex нулей, как у зонтика); `preview-form:none` — в enum. Имя файла `__` проходит фильтр `loadRegistry` (`.endsWith('.contract.json')`). +- **Регрессия:** Шаг 7 — полный свод; риск только у теста, жёстко завязанного на старый зонтик (поправить точечно). +- **Выход пилота:** подтверждённая конвенция (имя файла `<плагин>__<навык>`, поле `skill:<плагин>:<навык>`, external+zero-hash, удаление зонтика, регрессия зелёная) → переиспользуется планами кластеров. diff --git a/tools/registry-load.test.mjs b/tools/registry-load.test.mjs index 9d15b37..97c7e47 100644 --- a/tools/registry-load.test.mjs +++ b/tools/registry-load.test.mjs @@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi describe('registry-load', () => { beforeEach(() => clearCache()); - it('loads registry (89 nodes after #87-89 research-tooling added 14.06.2026)', () => { + it('loads registry (90 nodes: 89 + разворачивание #33 → #33a/#33b 18.06.2026)', () => { const r = loadRegistry(); - expect(r.nodes).toHaveLength(89); + expect(r.nodes).toHaveLength(90); expect(r.version).toBe('0.1.0'); }); @@ -46,9 +46,9 @@ describe('registry-load', () => { it('findActiveNodes excludes non-active (nodes.yaml registry)', () => { const r = loadRegistry(); const active = findActiveNodes(r); - // 89 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred, - // #84/#85/#86 (project-agents 24.05 + graphifyy 27.05) + #87/#88/#89 (research-tooling 14.06) are active → 78 + 3 = 81 active - expect(active).toHaveLength(81); + // 90 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred, + // #84/#85/#86 + #87/#88/#89 active; #33 (1 active) развёрнут в #33a/#33b (2 active) → +1 → 82 active + expect(active).toHaveLength(82); expect(active.map(n => n.id)).toContain('#18'); expect(active.map(n => n.id)).toContain('#19'); expect(active.map(n => n.id)).not.toContain('#1'); diff --git a/tools/split-pilot-claude-md.test.mjs b/tools/split-pilot-claude-md.test.mjs new file mode 100644 index 0000000..980e9a2 --- /dev/null +++ b/tools/split-pilot-claude-md.test.mjs @@ -0,0 +1,22 @@ +import { describe, it, expect } from 'vitest'; +import { loadRegistry } from './skill-contract-registry.mjs'; + +const DIR = 'docs/registry/contracts'; + +describe('пилот разворачивания claude-md-management', () => { + const reg = loadRegistry({ dir: DIR }); + const skills = reg.contracts.map((c) => c.skill); + + it('весь каталог контрактов формо-валиден (нет ошибок сборки)', () => { + expect(reg.errors).toEqual([]); + }); + + it('зонтик claude-md-management удалён', () => { + expect(skills).not.toContain('claude-md-management'); + }); + + it('оба под-навыка заведены с адресацией плагин:навык', () => { + expect(skills).toContain('claude-md-management:claude-md-improver'); + expect(skills).toContain('claude-md-management:revise-claude-md'); + }); +});