@spec-box/sdd 0.6.4
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 +81 -0
- package/assets/adapters/openspec/instructions.md +47 -0
- package/assets/adapters/spec-box/instructions.md +44 -0
- package/assets/ci/Dockerfile +9 -0
- package/assets/ci/github-sbox-run.yml +85 -0
- package/assets/ci/github-tests.yml +25 -0
- package/assets/project/architecture.md +29 -0
- package/assets/project/contracts.md +29 -0
- package/assets/project/conventions.md +29 -0
- package/assets/project/decisions.README.md +3 -0
- package/assets/project/glossary.md +13 -0
- package/assets/project/overview.md +29 -0
- package/assets/project/testing.md +34 -0
- package/assets/project/workflow.md +29 -0
- package/assets/prompts/fill-project-docs.md +43 -0
- package/assets/roles/challenger.md +33 -0
- package/assets/roles/distiller.md +18 -0
- package/assets/roles/implementer.md +39 -0
- package/assets/roles/planner.md +58 -0
- package/assets/roles/researcher.md +47 -0
- package/assets/roles/reviewer.md +68 -0
- package/assets/roles/tester.md +36 -0
- package/assets/roles/verifier.md +57 -0
- package/assets/schema/default.yaml +121 -0
- package/assets/schema/sbox-answer.schema.json +42 -0
- package/assets/templates/coverage.yaml +12 -0
- package/assets/templates/design.md +48 -0
- package/assets/templates/proposal.md +27 -0
- package/assets/templates/tasks.md +9 -0
- package/assets/templates/test-plan.md +7 -0
- package/bin/sbox.js +5 -0
- package/dist/adapters/host/claude/index.js +112 -0
- package/dist/adapters/host/claude/index.js.map +1 -0
- package/dist/adapters/repo/git.js +81 -0
- package/dist/adapters/repo/git.js.map +1 -0
- package/dist/adapters/repo/github/index.js +136 -0
- package/dist/adapters/repo/github/index.js.map +1 -0
- package/dist/adapters/repo/index.js +4 -0
- package/dist/adapters/repo/index.js.map +1 -0
- package/dist/adapters/repo/local.js +47 -0
- package/dist/adapters/repo/local.js.map +1 -0
- package/dist/adapters/runner/claude.js +129 -0
- package/dist/adapters/runner/claude.js.map +1 -0
- package/dist/adapters/runner/codex.js +151 -0
- package/dist/adapters/runner/codex.js.map +1 -0
- package/dist/adapters/runner/index.js +4 -0
- package/dist/adapters/runner/index.js.map +1 -0
- package/dist/adapters/spec/index.js +4 -0
- package/dist/adapters/spec/index.js.map +1 -0
- package/dist/adapters/spec/openspec/delta.js +268 -0
- package/dist/adapters/spec/openspec/delta.js.map +1 -0
- package/dist/adapters/spec/openspec/index.js +107 -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/adapters/spec/spec-box/delta.js +198 -0
- package/dist/adapters/spec/spec-box/delta.js.map +1 -0
- package/dist/adapters/spec/spec-box/index.js +112 -0
- package/dist/adapters/spec/spec-box/index.js.map +1 -0
- package/dist/adapters/spec/spec-box/yaml.js +74 -0
- package/dist/adapters/spec/spec-box/yaml.js.map +1 -0
- package/dist/cli/commands/artifacts.js +86 -0
- package/dist/cli/commands/artifacts.js.map +1 -0
- package/dist/cli/commands/change.js +111 -0
- package/dist/cli/commands/change.js.map +1 -0
- package/dist/cli/commands/changeset.js +81 -0
- package/dist/cli/commands/changeset.js.map +1 -0
- package/dist/cli/commands/ci.js +45 -0
- package/dist/cli/commands/ci.js.map +1 -0
- package/dist/cli/commands/coverage.js +45 -0
- package/dist/cli/commands/coverage.js.map +1 -0
- package/dist/cli/commands/deliver.js +71 -0
- package/dist/cli/commands/deliver.js.map +1 -0
- package/dist/cli/commands/doctor.js +55 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/host.js +30 -0
- package/dist/cli/commands/host.js.map +1 -0
- package/dist/cli/commands/init.js +150 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/metrics.js +62 -0
- package/dist/cli/commands/metrics.js.map +1 -0
- package/dist/cli/commands/prompt.js +68 -0
- package/dist/cli/commands/prompt.js.map +1 -0
- package/dist/cli/commands/protocol.js +151 -0
- package/dist/cli/commands/protocol.js.map +1 -0
- package/dist/cli/commands/run.js +157 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/spec.js +84 -0
- package/dist/cli/commands/spec.js.map +1 -0
- package/dist/cli/commands/wiring.js +50 -0
- package/dist/cli/commands/wiring.js.map +1 -0
- package/dist/cli/context.js +18 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/main.js +63 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.js +31 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/core/archive.js +77 -0
- package/dist/core/archive.js.map +1 -0
- package/dist/core/change.js +240 -0
- package/dist/core/change.js.map +1 -0
- package/dist/core/changeset.js +98 -0
- package/dist/core/changeset.js.map +1 -0
- package/dist/core/config.js +144 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/coverage.js +69 -0
- package/dist/core/coverage.js.map +1 -0
- package/dist/core/deliver.js +190 -0
- package/dist/core/deliver.js.map +1 -0
- package/dist/core/diagnostics.js +12 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/drift.js +44 -0
- package/dist/core/drift.js.map +1 -0
- package/dist/core/errors.js +12 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/gates.js +76 -0
- package/dist/core/gates.js.map +1 -0
- package/dist/core/lock.js +57 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/metrics.js +140 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/packet.js +172 -0
- package/dist/core/packet.js.map +1 -0
- package/dist/core/paths.js +63 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/phases.js +203 -0
- package/dist/core/phases.js.map +1 -0
- package/dist/core/pr-body.js +64 -0
- package/dist/core/pr-body.js.map +1 -0
- package/dist/core/project-docs.js +246 -0
- package/dist/core/project-docs.js.map +1 -0
- package/dist/core/protect.js +47 -0
- package/dist/core/protect.js.map +1 -0
- package/dist/core/repo-host.js +11 -0
- package/dist/core/repo-host.js.map +1 -0
- package/dist/core/report.js +286 -0
- package/dist/core/report.js.map +1 -0
- package/dist/core/result.js +90 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/roles.js +18 -0
- package/dist/core/roles.js.map +1 -0
- package/dist/core/run.js +222 -0
- package/dist/core/run.js.map +1 -0
- package/dist/core/runner.js +40 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/schema.js +104 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/spec-adapter.js +12 -0
- package/dist/core/spec-adapter.js.map +1 -0
- package/dist/core/spec-model.js +8 -0
- package/dist/core/spec-model.js.map +1 -0
- package/dist/core/tasks.js +15 -0
- package/dist/core/tasks.js.map +1 -0
- package/dist/core/test-reports.js +60 -0
- package/dist/core/test-reports.js.map +1 -0
- package/dist/core/wiki.js +86 -0
- package/dist/core/wiki.js.map +1 -0
- package/dist/core/wiring.js +65 -0
- package/dist/core/wiring.js.map +1 -0
- package/docs/design.md +829 -0
- package/package.json +66 -0
package/README.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# @spec-box/sdd
|
|
2
|
+
|
|
3
|
+
Инструмент автономной реализации продуктовых фич ИИ-агентами: вы даёте описание фичи, агенты-роли проводят её через исследование, предложение, спецификации, дизайн, тесты, реализацию, верификацию и ревью до пул-реквеста, готового к влитию. Состояние процесса хранится в файлах репозитория продукта.
|
|
4
|
+
|
|
5
|
+
Проект входит в группу [spec-box](https://github.com/spec-box): инструменты для работы со спецификациями и автотестами. Репозиторий: [github.com/spec-box/sdd](https://github.com/spec-box/sdd).
|
|
6
|
+
|
|
7
|
+
Замысел и устройство описаны в [docs/design.md](docs/design.md). Ниже то, что уже реализовано (этапы 1 и 2 плана).
|
|
8
|
+
|
|
9
|
+
## Установка
|
|
10
|
+
|
|
11
|
+
Требуется Node.js 22. Инструмент ставится глобально из npm и обновляется той же командой:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install -g @spec-box/sdd
|
|
15
|
+
sbox --version
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Для разработки самого @spec-box/sdd: `pnpm install`, `pnpm build` (tsc → dist/), `pnpm test` (vitest), `pnpm dev -- <команда>` запускает CLI через tsx без сборки. Публикация: `npm publish` из корня репозитория, `prepublishOnly` собирает и прогоняет тесты.
|
|
19
|
+
|
|
20
|
+
## Быстрый старт в проекте продукта
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
cd <репозиторий продукта> # spec-box (.tms.json) или OpenSpec (openspec/specs); адаптер определяется автоматически
|
|
24
|
+
sbox init --host claude # .sbox/config.yaml, шаблоны .sbox/project/*.md, .gitignore, скиллы и агенты Claude Code
|
|
25
|
+
# заполнить .sbox/project/*.md
|
|
26
|
+
sbox doctor # структурная проверка документации, спецификаций и сред запуска
|
|
27
|
+
sbox change new add-search --title "Поиск по каталогу" --request "Добавить поле поиска на главную"
|
|
28
|
+
sbox next --change add-search # пакет для первой роли (researcher)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Дальше цикл ведёт скилл `/sbox-run` в Claude Code: он вызывает `sbox next`, запускает субагента нужной роли, сдаёт его ответ через `sbox report` и останавливается на гейтах. Гейты решает человек: `sbox approve <gate>` или `sbox reject <gate> --comment "..."`.
|
|
32
|
+
|
|
33
|
+
## Что где лежит
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
src/core/ доменная модель, конфиг, состояние изменения (ревизия, lock), машина состояний, схема артефактов,
|
|
37
|
+
пакет для роли, приём отчёта, change-set, headless-цикл run, доставка и текст PR, гейты через PR,
|
|
38
|
+
отчёты тестов и покрытие, категории документации и doctor, архивация
|
|
39
|
+
src/adapters/ spec/spec-box, spec/openspec — истина и дельты в двух форматах; runner/claude, runner/codex — среды агентов;
|
|
40
|
+
repo/github, repo/local — хостинг репозитория; host/claude — материалы для Claude Code
|
|
41
|
+
src/cli/ команды commander: init, doctor, host, change, next, report, approve, reject,
|
|
42
|
+
status, instructions, validate, spec, archive
|
|
43
|
+
assets/roles/ определения ролей (Markdown): researcher, planner, tester, implementer, reviewer, verifier…
|
|
44
|
+
assets/schema/ граф артефактов по умолчанию и инструкции к ним
|
|
45
|
+
assets/templates/ шаблоны артефактов изменения
|
|
46
|
+
assets/project/ шаблоны категорий проектной документации
|
|
47
|
+
assets/ci/ шаблоны GitHub Actions и Dockerfile
|
|
48
|
+
test/ vitest: парсеры, адаптер spec-box, doctor, полный цикл изменения на фикстуре
|
|
49
|
+
docs/design.md проектный документ
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Headless-режим
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
sbox run --change add-search --runner claude # роли выполняет адаптер среды до гейта, блокера или конца
|
|
56
|
+
sbox run --change add-search --detach # в фоне; журнал в .sbox/changes/<id>/runs/run.log
|
|
57
|
+
sbox watch --change add-search # ждать терминального статуса, выход 1 при parked/blocked/stopped
|
|
58
|
+
sbox stop --change add-search # остановить процесс роли, доставка после этого запрещена
|
|
59
|
+
sbox change resume add-search --returns 6 # продолжить после parked с большим бюджетом возвратов
|
|
60
|
+
sbox changeset show # запечатанный change-set и дрейф рабочей копии
|
|
61
|
+
sbox coverage --report jest=reports/jest.json # покрытие утверждений дельт тестами
|
|
62
|
+
sbox deliver --check && sbox deliver # чеклист готовности, архив, коммит, push, пул-реквест
|
|
63
|
+
sbox gates poll # гейты через комментарии /sbox approve|reject в пул-реквесте
|
|
64
|
+
sbox ci install --target github # workflows для GitHub Actions; --target docker для Dockerfile.sbox
|
|
65
|
+
sbox wiring --analog X --new Y # новый модуль подключён везде, где подключён образец
|
|
66
|
+
sbox metrics # время агентов, ожидание человека, запуски, стоимость, вмешательства, оценки
|
|
67
|
+
sbox change rate <id> --score 4 # оценка результата человеком
|
|
68
|
+
sbox prompt show project-docs # промпт для заполнения .sbox/project/*.md под адаптер проекта
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Модели и усилие по ролям задаются в `runner.models` и `runner.efforts` (по умолчанию opus только для planner и challenger, effort medium); после правки выполните `sbox host install --target claude`. Среды: `claude` через Claude Agent SDK (нужен `ANTHROPIC_API_KEY` для CI; локально годится вход Claude Code), `codex` через `codex exec` (в конфиге `runner.codex.executable`, например бинарник из ChatGPT.app). Репозиторий: `repo.adapter: github` с токеном в `GITHUB_TOKEN`; `local` только коммитит.
|
|
72
|
+
|
|
73
|
+
## Состояние
|
|
74
|
+
|
|
75
|
+
Готово (этапы 1 и 2): конфиг и раскладка `.sbox/`, жизненный цикл изменения с гейтами, возвратами и бюджетом (`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.
|
|
76
|
+
|
|
77
|
+
Готово также: адаптер OpenSpec (истина в `openspec/specs`, дельты в родном синтаксисе ADDED/MODIFIED/REMOVED/RENAMED, текстовое применение с сохранением остальных разделов, `.openspec.yaml` в папке изменения для совместимости с CLI OpenSpec).
|
|
78
|
+
|
|
79
|
+
Готово также: wiki проекта в `.sbox/wiki/` (индекс страниц с `read_when` попадает в пакет каждой роли), метрики `sbox metrics` и оценка `sbox change rate`.
|
|
80
|
+
|
|
81
|
+
Не готово: дискавери и правила (этап 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` (`sbox 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` применимы только к требованиям, которые есть в истине (`sbox spec show <capability-path> --json`); заголовок должен совпадать буква в букву.
|
|
43
|
+
- `MODIFIED` заменяет блок требования целиком: скопируйте существующий блок с всеми сценариями и измените нужное. Потерянные сценарии валидатор пометит предупреждением.
|
|
44
|
+
- Если меняется и название, и поведение: пара FROM/TO в `RENAMED` и полный блок в `MODIFIED` под новым названием.
|
|
45
|
+
- Для новой capability допустим только `ADDED` и обязателен `## Purpose`.
|
|
46
|
+
- Каждое требование содержит нормативный текст с SHALL или MUST и хотя бы один сценарий. Сценарии оформляются ровно четырьмя `#`: три `#` не распознаются.
|
|
47
|
+
- Названия сценариев попадают в имена тестов: пишите их коротко и без переносов строк.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
## Формат дельты спецификаций (адаптер spec-box)
|
|
2
|
+
|
|
3
|
+
Истина хранится в YAML-файлах spec-box: `feature`, `code`, `specs-unit` (группы утверждений `assert`). Одна группа соответствует требованию, одно утверждение соответствует сценарию, и на каждое утверждение приходится один автотест. Нормативный текст требования пишите полным предложением в названии группы (например, «Сессия завершается после 30 минут бездействия»), шаги GIVEN/WHEN/THEN пишите в `description` утверждения.
|
|
4
|
+
|
|
5
|
+
Дельта лежит в `specs/<code>.yml` папки изменения, по одному файлу на capability:
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
code: checkout-page # обязательно; совпадает с code существующей фичи или задаёт новую
|
|
9
|
+
feature: Страница оформления заказа # обязательно только для новой фичи
|
|
10
|
+
description: Назначение фичи # для новой фичи: 1–2 предложения
|
|
11
|
+
type: Functional # опционально
|
|
12
|
+
definitions: # опционально, атрибуты из .spec-box-meta.yml
|
|
13
|
+
page: [checkout]
|
|
14
|
+
|
|
15
|
+
added: # новые группы или новые утверждения в существующей группе
|
|
16
|
+
Пользователь может выбрать адрес доставки:
|
|
17
|
+
- assert: При нажатии «Выбрать адрес» открывается диалог выбора адреса на карте
|
|
18
|
+
description: |
|
|
19
|
+
GIVEN пользователь на странице оформления
|
|
20
|
+
WHEN нажимает «Выбрать адрес»
|
|
21
|
+
THEN открывается диалог с картой и полем поиска
|
|
22
|
+
|
|
23
|
+
modified: # полная замена утверждений существующей группы
|
|
24
|
+
Отображается сводка заказа:
|
|
25
|
+
- assert: Отображается количество и общая стоимость товаров с учётом скидки
|
|
26
|
+
|
|
27
|
+
removed: # удаление группы целиком или отдельных утверждений
|
|
28
|
+
Промокод применяется на странице корзины:
|
|
29
|
+
reason: Промокод переносится на страницу оформления
|
|
30
|
+
migration: Сценарии покрыты группой «Промокод применяется при оформлении»
|
|
31
|
+
Блок рекомендаций:
|
|
32
|
+
asserts: ["Отображается блок «С этим покупают»"]
|
|
33
|
+
|
|
34
|
+
renamed:
|
|
35
|
+
- from: Старое название группы
|
|
36
|
+
to: Новое название группы
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Правила:
|
|
40
|
+
- `modified`, `removed`, `renamed` применимы только к группам, которые есть в истине (`sbox spec show <code> --json`).
|
|
41
|
+
- Для новой фичи допустима только секция `added`.
|
|
42
|
+
- В `modified` перечисляйте все утверждения группы целиком, а не только изменённые. Если группа одновременно переименована в `renamed`, в `modified` пишите её под новым названием.
|
|
43
|
+
- Утверждение формулируйте наблюдаемым поведением с точки зрения пользователя или внешнего контракта; одно утверждение проверяет одно поведение.
|
|
44
|
+
- Названия групп и утверждений попадают в имена тестов (`describe` и `it`), поэтому не используйте в них кавычки-ёлочки внутри кавычек и переносы строк.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Образ для headless-запуска @spec-box/sdd в нейтральной среде (docs/design.md, раздел 13).
|
|
2
|
+
FROM node:22-bookworm-slim
|
|
3
|
+
RUN apt-get update && apt-get install -y --no-install-recommends git ca-certificates && rm -rf /var/lib/apt/lists/*
|
|
4
|
+
RUN npm install -g pnpm @spec-box/sdd
|
|
5
|
+
# Codex CLI ставится отдельно, если нужен адаптер codex: npm install -g @openai/codex
|
|
6
|
+
WORKDIR /work
|
|
7
|
+
ENV SBOX_HOME=/work/.sbox-runs
|
|
8
|
+
ENTRYPOINT ["sbox"]
|
|
9
|
+
CMD ["--help"]
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# @spec-box/sdd: headless-запуск изменения в GitHub Actions (docs/design.md, раздел 13).
|
|
2
|
+
# Триггеры: ручной запуск, расписание и команды в комментариях пул-реквеста (/sbox approve|reject).
|
|
3
|
+
name: sbox run
|
|
4
|
+
|
|
5
|
+
on:
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
change:
|
|
9
|
+
description: Идентификатор изменения
|
|
10
|
+
required: true
|
|
11
|
+
runner:
|
|
12
|
+
description: claude | codex
|
|
13
|
+
default: claude
|
|
14
|
+
schedule:
|
|
15
|
+
- cron: '*/30 * * * *'
|
|
16
|
+
issue_comment:
|
|
17
|
+
types: [created]
|
|
18
|
+
|
|
19
|
+
permissions:
|
|
20
|
+
contents: write
|
|
21
|
+
pull-requests: write
|
|
22
|
+
|
|
23
|
+
concurrency:
|
|
24
|
+
group: sbox-${{ github.event.inputs.change || github.event.issue.number || 'schedule' }}
|
|
25
|
+
cancel-in-progress: false
|
|
26
|
+
|
|
27
|
+
jobs:
|
|
28
|
+
run:
|
|
29
|
+
if: github.event_name != 'issue_comment' || startsWith(github.event.comment.body, '/sbox ')
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
timeout-minutes: 180
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v4
|
|
34
|
+
with:
|
|
35
|
+
fetch-depth: 0
|
|
36
|
+
# Для issue_comment нужна ветка пул-реквеста: её определяет шаг ниже.
|
|
37
|
+
- uses: actions/setup-node@v4
|
|
38
|
+
with:
|
|
39
|
+
node-version: 22
|
|
40
|
+
- uses: pnpm/action-setup@v4
|
|
41
|
+
- name: Определить изменение и ветку
|
|
42
|
+
id: change
|
|
43
|
+
shell: bash
|
|
44
|
+
run: |
|
|
45
|
+
if [ "${{ github.event_name }}" = "issue_comment" ]; then
|
|
46
|
+
BRANCH=$(gh pr view ${{ github.event.issue.number }} --json headRefName -q .headRefName)
|
|
47
|
+
git fetch origin "$BRANCH" && git checkout "$BRANCH"
|
|
48
|
+
echo "change=${BRANCH#sbox/}" >> "$GITHUB_OUTPUT"
|
|
49
|
+
elif [ -n "${{ github.event.inputs.change }}" ]; then
|
|
50
|
+
BRANCH="sbox/${{ github.event.inputs.change }}"
|
|
51
|
+
git fetch origin "$BRANCH" && git checkout "$BRANCH" || git checkout -b "$BRANCH"
|
|
52
|
+
echo "change=${{ github.event.inputs.change }}" >> "$GITHUB_OUTPUT"
|
|
53
|
+
else
|
|
54
|
+
echo "change=" >> "$GITHUB_OUTPUT"
|
|
55
|
+
fi
|
|
56
|
+
env:
|
|
57
|
+
GH_TOKEN: ${{ github.token }}
|
|
58
|
+
- name: Установить зависимости проекта и @spec-box/sdd
|
|
59
|
+
run: |
|
|
60
|
+
pnpm install --frozen-lockfile
|
|
61
|
+
npm install -g @spec-box/sdd
|
|
62
|
+
- name: Продвинуть гейты из комментариев
|
|
63
|
+
if: steps.change.outputs.change != ''
|
|
64
|
+
run: sbox gates poll --change "${{ steps.change.outputs.change }}" --json || true
|
|
65
|
+
env:
|
|
66
|
+
GITHUB_TOKEN: ${{ github.token }}
|
|
67
|
+
- name: Запустить @spec-box/sdd
|
|
68
|
+
if: steps.change.outputs.change != ''
|
|
69
|
+
run: sbox run --change "${{ steps.change.outputs.change }}" --runner "${{ github.event.inputs.runner || 'claude' }}" --json
|
|
70
|
+
env:
|
|
71
|
+
GITHUB_TOKEN: ${{ github.token }}
|
|
72
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
73
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
74
|
+
- name: Сохранить состояние изменения
|
|
75
|
+
if: always() && steps.change.outputs.change != ''
|
|
76
|
+
run: |
|
|
77
|
+
git config user.name "sbox-bot"
|
|
78
|
+
git config user.email "sbox-bot@users.noreply.github.com"
|
|
79
|
+
git add -A .sbox && git commit -qm "sbox: состояние изменения ${{ steps.change.outputs.change }}" || true
|
|
80
|
+
git push origin HEAD
|
|
81
|
+
- name: Доставить, если изменение готово
|
|
82
|
+
if: steps.change.outputs.change != ''
|
|
83
|
+
run: sbox deliver --change "${{ steps.change.outputs.change }}" --check --json && sbox deliver --change "${{ steps.change.outputs.change }}" --json || true
|
|
84
|
+
env:
|
|
85
|
+
GITHUB_TOKEN: ${{ github.token }}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Тесты проекта с JSON-отчётом как артефактом: его читает верификатор @spec-box/sdd (`sbox coverage --report jest=…`).
|
|
2
|
+
name: tests
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
pull_request:
|
|
6
|
+
push:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: actions/setup-node@v4
|
|
15
|
+
with:
|
|
16
|
+
node-version: 22
|
|
17
|
+
- uses: pnpm/action-setup@v4
|
|
18
|
+
- run: pnpm install --frozen-lockfile
|
|
19
|
+
- name: Тесты с JSON-отчётом
|
|
20
|
+
run: mkdir -p reports && pnpm test -- --reporter=default --reporter=json --outputFile=reports/jest.json
|
|
21
|
+
- uses: actions/upload-artifact@v4
|
|
22
|
+
if: always()
|
|
23
|
+
with:
|
|
24
|
+
name: test-report
|
|
25
|
+
path: reports/
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: project.architecture
|
|
3
|
+
summary: Карта пакетов и модулей, точки входа, поток данных, границы
|
|
4
|
+
read_when: Перед исследованием, планированием и реализацией
|
|
5
|
+
updated: {{DATE}}
|
|
6
|
+
verification: needs-review
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Архитектура и карта кода
|
|
10
|
+
|
|
11
|
+
## Карта пакетов и модулей
|
|
12
|
+
|
|
13
|
+
<!-- Таблица: пакет или каталог → ответственность → с чего начинать при изменении. -->
|
|
14
|
+
|
|
15
|
+
## Точки входа
|
|
16
|
+
|
|
17
|
+
<!-- Команды CLI, HTTP-обработчики, задания, UI-страницы: где начинается выполнение. -->
|
|
18
|
+
|
|
19
|
+
## Поток данных
|
|
20
|
+
|
|
21
|
+
<!-- Как данные проходят от входа к результату; состояние, преобразования, побочные эффекты. -->
|
|
22
|
+
|
|
23
|
+
## Границы модулей
|
|
24
|
+
|
|
25
|
+
<!-- Что с чем может и не может взаимодействовать напрямую; публичные интерфейсы. -->
|
|
26
|
+
|
|
27
|
+
## Генерируемый код
|
|
28
|
+
|
|
29
|
+
<!-- Что генерируется, чем, и что нельзя править руками. Если нет — «—». -->
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: project.contracts
|
|
3
|
+
summary: Внешние API, события, схемы, потребители, машиночитаемые контракты
|
|
4
|
+
read_when: При изменении интерфейсов и интеграций
|
|
5
|
+
updated: {{DATE}}
|
|
6
|
+
verification: needs-review
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Интеграции и контракты
|
|
10
|
+
|
|
11
|
+
## Внешние API
|
|
12
|
+
|
|
13
|
+
<!-- Какие API продукт предоставляет и потребляет. -->
|
|
14
|
+
|
|
15
|
+
## События
|
|
16
|
+
|
|
17
|
+
<!-- Публикуемые и потребляемые события, их схемы. -->
|
|
18
|
+
|
|
19
|
+
## Схемы
|
|
20
|
+
|
|
21
|
+
<!-- Схемы данных, версии, совместимость. -->
|
|
22
|
+
|
|
23
|
+
## Потребители
|
|
24
|
+
|
|
25
|
+
<!-- Кто зависит от контрактов продукта; репозитории-партнёры. -->
|
|
26
|
+
|
|
27
|
+
## Машиночитаемые контракты
|
|
28
|
+
|
|
29
|
+
<!-- Где лежат OpenAPI, JSON Schema, protobuf. -->
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: project.conventions
|
|
3
|
+
summary: Язык, стиль, запрещённые конструкции, именование, коммиты
|
|
4
|
+
read_when: Перед написанием кода и тестов, при ревью
|
|
5
|
+
updated: {{DATE}}
|
|
6
|
+
verification: needs-review
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Соглашения по коду
|
|
10
|
+
|
|
11
|
+
## Язык
|
|
12
|
+
|
|
13
|
+
<!-- Язык кода, комментариев, сообщений коммитов, пользовательских текстов. -->
|
|
14
|
+
|
|
15
|
+
## Стиль
|
|
16
|
+
|
|
17
|
+
<!-- Форматтер и линтер, команды проверки, ключевые правила. -->
|
|
18
|
+
|
|
19
|
+
## Запрещено
|
|
20
|
+
|
|
21
|
+
<!-- Конструкции и практики, которые ревью отклоняет: например, явный any, бесконтрольный catch. -->
|
|
22
|
+
|
|
23
|
+
## Именование
|
|
24
|
+
|
|
25
|
+
<!-- Файлы, модули, тесты, ветки. -->
|
|
26
|
+
|
|
27
|
+
## Коммиты
|
|
28
|
+
|
|
29
|
+
<!-- Формат сообщения, что в один коммит, что запрещено коммитить. -->
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# Постоянные правила проекта
|
|
2
|
+
|
|
3
|
+
Каждое правило — файл `ADR-NNNN-<slug>.md` с фронтматтером `id`, `title`, `status` (accepted | superseded), `scope` (пути или области), `accepted_by`, `accepted_at`, `origin`, `supersedes` и разделами «Правило», «Контекст», «Обоснование», «Последствия», «Как проверяется». Правило меняется только новым правилом со ссылкой `supersedes`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: project.glossary
|
|
3
|
+
summary: Термины домена в формулировках спецификаций и тестов
|
|
4
|
+
read_when: При написании спецификаций, тестов и сообщений пользователю
|
|
5
|
+
updated: {{DATE}}
|
|
6
|
+
verification: needs-review
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Словарь домена
|
|
10
|
+
|
|
11
|
+
## Термины
|
|
12
|
+
|
|
13
|
+
<!-- Термин — определение — где встречается в коде. По одному термину на строку таблицы. -->
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: project.overview
|
|
3
|
+
summary: Что за продукт, для кого, где живёт код и истина спецификаций
|
|
4
|
+
read_when: Перед исследованием и планированием любого изменения
|
|
5
|
+
updated: {{DATE}}
|
|
6
|
+
verification: needs-review
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Продукт и границы
|
|
10
|
+
|
|
11
|
+
## Что за продукт
|
|
12
|
+
|
|
13
|
+
<!-- Одним абзацем: что делает продукт и какую задачу решает. Категория продукта первой строкой. -->
|
|
14
|
+
|
|
15
|
+
## Пользователи
|
|
16
|
+
|
|
17
|
+
<!-- Кто пользуется и в каких сценариях. Роли пользователей, если есть. -->
|
|
18
|
+
|
|
19
|
+
## Системы рядом
|
|
20
|
+
|
|
21
|
+
<!-- Внешние сервисы, от которых зависит продукт, и кто зависит от него. -->
|
|
22
|
+
|
|
23
|
+
## Где живёт код
|
|
24
|
+
|
|
25
|
+
<!-- Репозиторий, корневые каталоги, что где лежит на верхнем уровне. -->
|
|
26
|
+
|
|
27
|
+
## Истина спецификаций
|
|
28
|
+
|
|
29
|
+
<!-- Формат (spec-box / OpenSpec), пути файлов, как читать: `sbox spec list`. Внешняя система выгрузки, если есть. -->
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: project.testing
|
|
3
|
+
summary: Уровни тестов, команды, отчёты, именование тестов по сценариям, среда e2e
|
|
4
|
+
read_when: Перед написанием тестов, реализацией и верификацией
|
|
5
|
+
updated: {{DATE}}
|
|
6
|
+
verification: needs-review
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Тестирование и проверки
|
|
10
|
+
|
|
11
|
+
## Уровни тестов
|
|
12
|
+
|
|
13
|
+
<!-- Таблица: уровень (unit / component / module / e2e) → когда применять → где лежат → чем запускаются. -->
|
|
14
|
+
|
|
15
|
+
## Команды
|
|
16
|
+
|
|
17
|
+
<!-- Узкий прогон одного файла, полный прогон, проверки типов и линтеров. Команды в обратных кавычках, например `pnpm test`.
|
|
18
|
+
Обязательно опишите дымовой запуск: как поднять приложение или сервис локально (зависимости, порт) и какой URL или команда подтверждает, что оно работает. Верификатор запускает его, когда изменение добавляет модуль, маршрут или сборку. -->
|
|
19
|
+
|
|
20
|
+
## Отчёты
|
|
21
|
+
|
|
22
|
+
<!-- Куда пишутся отчёты тестов (jest --json, playwright json) и как их получить в CI. -->
|
|
23
|
+
|
|
24
|
+
## Именование тестов по сценариям
|
|
25
|
+
|
|
26
|
+
<!-- Правило: describe = название capability, вложенный describe = группа, it = утверждение. Пример. -->
|
|
27
|
+
|
|
28
|
+
## Среда e2e
|
|
29
|
+
|
|
30
|
+
<!-- Как запускаются e2e: локально, задачей CI, на стенде; что для этого нужно. Если e2e нет — «—». -->
|
|
31
|
+
|
|
32
|
+
## Не автоматизируется
|
|
33
|
+
|
|
34
|
+
<!-- Что проверяется только руками и почему. -->
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: project.workflow
|
|
3
|
+
summary: Ветки, пул-реквесты, проверки CI, что запрещено без человека, разрешённые команды
|
|
4
|
+
read_when: Перед коммитом, созданием ветки и пул-реквеста
|
|
5
|
+
updated: {{DATE}}
|
|
6
|
+
verification: needs-review
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Рабочий процесс
|
|
10
|
+
|
|
11
|
+
## Ветки
|
|
12
|
+
|
|
13
|
+
<!-- Базовая ветка, правило именования веток, одна ветка на изменение. -->
|
|
14
|
+
|
|
15
|
+
## Пул-реквесты
|
|
16
|
+
|
|
17
|
+
<!-- Что должно быть в описании, кто ревьюит, когда черновик становится готовым. -->
|
|
18
|
+
|
|
19
|
+
## Проверки CI
|
|
20
|
+
|
|
21
|
+
<!-- Обязательные проверки перед мержем и где смотреть их результаты. -->
|
|
22
|
+
|
|
23
|
+
## Запрещено без человека
|
|
24
|
+
|
|
25
|
+
<!-- Мерж, публикация, миграции, изменения секретов и всё, что агент не делает сам. -->
|
|
26
|
+
|
|
27
|
+
## Разрешённые команды
|
|
28
|
+
|
|
29
|
+
<!-- Список команд, которые агенты могут запускать без подтверждения. -->
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
Заполни проектную документацию @spec-box/sdd в каталоге `.sbox/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. В конце выполни `sbox 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}}) и как её читать (`sbox 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 и документацию: только `.sbox/project/*.md`.
|
|
37
|
+
- Не задавать вопросы по ходу: собери их в конец.
|
|
38
|
+
|
|
39
|
+
## Формат ответа
|
|
40
|
+
|
|
41
|
+
1. Список заполненных файлов с одной строкой о содержании.
|
|
42
|
+
2. Результат `sbox doctor`.
|
|
43
|
+
3. Вопросы и неустановленные факты списком, каждый с указанием, в каком файле и разделе стоит «не установлено».
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Роль: challenger (аудитор плана)
|
|
2
|
+
|
|
3
|
+
## Правила
|
|
4
|
+
|
|
5
|
+
- Только чтение. Аудируй замороженный план или бриф целиком и верни все существенные проблемы одним пакетом.
|
|
6
|
+
- Не переписывай план, не утверждай его, не вызывай агентов, не задавай вопросы пользователю.
|
|
7
|
+
- Отвечай только по шаблону «Выход».
|
|
8
|
+
|
|
9
|
+
## Этапы
|
|
10
|
+
|
|
11
|
+
Проверь: блокеры (шаг, который не может выполниться как написано); отсутствующие решения; необоснованные допущения (процитируй); расползание объёма; пробелы приёмки (поведение без шага или проверки); пробелы валидации; нарушения правил проекта; более простое решение с теми же критериями (или «нет»).
|
|
12
|
+
|
|
13
|
+
## Выход
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
## Аудит плана
|
|
17
|
+
### Блокеры
|
|
18
|
+
### Отсутствующие решения
|
|
19
|
+
### Необоснованные допущения
|
|
20
|
+
### Расползание объёма
|
|
21
|
+
### Пробелы приёмки и проверки
|
|
22
|
+
### Более простое решение
|
|
23
|
+
### Вердикт
|
|
24
|
+
**достаточно** или **доработать** — одно предложение
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
# sbox-result
|
|
29
|
+
status: готово | заблокировано
|
|
30
|
+
blocker: { category: артефакт | нет, artifact: design, message: "" }
|
|
31
|
+
findings:
|
|
32
|
+
- { level: blocking, text: "" }
|
|
33
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Роль: distiller (дистиллятор знаний)
|
|
2
|
+
|
|
3
|
+
## Правила
|
|
4
|
+
|
|
5
|
+
- Переноси в wiki проекта только записи `[CODE]` и `[RULE]` из `log.md` изменения, которые отвечают на повторяющийся вопрос и предотвращают класс ошибок. Пересказ одного файла не переносится.
|
|
6
|
+
- Записи `[TASK]` и `[HUMAN]` не переносятся.
|
|
7
|
+
- Правь только `.sbox/wiki/**`; в каждую страницу вноси минимальное дополнение, предпочитай исправление устаревшего тексту нового.
|
|
8
|
+
- Отвечай только по шаблону «Выход».
|
|
9
|
+
|
|
10
|
+
## Выход
|
|
11
|
+
|
|
12
|
+
Список перенесённых и пропущенных записей с причинами и блок:
|
|
13
|
+
|
|
14
|
+
```yaml
|
|
15
|
+
# sbox-result
|
|
16
|
+
status: готово
|
|
17
|
+
blocker: { category: нет }
|
|
18
|
+
```
|