feat(registry): токенизация needs/produces — батч superpowers (этап 2b, роутер-реестр)
Phase 2b батч 1: 14 superpowers-контрактов переведены с прозы на токены словаря. Словарь +13 (атомарные выходы + данности), всего 39 токенов, v0.3.0. Граф ожил для рабочих цепочек (рёбра producer->consumer): - brainstorming -> writing-plans -> executing-plans / subagent-driven - test-driven-development -> requesting-code-review -> receiving-code-review - finishing-a-development-branch (needs completed-change) Тесты: новый замок-тест батча (14 контрактов проходят словарь + рёбра графа); m3c-coverage-invariants просьба обновлена на токен; capability-vocabulary счётчик -> >= (словарь живой). Регрессия 4369 passed, exit 0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,33 +1,239 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"version": "0.3.0",
|
||||
"tokens": [
|
||||
{"token": "running-portal", "category": "given", "label": "работающий портал (DAST-цель)", "description": "Запущенный веб-портал как цель динамической проверки."},
|
||||
{"token": "laravel-config", "category": "given", "label": "конфигурация Laravel", "description": "Конфиг приложения Laravel (заголовки, debug, права)."},
|
||||
{"token": "pii-inventory-task", "category": "given", "label": "задача аудита ПДн", "description": "Запрос на аудит персональных данных по 152-ФЗ."},
|
||||
{"token": "portal-pre-launch", "category": "given", "label": "портал перед публикацией", "description": "Портал на стадии подготовки к выходу в интернет."},
|
||||
{"token": "dast-report", "category": "produced", "label": "отчёт DAST", "description": "Результат динамической атаки на живой портал (инъекции/XSS/обход входа/IDOR)."},
|
||||
{"token": "cve-exposure-scan", "category": "produced", "label": "скан CVE/экспозиции", "description": "Результат проверки известных уязвимостей и небезопасной внешней экспозиции."},
|
||||
{"token": "laravel-config-audit", "category": "produced", "label": "аудит конфигурации Laravel", "description": "Результат проверки безопасности конфигурации Laravel."},
|
||||
{"token": "pii-152fz-audit", "category": "produced", "label": "аудит ПДн/152-ФЗ", "description": "Результат аудита персональных данных на соответствие 152-ФЗ."},
|
||||
{"token": "stride-model", "category": "produced", "label": "STRIDE-модель угроз", "description": "Карта attack surface и приоритеты защиты перед публикацией."},
|
||||
{"token": "go-live-verdict", "category": "produced", "label": "вердикт go-live", "description": "Сводный вердикт GO/NO-GO по безопасности перед публикацией."},
|
||||
|
||||
{"token": "feature-spec", "category": "bridge", "label": "спека/требования фичи", "description": "Согласованный дизайн+требования или PRD до плана. Выход brainstorming / product-management:write-spec; вход writing-plans."},
|
||||
{"token": "implementation-plan", "category": "bridge", "label": "план реализации", "description": "Пошаговый план bite-sized задач. Выход writing-plans; вход executing-plans / subagent-driven-development."},
|
||||
{"token": "completed-change", "category": "bridge", "label": "завершённая правка", "description": "Готовое изменение кода до ревью/мержа. Выход test-driven-development; вход requesting-code-review / finishing-a-development-branch."},
|
||||
{"token": "code-review-feedback", "category": "bridge", "label": "фидбэк код-ревью", "description": "Замечания ревью до внедрения правок. Выход requesting-code-review; вход receiving-code-review."},
|
||||
{"token": "raw-research", "category": "bridge", "label": "сырой research", "description": "Интервью/опросы/тикеты/тесты до синтеза. Выход design-plugin:user-research; вход design-plugin:research-synthesis / product-management:synthesize-research."},
|
||||
{"token": "ui-design", "category": "bridge", "label": "решение UI/UX", "description": "Доменное UI/UX-решение (компоненты/паттерны/a11y). Выход frontend-design; вход design-plugin:design-handoff."},
|
||||
{"token": "marketing-draft", "category": "bridge", "label": "драфт маркетинг-контента", "description": "Черновик контента с форматированием. Выход marketing-plugin:draft-content; вход marketing-plugin:brand-review."},
|
||||
{"token": "content-framework", "category": "bridge", "label": "фреймворк контента", "description": "Шаблоны/фреймворки контента под канал. Выход marketing-plugin:content-creation; вход marketing-plugin:draft-content."},
|
||||
{"token": "close-entries", "category": "bridge", "label": "проводки close", "description": "Подготовленные проводки month-end (accruals/prepaid/depreciation). Выход finance-plugin:journal-entry-prep; вход finance-plugin:close-management."},
|
||||
|
||||
{"token": "feature-intent", "category": "given", "label": "идея фичи", "description": "Замысел фичи/компонента/изменения поведения до проработки. Вход brainstorming / product-management:write-spec."},
|
||||
{"token": "feature-or-bugfix", "category": "given", "label": "фича или багфикс", "description": "Задача на реализацию до написания кода. Вход test-driven-development."},
|
||||
{"token": "bug-or-failure", "category": "given", "label": "баг/падение", "description": "Баг, упавший тест или неожиданное поведение. Вход systematic-debugging."},
|
||||
{"token": "ui-task", "category": "given", "label": "UI-задача", "description": "Задача по интерфейсу: компонент/паттерн/состояние/a11y-принцип. Вход frontend-design / UI-пула."},
|
||||
{"token": "user-understanding-need", "category": "given", "label": "потребность понять пользователей", "description": "Запрос на исследование пользователей. Вход design-plugin:user-research."},
|
||||
{"token": "marketing-content-task", "category": "given", "label": "маркетинг-контент-задача", "description": "Задача создания маркетингового контента под канал. Вход marketing-plugin:content-creation."},
|
||||
{"token": "close-source-data", "category": "given", "label": "данные для close", "description": "Накопления/prepaid/амортизация для month-end. Вход finance-plugin:journal-entry-prep."}
|
||||
{
|
||||
"token": "running-portal",
|
||||
"category": "given",
|
||||
"label": "работающий портал (DAST-цель)",
|
||||
"description": "Запущенный веб-портал как цель динамической проверки."
|
||||
},
|
||||
{
|
||||
"token": "laravel-config",
|
||||
"category": "given",
|
||||
"label": "конфигурация Laravel",
|
||||
"description": "Конфиг приложения Laravel (заголовки, debug, права)."
|
||||
},
|
||||
{
|
||||
"token": "pii-inventory-task",
|
||||
"category": "given",
|
||||
"label": "задача аудита ПДн",
|
||||
"description": "Запрос на аудит персональных данных по 152-ФЗ."
|
||||
},
|
||||
{
|
||||
"token": "portal-pre-launch",
|
||||
"category": "given",
|
||||
"label": "портал перед публикацией",
|
||||
"description": "Портал на стадии подготовки к выходу в интернет."
|
||||
},
|
||||
{
|
||||
"token": "dast-report",
|
||||
"category": "produced",
|
||||
"label": "отчёт DAST",
|
||||
"description": "Результат динамической атаки на живой портал (инъекции/XSS/обход входа/IDOR)."
|
||||
},
|
||||
{
|
||||
"token": "cve-exposure-scan",
|
||||
"category": "produced",
|
||||
"label": "скан CVE/экспозиции",
|
||||
"description": "Результат проверки известных уязвимостей и небезопасной внешней экспозиции."
|
||||
},
|
||||
{
|
||||
"token": "laravel-config-audit",
|
||||
"category": "produced",
|
||||
"label": "аудит конфигурации Laravel",
|
||||
"description": "Результат проверки безопасности конфигурации Laravel."
|
||||
},
|
||||
{
|
||||
"token": "pii-152fz-audit",
|
||||
"category": "produced",
|
||||
"label": "аудит ПДн/152-ФЗ",
|
||||
"description": "Результат аудита персональных данных на соответствие 152-ФЗ."
|
||||
},
|
||||
{
|
||||
"token": "stride-model",
|
||||
"category": "produced",
|
||||
"label": "STRIDE-модель угроз",
|
||||
"description": "Карта attack surface и приоритеты защиты перед публикацией."
|
||||
},
|
||||
{
|
||||
"token": "go-live-verdict",
|
||||
"category": "produced",
|
||||
"label": "вердикт go-live",
|
||||
"description": "Сводный вердикт GO/NO-GO по безопасности перед публикацией."
|
||||
},
|
||||
{
|
||||
"token": "feature-spec",
|
||||
"category": "bridge",
|
||||
"label": "спека/требования фичи",
|
||||
"description": "Согласованный дизайн+требования или PRD до плана. Выход brainstorming / product-management:write-spec; вход writing-plans."
|
||||
},
|
||||
{
|
||||
"token": "implementation-plan",
|
||||
"category": "bridge",
|
||||
"label": "план реализации",
|
||||
"description": "Пошаговый план bite-sized задач. Выход writing-plans; вход executing-plans / subagent-driven-development."
|
||||
},
|
||||
{
|
||||
"token": "completed-change",
|
||||
"category": "bridge",
|
||||
"label": "завершённая правка",
|
||||
"description": "Готовое изменение кода до ревью/мержа. Выход test-driven-development; вход requesting-code-review / finishing-a-development-branch."
|
||||
},
|
||||
{
|
||||
"token": "code-review-feedback",
|
||||
"category": "bridge",
|
||||
"label": "фидбэк код-ревью",
|
||||
"description": "Замечания ревью до внедрения правок. Выход requesting-code-review; вход receiving-code-review."
|
||||
},
|
||||
{
|
||||
"token": "raw-research",
|
||||
"category": "bridge",
|
||||
"label": "сырой research",
|
||||
"description": "Интервью/опросы/тикеты/тесты до синтеза. Выход design-plugin:user-research; вход design-plugin:research-synthesis / product-management:synthesize-research."
|
||||
},
|
||||
{
|
||||
"token": "ui-design",
|
||||
"category": "bridge",
|
||||
"label": "решение UI/UX",
|
||||
"description": "Доменное UI/UX-решение (компоненты/паттерны/a11y). Выход frontend-design; вход design-plugin:design-handoff."
|
||||
},
|
||||
{
|
||||
"token": "marketing-draft",
|
||||
"category": "bridge",
|
||||
"label": "драфт маркетинг-контента",
|
||||
"description": "Черновик контента с форматированием. Выход marketing-plugin:draft-content; вход marketing-plugin:brand-review."
|
||||
},
|
||||
{
|
||||
"token": "content-framework",
|
||||
"category": "bridge",
|
||||
"label": "фреймворк контента",
|
||||
"description": "Шаблоны/фреймворки контента под канал. Выход marketing-plugin:content-creation; вход marketing-plugin:draft-content."
|
||||
},
|
||||
{
|
||||
"token": "close-entries",
|
||||
"category": "bridge",
|
||||
"label": "проводки close",
|
||||
"description": "Подготовленные проводки month-end (accruals/prepaid/depreciation). Выход finance-plugin:journal-entry-prep; вход finance-plugin:close-management."
|
||||
},
|
||||
{
|
||||
"token": "feature-intent",
|
||||
"category": "given",
|
||||
"label": "идея фичи",
|
||||
"description": "Замысел фичи/компонента/изменения поведения до проработки. Вход brainstorming / product-management:write-spec."
|
||||
},
|
||||
{
|
||||
"token": "feature-or-bugfix",
|
||||
"category": "given",
|
||||
"label": "фича или багфикс",
|
||||
"description": "Задача на реализацию до написания кода. Вход test-driven-development."
|
||||
},
|
||||
{
|
||||
"token": "bug-or-failure",
|
||||
"category": "given",
|
||||
"label": "баг/падение",
|
||||
"description": "Баг, упавший тест или неожиданное поведение. Вход systematic-debugging."
|
||||
},
|
||||
{
|
||||
"token": "ui-task",
|
||||
"category": "given",
|
||||
"label": "UI-задача",
|
||||
"description": "Задача по интерфейсу: компонент/паттерн/состояние/a11y-принцип. Вход frontend-design / UI-пула."
|
||||
},
|
||||
{
|
||||
"token": "user-understanding-need",
|
||||
"category": "given",
|
||||
"label": "потребность понять пользователей",
|
||||
"description": "Запрос на исследование пользователей. Вход design-plugin:user-research."
|
||||
},
|
||||
{
|
||||
"token": "marketing-content-task",
|
||||
"category": "given",
|
||||
"label": "маркетинг-контент-задача",
|
||||
"description": "Задача создания маркетингового контента под канал. Вход marketing-plugin:content-creation."
|
||||
},
|
||||
{
|
||||
"token": "close-source-data",
|
||||
"category": "given",
|
||||
"label": "данные для close",
|
||||
"description": "Накопления/prepaid/амортизация для month-end. Вход finance-plugin:journal-entry-prep."
|
||||
},
|
||||
{
|
||||
"token": "root-cause",
|
||||
"category": "produced",
|
||||
"label": "корневая причина",
|
||||
"description": "Найденная корневая причина бага ДО предложения фикса. Выход superpowers:systematic-debugging."
|
||||
},
|
||||
{
|
||||
"token": "review-response",
|
||||
"category": "produced",
|
||||
"label": "выверенный ответ на ревью",
|
||||
"description": "Технически проверенная реакция на фидбэк код-ревью (не слепое согласие). Выход superpowers:receiving-code-review."
|
||||
},
|
||||
{
|
||||
"token": "integration-decision",
|
||||
"category": "produced",
|
||||
"label": "решение интеграции ветки",
|
||||
"description": "Решение merge/PR/cleanup для завершённой ветки. Выход superpowers:finishing-a-development-branch."
|
||||
},
|
||||
{
|
||||
"token": "isolated-worktree",
|
||||
"category": "produced",
|
||||
"label": "изолированный worktree",
|
||||
"description": "Изолированное рабочее пространство (native или git-fallback). Выход superpowers:using-git-worktrees."
|
||||
},
|
||||
{
|
||||
"token": "parallel-dispatch",
|
||||
"category": "produced",
|
||||
"label": "параллельная раздача задач",
|
||||
"description": "Раздача 2+ независимых задач субагентам. Выход superpowers:dispatching-parallel-agents."
|
||||
},
|
||||
{
|
||||
"token": "verification-evidence",
|
||||
"category": "produced",
|
||||
"label": "доказательство готовности",
|
||||
"description": "Доказательство (прогон команд) ДО утверждения об успехе. Выход superpowers:verification-before-completion."
|
||||
},
|
||||
{
|
||||
"token": "skill-discipline",
|
||||
"category": "produced",
|
||||
"label": "дисциплина выбора навыков",
|
||||
"description": "Дисциплина поиска и вызова релевантных навыков ПЕРВЫМ делом. Выход superpowers:using-superpowers."
|
||||
},
|
||||
{
|
||||
"token": "authored-skill",
|
||||
"category": "produced",
|
||||
"label": "созданный навык",
|
||||
"description": "Навык, построенный TDD-процессом для процесс-документов. Выход superpowers:writing-skills."
|
||||
},
|
||||
{
|
||||
"token": "worktree-need",
|
||||
"category": "given",
|
||||
"label": "нужна изоляция",
|
||||
"description": "Потребность в изоляции рабочего пространства под фичу. Вход superpowers:using-git-worktrees."
|
||||
},
|
||||
{
|
||||
"token": "independent-tasks",
|
||||
"category": "given",
|
||||
"label": "независимые задачи",
|
||||
"description": "2+ независимые задачи без общего состояния и последовательных зависимостей. Вход superpowers:dispatching-parallel-agents."
|
||||
},
|
||||
{
|
||||
"token": "completion-claim",
|
||||
"category": "given",
|
||||
"label": "заявление о готовности",
|
||||
"description": "Заявление о готовности/успехе до коммита или PR. Вход superpowers:verification-before-completion."
|
||||
},
|
||||
{
|
||||
"token": "task-start",
|
||||
"category": "given",
|
||||
"label": "начало задачи",
|
||||
"description": "Начало любой задачи/разговора. Вход superpowers:using-superpowers."
|
||||
},
|
||||
{
|
||||
"token": "skill-authoring-intent",
|
||||
"category": "given",
|
||||
"label": "намерение создать/править навык",
|
||||
"description": "Намерение создать или править навык. Вход superpowers:writing-skills."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:brainstorming",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"идея фичи/компонента/изменения поведения до реализации"
|
||||
"feature-intent"
|
||||
],
|
||||
"produces": [
|
||||
"согласованный дизайн и требования (что и зачем) до кода"
|
||||
"feature-spec"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:dispatching-parallel-agents",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"2+ независимые задачи без общего состояния и последовательных зависимостей"
|
||||
"independent-tasks"
|
||||
],
|
||||
"produces": [
|
||||
"параллельная раздача задач субагентам"
|
||||
"parallel-dispatch"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:executing-plans",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"написанный план для исполнения с чекпойнтами ревью"
|
||||
"implementation-plan"
|
||||
],
|
||||
"produces": [
|
||||
"пакетное исполнение задач плана с чекпойнтами"
|
||||
"completed-change"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:finishing-a-development-branch",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"реализация завершена, тесты зелёные"
|
||||
"completed-change"
|
||||
],
|
||||
"produces": [
|
||||
"решение интеграции: merge / PR / cleanup"
|
||||
"integration-decision"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:receiving-code-review",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"полученная обратная связь код-ревью до внедрения правок"
|
||||
"code-review-feedback"
|
||||
],
|
||||
"produces": [
|
||||
"техническая проверка фидбэка (не слепое согласие)"
|
||||
"review-response"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:requesting-code-review",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"завершённая задача/фича до мержа"
|
||||
"completed-change"
|
||||
],
|
||||
"produces": [
|
||||
"запрос ревью, ловящий дефекты до каскада"
|
||||
"code-review-feedback"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:subagent-driven-development",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"план с независимыми задачами для исполнения в текущей сессии"
|
||||
"implementation-plan"
|
||||
],
|
||||
"produces": [
|
||||
"исполнение задач плана свежими субагентами + двухстадийное ревью"
|
||||
"completed-change"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:systematic-debugging",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"баг, упавший тест или неожиданное поведение"
|
||||
"bug-or-failure"
|
||||
],
|
||||
"produces": [
|
||||
"корневая причина, найденная ДО предложения фикса"
|
||||
"root-cause"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:test-driven-development",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"фича или багфикс до написания кода"
|
||||
"feature-or-bugfix"
|
||||
],
|
||||
"produces": [
|
||||
"цикл тест-первый: RED → минимальный код → GREEN → рефактор"
|
||||
"completed-change"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:using-git-worktrees",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"нужна изоляция рабочего пространства под фичу"
|
||||
"worktree-need"
|
||||
],
|
||||
"produces": [
|
||||
"изолированный worktree (native или git-fallback)"
|
||||
"isolated-worktree"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:using-superpowers",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"начало любой задачи/разговора"
|
||||
"task-start"
|
||||
],
|
||||
"produces": [
|
||||
"дисциплина поиска и вызова релевантных навыков ПЕРВЫМ делом"
|
||||
"skill-discipline"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:verification-before-completion",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"заявление о готовности/успехе до коммита или PR"
|
||||
"completion-claim"
|
||||
],
|
||||
"produces": [
|
||||
"доказательство (прогон команд) ДО любого утверждения об успехе"
|
||||
"verification-evidence"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:writing-plans",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"спека или требования для многошаговой задачи"
|
||||
"feature-spec"
|
||||
],
|
||||
"produces": [
|
||||
"план реализации из bite-sized TDD-задач без плейсхолдеров"
|
||||
"implementation-plan"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"skill": "superpowers:writing-skills",
|
||||
"kind": "external",
|
||||
"needs": [
|
||||
"создание или правка навыка"
|
||||
"skill-authoring-intent"
|
||||
],
|
||||
"produces": [
|
||||
"навык, построенный TDD-процессом для процесс-документов"
|
||||
"authored-skill"
|
||||
],
|
||||
"constraints": [
|
||||
"под-навык зонтика superpowers (процессный мета-скил)",
|
||||
|
||||
@@ -12,7 +12,8 @@ describe('capability-vocabulary.json — реальный файл словар
|
||||
});
|
||||
|
||||
it('фундамент-набор присутствует (A8 + мосты + данности)', () => {
|
||||
expect(r.tokens.size).toBe(26);
|
||||
// фундамент = 26 токенов; словарь живой, дорастает per-batch в 2b → >= не ==
|
||||
expect(r.tokens.size).toBeGreaterThanOrEqual(26);
|
||||
// A8-цепочка
|
||||
for (const t of ['running-portal', 'dast-report', 'go-live-verdict']) expect(r.tokens.has(t)).toBe(true);
|
||||
// мосты рабочих цепочек (создают рёбра графа)
|
||||
|
||||
@@ -14,7 +14,8 @@ describe('Машина 3-C — охват на реальных контракт
|
||||
const wp = JSON.parse(readFileSync(join(cdir, 'superpowers__writing-plans.contract.json'), 'utf8'));
|
||||
const pd = JSON.parse(readFileSync(join(cdir, 'operations-process-doc.contract.json'), 'utf8'));
|
||||
const { contracts } = buildRegistry([{ contract: wp, currentContent: '' }, { contract: pd, currentContent: '' }]);
|
||||
const r = readinessChecklist({ contracts, requests: ['план реализации из bite-sized TDD-задач без плейсхолдеров'] });
|
||||
// этап 2b: writing-plans токенизирован → produces ['implementation-plan']; просьба = токен словаря
|
||||
const r = readinessChecklist({ contracts, requests: ['implementation-plan'] });
|
||||
expect(Array.isArray(r.items)).toBe(true);
|
||||
expect(r.items).toHaveLength(4);
|
||||
expect(r.items.find((i) => /просьб/i.test(i.label)).ok).toBe(true);
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { readFileSync, readdirSync } from 'node:fs';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { dirname, join } from 'node:path';
|
||||
import { buildRegistry } from './skill-contract-registry.mjs';
|
||||
import { loadVocabulary } from './capability-vocabulary.mjs';
|
||||
import { buildDependencyGraph } from './coverage-machine.mjs';
|
||||
|
||||
const here = dirname(fileURLToPath(import.meta.url));
|
||||
const cdir = join(here, '..', 'docs', 'registry', 'contracts');
|
||||
const vocabPath = join(here, '..', 'docs', 'registry', 'capability-vocabulary.json');
|
||||
|
||||
const SP = readdirSync(cdir).filter((f) => f.startsWith('superpowers__') && f.endsWith('.contract.json'));
|
||||
const entries = SP.map((f) => ({ contract: JSON.parse(readFileSync(join(cdir, f), 'utf8')), currentContent: '' }));
|
||||
|
||||
describe('Phase 2b батч superpowers — замок словаря + рёбра графа', () => {
|
||||
const { tokens } = loadVocabulary({ path: vocabPath });
|
||||
|
||||
it('все 14 superpowers-контрактов проходят замок словаря (нет неизвестных токенов)', () => {
|
||||
expect(SP.length).toBe(14);
|
||||
const { contracts, errors } = buildRegistry(entries, { vocabTokens: tokens });
|
||||
expect(errors).toEqual([]);
|
||||
expect(contracts.length).toBe(14);
|
||||
});
|
||||
|
||||
it('рёбра рабочей цепочки сформированы (brainstorming→writing-plans→executing-plans)', () => {
|
||||
const { contracts } = buildRegistry(entries, { vocabTokens: tokens });
|
||||
const { edges } = buildDependencyGraph(contracts);
|
||||
const has = (from, to) => edges.some((e) => e.from === from && e.to === to);
|
||||
expect(has('superpowers:brainstorming', 'superpowers:writing-plans')).toBe(true); // via feature-spec
|
||||
expect(has('superpowers:writing-plans', 'superpowers:executing-plans')).toBe(true); // via implementation-plan
|
||||
expect(has('superpowers:test-driven-development', 'superpowers:requesting-code-review')).toBe(true); // via completed-change
|
||||
expect(has('superpowers:requesting-code-review', 'superpowers:receiving-code-review')).toBe(true); // via code-review-feedback
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user