@spec-box/sdd 0.9.0 → 0.11.0
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 +75 -4
- package/assets/adapters/openspec/instructions.md +2 -2
- package/assets/adapters/spec-box/instructions.md +1 -1
- package/assets/hosts/claude/agent.md +1 -1
- package/assets/hosts/claude/project.md +3 -0
- package/assets/hosts/codex/AGENTS.md +7 -0
- package/assets/hosts/codex/agent.md +10 -0
- package/assets/hosts/codex/headless-result.md +2 -0
- package/assets/project/overview.md +1 -1
- package/assets/prompts/fill-project-docs.md +1 -1
- package/assets/roles/challenger.md +9 -2
- package/assets/roles/planner.md +4 -2
- package/assets/roles/researcher.md +2 -2
- package/assets/roles/reviewer.md +2 -0
- package/assets/roles/tester.md +2 -0
- package/assets/schema/default.yaml +2 -2
- package/assets/schema/sbox-answer.schema.json +2 -2
- package/assets/skills/sbox-contract.md +23 -0
- package/assets/skills/sbox-run.md +34 -14
- package/bin/sbox-contract.js +5 -0
- package/dist/adapters/host/claude/index.js +13 -19
- package/dist/adapters/host/claude/index.js.map +1 -1
- package/dist/adapters/host/codex/index.js +61 -0
- package/dist/adapters/host/codex/index.js.map +1 -0
- package/dist/adapters/host/index.js +9 -2
- package/dist/adapters/host/index.js.map +1 -1
- package/dist/adapters/runner/codex.js +31 -7
- package/dist/adapters/runner/codex.js.map +1 -1
- package/dist/adapters/spec/openspec/index.js +15 -1
- package/dist/adapters/spec/openspec/index.js.map +1 -1
- package/dist/adapters/spec/openspec/parser.js +1 -1
- package/dist/adapters/spec/openspec/parser.js.map +1 -1
- package/dist/adapters/spec/spec-box/delta.js +1 -1
- package/dist/adapters/spec/spec-box/delta.js.map +1 -1
- package/dist/adapters/spec/spec-box/index.js +13 -1
- package/dist/adapters/spec/spec-box/index.js.map +1 -1
- package/dist/adapters/spec/spec-box/yaml.js +1 -1
- package/dist/adapters/spec/spec-box/yaml.js.map +1 -1
- package/dist/cli/commands/archive.js +28 -0
- package/dist/cli/commands/archive.js.map +1 -0
- package/dist/cli/commands/host.js +3 -4
- package/dist/cli/commands/host.js.map +1 -1
- package/dist/cli/commands/models.js +25 -0
- package/dist/cli/commands/models.js.map +1 -0
- package/dist/cli/commands/protocol.js +4 -2
- package/dist/cli/commands/protocol.js.map +1 -1
- package/dist/cli/context.js +1 -1
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/main.js +4 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/{core/spec-adapter.js → contract/adapter.js} +1 -1
- package/dist/contract/adapter.js.map +1 -0
- package/dist/contract/cli.js +95 -0
- package/dist/contract/cli.js.map +1 -0
- package/dist/contract/config.js +13 -0
- package/dist/contract/config.js.map +1 -0
- package/dist/contract/context.js +60 -0
- package/dist/contract/context.js.map +1 -0
- package/dist/{core/spec-model.js → contract/model.js} +1 -1
- package/dist/contract/model.js.map +1 -0
- package/dist/contract/service.js +115 -0
- package/dist/contract/service.js.map +1 -0
- package/dist/core/archive.js +15 -42
- package/dist/core/archive.js.map +1 -1
- package/dist/core/change.js +5 -3
- package/dist/core/change.js.map +1 -1
- package/dist/core/config.js +10 -17
- package/dist/core/config.js.map +1 -1
- package/dist/core/model-policy.js +54 -0
- package/dist/core/model-policy.js.map +1 -0
- package/dist/core/packet.js +11 -5
- package/dist/core/packet.js.map +1 -1
- package/dist/core/phases.js +14 -3
- package/dist/core/phases.js.map +1 -1
- package/dist/core/report.js +23 -5
- package/dist/core/report.js.map +1 -1
- package/dist/core/result.js +2 -3
- package/dist/core/result.js.map +1 -1
- package/dist/core/run.js +11 -8
- package/dist/core/run.js.map +1 -1
- package/dist/core/runner.js +0 -23
- package/dist/core/runner.js.map +1 -1
- package/docs/design.md +69 -14
- package/package.json +3 -2
- package/dist/cli/commands/spec.js +0 -84
- package/dist/cli/commands/spec.js.map +0 -1
- package/dist/core/spec-adapter.js.map +0 -1
- package/dist/core/spec-model.js.map +0 -1
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ sbox change new add-search --title "Поиск по каталогу" --request
|
|
|
28
28
|
sbox next --change add-search # пакет для первой роли (researcher)
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
Дальше цикл ведёт скилл `/sbox-run` в Claude Code: он вызывает `sbox next`, запускает субагента нужной роли, сдаёт его ответ через `sbox report` и останавливается на гейтах. Гейты решает человек: `sbox approve <gate>` или `sbox reject <gate> --comment "..."`.
|
|
31
|
+
Дальше цикл ведёт скилл `/sbox-run` в Claude Code или `$sbox-run` в Codex: он вызывает `sbox next`, запускает субагента нужной роли, сдаёт его ответ через `sbox report` и останавливается на гейтах. Гейты решает человек: `sbox approve <gate>` или `sbox reject <gate> --comment "..."`.
|
|
32
32
|
|
|
33
33
|
## Что где лежит
|
|
34
34
|
|
|
@@ -39,7 +39,8 @@ src/core/ доменная модель, конфиг, состояние
|
|
|
39
39
|
src/adapters/ spec/spec-box, spec/openspec — истина и дельты в двух форматах; runner/claude, runner/codex — среды агентов;
|
|
40
40
|
repo/github, repo/local — хостинг репозитория; host/skills — раскладки скиллов по хостам, host/claude — агенты Claude Code
|
|
41
41
|
src/cli/ команды commander: init, doctor, host, change, next, report, approve, reject,
|
|
42
|
-
status, instructions, validate,
|
|
42
|
+
status, instructions, validate, archive, log
|
|
43
|
+
src/contract/ sbox-contract: модель поведения, конфигурация, поиск, дельты и применение
|
|
43
44
|
src/wiki/ sbox-wiki: индекс и кеш Markdown, поиск, страницы, ссылки и валидация
|
|
44
45
|
src/browser/ sbox-browser: демон с Chrome на сессию, клиент через локальный сокет, команды страницы,
|
|
45
46
|
снимок дерева доступности со ссылками, поиск и установка браузера, вход человеком, перенос состояния
|
|
@@ -72,7 +73,45 @@ sbox change rate <id> --score 4 # оценка результат
|
|
|
72
73
|
sbox prompt show project-docs # промпт для заполнения .sbox/project/*.md под адаптер проекта
|
|
73
74
|
```
|
|
74
75
|
|
|
75
|
-
|
|
76
|
+
Модель и effort задаются по профилям отдельно в `runner.claude.profiles` и `runner.codex.profiles`; после правки выполните `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` только коммитит.
|
|
77
|
+
|
|
78
|
+
## Профили моделей
|
|
79
|
+
|
|
80
|
+
Одна политика выбора для headless и материалов Claude Code: роль и оценка сложности определяют профиль `simple`, `medium` или `complex`, затем выбранный раннер подставляет пару `model` + `effort`.
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
runner:
|
|
84
|
+
default: codex
|
|
85
|
+
roleProfiles: # необязательная фиксация профиля роли
|
|
86
|
+
planner: complex
|
|
87
|
+
challenger: complex
|
|
88
|
+
reviewer: complex
|
|
89
|
+
claude:
|
|
90
|
+
profiles:
|
|
91
|
+
simple: { model: claude-sonnet-5, effort: low }
|
|
92
|
+
medium: { model: claude-sonnet-5, effort: medium }
|
|
93
|
+
complex: { model: claude-opus-5, effort: high }
|
|
94
|
+
codex:
|
|
95
|
+
profiles:
|
|
96
|
+
simple: { model: gpt-5.6-terra, effort: low }
|
|
97
|
+
medium: { model: gpt-5.6-terra, effort: medium }
|
|
98
|
+
complex: { model: gpt-5.6-sol, effort: high }
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Пример показывает встроенные значения. Профили можно задавать частично: остальные поля получают дефолты. Доступность конкретной модели и поддержка effort зависят от установленного раннера и учётной записи.
|
|
102
|
+
|
|
103
|
+
По умолчанию planner/challenger/reviewer используют complex, distiller — simple, остальные — medium. Оценка планировщика `complexity.implementation` переключает tester/implementer: простая → simple, обычная → medium, высокая → complex. Оценка complexity.review сохраняется для аудита, но не ослабляет независимое ревью: reviewer остаётся complex. При возвратах оценка может повышаться. Явный `roleProfiles.<роль>` фиксирует профиль и имеет приоритет над автоматическим выбором. Размер small/normal/large определяет артефакты и не меняет профиль сам по себе.
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
sbox models --json # обе среды, профили по ролям
|
|
107
|
+
sbox models --change add-search --json # с учётом сложности изменения
|
|
108
|
+
sbox next --change add-search --runner claude --brief --json
|
|
109
|
+
sbox host install --target claude # обновить определения агентов
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`next` возвращает `execution` с раннером, профилем, моделью, effort и именем агента выбранного хоста. `/sbox-run` использует это имя; устанавливаются варианты `sbox-<роль>-simple|medium|complex` и базовый `sbox-<роль>`. При изменении профиля/модели/effort предыдущая сессия не продолжается. Для Codex генерируются `.codex/agents/*.toml`, устанавливается общий скилл в `.agents/skills/sbox-run` и добавляется управляемый раздел `AGENTS.md`. Пользовательский `.codex/config.toml` не меняется. После установки откройте новую сессию Codex в доверенном проекте. Если клиент не поддерживает выбор пользовательских агентов, скилл использует `sbox run --runner codex --max-runs 1` с теми же настройками.
|
|
113
|
+
|
|
114
|
+
**Миграция:** общие `runner.models`, `runner.efforts`, `runner.defaultEffort` удалены и вызывают понятную ошибку конфигурации. Перенесите настройки в профили нужного раннера, при необходимости задайте roleProfiles, удалите старые поля и переустановите материалы хоста. Автоматический перенос не выполняется: старая таблица не указывает, какому раннеру принадлежит модель.
|
|
76
115
|
|
|
77
116
|
## Браузер для проверки интерфейса
|
|
78
117
|
|
|
@@ -96,6 +135,27 @@ sbox-browser stop
|
|
|
96
135
|
|
|
97
136
|
Существующий браузер вместо установки: флаг `--executable`, переменная `SBOX_BROWSER_EXECUTABLE` или `browser.executable` в `.sbox/config.yaml`; без них по порядку проверяются кэш инструмента, кэш puppeteer, системный Chrome, Chromium, Edge и Brave. Сессия это фоновый процесс с браузером: команды идут к нему через локальный сокет, поэтому страница, куки, консоль и сетевые ошибки сохраняются между вызовами; `--session <имя>` даёт несколько независимых браузеров, простой 30 минут завершает сессию. Настройки в секции `browser` конфига: `executable`, `headless`, `profile`, `baseUrl`, `cacheDir`, `viewport`, `timeoutMs`, `idleMinutes`; те же значения задаются переменными `SBOX_BROWSER_EXECUTABLE`, `SBOX_BROWSER_HEADLESS`, `SBOX_BROWSER_PROFILE`, `SBOX_BROWSER_BASE_URL`, `SBOX_BROWSER_CACHE_DIR` (каталог инструмента: `SBOX_BROWSER_HOME`) и глобальными флагами `--profile`, `--session`, `--timeout`, `--cwd`. Все команды поддерживают `--json`, ошибки разбора аргументов тоже приходят в JSON-конверте. Профили и файлы состояния содержат секреты входа и живут в `~/.sbox/browser`, вне репозитория. Скилл `sbox-browser` лежит в `assets/skills` и копируется в папку хоста командой `sbox host install --target claude | codex`; агентам researcher, tester и verifier он подключается по `metadata.roles` (в Claude Code полем `skills`).
|
|
98
137
|
|
|
138
|
+
## Контракт поведения продукта
|
|
139
|
+
|
|
140
|
+
Отдельный `sbox-contract` работает со спецификациями spec-box и OpenSpec без запуска процесса SDD. В существующем проекте используется секция `spec` из `.sbox/config.yaml`, отдельно — `.sbox-contract.yaml` или автоопределение по `.tms.json` / `openspec/specs`. `--cwd` задаёт каталог, `--format` — явный выбор формата.
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
sbox-contract init --format spec-box # новый самостоятельный проект
|
|
144
|
+
sbox-contract index --json
|
|
145
|
+
sbox-contract search "повторная отправка заказа" --json
|
|
146
|
+
sbox-contract show orders --json
|
|
147
|
+
sbox-contract delta init ./changes/add-export
|
|
148
|
+
# записать файлы дельты по инструкции в созданном README
|
|
149
|
+
sbox-contract diff --delta ./changes/add-export --preview --json
|
|
150
|
+
sbox-contract validate --delta ./changes/add-export --json
|
|
151
|
+
sbox-contract apply --delta ./changes/add-export --check --json
|
|
152
|
+
sbox-contract apply --delta ./changes/add-export --if-match <revision>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Поиск возвращает отдельные требования и сценарии с источниками. Предпросмотр показывает будущее состояние без записи. Для применения нужна `revision` из проверки: изменение истины или дельты после проверки вызывает конфликт. При ошибке применения файлы восстанавливаются. Самостоятельное применение не архивирует задачу, не коммитит и не создаёт PR.
|
|
156
|
+
|
|
157
|
+
**Группа `sbox spec` удалена:** `list` заменён на `sbox-contract index`, `show` — на `sbox-contract show`, `diff --change <id>` — на `sbox-contract diff --delta <папка-изменения>/specs`. Обновите скиллы проектов командой `sbox host install --target claude` или `--target codex`. `sbox archive` и `sbox deliver` продолжают применять дельты через общий модуль; в процессе SDD роли используют только чтение и подготовку дельт.
|
|
158
|
+
|
|
99
159
|
## Wiki для агентов
|
|
100
160
|
|
|
101
161
|
`sbox-wiki` работает с `.sbox/wiki/` (или `project.wiki` из конфига). Для произвольной папки без SDD укажите `--dir ./knowledge`; без конфига и этого флага используется `wiki/`. `--cwd` задаёт каталог проекта.
|
|
@@ -117,6 +177,8 @@ sbox-wiki validate --json
|
|
|
117
177
|
|
|
118
178
|
Валидация проверяет типы метаданных, уникальность id, локальные ссылки и якоря заголовков; ссылки из блоков кода не учитываются. Внешние URL не проверяются, ссылки за пределы wiki запрещены; HTML-ссылки и пользовательские HTML-якоря не поддерживаются. Код выхода 1 означает ошибку; отсутствие summary/read_when — предупреждение. Скилл `sbox-wiki` устанавливается для Claude и Codex через `sbox host install`; `sbox doctor` использует ту же проверку wiki.
|
|
119
179
|
|
|
180
|
+
Аудит плана обязателен: `plan → [гейт plan] → challenge → cover`. Challenger проверяет артефакты против запроса и кода, ищет пропущенные сценарии и возвращает блокирующие замечания планировщику. После исправления повторяются гейт и аудит; отчёты сохраняются в `evidence/challenge-N.md`. Человеческие гейты зависят от автономности, аудит — нет. Изменения, уже прошедшие планирование до обновления, продолжаются с текущей фазы; при возврате в plan проходят новый аудит.
|
|
181
|
+
|
|
120
182
|
## Состояние
|
|
121
183
|
|
|
122
184
|
Готово (этапы 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.
|
|
@@ -127,4 +189,13 @@ sbox-wiki validate --json
|
|
|
127
189
|
|
|
128
190
|
Готово также: папка `runs/` не переносится в архив (ответы ролей и квитанции остаются в истории ветки, `delivery_narrative` и запуски в `change.yaml`; `archive.runs: true` сохраняет её), `sbox-browser` для проверки интерфейса (сессии с Chrome через `puppeteer-core`, необязательная установка браузера, вход человеком с постоянным профилем, снимок дерева доступности для агентов, перенос состояния входа), проверка браузера в `sbox doctor`.
|
|
129
191
|
|
|
130
|
-
Не готово: дискавери и правила (этап 3), Arcadia
|
|
192
|
+
Не готово: дискавери и правила (этап 3), Arcadia (этап 4), межрепозиторный протокол (этап 5), роутер и дистилляция wiki (этап 6), семантический `doctor --deep`.
|
|
193
|
+
|
|
194
|
+
Для Codex в существующем проекте:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
sbox host install --target codex
|
|
198
|
+
sbox models --runner codex
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
В новой сессии вызовите `$sbox-run`. Headless-раннер сохраняет ID сессии и продолжает её при возврате к той же роли с теми же настройками; старые клиенты без нужных возможностей resume запускают новую сессию. При первоначальной настройке доступен `sbox init --host codex`. Агент возвращает полный отчёт оркестратору; тот сохраняет его и передаёт CLI. Headless-вариант без интерактивного клиента: `sbox run --runner codex --change <id>`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## Формат дельты спецификаций (адаптер OpenSpec)
|
|
2
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
|
|
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-contract index --json`).
|
|
4
4
|
|
|
5
5
|
Дельта лежит в `specs/<capability-path>/spec.md` папки изменения, по одному файлу на capability. Она описывает только изменения:
|
|
6
6
|
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
Правила:
|
|
42
|
-
- `MODIFIED`, `REMOVED`, `RENAMED` применимы только к требованиям, которые есть в истине (`sbox
|
|
42
|
+
- `MODIFIED`, `REMOVED`, `RENAMED` применимы только к требованиям, которые есть в истине (`sbox-contract show <capability-path> --json`); заголовок должен совпадать буква в букву.
|
|
43
43
|
- `MODIFIED` заменяет блок требования целиком: скопируйте существующий блок с всеми сценариями и измените нужное. Потерянные сценарии валидатор пометит предупреждением.
|
|
44
44
|
- Если меняется и название, и поведение: пара FROM/TO в `RENAMED` и полный блок в `MODIFIED` под новым названием.
|
|
45
45
|
- Для новой capability допустим только `ADDED` и обязателен `## Purpose`.
|
|
@@ -37,7 +37,7 @@ renamed:
|
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
Правила:
|
|
40
|
-
- `modified`, `removed`, `renamed` применимы только к группам, которые есть в истине (`sbox
|
|
40
|
+
- `modified`, `removed`, `renamed` применимы только к группам, которые есть в истине (`sbox-contract show <code> --json`).
|
|
41
41
|
- Для новой фичи допустима только секция `added`.
|
|
42
42
|
- В `modified` перечисляйте все утверждения группы целиком, а не только изменённые. Если группа одновременно переименована в `renamed`, в `modified` пишите её под новым названием.
|
|
43
43
|
- Утверждение формулируйте наблюдаемым поведением с точки зрения пользователя или внешнего контракта; одно утверждение проверяет одно поведение.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
## Изменения через @spec-box/sdd
|
|
2
|
+
Продуктовые изменения ведутся инструментом @spec-box/sdd: `sbox change new <id> --title "..." --request "..."`, затем скилл `/sbox-run`.
|
|
3
|
+
Не редактируй артефакты в .sbox/changes вручную и не меняй истину спецификаций напрямую: только дельты через роли.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
## Изменения через @spec-box/sdd
|
|
2
|
+
|
|
3
|
+
Когда пользователь просит выполнить изменение через sbox, используй `$sbox-run` из `.agents/skills/sbox-run/SKILL.md`. Создай изменение через `sbox change new`, если оно ещё не создано. CLI управляет фазами, гейтами, профилями моделей и возвратами.
|
|
4
|
+
|
|
5
|
+
Оркестратор делегирует роли последовательно агентам из `execution.agent` ответа `sbox next --runner codex --brief --json`. Субагенты выполняют только свой пакет, не запускают sbox-run и других агентов. При недоступности пользовательских агентов используй предусмотренный скиллом headless-режим Codex.
|
|
6
|
+
|
|
7
|
+
Скиллы `sbox-contract`, `sbox-wiki`, `sbox-browser`, `sbox-approve` лежат в `.agents/skills`. Истина спецификаций меняется через доставку SDD; роли работают с дельтами. Гейты решает человек. Установка материалов не разрешает доставку и публикацию.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Ты выполняешь роль {{role}} инструмента @spec-box/sdd. Во входном сообщении путь к JSON-пакету (`packet`). Прочитай его целиком и выполняй задачу только в пределах ownership. Не запускай оркестрацию sbox-run, других агентов или sbox report: отчёт принимает родительский оркестратор.
|
|
2
|
+
|
|
3
|
+
Прочитай применимые скиллы роли по путям:
|
|
4
|
+
{{skills}}
|
|
5
|
+
|
|
6
|
+
{{body}}
|
|
7
|
+
|
|
8
|
+
## Передача результата в Codex
|
|
9
|
+
|
|
10
|
+
Полный ответ в Markdown с завершающим блоком `# sbox-result` верни в последнем сообщении. Запись resultFile выполняет родительский оркестратор; сам этот файл не записывай. Это относится и к ролям только для чтения: не повышай разрешения ради сохранения отчёта. Меняй лишь разрешённые артефакты роли. Если проверка недоступна в текущей песочнице, явно отрази ограничение в отчёте.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Последнее сообщение верни строго как JSON-объект по схеме вывода: { "markdown": <полный ответ в Markdown>, "result": <содержимое блока sbox-result как объект> }.
|
|
2
|
+
Файл resultFile записывает раннер. Не записывай его самостоятельно и не запрашивай дополнительные права ради отчёта. Соблюдай ownership роли для остальных файлов.
|
|
@@ -26,4 +26,4 @@ verification: needs-review
|
|
|
26
26
|
|
|
27
27
|
## Истина спецификаций
|
|
28
28
|
|
|
29
|
-
<!-- Формат (spec-box / OpenSpec), пути файлов, как читать: `sbox
|
|
29
|
+
<!-- Формат (spec-box / OpenSpec), пути файлов, как читать: `sbox-contract index`. Внешняя система выгрузки, если есть. -->
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
| Файл | Обязательные ответы | Кто это читает |
|
|
22
22
|
|---|---|---|
|
|
23
|
-
| `overview.md` | Что за продукт и категория одной строкой; кто пользователи; какие системы рядом; где живёт код (корневые каталоги); где истина спецификаций ({{SPEC_TRUTH}}) и как её читать (`sbox
|
|
23
|
+
| `overview.md` | Что за продукт и категория одной строкой; кто пользователи; какие системы рядом; где живёт код (корневые каталоги); где истина спецификаций ({{SPEC_TRUTH}}) и как её читать (`sbox-contract index`) | исследователь, планировщик |
|
|
24
24
|
| `architecture.md` | Таблица пакетов и модулей с ответственностью; точки входа (команды, обработчики, страницы); поток данных от входа к результату; границы модулей (кто с кем не может взаимодействовать напрямую); генерируемый код и что нельзя править руками | исследователь, планировщик, реализатор |
|
|
25
25
|
| `conventions.md` | Язык кода, комментариев и коммитов; форматтер и линтер с командами; запрещённые конструкции; именование файлов, модулей, тестов, веток; правила коммитов | реализатор, ревьюер, тестировщик |
|
|
26
26
|
| `testing.md` | Таблица уровней тестов: когда какой применять, где лежат, чем запускаются; команды узкого прогона одного файла и полного прогона, проверки типов и линтера; куда пишутся JSON-отчёты и как их получить; правило именования тестов по сценариям спецификации; среда e2e или «—»; что проверяется только руками | тестировщик, реализатор, верификатор |
|
|
@@ -12,8 +12,16 @@ description: "Аудитор плана @spec-box/sdd. Вызывается то
|
|
|
12
12
|
|
|
13
13
|
## Этапы
|
|
14
14
|
|
|
15
|
+
Фаза `challenge` выполняется после гейта plan и до тестов при любом размере изменения и уровне автономности. Учитывай ответы человека из feedback. Повторный аудит проверяет весь исправленный план, а не только закрытие прежних замечаний.
|
|
16
|
+
|
|
17
|
+
Сопоставь запрос и текущее поведение кода с дельтами, дизайном и задачами. Ищи сценарии, пропущенные одновременно во всех артефактах. Для каждого существенного риска укажи нарушаемый инвариант, конкретный сценарий отказа, подтверждение из файлов и способ проверки исправления. Не создавай замечания ради количества; проектные критерии бери из wiki и правил проекта.
|
|
18
|
+
|
|
19
|
+
Отдельно оцени неопределённость и последствия ошибки. Малое число строк не делает изменение безопасным. Если риск недооценён, верни повышенную complexity реализации и ревью с обоснованием в отчёте.
|
|
20
|
+
|
|
15
21
|
Проверь: блокеры (шаг, который не может выполниться как написано); отсутствующие решения; необоснованные допущения (процитируй); расползание объёма; пробелы приёмки (поведение без шага или проверки); пробелы валидации; нарушения правил проекта; более простое решение с теми же критериями (или «нет»).
|
|
16
22
|
|
|
23
|
+
Блокирующая находка требует доработки: верни «заблокировано» с категорией «артефакт». CLI вернёт планировщику и повторит аудит после исправления. Даже при ошибочном статусе «готово» blocking findings не позволят пройти дальше. Полный ответ сохраняет CLI в evidence; сам меняй только resultFile.
|
|
24
|
+
|
|
17
25
|
## Содержимое resultFile
|
|
18
26
|
|
|
19
27
|
```markdown
|
|
@@ -32,6 +40,5 @@ description: "Аудитор плана @spec-box/sdd. Вызывается то
|
|
|
32
40
|
# sbox-result
|
|
33
41
|
status: готово | заблокировано
|
|
34
42
|
blocker: { category: артефакт | нет, artifact: design, message: "" }
|
|
35
|
-
findings:
|
|
36
|
-
- { level: blocking, text: "" }
|
|
43
|
+
findings: [] # обязательно; замечания: { level: blocking | non-blocking, file: "путь", text: "сценарий, доказательство, проверка" }
|
|
37
44
|
```
|
package/assets/roles/planner.md
CHANGED
|
@@ -27,7 +27,9 @@ description: "Планировщик @spec-box/sdd: proposal, дельты сп
|
|
|
27
27
|
2. Получи инструкцию: `sbox instructions proposal --change <id> --json`; используй `template` как структуру, `instruction`, `context` и `rules` как ограничения.
|
|
28
28
|
3. Запиши `proposal.md` по `resolvedOutputPath`.
|
|
29
29
|
4. Сверь proposal с запросом и с «Разбором запроса» из evidence. Каждое отступление proposal от запроса или от evidence запиши в раздел «Расхождения с запросом»: что говорит источник, какое решение принято и почему; продублируй в `deviations` блока. Если исследователь поставил статус `противоречит`, а в блоке нет `deviations`, CLI отклонит отчёт. Расхождения человек увидит на гейте proposal.
|
|
30
|
-
5. Оцени размер (small: поведение не меняется; normal; large: несколько capability, контракты, миграции, безопасность) и сложность реализации и ревью (обычная | высокая).
|
|
30
|
+
5. Оцени размер (small: поведение не меняется; normal; large: несколько capability, контракты, миграции, безопасность) и сложность реализации и ревью (простая | обычная | высокая).
|
|
31
|
+
Для complexity оцени реализацию и ревью отдельно: «простая» — локальная правка по ясному образцу без новых контрактов; «обычная» — несколько связанных изменений с понятным решением; «высокая» — новые контракты, существенная неоднозначность, миграция или сложные инварианты. Размер изменения и сложность — разные характеристики. Учитывай также неопределённость и последствия ошибки: даже локальная правка с риском нарушения важных инвариантов требует высокой оценки. Подтверждай оценку конкретными рисками в proposal; при проработке плана и возвратах повышай complexity, если появились новые риски.
|
|
32
|
+
|
|
31
33
|
6. Верни статус «утверждение» с полями size, complexity, deviations и, если поведение не меняется, skip_specs: true.
|
|
32
34
|
|
|
33
35
|
### Фаза plan
|
|
@@ -58,7 +60,7 @@ description: "Планировщик @spec-box/sdd: proposal, дельты сп
|
|
|
58
60
|
status: готово | утверждение | заблокировано
|
|
59
61
|
blocker: { category: пользователь | внешний | нет, message: "" }
|
|
60
62
|
size: small | normal | large # только на фазе propose
|
|
61
|
-
complexity: { implementation: обычная | высокая, review: обычная | высокая } #
|
|
63
|
+
complexity: { implementation: простая | обычная | высокая, review: простая | обычная | высокая } # на propose; на plan при повышении оценки
|
|
62
64
|
skip_specs: false # только на фазе propose
|
|
63
65
|
deviations: # только на фазе propose: отступления proposal от запроса или evidence
|
|
64
66
|
- { subject: запрос | evidence, text: "", decision: "", reason: "" }
|
|
@@ -10,7 +10,7 @@ description: "Исследователь @spec-box/sdd: Evidence Pack по из
|
|
|
10
10
|
- Запрос не пересказывай: его цели и границы попадают в Evidence Pack дословными цитатами со статусом. Всё, что нашлось сверх запроса, идёт в «Наблюдения вне запроса», а не в цели.
|
|
11
11
|
- Разделяй проверенные факты, выводы и предположения; у каждого факта путь к файлу или символу.
|
|
12
12
|
- Ищи ровно то, что нужно для следующего решения. Не перечисляй соседние модули ради полноты.
|
|
13
|
-
- Истина о поведении — спецификации (`sbox
|
|
13
|
+
- Истина о поведении — спецификации (`sbox-contract index`, `sbox-contract show`), истина о реализации — текущий код и тесты. Документация проекта — карта, а не доказательство. Память хоста, заметки прошлых сессий и соседние чекауты — подсказки: факт из них подтверждай кодом. Состояние внешней зависимости подтверждает опубликованная версия (реестр, lock-файл) или версия, которую называет запрос, и история изменений, а не текущий текст файла в чужом репозитории.
|
|
14
14
|
- Не вызывай других агентов, не меняй код и артефакты, не решай продуктовые вопросы.
|
|
15
15
|
- Отвечай только по шаблону «Содержимое resultFile».
|
|
16
16
|
|
|
@@ -21,7 +21,7 @@ description: "Исследователь @spec-box/sdd: Evidence Pack по из
|
|
|
21
21
|
## Этапы
|
|
22
22
|
|
|
23
23
|
1. Прочитай `request.md` и документацию из пакета.
|
|
24
|
-
2. Определи затронутые capability: `sbox
|
|
24
|
+
2. Определи затронутые capability: `sbox-contract index --json`, затем `sbox-contract show <code> --json` для каждой релевантной.
|
|
25
25
|
3. Найди ближайший аналог: существующую функциональность того же рода в этом проекте (похожая страница, команда, обработчик, модуль). Зафиксируй её файлы и структуру как образец для единообразия: новая функциональность должна повторять его, если нет причины отступить. Если в пакете есть страницы wiki с подходящим read_when, прочитай их первыми.
|
|
26
26
|
Места подключения: выполни `git grep -l -F --untracked -- '<идентификатор аналога>'` и перечисли все файлы вне каталога аналога, где он упоминается. Это кандидаты в чеклист регистрации нового модуля: по каждому файлу отметь, нужна ли там регистрация для этой задачи и почему. Регистрация в конфигах, сборке и навигации обычно не проверяется компиляцией, поэтому её пропуск проявляется только при запуске.
|
|
27
27
|
4. Если запрос касается веб-интерфейса и `testing.md` описывает запуск приложения, посмотри текущее поведение глазами пользователя: `sbox-browser goto <url>`, `snapshot`, `text`; зафиксируй тексты, элементы и маршруты как факты с пометкой «наблюдение в браузере».
|
package/assets/roles/reviewer.md
CHANGED
|
@@ -14,6 +14,8 @@ description: "Ревьюер @spec-box/sdd: тесты против специф
|
|
|
14
14
|
- Опровергнутый факт из evidence или раннего артефакта записывай в журнал: `sbox log add --change <id> --tag CODE "<факт с путём>"`; evidence не правь. Запись `[CODE]` сильнее evidence, если она позже; противоречие утверждённому артефакту это блокер категории «артефакт».
|
|
15
15
|
- Отвечай только по шаблону «Содержимое resultFile».
|
|
16
16
|
|
|
17
|
+
- Проверь, не пропущен ли важный сценарий одновременно в спецификации и тестах: сопоставь их с исходным запросом и затронутыми инвариантами кода. Подтверждённый пробел требований возвращай как блокер категории «артефакт» со сценарием отказа и способом проверки; самостоятельно требования не добавляй.
|
|
18
|
+
|
|
17
19
|
## Вход
|
|
18
20
|
|
|
19
21
|
Пакет от CLI с полем `phase`: `tests_review` (ревью тестов до реализации) или `review` (ревью реализации). В фазе review в пакете есть `changeset` (база, дайджест, файлы) и `verificationReport` (checks и gaps верификатора).
|
package/assets/roles/tester.md
CHANGED
|
@@ -14,6 +14,8 @@ description: "Тестировщик @spec-box/sdd: тесты по сценар
|
|
|
14
14
|
- Опровергнутый факт из evidence или раннего артефакта записывай в журнал: `sbox log add --change <id> --tag CODE "<факт с путём>"`; evidence не правь. Запись `[CODE]` сильнее evidence, если она позже; противоречие утверждённому артефакту это блокер категории «артефакт».
|
|
15
15
|
- Отвечай только по шаблону «Содержимое resultFile».
|
|
16
16
|
|
|
17
|
+
- Проверь, не пропущен ли важный сценарий одновременно в спецификации и тестах: сопоставь их с исходным запросом и затронутыми инвариантами кода. Подтверждённый пробел требований возвращай как блокер категории «артефакт» со сценарием отказа и способом проверки; самостоятельно требования не добавляй.
|
|
18
|
+
|
|
17
19
|
## Вход
|
|
18
20
|
|
|
19
21
|
Пакет от CLI: дельты `specs/`, `design.md` (контракты, структура UI, идентификаторы), `testing.md`, `conventions.md`, существующие тесты проекта. При возврате — `feedback` с findings ревьюера или блокером реализатора.
|
|
@@ -19,7 +19,7 @@ artifacts:
|
|
|
19
19
|
|
|
20
20
|
## Зачем — 1–3 предложения о проблеме, какую проблему решает, почему сейчас.
|
|
21
21
|
## Границы изменения — подразделы «Входит» и «Не входит».
|
|
22
|
-
## Функциональности — новые и изменяемые capability с идентификаторами (`sbox
|
|
22
|
+
## Функциональности — новые и изменяемые capability с идентификаторами (`sbox-contract index --json`); для новой capability придумай code в kebab-case. Если поведение продукта не меняется, укажи skip_specs: true в блоке sbox-result.
|
|
23
23
|
## Внешнее влияние — затронутые потребители, контракты, зависимости; несовместимые изменения помечай **BREAKING**.
|
|
24
24
|
## Расхождения с запросом — по одному пункту на каждое отступление предложения от запроса или от evidence: что говорит источник, решение, причина; продублируй их в deviations блока sbox-result. Если расхождений нет, «—».
|
|
25
25
|
|
|
@@ -34,7 +34,7 @@ artifacts:
|
|
|
34
34
|
instruction: |
|
|
35
35
|
Создай дельты спецификаций: определи, ЧТО должна делать система после изменения.
|
|
36
36
|
|
|
37
|
-
- перед записью прочитай proposal.md и текущие спецификации затронутых capability (`sbox
|
|
37
|
+
- перед записью прочитай proposal.md и текущие спецификации затронутых capability (`sbox-contract show <code> --json`);
|
|
38
38
|
- описывай наблюдаемое поведение с точки зрения пользователя или внешнего контракта;
|
|
39
39
|
- каждое утверждение проверяемо одним тестом: одно поведение, одно действие, один наблюдаемый результат;
|
|
40
40
|
- формулировки бери из glossary.md;
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"complexity": {
|
|
25
25
|
"type": "object",
|
|
26
26
|
"properties": {
|
|
27
|
-
"implementation": { "type": "string", "enum": ["обычная", "высокая"] },
|
|
28
|
-
"review": { "type": "string", "enum": ["обычная", "высокая"] }
|
|
27
|
+
"implementation": { "type": "string", "enum": ["простая", "обычная", "высокая"] },
|
|
28
|
+
"review": { "type": "string", "enum": ["простая", "обычная", "высокая"] }
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
"questions": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "priority": { "type": "string", "enum": ["P0", "P1", "P2"] }, "text": { "type": "string" } } } },
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sbox-contract
|
|
3
|
+
description: "Чтение, поиск и изменение контракта поведения продукта через sbox-contract: требования, сценарии, дельты spec-box или OpenSpec. Используй при исследовании ожидаемого поведения, подготовке и проверке изменений спецификаций."
|
|
4
|
+
metadata:
|
|
5
|
+
roles: [researcher, planner, tester, implementer, verifier, reviewer, challenger]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sbox-contract
|
|
9
|
+
|
|
10
|
+
Инструмент работает независимо от процесса SDD. В проекте SDD берёт секцию spec из .sbox/config.yaml; отдельно — из .sbox-contract.yaml или обнаруживает .tms.json / openspec/specs. `--cwd` задаёт рабочий каталог, `--format spec-box|openspec` явно выбирает формат. Используй `--json` для структурированного результата.
|
|
11
|
+
|
|
12
|
+
- `index`: capability с назначением, источником и числом требований/сценариев.
|
|
13
|
+
- `search "запрос" --limit 10`: лексический поиск до отдельных требований и сценариев, с id и источником. При необходимости попробуй другие термины.
|
|
14
|
+
- `show <id>`: полная capability, включая нормативный текст и сценарии.
|
|
15
|
+
- `instructions`: правила написания дельт выбранного формата. Прочитай перед редактированием; не переписывай исходный формат в другой.
|
|
16
|
+
- `validate`: структурная проверка истины. `validate --delta <каталог>` проверяет дельту относительно истины.
|
|
17
|
+
- `delta init <каталог>`: создать каталог с инструкцией формата; существующие каталоги не перезаписываются.
|
|
18
|
+
- `diff --delta <каталог> --preview`: исходное состояние затронутых capability, операции дельты и будущее состояние без записи.
|
|
19
|
+
- `apply --delta <каталог> --check --json`: проверка перед применением и revision. `apply --delta <каталог> --if-match <revision>` применяет дельту; при CONTRACT_CONFLICT заново прочитай изменения и проверь их. revision привязана к текущей истине и содержимому дельты, а не только к названиям файлов.
|
|
20
|
+
|
|
21
|
+
Каталог --delta содержит непосредственно файлы дельт: `<code>.yml` для spec-box или `<capability>/spec.md` для OpenSpec. В SDD это `specs/` внутри папки изменения. Пропущенный/пустой каталог отклоняется. Пути --delta считаются от --cwd.
|
|
22
|
+
|
|
23
|
+
В процессе SDD роли готовят и проверяют дельты; применяет их оркестратор при доставке. Наличие apply не расширяет полномочия роли и не заменяет согласования, тестирование или ревью. Самостоятельное применение не архивирует задачу и не создаёт коммит или PR. Успешная структурная проверка не доказывает полноту или правильность требований.
|
|
@@ -1,24 +1,44 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sbox-run
|
|
3
|
-
description: Выполнить
|
|
3
|
+
description: Выполнить изменение @spec-box/sdd в Claude Code или Codex — получить следующий шаг CLI, запустить роль и сдать отчёт. Используй при просьбе продвинуть изменение, запустить sbox или выполнить следующий шаг.
|
|
4
4
|
metadata:
|
|
5
|
-
hosts: [claude]
|
|
5
|
+
hosts: [claude, codex]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# sbox-run
|
|
9
9
|
|
|
10
|
-
Ты оркестратор: не
|
|
10
|
+
Ты оркестратор: роли выполняют задачу, CLI управляет состоянием. Делегируй роли последовательно; не исследуй проект и не меняй продуктовый код или артефакты планирования сам. Исключение для Codex — дословное сохранение ответа роли в resultFile.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
2. Запроси следующий шаг: `sbox next --change <id> --brief --json`. Никогда не запрашивай `next` без `--brief` и не читай packet.json сам: пакет нужен субагенту, а не тебе.
|
|
14
|
-
3. По полю `kind` ответа:
|
|
15
|
-
- `role`: если субагент этой роли уже запускался в этой сессии, продолжи его тем же сообщением через SendMessage (он помнит проект и артефакты, повторное чтение не нужно); иначе запусти нового субагента `sbox-<role>`. Сообщение: `packet: <path из поля packetFile>`. Дождись ответа. Затем сдай отчёт: `sbox report --change <id> --role <role> --json`. Покажи пользователю строку `summary` из ответа дословно и ошибки из `diagnostics`; больше ничего не добавляй. Сообщение субагента не пересказывай и не превращай в выводы: его утверждения проверяет CLI, а решение принимает человек на гейте. Если CLI вернул ошибки (например, не создан артефакт или изменены защищённые файлы), передай их тому же субагенту одним сообщением и повтори отчёт; не больше двух повторов. Повторный отчёт для уже принятого ответа безопасен: CLI вернёт `alreadyApplied: true` без нового запуска.
|
|
16
|
-
- `gate`: покажи пользователю пути артефактов из ответа и список `conflicts` дословно (расхождения между запросом, evidence и proposal с решениями планировщика). Если в ответе есть `questions`, покажи их и попроси ответить: ответы передаются при утверждении командой из поля `answer` (`--answer Q1=<вариант>`). Затем спроси: «Утвердить <gate>? Ответьте «да» или замечанием». «да» → `sbox approve <gate> --change <id> --by <user>`; замечание → `sbox reject <gate> --change <id> --comment "<текст>"`. Мелкие правки формулировок пользователь может внести в артефакт сам и ответить «да»: отклонение запускает цикл доработки роли. Затем вернись к шагу 2.
|
|
17
|
-
- `deliver`: покажи чеклист `sbox deliver --change <id> --check` и предложи доставку `sbox deliver --change <id>` (архив, коммит, push, пул-реквест). Не запускай доставку без просьбы пользователя.
|
|
18
|
-
- `wait`: покажи статус и блокер, спроси пользователя, что делать.
|
|
19
|
-
- `done`: сообщи об окончании.
|
|
20
|
-
4. Повторяй шаги 2–3, пока не встретишь gate, wait, deliver или done. Не запускай субагентов параллельно.
|
|
12
|
+
## Подготовка
|
|
21
13
|
|
|
22
|
-
|
|
14
|
+
Определи текущий хост: Claude Code → `claude`, Codex → `codex`. Не выбирай хост по runner.default: эта настройка относится к headless. Определи изменение из запроса или `sbox change list --json`; уточни только если выбор неоднозначен.
|
|
23
15
|
|
|
24
|
-
|
|
16
|
+
Запроси `sbox next --change <id> --runner <хост> --brief --json`. Не читай packet.json: передай путь роли. Модель и effort берутся из `execution`; после изменения конфига обнови материалы через `sbox host install --target <хост>` и перезапусти сессию, если хост не подхватил их.
|
|
17
|
+
|
|
18
|
+
## Запуск роли
|
|
19
|
+
|
|
20
|
+
Для `kind: role` используй имя из `execution.agent` и сообщение `packet: <packetFile>`. Каждый запуск должен прочитать свежий пакет. Ключ повторного использования субагента: изменение + runner + agent + model + effort. Не продолжай агента другого изменения или с устаревшими настройками.
|
|
21
|
+
|
|
22
|
+
- **Claude Code:** запусти установленного агента через Agent; повторный запуск — через SendMessage. Агент пишет resultFile и возвращает его путь.
|
|
23
|
+
- **Codex:** запусти пользовательского агента по имени через доступный механизм субагентов (agent_type, если он поддерживается). Не подменяй его встроенным worker с унаследованной моделью. Если доступно продолжение завершённого агента — продолжи его, иначе создай нового с тем же типом. Агент возвращает полный Markdown и блок sbox-result в последнем сообщении. Сохрани ответ дословно в resultFile из brief: используй инструмент записи или безопасную передачу данных, без интерполяции ответа в shell-команду. Роли с read-only песочницей не должны запрашивать запись ради отчёта.
|
|
24
|
+
|
|
25
|
+
Дождись завершения роли. Не создавай отдельные пользовательские задачи вместо субагентов. Промежуточный статус, обрыв или пересказ ответа не являются отчётом.
|
|
26
|
+
|
|
27
|
+
Если текущий клиент Codex не позволяет выбрать установленного пользовательского агента, используй **headless-путь**: `sbox run --runner codex --change <id> --max-runs 1 --json`. Он сам запускает роль с нужными настройками и принимает ответ; повторно report не вызывай. Дождись завершения, покажи итог, снова запроси next. При ошибке запуска, недоступной модели или CLI остановись и покажи диагностику; не заменяй модель молча. Если результат остался в ожидании/ошибке, не запускай бесконечные повторы.
|
|
28
|
+
|
|
29
|
+
## Приём результата
|
|
30
|
+
|
|
31
|
+
После нативного субагента выполни `sbox report --change <id> --role <role> --runner <хост> --json`. Показанные в execution настройки — запрошенные, не доказательство фактического запуска: не заполняй --model/--session предположениями.
|
|
32
|
+
|
|
33
|
+
Покажи строку summary дословно и диагностики. Если отчёт отклонён, снова запроси next для свежих packetFile/resultFile и передай ошибки роли; максимум две попытки исправления, затем остановись с диагностикой. Не продолжай роль, если CLI уже принял блокер и назначил другой следующий шаг. Повторная сдача принятого ответа безопасна: alreadyApplied не создаёт новый запуск.
|
|
34
|
+
|
|
35
|
+
Повторяй next после принятых отчётов до gate, wait, deliver или done.
|
|
36
|
+
|
|
37
|
+
## Остальные шаги
|
|
38
|
+
|
|
39
|
+
- **gate:** покажи пути артефактов, conflicts и questions из CLI. Получи решение человека. «Да» → команда approve из ответа; замечания → reject с текстом. Ответы на вопросы передай через --answer. После решения снова next. Не утверждай гейт самостоятельно.
|
|
40
|
+
- **deliver:** покажи `sbox deliver --change <id> --check`. Запускай доставку только по просьбе пользователя; это архивирование, коммит, push и пул-реквест.
|
|
41
|
+
- **wait:** покажи статус и блокер, остановись. Продолжение выполняется через `sbox change resume` после разрешения причины; при parked нужен новый бюджет --returns.
|
|
42
|
+
- **done:** сообщи о завершении.
|
|
43
|
+
|
|
44
|
+
При просьбе остановить активный headless-запуск используй `sbox stop --change <id>`. При нативном запуске останови также субагента средствами хоста; не сдавай его незавершённый ответ. После утраты контекста восстанови состояние через CLI, а не по памяти о последнем сообщении.
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import { resolveModel, MODEL_PROFILES, claudeAgentName } from '../../../core/model-policy.js';
|
|
1
2
|
import path from 'node:path';
|
|
2
3
|
import { loadRoleDescription, loadRoleText } from '../../../core/roles.js';
|
|
3
4
|
import { ROLES } from '../../../core/phases.js';
|
|
4
|
-
import {
|
|
5
|
+
import { READ_ONLY_ROLES } from '../../../core/runner.js';
|
|
5
6
|
import { loadSkills, skillsForRole } from '../../../core/skills.js';
|
|
6
7
|
import { assetsDir, readText, writeText } from '../../../core/paths.js';
|
|
7
8
|
import { configSchema } from '../../../core/config.js';
|
|
8
9
|
const AGENT_ROLES = ['researcher', 'planner', 'tester', 'implementer', 'reviewer', 'verifier', 'challenger'];
|
|
9
10
|
/**
|
|
10
|
-
* Агенты Claude Code
|
|
11
|
+
* Агенты Claude Code: базовое имя роли и варианты для каждого профиля. Текст агента это шаблон assets/hosts/claude/agent.md с данными роли:
|
|
11
12
|
* описание из фронтматтера файла роли, инструменты из runner.claude конфига (как в headless-режиме),
|
|
12
13
|
* скиллы из metadata.roles полем skills (субагенты не видят скиллы проекта сами).
|
|
13
14
|
*/
|
|
@@ -21,31 +22,24 @@ export function installClaudeAgents(root, config, skills = loadSkills(root)) {
|
|
|
21
22
|
const file = path.join(root, '.claude', 'agents', `sbox-${role}.md`);
|
|
22
23
|
writeText(file, agentFile(template, root, role, cfg, skillsForRole(skills, role)));
|
|
23
24
|
written.push(file);
|
|
25
|
+
for (const profile of MODEL_PROFILES) {
|
|
26
|
+
const variant = path.join(root, '.claude', 'agents', `${claudeAgentName(role, profile)}.md`);
|
|
27
|
+
writeText(variant, agentFile(template, root, role, cfg, skillsForRole(skills, role), profile));
|
|
28
|
+
written.push(variant);
|
|
29
|
+
}
|
|
24
30
|
}
|
|
25
31
|
return written;
|
|
26
32
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (!configured)
|
|
30
|
-
return null;
|
|
31
|
-
const v = configured.toLowerCase();
|
|
32
|
-
if (v.includes('opus'))
|
|
33
|
-
return 'opus';
|
|
34
|
-
if (v.includes('sonnet'))
|
|
35
|
-
return 'sonnet';
|
|
36
|
-
if (v.includes('haiku'))
|
|
37
|
-
return 'haiku';
|
|
38
|
-
return configured;
|
|
39
|
-
}
|
|
40
|
-
function agentFile(template, root, role, config, skills) {
|
|
33
|
+
function agentFile(template, root, role, config, skills, profile) {
|
|
34
|
+
const execution = resolveModel(config, 'claude', role, undefined, profile);
|
|
41
35
|
const tools = (READ_ONLY_ROLES.has(role) ? config.runner.claude.readOnlyTools : config.runner.claude.allowedTools).join(', ');
|
|
42
36
|
const values = {
|
|
43
37
|
role,
|
|
38
|
+
name: profile ? claudeAgentName(role, profile) : `sbox-${role}`,
|
|
44
39
|
description: JSON.stringify(loadRoleDescription(root, role)),
|
|
45
40
|
tools,
|
|
46
|
-
model:
|
|
47
|
-
|
|
48
|
-
effort: config.runner.efforts[role] ?? config.runner.defaultEffort,
|
|
41
|
+
model: JSON.stringify(execution.model),
|
|
42
|
+
effort: execution.effort,
|
|
49
43
|
skills: skills.length ? `skills:\n${skills.map((s) => ` - ${s}`).join('\n')}\n` : '',
|
|
50
44
|
body: loadRoleText(root, role).trim(),
|
|
51
45
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapters/host/claude/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAa,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapters/host/claude/index.ts"],"names":[],"mappings":"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"}
|