resolver-cow 0.2.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/assets/adapters/openspec/instructions.md +47 -0
- package/assets/prompts/fill-project-docs.md +43 -0
- package/dist/adapters/spec/index.js +1 -0
- package/dist/adapters/spec/index.js.map +1 -1
- package/dist/adapters/spec/openspec/delta.js +237 -0
- package/dist/adapters/spec/openspec/delta.js.map +1 -0
- package/dist/adapters/spec/openspec/index.js +81 -0
- package/dist/adapters/spec/openspec/index.js.map +1 -0
- package/dist/adapters/spec/openspec/parser.js +188 -0
- package/dist/adapters/spec/openspec/parser.js.map +1 -0
- package/dist/cli/commands/change.js +4 -1
- package/dist/cli/commands/change.js.map +1 -1
- package/dist/cli/commands/init.js +57 -9
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/prompt.js +68 -0
- package/dist/cli/commands/prompt.js.map +1 -0
- package/dist/cli/main.js +2 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/core/config.js +1 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/report.js +5 -1
- package/dist/core/report.js.map +1 -1
- package/dist/core/spec-model.js.map +1 -1
- package/docs/design.md +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ cow --version
|
|
|
18
18
|
## Быстрый старт в проекте продукта
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
cd <репозиторий продукта> #
|
|
21
|
+
cd <репозиторий продукта> # spec-box (.tms.json) или OpenSpec (openspec/specs); адаптер определяется автоматически
|
|
22
22
|
cow init --host claude # .cow/config.yaml, шаблоны .cow/project/*.md, .gitignore, скиллы и агенты Claude Code
|
|
23
23
|
# заполнить .cow/project/*.md
|
|
24
24
|
cow doctor # структурная проверка документации, спецификаций и сред запуска
|
|
@@ -34,7 +34,7 @@ cow next --change add-search # пакет для первой роли (re
|
|
|
34
34
|
src/core/ доменная модель, конфиг, состояние изменения (ревизия, lock), машина состояний, схема артефактов,
|
|
35
35
|
пакет для роли, приём отчёта, change-set, headless-цикл run, доставка и текст PR, гейты через PR,
|
|
36
36
|
отчёты тестов и покрытие, категории документации и doctor, архивация
|
|
37
|
-
src/adapters/ spec/spec-box — истина и дельты
|
|
37
|
+
src/adapters/ spec/spec-box, spec/openspec — истина и дельты в двух форматах; runner/claude, runner/codex — среды агентов;
|
|
38
38
|
repo/github, repo/local — хостинг репозитория; host/claude — материалы для Claude Code
|
|
39
39
|
src/cli/ команды commander: init, doctor, host, change, next, report, approve, reject,
|
|
40
40
|
status, instructions, validate, spec, archive
|
|
@@ -68,4 +68,6 @@ cow ci install --target github # workflows для GitHub Action
|
|
|
68
68
|
|
|
69
69
|
Готово (этапы 1 и 2): конфиг и раскладка `.cow/`, жизненный цикл изменения с гейтами, возвратами и бюджетом (`parked`), ревизия и lock `change.yaml`, пакеты и receipt запусков, приём отчётов с проверками (артефакты, дельты, задачи, защищённые тесты, дрейф change-set, disposition и `delivery_narrative` ревьюера), запечатывание change-set после реализации, адаптер spec-box, категории документации и структурный `doctor`, материалы для Claude Code, адаптеры сред Claude и Codex с надзором и одним транспортным повтором, `run`/`stop`/`watch`, адаптер GitHub с идемпотентной доставкой и каналом гейтов через комментарии, отчёты тестов jest/vitest/playwright и покрытие, шаблоны CI и Dockerfile.
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
Готово также: адаптер OpenSpec (истина в `openspec/specs`, дельты в родном синтаксисе ADDED/MODIFIED/REMOVED/RENAMED, текстовое применение с сохранением остальных разделов, `.openspec.yaml` в папке изменения для совместимости с CLI OpenSpec).
|
|
72
|
+
|
|
73
|
+
Не готово: дискавери и правила (этап 3), Arcadia и Codex-материалы для хоста (этап 4), межрепозиторный протокол (этап 5), wiki и дистилляция (этап 6), продолжение сессий Codex, семантический `doctor --deep`.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
## Формат дельты спецификаций (адаптер OpenSpec)
|
|
2
|
+
|
|
3
|
+
Истина хранится в `openspec/specs/<capability-path>/spec.md`: заголовок `# <Название> Specification`, раздел `## Purpose`, раздел `## Requirements` с блоками `### Requirement: <название>` (нормативный текст с SHALL или MUST) и сценариями `#### Scenario: <название>` в форме GIVEN / WHEN / THEN. Идентификатор capability это путь относительно `openspec/specs/`, например `auth` или `identity/user-auth` (`cow spec list --json`).
|
|
4
|
+
|
|
5
|
+
Дельта лежит в `specs/<capability-path>/spec.md` папки изменения, по одному файлу на capability. Она описывает только изменения:
|
|
6
|
+
|
|
7
|
+
```markdown
|
|
8
|
+
## Purpose
|
|
9
|
+
<!-- только для новой capability: 1–2 предложения, не короче 50 символов -->
|
|
10
|
+
|
|
11
|
+
## ADDED Requirements
|
|
12
|
+
|
|
13
|
+
### Requirement: Экспорт данных в CSV
|
|
14
|
+
Система SHALL позволять пользователю экспортировать свои данные в формате CSV.
|
|
15
|
+
|
|
16
|
+
#### Scenario: Успешный экспорт
|
|
17
|
+
- **GIVEN** пользователь авторизован
|
|
18
|
+
- **WHEN** пользователь нажимает «Экспорт»
|
|
19
|
+
- **THEN** система отдаёт CSV-файл со всеми данными пользователя
|
|
20
|
+
|
|
21
|
+
## MODIFIED Requirements
|
|
22
|
+
|
|
23
|
+
### Requirement: Истечение сессии
|
|
24
|
+
Система SHALL завершать сессию после 15 минут бездействия.
|
|
25
|
+
|
|
26
|
+
#### Scenario: Таймаут при бездействии
|
|
27
|
+
- **WHEN** проходит 15 минут без активности
|
|
28
|
+
- **THEN** сессия завершается
|
|
29
|
+
|
|
30
|
+
## REMOVED Requirements
|
|
31
|
+
|
|
32
|
+
### Requirement: Запомнить меня
|
|
33
|
+
**Reason**: Заменено двухфакторной аутентификацией
|
|
34
|
+
**Migration**: Пользователи входят заново в каждой сессии
|
|
35
|
+
|
|
36
|
+
## RENAMED Requirements
|
|
37
|
+
- FROM: `### Requirement: Старое название`
|
|
38
|
+
- TO: `### Requirement: Новое название`
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Правила:
|
|
42
|
+
- `MODIFIED`, `REMOVED`, `RENAMED` применимы только к требованиям, которые есть в истине (`cow spec show <capability-path> --json`); заголовок должен совпадать буква в букву.
|
|
43
|
+
- `MODIFIED` заменяет блок требования целиком: скопируйте существующий блок с всеми сценариями и измените нужное. Потерянные сценарии валидатор пометит предупреждением.
|
|
44
|
+
- Если меняется и название, и поведение: пара FROM/TO в `RENAMED` и полный блок в `MODIFIED` под новым названием.
|
|
45
|
+
- Для новой capability допустим только `ADDED` и обязателен `## Purpose`.
|
|
46
|
+
- Каждое требование содержит нормативный текст с SHALL или MUST и хотя бы один сценарий. Сценарии оформляются ровно четырьмя `#`: три `#` не распознаются.
|
|
47
|
+
- Названия сценариев попадают в имена тестов: пишите их коротко и без переносов строк.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
Заполни проектную документацию cow в каталоге `.cow/project/` по этому репозиторию.
|
|
2
|
+
|
|
3
|
+
## Что делать
|
|
4
|
+
|
|
5
|
+
1. Прочитай README, package.json (или аналог для стека), конфиги сборки, тестов, линтеров и CI, структуру каталогов и по несколько ключевых файлов в каждом крупном модуле. Не читай всё подряд: нужны факты для семи файлов ниже.
|
|
6
|
+
2. Заполни файлы `overview.md`, `architecture.md`, `conventions.md`, `testing.md`, `workflow.md`, `glossary.md`. Файл `contracts.md` заполняй только если продукт предоставляет или потребляет внешние API, события или схемы; иначе оставь его как есть.
|
|
7
|
+
3. Сохрани структуру каждого файла: фронтматтер и все заголовки `## …` из шаблона остаются, добавлять разделы можно, убирать нельзя. HTML-комментарии из шаблона замени содержанием или удали.
|
|
8
|
+
4. В конце выполни `cow doctor` и устрани ошибки. Doctor проверяет фронтматтер, наличие разделов, заглушки, существование упомянутых путей и скриптов из package.json.
|
|
9
|
+
|
|
10
|
+
## Правила содержания
|
|
11
|
+
|
|
12
|
+
- Только проверенные факты с указанием, откуда они: путь к файлу, скрипт, конфиг. Ничего не выдумывай и не пиши «обычно в таких проектах».
|
|
13
|
+
- Если факт не установлен, напиши «не установлено: <что и где проверить>» и вынеси вопрос в итоговый список. Не пиши TODO, TBD и угловые скобки: doctor считает их заглушками.
|
|
14
|
+
- Если раздел неприменим к проекту, напиши «—» и одну фразу, почему.
|
|
15
|
+
- Коротко и конкретно: таблицы и списки вместо абзацев, команды и пути в обратных кавычках. Ориентир: до 60 строк на файл, `glossary.md` и `architecture.md` могут быть длиннее.
|
|
16
|
+
- Пиши по-русски, идентификаторы, команды и пути оставляй как в коде.
|
|
17
|
+
- Во фронтматтере обнови `summary` под содержимое, `updated` на сегодняшнюю дату, `verification: needs-review`: проверять и утверждать буду я.
|
|
18
|
+
|
|
19
|
+
## На какие вопросы должен ответить каждый файл
|
|
20
|
+
|
|
21
|
+
| Файл | Обязательные ответы | Кто это читает |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| `overview.md` | Что за продукт и категория одной строкой; кто пользователи; какие системы рядом; где живёт код (корневые каталоги); где истина спецификаций ({{SPEC_TRUTH}}) и как её читать (`cow spec list`) | исследователь, планировщик |
|
|
24
|
+
| `architecture.md` | Таблица пакетов и модулей с ответственностью; точки входа (команды, обработчики, страницы); поток данных от входа к результату; границы модулей (кто с кем не может взаимодействовать напрямую); генерируемый код и что нельзя править руками | исследователь, планировщик, реализатор |
|
|
25
|
+
| `conventions.md` | Язык кода, комментариев и коммитов; форматтер и линтер с командами; запрещённые конструкции; именование файлов, модулей, тестов, веток; правила коммитов | реализатор, ревьюер, тестировщик |
|
|
26
|
+
| `testing.md` | Таблица уровней тестов: когда какой применять, где лежат, чем запускаются; команды узкого прогона одного файла и полного прогона, проверки типов и линтера; куда пишутся JSON-отчёты и как их получить; правило именования тестов по сценариям спецификации; среда e2e или «—»; что проверяется только руками | тестировщик, реализатор, верификатор |
|
|
27
|
+
| `workflow.md` | Базовая ветка и именование веток; требования к пул-реквесту; обязательные проверки CI; что запрещено без человека; список команд, которые агенты могут запускать без подтверждения | все роли с правом записи |
|
|
28
|
+
| `glossary.md` | Термины домена: термин, определение, где встречается в коде. Именно этими словами будут написаны спецификации и тесты | все роли |
|
|
29
|
+
| `contracts.md` | Внешние API, события, схемы данных, потребители, где лежат машиночитаемые контракты | планировщик, тестировщик |
|
|
30
|
+
|
|
31
|
+
Особое внимание правилу именования тестов в `testing.md`: инструмент сопоставляет тесты с утверждениями спецификации по цепочке {{SPEC_CHAIN}}. Опиши, как эта цепочка ложится на `describe` и `it` в тестах проекта, с примером.
|
|
32
|
+
|
|
33
|
+
## Что не делать
|
|
34
|
+
|
|
35
|
+
- Не менять другие файлы репозитория и код.
|
|
36
|
+
- Не переписывать существующие README и документацию: только `.cow/project/*.md`.
|
|
37
|
+
- Не задавать вопросы по ходу: собери их в конец.
|
|
38
|
+
|
|
39
|
+
## Формат ответа
|
|
40
|
+
|
|
41
|
+
1. Список заполненных файлов с одной строкой о содержании.
|
|
42
|
+
2. Результат `cow doctor`.
|
|
43
|
+
3. Вопросы и неустановленные факты списком, каждый с указанием, в каком файле и разделе стоит «не установлено».
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/spec/index.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,OAAO,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/spec/index.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { diag } from '../../../core/diagnostics.js';
|
|
2
|
+
import { blockToRequirement, codeFenceMask, extractRequirementsSection, normalizeLineEndings, parseRequirementBlocks, parseScenarios, renderRequirement, renderSpec, REQUIREMENT_HEADER, titleFromId, TOP_LEVEL } from './parser.js';
|
|
3
|
+
function splitSections(content) {
|
|
4
|
+
const lines = normalizeLineEndings(content).split('\n');
|
|
5
|
+
const mask = codeFenceMask(lines);
|
|
6
|
+
const indices = [];
|
|
7
|
+
lines.forEach((l, i) => {
|
|
8
|
+
const m = !mask[i] && l.match(/^##\s+(.+?)\s*$/);
|
|
9
|
+
if (m)
|
|
10
|
+
indices.push({ title: m[1], index: i });
|
|
11
|
+
});
|
|
12
|
+
const sections = indices.map((cur, k) => {
|
|
13
|
+
const end = indices[k + 1]?.index ?? lines.length;
|
|
14
|
+
return { title: cur.title, lines: lines.slice(cur.index + 1, end), mask: mask.slice(cur.index + 1, end) };
|
|
15
|
+
});
|
|
16
|
+
const headEnd = indices[0]?.index ?? lines.length;
|
|
17
|
+
return { head: lines.slice(0, headEnd), headMask: mask.slice(0, headEnd), sections };
|
|
18
|
+
}
|
|
19
|
+
const DELTA_SECTION = /^(ADDED|MODIFIED|REMOVED|RENAMED)\s+Requirements$/i;
|
|
20
|
+
export function parseOpenSpecDelta(content, capabilityId, source, truthIds) {
|
|
21
|
+
const { sections } = splitSections(content);
|
|
22
|
+
const ops = [];
|
|
23
|
+
const unknownSections = [];
|
|
24
|
+
const skippedHeaders = [];
|
|
25
|
+
let purpose;
|
|
26
|
+
const blocksOf = (s) => {
|
|
27
|
+
const parsed = parseRequirementBlocks(s.lines, s.mask);
|
|
28
|
+
s.lines.forEach((l, i) => {
|
|
29
|
+
if (!s.mask[i] && /^###\s+/.test(l) && !REQUIREMENT_HEADER.test(l))
|
|
30
|
+
skippedHeaders.push(l.trim());
|
|
31
|
+
});
|
|
32
|
+
return parsed.blocks;
|
|
33
|
+
};
|
|
34
|
+
const toReq = (b) => blockToRequirement(b);
|
|
35
|
+
const renamed = [];
|
|
36
|
+
const removed = [];
|
|
37
|
+
const modified = [];
|
|
38
|
+
const added = [];
|
|
39
|
+
for (const s of sections) {
|
|
40
|
+
if (/^Purpose$/i.test(s.title)) {
|
|
41
|
+
const text = s.lines.join('\n').trim();
|
|
42
|
+
if (text)
|
|
43
|
+
purpose = text;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const m = s.title.match(DELTA_SECTION);
|
|
47
|
+
if (!m) {
|
|
48
|
+
unknownSections.push(s.title);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const kind = m[1].toUpperCase();
|
|
52
|
+
if (kind === 'ADDED')
|
|
53
|
+
for (const b of blocksOf(s))
|
|
54
|
+
added.push({ op: 'add-requirement', requirement: toReq(b) });
|
|
55
|
+
if (kind === 'MODIFIED')
|
|
56
|
+
for (const b of blocksOf(s))
|
|
57
|
+
modified.push({ op: 'modify-requirement', requirement: toReq(b) });
|
|
58
|
+
if (kind === 'REMOVED') {
|
|
59
|
+
const blocks = blocksOf(s);
|
|
60
|
+
if (blocks.length > 0) {
|
|
61
|
+
for (const b of blocks) {
|
|
62
|
+
const reason = b.raw.match(/\*\*Reason\*\*\s*:?\s*(.+)/i)?.[1]?.trim();
|
|
63
|
+
const migration = b.raw.match(/\*\*Migration\*\*\s*:?\s*(.+)/i)?.[1]?.trim();
|
|
64
|
+
removed.push({ op: 'remove-requirement', requirementTitle: b.name, ...(reason ? { reason } : {}), ...(migration ? { migration } : {}) });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
s.lines.forEach((l, i) => {
|
|
68
|
+
const bullet = !s.mask[i] && l.match(/^\s*[-*+]\s*`?###\s*Requirement:\s*(.+?)`?\s*$/);
|
|
69
|
+
if (bullet)
|
|
70
|
+
removed.push({ op: 'remove-requirement', requirementTitle: bullet[1].trim() });
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (kind === 'RENAMED') {
|
|
74
|
+
let cur = {};
|
|
75
|
+
s.lines.forEach((l, i) => {
|
|
76
|
+
if (s.mask[i])
|
|
77
|
+
return;
|
|
78
|
+
const from = l.match(/^\s*[-*+]?\s*FROM:\s*`?###\s*Requirement:\s*(.+?)`?\s*$/);
|
|
79
|
+
const to = l.match(/^\s*[-*+]?\s*TO:\s*`?###\s*Requirement:\s*(.+?)`?\s*$/);
|
|
80
|
+
if (from)
|
|
81
|
+
cur.from = from[1].trim();
|
|
82
|
+
else if (to) {
|
|
83
|
+
cur.to = to[1].trim();
|
|
84
|
+
if (cur.from && cur.to) {
|
|
85
|
+
renamed.push({ from: cur.from, to: cur.to });
|
|
86
|
+
cur = {};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const r of renamed)
|
|
93
|
+
ops.push({ op: 'rename-requirement', from: r.from, to: r.to });
|
|
94
|
+
ops.push(...removed, ...modified, ...added);
|
|
95
|
+
const delta = { capabilityId, isNew: !truthIds.has(capabilityId), ops, source, ...(purpose ? { purpose } : {}) };
|
|
96
|
+
return { delta, unknownSections, skippedHeaders };
|
|
97
|
+
}
|
|
98
|
+
export const MIN_PURPOSE_LENGTH = 50;
|
|
99
|
+
export function validateOpenSpecDeltas(truth, deltas, extras = new Map()) {
|
|
100
|
+
const out = [];
|
|
101
|
+
const byId = new Map(truth.map((c) => [c.id, c]));
|
|
102
|
+
const seen = new Set();
|
|
103
|
+
for (const delta of deltas) {
|
|
104
|
+
const t = delta.source;
|
|
105
|
+
if (!/^[a-z0-9]+(?:[-][a-z0-9]+)*(?:\/[a-z0-9]+(?:[-][a-z0-9]+)*)*$/.test(delta.capabilityId)) {
|
|
106
|
+
out.push(diag('error', 'DELTA_CAPABILITY_ID', `Путь capability «${delta.capabilityId}» должен быть в kebab-case, сегменты через /`, t));
|
|
107
|
+
}
|
|
108
|
+
if (seen.has(delta.capabilityId))
|
|
109
|
+
out.push(diag('error', 'DELTA_DUPLICATE', `Дельта для ${delta.capabilityId} встречается дважды`, t));
|
|
110
|
+
seen.add(delta.capabilityId);
|
|
111
|
+
const extra = extras.get(delta.source);
|
|
112
|
+
for (const h of extra?.skippedHeaders ?? [])
|
|
113
|
+
out.push(diag('info', 'DELTA_SKIPPED_HEADER', `Заголовок «${h}» не является \`### Requirement:\` и будет пропущен`, t));
|
|
114
|
+
for (const s of extra?.unknownSections ?? [])
|
|
115
|
+
out.push(diag('warning', 'DELTA_UNKNOWN_SECTION', `Раздел «## ${s}» не относится к дельте и будет проигнорирован`, t));
|
|
116
|
+
const cap = byId.get(delta.capabilityId);
|
|
117
|
+
if (delta.ops.length === 0)
|
|
118
|
+
out.push(diag('error', 'DELTA_EMPTY', 'Дельта без операций ADDED, MODIFIED, REMOVED или RENAMED', t));
|
|
119
|
+
if (!cap) {
|
|
120
|
+
if (!delta.purpose)
|
|
121
|
+
out.push(diag('error', 'DELTA_NEW_PURPOSE', `Новая capability ${delta.capabilityId} без раздела \`## Purpose\``, t));
|
|
122
|
+
else if (delta.purpose.length < MIN_PURPOSE_LENGTH)
|
|
123
|
+
out.push(diag('warning', 'DELTA_NEW_PURPOSE', `Purpose короче ${MIN_PURPOSE_LENGTH} символов`, t));
|
|
124
|
+
for (const op of delta.ops)
|
|
125
|
+
if (op.op !== 'add-requirement')
|
|
126
|
+
out.push(diag('error', 'DELTA_NEW_OP', `Для новой capability допустим только ADDED, найдено ${op.op}`, t));
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
if (delta.purpose)
|
|
130
|
+
out.push(diag('info', 'DELTA_PURPOSE_IGNORED', 'Purpose существующей capability не меняется дельтой; правьте spec.md истины', t));
|
|
131
|
+
const titles = new Set(cap.requirements.map((r) => r.title));
|
|
132
|
+
const renamedFrom = new Set(delta.ops.filter((o) => o.op === 'rename-requirement').map((o) => o.from));
|
|
133
|
+
const renamedTo = new Set(delta.ops.filter((o) => o.op === 'rename-requirement').map((o) => o.to));
|
|
134
|
+
for (const op of delta.ops) {
|
|
135
|
+
switch (op.op) {
|
|
136
|
+
case 'rename-requirement':
|
|
137
|
+
if (!titles.has(op.from))
|
|
138
|
+
out.push(diag('error', 'DELTA_RENAME_FROM', `RENAMED: требования «${op.from}» нет в истине`, t));
|
|
139
|
+
if (titles.has(op.to))
|
|
140
|
+
out.push(diag('error', 'DELTA_RENAME_TO', `RENAMED: требование «${op.to}» уже существует`, t));
|
|
141
|
+
break;
|
|
142
|
+
case 'remove-requirement':
|
|
143
|
+
if (!titles.has(op.requirementTitle))
|
|
144
|
+
out.push(diag('error', 'DELTA_REMOVE_MISSING', `REMOVED: требования «${op.requirementTitle}» нет в истине`, t));
|
|
145
|
+
if (renamedFrom.has(op.requirementTitle))
|
|
146
|
+
out.push(diag('error', 'DELTA_REMOVE_RENAMED', `REMOVED: «${op.requirementTitle}» одновременно переименовано`, t));
|
|
147
|
+
if (!op.reason)
|
|
148
|
+
out.push(diag('warning', 'DELTA_REMOVE_REASON', `REMOVED «${op.requirementTitle}» без **Reason**`, t));
|
|
149
|
+
break;
|
|
150
|
+
case 'modify-requirement':
|
|
151
|
+
if (renamedFrom.has(op.requirement.title))
|
|
152
|
+
out.push(diag('error', 'DELTA_MODIFY_RENAMED', `MODIFIED: «${op.requirement.title}» переименовано, опишите под новым заголовком TO`, t));
|
|
153
|
+
else if (!titles.has(op.requirement.title) && !renamedTo.has(op.requirement.title))
|
|
154
|
+
out.push(diag('error', 'DELTA_MODIFY_MISSING', `MODIFIED: требования «${op.requirement.title}» нет в истине`, t, 'Для нового требования используйте ADDED.'));
|
|
155
|
+
else {
|
|
156
|
+
const current = cap.requirements.find((r) => r.title === op.requirement.title || renamedFrom.has(r.title));
|
|
157
|
+
if (current) {
|
|
158
|
+
const incoming = new Set(op.requirement.scenarios.map((s) => s.title));
|
|
159
|
+
const dropped = current.scenarios.filter((s) => !incoming.has(s.title)).map((s) => s.title);
|
|
160
|
+
if (dropped.length > 0)
|
|
161
|
+
out.push(diag('warning', 'DELTA_MODIFY_DROPS_SCENARIOS', `MODIFIED «${op.requirement.title}» теряет сценарии: ${dropped.join(', ')}`, t, 'MODIFIED заменяет блок целиком; чтобы убрать сценарий, используйте REMOVED + ADDED.'));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
case 'add-requirement':
|
|
166
|
+
if (titles.has(op.requirement.title))
|
|
167
|
+
out.push(diag('error', 'DELTA_ADD_EXISTS', `ADDED: требование «${op.requirement.title}» уже есть в истине; используйте MODIFIED`, t));
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const names = new Set();
|
|
173
|
+
for (const op of delta.ops) {
|
|
174
|
+
if (op.op !== 'add-requirement' && op.op !== 'modify-requirement')
|
|
175
|
+
continue;
|
|
176
|
+
const r = op.requirement;
|
|
177
|
+
if (names.has(r.title))
|
|
178
|
+
out.push(diag('error', 'DELTA_REQUIREMENT_DUPLICATE', `Требование «${r.title}» встречается дважды`, t));
|
|
179
|
+
names.add(r.title);
|
|
180
|
+
if (r.scenarios.length === 0)
|
|
181
|
+
out.push(diag('error', 'DELTA_NO_SCENARIO', `Требование «${r.title}» без сценария (\`#### Scenario:\`)`, t));
|
|
182
|
+
if (!r.text || !/\b(SHALL|MUST)\b/.test(r.text))
|
|
183
|
+
out.push(diag('warning', 'DELTA_NO_SHALL', `Требование «${r.title}» без нормативного текста с SHALL или MUST`, t));
|
|
184
|
+
if (r.raw && /^###\s+Scenario:/im.test(r.raw))
|
|
185
|
+
out.push(diag('error', 'DELTA_SCENARIO_LEVEL', `Сценарий в «${r.title}» оформлен тремя #: нужно ровно \`#### Scenario:\``, t));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return out;
|
|
189
|
+
}
|
|
190
|
+
/** Текстовое применение дельты к содержимому spec.md: неизменённые части сохраняются байт в байт. */
|
|
191
|
+
export function applyOpenSpecDelta(current, delta) {
|
|
192
|
+
if (current === null) {
|
|
193
|
+
const title = delta.title ?? titleFromId(delta.capabilityId);
|
|
194
|
+
const purpose = delta.purpose ?? `TBD - created by archiving change. Update Purpose after archive.`;
|
|
195
|
+
const blocks = delta.ops.filter((o) => o.op === 'add-requirement').map((o) => renderRequirement(o.requirement));
|
|
196
|
+
return `# ${title} Specification\n\n## Purpose\n${purpose}\n\n## Requirements\n\n${blocks.join('\n\n')}\n`;
|
|
197
|
+
}
|
|
198
|
+
const structure = extractRequirementsSection(current);
|
|
199
|
+
let blocks = [...structure.blocks];
|
|
200
|
+
const find = (name) => blocks.findIndex((b) => b.name === name);
|
|
201
|
+
for (const op of delta.ops) {
|
|
202
|
+
switch (op.op) {
|
|
203
|
+
case 'rename-requirement': {
|
|
204
|
+
const i = find(op.from);
|
|
205
|
+
if (i === -1)
|
|
206
|
+
break;
|
|
207
|
+
const b = blocks[i];
|
|
208
|
+
const newHeader = b.headerLine.replace(REQUIREMENT_HEADER, (_m, _n) => `### Requirement: ${op.to}`);
|
|
209
|
+
blocks[i] = { name: op.to, headerLine: newHeader, raw: b.raw.replace(b.headerLine, newHeader) };
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
case 'remove-requirement': {
|
|
213
|
+
const i = find(op.requirementTitle);
|
|
214
|
+
if (i !== -1)
|
|
215
|
+
blocks.splice(i, 1);
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
case 'modify-requirement': {
|
|
219
|
+
const i = find(op.requirement.title);
|
|
220
|
+
const raw = renderRequirement(op.requirement);
|
|
221
|
+
if (i === -1)
|
|
222
|
+
blocks.push({ name: op.requirement.title, headerLine: `### Requirement: ${op.requirement.title}`, raw });
|
|
223
|
+
else
|
|
224
|
+
blocks[i] = { name: op.requirement.title, headerLine: `### Requirement: ${op.requirement.title}`, raw };
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
case 'add-requirement': {
|
|
228
|
+
const raw = renderRequirement(op.requirement);
|
|
229
|
+
blocks.push({ name: op.requirement.title, headerLine: `### Requirement: ${op.requirement.title}`, raw });
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return renderSpec({ ...structure, blocks, hasRequirementsHeader: true });
|
|
235
|
+
}
|
|
236
|
+
export { parseScenarios, TOP_LEVEL };
|
|
237
|
+
//# sourceMappingURL=delta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delta.js","sourceRoot":"","sources":["../../../../src/adapters/spec/openspec/delta.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fg from 'fast-glob';
|
|
4
|
+
import { CowError } from '../../../core/errors.js';
|
|
5
|
+
import { assetsDir, exists, readText, toPosix, writeText } from '../../../core/paths.js';
|
|
6
|
+
import { registerSpecAdapter } from '../../../core/spec-adapter.js';
|
|
7
|
+
import { applyOpenSpecDelta, parseOpenSpecDelta, validateOpenSpecDeltas } from './delta.js';
|
|
8
|
+
import { parseSpecFile } from './parser.js';
|
|
9
|
+
/**
|
|
10
|
+
* Адаптер OpenSpec: истина в `<root>/specs/<capability-path>/spec.md`, дельты в родном синтаксисе OpenSpec
|
|
11
|
+
* в `specs/<capability-path>/spec.md` папки изменения, применение текстовое с сохранением остальных разделов.
|
|
12
|
+
*/
|
|
13
|
+
export class OpenSpecAdapter {
|
|
14
|
+
root;
|
|
15
|
+
config;
|
|
16
|
+
name = 'openspec';
|
|
17
|
+
lastParsed = new Map();
|
|
18
|
+
constructor(root, config) {
|
|
19
|
+
this.root = root;
|
|
20
|
+
this.config = config;
|
|
21
|
+
}
|
|
22
|
+
get specsRoot() {
|
|
23
|
+
return path.join(this.root, this.config.spec.openspec.root, 'specs');
|
|
24
|
+
}
|
|
25
|
+
async readTruth() {
|
|
26
|
+
if (!exists(this.specsRoot))
|
|
27
|
+
return [];
|
|
28
|
+
const files = fg.sync('**/spec.md', { cwd: this.specsRoot, onlyFiles: true, absolute: true }).sort();
|
|
29
|
+
return files.map((file) => {
|
|
30
|
+
const id = toPosix(path.relative(this.specsRoot, path.dirname(file)));
|
|
31
|
+
return parseSpecFile(readText(file), id, toPosix(path.relative(this.root, file)));
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async readDelta(dir) {
|
|
35
|
+
if (!exists(dir))
|
|
36
|
+
return [];
|
|
37
|
+
const truthIds = new Set((await this.readTruth()).map((c) => c.id));
|
|
38
|
+
const files = fg.sync('**/spec.md', { cwd: dir, onlyFiles: true, absolute: true }).sort();
|
|
39
|
+
this.lastParsed = new Map();
|
|
40
|
+
return files.map((file) => {
|
|
41
|
+
const id = toPosix(path.relative(dir, path.dirname(file)));
|
|
42
|
+
const source = toPosix(path.relative(this.root, file));
|
|
43
|
+
const parsed = parseOpenSpecDelta(readText(file), id, source, truthIds);
|
|
44
|
+
this.lastParsed.set(source, parsed);
|
|
45
|
+
return parsed.delta;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
validate(truth, deltas) {
|
|
49
|
+
return validateOpenSpecDeltas(truth, deltas, this.lastParsed);
|
|
50
|
+
}
|
|
51
|
+
async apply(truth, deltas) {
|
|
52
|
+
const byId = new Map(truth.map((c) => [c.id, c]));
|
|
53
|
+
const written = [];
|
|
54
|
+
for (const delta of deltas) {
|
|
55
|
+
const current = byId.get(delta.capabilityId);
|
|
56
|
+
const target = current?.source ? path.join(this.root, current.source) : path.join(this.specsRoot, delta.capabilityId, 'spec.md');
|
|
57
|
+
const next = applyOpenSpecDelta(current ? readText(target) : null, delta);
|
|
58
|
+
const remaining = current ? current.requirements.length - delta.ops.filter((o) => o.op === 'remove-requirement').length + delta.ops.filter((o) => o.op === 'add-requirement').length : 1;
|
|
59
|
+
if (remaining <= 0 && !/###\s*Requirement:/.test(next)) {
|
|
60
|
+
fs.rmSync(target, { force: true });
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
writeText(target, next);
|
|
64
|
+
}
|
|
65
|
+
written.push(toPosix(path.relative(this.root, target)));
|
|
66
|
+
}
|
|
67
|
+
return written;
|
|
68
|
+
}
|
|
69
|
+
instructions() {
|
|
70
|
+
return readText(path.join(assetsDir(), 'adapters', 'openspec', 'instructions.md'));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export function openSpecRootExists(root, config) {
|
|
74
|
+
return exists(path.join(root, config.spec.openspec.root));
|
|
75
|
+
}
|
|
76
|
+
registerSpecAdapter('openspec', (root, config) => {
|
|
77
|
+
if (!config.spec.openspec.root)
|
|
78
|
+
throw new CowError('OPENSPEC_ROOT', 'Не задан spec.openspec.root');
|
|
79
|
+
return new OpenSpecAdapter(root, config);
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapters/spec/openspec/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { slugify } from '../../../core/spec-model.js';
|
|
2
|
+
/**
|
|
3
|
+
* Разбор спецификаций OpenSpec (openspec/specs/<capability-path>/spec.md).
|
|
4
|
+
* Правила совпадают с парсером OpenSpec: `## Requirements` до следующего `## `, блоки `### Requirement:`,
|
|
5
|
+
* сценарии это любые заголовки `#### `, содержимое fenced-блоков кода игнорируется при поиске заголовков.
|
|
6
|
+
*/
|
|
7
|
+
export const REQUIREMENT_HEADER = /^###\s*Requirement:\s*(.+?)\s*$/i;
|
|
8
|
+
export const SCENARIO_HEADER = /^####\s+/;
|
|
9
|
+
export const REQUIREMENTS_SECTION = /^##\s+Requirements\s*$/i;
|
|
10
|
+
export const TOP_LEVEL = /^##\s+/;
|
|
11
|
+
export function normalizeLineEndings(content) {
|
|
12
|
+
return content.replace(/^/, '').replace(/\r\n?/g, '\n');
|
|
13
|
+
}
|
|
14
|
+
/** Маска строк внутри ``` или ~~~ fenced-блоков. */
|
|
15
|
+
export function codeFenceMask(lines) {
|
|
16
|
+
const mask = new Array(lines.length).fill(false);
|
|
17
|
+
let fence = null;
|
|
18
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
19
|
+
const m = lines[i].match(/^\s*(`{3,}|~{3,})/);
|
|
20
|
+
if (fence) {
|
|
21
|
+
mask[i] = true;
|
|
22
|
+
if (m && m[1][0] === fence[0] && m[1].length >= fence.length)
|
|
23
|
+
fence = null;
|
|
24
|
+
}
|
|
25
|
+
else if (m) {
|
|
26
|
+
fence = m[1];
|
|
27
|
+
mask[i] = true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return mask;
|
|
31
|
+
}
|
|
32
|
+
export function parseRequirementBlocks(lines, mask) {
|
|
33
|
+
const isReq = (i) => !mask[i] && REQUIREMENT_HEADER.test(lines[i]);
|
|
34
|
+
const isTop = (i) => !mask[i] && TOP_LEVEL.test(lines[i]);
|
|
35
|
+
const blocks = [];
|
|
36
|
+
let i = 0;
|
|
37
|
+
const preamble = [];
|
|
38
|
+
while (i < lines.length && !isReq(i)) {
|
|
39
|
+
preamble.push(lines[i]);
|
|
40
|
+
i += 1;
|
|
41
|
+
}
|
|
42
|
+
while (i < lines.length) {
|
|
43
|
+
if (!isReq(i)) {
|
|
44
|
+
i += 1;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const headerLine = lines[i];
|
|
48
|
+
const name = headerLine.match(REQUIREMENT_HEADER)[1].trim();
|
|
49
|
+
const buf = [headerLine];
|
|
50
|
+
i += 1;
|
|
51
|
+
while (i < lines.length && !isReq(i) && !isTop(i)) {
|
|
52
|
+
buf.push(lines[i]);
|
|
53
|
+
i += 1;
|
|
54
|
+
}
|
|
55
|
+
blocks.push({ name, headerLine, raw: buf.join('\n').trimEnd() });
|
|
56
|
+
}
|
|
57
|
+
return { preamble: preamble.join('\n').trimEnd(), blocks };
|
|
58
|
+
}
|
|
59
|
+
export function extractRequirementsSection(content) {
|
|
60
|
+
const lines = normalizeLineEndings(content).split('\n');
|
|
61
|
+
const mask = codeFenceMask(lines);
|
|
62
|
+
const headerIndex = lines.findIndex((l, i) => !mask[i] && REQUIREMENTS_SECTION.test(l));
|
|
63
|
+
if (headerIndex === -1) {
|
|
64
|
+
return { before: lines.join('\n'), hasRequirementsHeader: false, headerLine: '## Requirements', preamble: '', blocks: [], after: '' };
|
|
65
|
+
}
|
|
66
|
+
let end = lines.length;
|
|
67
|
+
for (let i = headerIndex + 1; i < lines.length; i += 1) {
|
|
68
|
+
if (!mask[i] && TOP_LEVEL.test(lines[i])) {
|
|
69
|
+
end = i;
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const body = parseRequirementBlocks(lines.slice(headerIndex + 1, end), mask.slice(headerIndex + 1, end));
|
|
74
|
+
return {
|
|
75
|
+
before: lines.slice(0, headerIndex).join('\n'),
|
|
76
|
+
hasRequirementsHeader: true,
|
|
77
|
+
headerLine: lines[headerIndex],
|
|
78
|
+
preamble: body.preamble,
|
|
79
|
+
blocks: body.blocks,
|
|
80
|
+
after: lines.slice(end).join('\n'),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function renderSpec(structure) {
|
|
84
|
+
const parts = [];
|
|
85
|
+
const before = structure.before.trimEnd();
|
|
86
|
+
if (before)
|
|
87
|
+
parts.push(before, '');
|
|
88
|
+
parts.push(structure.headerLine);
|
|
89
|
+
if (structure.preamble.trim())
|
|
90
|
+
parts.push(structure.preamble, '');
|
|
91
|
+
else
|
|
92
|
+
parts.push('');
|
|
93
|
+
for (const b of structure.blocks)
|
|
94
|
+
parts.push(b.raw, '');
|
|
95
|
+
const after = structure.after.trim();
|
|
96
|
+
if (after)
|
|
97
|
+
parts.push(after, '');
|
|
98
|
+
return `${parts.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd()}\n`;
|
|
99
|
+
}
|
|
100
|
+
/** Сценарии блока требования: любые `#### ` заголовки, как в OpenSpec. */
|
|
101
|
+
export function parseScenarios(raw) {
|
|
102
|
+
const lines = raw.split('\n');
|
|
103
|
+
const mask = codeFenceMask(lines);
|
|
104
|
+
const out = [];
|
|
105
|
+
let i = 0;
|
|
106
|
+
while (i < lines.length) {
|
|
107
|
+
if (mask[i] || !SCENARIO_HEADER.test(lines[i])) {
|
|
108
|
+
i += 1;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const title = lines[i].replace(SCENARIO_HEADER, '').replace(/[ \t]+#+[ \t]*$/, '').replace(/^Scenario:\s*/i, '').trim();
|
|
112
|
+
i += 1;
|
|
113
|
+
const body = [];
|
|
114
|
+
while (i < lines.length && (mask[i] || !SCENARIO_HEADER.test(lines[i]))) {
|
|
115
|
+
body.push(lines[i]);
|
|
116
|
+
i += 1;
|
|
117
|
+
}
|
|
118
|
+
const description = body.join('\n').trim();
|
|
119
|
+
out.push({ id: slugify(title), title, ...(description ? { description } : {}) });
|
|
120
|
+
}
|
|
121
|
+
return out;
|
|
122
|
+
}
|
|
123
|
+
/** Нормативный текст: строки между заголовком требования и первым сценарием. */
|
|
124
|
+
export function requirementText(raw) {
|
|
125
|
+
const lines = raw.split('\n').slice(1);
|
|
126
|
+
const mask = codeFenceMask(lines);
|
|
127
|
+
const firstScenario = lines.findIndex((l, i) => !mask[i] && SCENARIO_HEADER.test(l));
|
|
128
|
+
return (firstScenario === -1 ? lines : lines.slice(0, firstScenario)).join('\n').trim();
|
|
129
|
+
}
|
|
130
|
+
export function blockToRequirement(block) {
|
|
131
|
+
const text = requirementText(block.raw);
|
|
132
|
+
return { id: slugify(block.name), title: block.name, ...(text ? { text } : {}), scenarios: parseScenarios(block.raw), raw: block.raw };
|
|
133
|
+
}
|
|
134
|
+
/** Заголовок `# … Specification` и текст `## Purpose` из части до Requirements. */
|
|
135
|
+
export function parseHead(before, fallbackTitle) {
|
|
136
|
+
const lines = before.split('\n');
|
|
137
|
+
const mask = codeFenceMask(lines);
|
|
138
|
+
let title = fallbackTitle;
|
|
139
|
+
const h1 = lines.findIndex((l, i) => !mask[i] && /^#\s+/.test(l));
|
|
140
|
+
if (h1 !== -1)
|
|
141
|
+
title = lines[h1].replace(/^#\s+/, '').replace(/\s+Specification\s*$/i, '').trim() || fallbackTitle;
|
|
142
|
+
const purposeIndex = lines.findIndex((l, i) => !mask[i] && /^##\s+Purpose\s*$/i.test(l));
|
|
143
|
+
if (purposeIndex === -1)
|
|
144
|
+
return { title };
|
|
145
|
+
const body = [];
|
|
146
|
+
for (let i = purposeIndex + 1; i < lines.length; i += 1) {
|
|
147
|
+
if (!mask[i] && TOP_LEVEL.test(lines[i]))
|
|
148
|
+
break;
|
|
149
|
+
body.push(lines[i]);
|
|
150
|
+
}
|
|
151
|
+
const purpose = body.join('\n').trim();
|
|
152
|
+
return purpose ? { title, purpose } : { title };
|
|
153
|
+
}
|
|
154
|
+
export function parseSpecFile(content, capabilityId, source) {
|
|
155
|
+
const structure = extractRequirementsSection(content);
|
|
156
|
+
const head = parseHead(structure.before, titleFromId(capabilityId));
|
|
157
|
+
return {
|
|
158
|
+
id: capabilityId,
|
|
159
|
+
title: head.title,
|
|
160
|
+
...(head.purpose ? { purpose: head.purpose } : {}),
|
|
161
|
+
requirements: structure.blocks.map(blockToRequirement),
|
|
162
|
+
source,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** `identity/user-auth` → `User Auth`. */
|
|
166
|
+
export function titleFromId(id) {
|
|
167
|
+
const last = id.split('/').pop() ?? id;
|
|
168
|
+
return last
|
|
169
|
+
.split(/[-_]+/)
|
|
170
|
+
.filter(Boolean)
|
|
171
|
+
.map((w) => w[0].toUpperCase() + w.slice(1))
|
|
172
|
+
.join(' ');
|
|
173
|
+
}
|
|
174
|
+
/** Требование из внутренней модели в блок OpenSpec, если нет исходного raw. */
|
|
175
|
+
export function renderRequirement(req) {
|
|
176
|
+
if (req.raw)
|
|
177
|
+
return req.raw.trimEnd();
|
|
178
|
+
const parts = [`### Requirement: ${req.title}`];
|
|
179
|
+
if (req.text)
|
|
180
|
+
parts.push(req.text.trim());
|
|
181
|
+
for (const s of req.scenarios) {
|
|
182
|
+
parts.push('', `#### Scenario: ${s.title}`);
|
|
183
|
+
if (s.description)
|
|
184
|
+
parts.push(s.description.trim());
|
|
185
|
+
}
|
|
186
|
+
return parts.join('\n').trimEnd();
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/adapters/spec/openspec/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { createChange, listChanges, saveChange } from '../../core/change.js';
|
|
3
3
|
import { CowError } from '../../core/errors.js';
|
|
4
|
-
import { exists, readText } from '../../core/paths.js';
|
|
4
|
+
import { exists, readText, writeText } from '../../core/paths.js';
|
|
5
5
|
import { nextStep, resumeChange } from '../../core/phases.js';
|
|
6
6
|
import { clearStop } from '../../core/run.js';
|
|
7
7
|
import { artifactStates, loadWorkflow } from '../../core/schema.js';
|
|
@@ -39,6 +39,9 @@ export function registerChange(program) {
|
|
|
39
39
|
...(opts.size ? { size: opts.size } : {}),
|
|
40
40
|
...(opts.autonomy ? { autonomy: opts.autonomy } : {}),
|
|
41
41
|
});
|
|
42
|
+
if (ctx.config.spec.adapter === 'openspec') {
|
|
43
|
+
writeText(path.join(result.dir, '.openspec.yaml'), `schema: spec-driven\ncreated: ${result.change.created}\nskip_specs: false\n`);
|
|
44
|
+
}
|
|
42
45
|
emit(g, { id, dir: path.relative(ctx.root, result.dir), change: result.change }, (d) => `Создано изменение ${d.id} в ${d.dir}. Дальше: \`cow next --change ${d.id}\`.`);
|
|
43
46
|
}
|
|
44
47
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change.js","sourceRoot":"","sources":["../../../src/cli/commands/change.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAa,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"change.js","sourceRoot":"","sources":["../../../src/cli/commands/change.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { installClaudeMaterials } from '../../adapters/host/claude/index.js';
|
|
4
|
-
import { defaultConfig, saveConfig } from '../../core/config.js';
|
|
4
|
+
import { defaultConfig, loadConfig, saveConfig } from '../../core/config.js';
|
|
5
5
|
import { CowError } from '../../core/errors.js';
|
|
6
6
|
import { assetsDir, cowDir, exists, readText, today, writeText } from '../../core/paths.js';
|
|
7
7
|
import { DOC_CATEGORIES } from '../../core/project-docs.js';
|
|
@@ -11,23 +11,71 @@ export function registerInit(program) {
|
|
|
11
11
|
program
|
|
12
12
|
.command('init')
|
|
13
13
|
.description('Создать .cow/: конфиг, шаблоны проектной документации, каталог изменений; при --host сразу материалы для хоста')
|
|
14
|
-
.option('--adapter <name>', 'адаптер спецификаций: spec-box | openspec')
|
|
14
|
+
.option('--adapter <name>', 'адаптер спецификаций: spec-box | openspec; при существующем конфиге меняет только его')
|
|
15
15
|
.option('--host <name>', 'сразу установить материалы хоста: claude')
|
|
16
|
-
.option('--force', 'перезаписать
|
|
16
|
+
.option('--force', 'перезаписать конфиг целиком (документация не трогается)')
|
|
17
|
+
.option('--reset-docs', 'перезаписать заполненную документацию шаблонами')
|
|
17
18
|
.action((opts, cmd) => {
|
|
18
19
|
const g = cmd.optsWithGlobals();
|
|
19
20
|
try {
|
|
20
21
|
const root = path.resolve(g.cwd ?? process.cwd());
|
|
21
|
-
const adapter = (opts.adapter ?? 'spec-box');
|
|
22
|
-
if (adapter
|
|
23
|
-
throw new CowError('
|
|
22
|
+
const adapter = (opts.adapter ?? (exists(path.join(root, 'openspec', 'specs')) && !exists(path.join(root, '.tms.json')) ? 'openspec' : 'spec-box'));
|
|
23
|
+
if (adapter !== 'spec-box' && adapter !== 'openspec')
|
|
24
|
+
throw new CowError('ADAPTER_UNKNOWN', `Неизвестный адаптер ${String(adapter)}; доступны spec-box и openspec.`);
|
|
24
25
|
const dir = cowDir(root);
|
|
25
26
|
const created = [];
|
|
26
27
|
const notes = [];
|
|
27
28
|
const configFile = path.join(dir, 'config.yaml');
|
|
28
|
-
if (
|
|
29
|
+
if (exists(configFile) && !opts.force) {
|
|
30
|
+
// Повторный запуск: обновляем только адаптер и связанные пути, остальное сохраняем.
|
|
31
|
+
const current = loadConfig(root);
|
|
32
|
+
if (opts.adapter && current.spec.adapter !== adapter) {
|
|
33
|
+
current.spec.adapter = adapter;
|
|
34
|
+
if (adapter === 'openspec') {
|
|
35
|
+
const activeChanges = exists(path.join(root, current.changes.dir)) ? fs.readdirSync(path.join(root, current.changes.dir)).filter((n) => n !== 'archive' && n !== '.gitkeep') : [];
|
|
36
|
+
if (activeChanges.length === 0) {
|
|
37
|
+
current.changes.dir = 'openspec/changes';
|
|
38
|
+
notes.push('changes.dir переключён на openspec/changes для совместимости с CLI OpenSpec.');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
notes.push(`В ${current.changes.dir} есть изменения (${activeChanges.join(', ')}): changes.dir оставлен; перенесите их в openspec/changes и поправьте конфиг вручную, если нужна совместимость с CLI OpenSpec.`);
|
|
42
|
+
}
|
|
43
|
+
for (const sub of ['specs', 'changes', 'changes/archive']) {
|
|
44
|
+
const keep = path.join(root, 'openspec', sub, '.gitkeep');
|
|
45
|
+
if (!exists(path.join(root, 'openspec', sub))) {
|
|
46
|
+
writeText(keep, '');
|
|
47
|
+
created.push(keep);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const staleKeep = path.join(root, 'specs', '.gitkeep');
|
|
51
|
+
if (exists(staleKeep) && fs.readdirSync(path.join(root, 'specs')).length === 1) {
|
|
52
|
+
fs.rmSync(path.join(root, 'specs'), { recursive: true, force: true });
|
|
53
|
+
notes.push('Удалён пустой каталог specs/, созданный для spec-box.');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
saveConfig(root, current);
|
|
57
|
+
created.push(configFile);
|
|
58
|
+
notes.push(`Адаптер спецификаций переключён на ${adapter}; проверьте раздел «Истина спецификаций» в .cow/project/overview.md.`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
notes.push('Конфиг уже есть и не изменён: укажите --adapter для смены адаптера или --force для перезаписи.');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
29
65
|
const config = defaultConfig(adapter);
|
|
30
|
-
if (
|
|
66
|
+
if (adapter === 'openspec') {
|
|
67
|
+
// Совместимость с CLI OpenSpec: изменения живут в openspec/changes, истина в openspec/specs.
|
|
68
|
+
config.changes.dir = 'openspec/changes';
|
|
69
|
+
for (const sub of ['specs', 'changes', 'changes/archive']) {
|
|
70
|
+
const keep = path.join(root, 'openspec', sub, '.gitkeep');
|
|
71
|
+
if (!exists(path.join(root, 'openspec', sub))) {
|
|
72
|
+
writeText(keep, '');
|
|
73
|
+
created.push(keep);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
notes.push('Адаптер openspec: истина в openspec/specs/<capability>/spec.md, изменения в openspec/changes/<id>/ (совместимо с openspec CLI).');
|
|
77
|
+
}
|
|
78
|
+
else if (!exists(path.join(root, '.tms.json'))) {
|
|
31
79
|
// Нет конфига spec-box: истина будет жить в specs/*.spec-box.yml прямо в репозитории.
|
|
32
80
|
config.spec['spec-box'].files = ['specs/**/*.spec-box.yml'];
|
|
33
81
|
const keep = path.join(root, 'specs', '.gitkeep');
|
|
@@ -43,7 +91,7 @@ export function registerInit(program) {
|
|
|
43
91
|
const date = today();
|
|
44
92
|
for (const category of DOC_CATEGORIES) {
|
|
45
93
|
const target = path.join(dir, 'project', category.file);
|
|
46
|
-
if (exists(target) && !opts.
|
|
94
|
+
if (exists(target) && !opts.resetDocs)
|
|
47
95
|
continue;
|
|
48
96
|
writeText(target, readText(path.join(assetsDir(), 'project', category.file)).replace(/\{\{DATE\}\}/g, date));
|
|
49
97
|
created.push(target);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { CowError } from '../../core/errors.js';
|
|
4
|
+
import { assetsDir, readText } from '../../core/paths.js';
|
|
5
|
+
import { projectContext } from '../context.js';
|
|
6
|
+
import { emit, emitError } from '../output.js';
|
|
7
|
+
const PROMPTS = {
|
|
8
|
+
'project-docs': { file: 'fill-project-docs.md', description: 'Заполнить .cow/project/*.md по коду репозитория' },
|
|
9
|
+
};
|
|
10
|
+
/** Подстановки под адаптер спецификаций проекта. */
|
|
11
|
+
function substitutions(adapter) {
|
|
12
|
+
if (adapter === 'openspec') {
|
|
13
|
+
return {
|
|
14
|
+
SPEC_CHAIN: '«название capability › требование › сценарий» из `openspec/specs/<capability>/spec.md` (заголовки `# … Specification`, `### Requirement:`, `#### Scenario:`)',
|
|
15
|
+
SPEC_TRUTH: 'формат OpenSpec, файлы `openspec/specs/<capability>/spec.md`',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
SPEC_CHAIN: '«название фичи › группа › утверждение» из YAML spec-box (поля `feature`, ключ группы в `specs-unit`, `assert`)',
|
|
20
|
+
SPEC_TRUTH: 'формат spec-box, YAML-файлы по шаблонам из `.tms.json` или `spec.spec-box.files`',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function renderPrompt(name, adapter) {
|
|
24
|
+
const entry = PROMPTS[name];
|
|
25
|
+
if (!entry)
|
|
26
|
+
throw new CowError('NO_PROMPT', `Нет промпта ${name}; доступны: ${Object.keys(PROMPTS).join(', ')}`);
|
|
27
|
+
const subs = substitutions(adapter);
|
|
28
|
+
return readText(path.join(assetsDir(), 'prompts', entry.file)).replace(/\{\{(\w+)\}\}/g, (_m, key) => subs[key] ?? `{{${key}}}`);
|
|
29
|
+
}
|
|
30
|
+
export function registerPrompt(program) {
|
|
31
|
+
const prompt = program.command('prompt').description('Готовые промпты для хоста разработчика');
|
|
32
|
+
prompt
|
|
33
|
+
.command('list')
|
|
34
|
+
.description('Список промптов')
|
|
35
|
+
.action((_opts, cmd) => {
|
|
36
|
+
const g = cmd.optsWithGlobals();
|
|
37
|
+
emit(g, { prompts: Object.entries(PROMPTS).map(([name, p]) => ({ name, description: p.description })) }, (d) => d.prompts.map((p) => `${p.name}\t${p.description}`).join('\n'));
|
|
38
|
+
});
|
|
39
|
+
prompt
|
|
40
|
+
.command('show <name>')
|
|
41
|
+
.description('Напечатать промпт с формулировками под адаптер проекта')
|
|
42
|
+
.option('--adapter <name>', 'spec-box | openspec (по умолчанию из конфига проекта)')
|
|
43
|
+
.action((name, opts, cmd) => {
|
|
44
|
+
const g = cmd.optsWithGlobals();
|
|
45
|
+
try {
|
|
46
|
+
let adapter = opts.adapter;
|
|
47
|
+
if (!adapter) {
|
|
48
|
+
try {
|
|
49
|
+
adapter = projectContext(g.cwd).config.spec.adapter;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
adapter = 'spec-box';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const text = renderPrompt(name, adapter);
|
|
56
|
+
if (g.json)
|
|
57
|
+
emit(g, { name, adapter, text }, () => text);
|
|
58
|
+
else
|
|
59
|
+
process.stdout.write(`${text.trimEnd()}\n`);
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
emitError(g, e);
|
|
63
|
+
process.exitCode = 1;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export { fs };
|
|
68
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/cli/commands/prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/main.js
CHANGED
|
@@ -14,6 +14,7 @@ import { registerChangeset } from './commands/changeset.js';
|
|
|
14
14
|
import { registerDeliver } from './commands/deliver.js';
|
|
15
15
|
import { registerCoverage } from './commands/coverage.js';
|
|
16
16
|
import { registerCi } from './commands/ci.js';
|
|
17
|
+
import { registerPrompt } from './commands/prompt.js';
|
|
17
18
|
function readVersion() {
|
|
18
19
|
try {
|
|
19
20
|
return JSON.parse(fs.readFileSync(path.join(packageRoot(), 'package.json'), 'utf8')).version;
|
|
@@ -42,6 +43,7 @@ export function buildProgram() {
|
|
|
42
43
|
registerDeliver(program);
|
|
43
44
|
registerCoverage(program);
|
|
44
45
|
registerCi(program);
|
|
46
|
+
registerPrompt(program);
|
|
45
47
|
return program;
|
|
46
48
|
}
|
|
47
49
|
export async function main(argv) {
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.js
CHANGED
|
@@ -17,6 +17,7 @@ export const configSchema = z.object({
|
|
|
17
17
|
newFile: z.string().default('specs/{code}.spec-box.yml'),
|
|
18
18
|
})
|
|
19
19
|
.prefault({}),
|
|
20
|
+
openspec: z.object({ root: z.string().default('openspec') }).prefault({}),
|
|
20
21
|
}),
|
|
21
22
|
autonomy: z.enum(AUTONOMY_PROFILES).default('supervised'),
|
|
22
23
|
gates: z
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE/E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAU,CAAC;AAGrF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAG5D,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACzC,UAAU,EAAE,CAAC;aACV,MAAM,CAAC;YACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;YACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;SACzD,CAAC;aACD,QAAQ,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
package/dist/core/report.js
CHANGED
|
@@ -77,8 +77,12 @@ export async function applyReport(input) {
|
|
|
77
77
|
if (role === 'planner' && phase === 'propose') {
|
|
78
78
|
if (result.size)
|
|
79
79
|
change.size = result.size;
|
|
80
|
-
if (result.skip_specs !== undefined)
|
|
80
|
+
if (result.skip_specs !== undefined) {
|
|
81
81
|
change.skip_specs = result.skip_specs;
|
|
82
|
+
const openspecMeta = path.join(dir, '.openspec.yaml');
|
|
83
|
+
if (exists(openspecMeta))
|
|
84
|
+
writeText(openspecMeta, readText(openspecMeta).replace(/^skip_specs:.*$/m, `skip_specs: ${result.skip_specs}`));
|
|
85
|
+
}
|
|
82
86
|
}
|
|
83
87
|
if (result.complexity) {
|
|
84
88
|
const prev = change.complexity;
|
package/dist/core/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/core/report.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/core/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-model.js","sourceRoot":"","sources":["../../src/core/spec-model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spec-model.js","sourceRoot":"","sources":["../../src/core/spec-model.ts"],"names":[],"mappings":"AAqDA,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC;AAC5B,CAAC"}
|
package/docs/design.md
CHANGED
|
@@ -629,7 +629,7 @@ interface SpecAdapter {
|
|
|
629
629
|
}
|
|
630
630
|
```
|
|
631
631
|
|
|
632
|
-
Реализации: `spec-box` (YAML по глобам из `.tms.json`, `sync` вызывает `spec-box sync`), `openspec` (Markdown в `openspec/specs`,
|
|
632
|
+
Реализации: `spec-box` (YAML по глобам из `.tms.json`, `sync` вызывает `spec-box sync`), `openspec` (Markdown в `openspec/specs`, дельты в родном синтаксисе OpenSpec, применение текстовое с сохранением остальных разделов файла; при `cow init` изменения направляются в `openspec/changes`, а в папку изменения пишется `.openspec.yaml`, чтобы CLI OpenSpec видел изменение).
|
|
633
633
|
|
|
634
634
|
### Хостинг репозитория
|
|
635
635
|
|
|
@@ -816,6 +816,6 @@ packages/
|
|
|
816
816
|
| 3. Дискавери и правила | `discover` с дельтами и решениями, критерии достаточности, `discover validate`, повышение решений и проверка правил, `doctor --deep` | Изменение в `sync` по брифу проходит профиль `autonomous` без блокера `пользователь` |
|
|
817
817
|
| 4. Arcadia и Magic | Адаптер Arcadia с отдельным `arc mount` на изменение и идемпотентной доставкой в Arcanum, канал `tracker` с проекцией статуса тегами, материалы для Codex | Изменение в Magic проходит headless до готового к влитию пул-реквеста |
|
|
818
818
|
| 5. Несколько репозиториев | Координация, события, опрос и `github-dispatch` | Согласованное изменение в двух репозиториях доходит до двух пул-реквестов с правильным порядком мержа; проект для проверки выбирается, когда он появится |
|
|
819
|
-
| 6. Расширения |
|
|
819
|
+
| 6. Расширения | Схема `bugfix` с причинным контрактом и RED-оракулом, wiki и дистилляция, шина событий для Arcadia (адаптер OpenSpec реализован досрочно) | Порядок определяют потребности пилотов |
|
|
820
820
|
|
|
821
821
|
Каждый этап заканчивается изменением в реальном проекте, а не демонстрацией на образце.
|