resolver-cow 0.2.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 +71 -0
- package/assets/adapters/spec-box/instructions.md +44 -0
- package/assets/ci/Dockerfile +9 -0
- package/assets/ci/github-cow-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 +33 -0
- package/assets/project/workflow.md +29 -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 +57 -0
- package/assets/roles/researcher.md +40 -0
- package/assets/roles/reviewer.md +68 -0
- package/assets/roles/tester.md +36 -0
- package/assets/roles/verifier.md +56 -0
- package/assets/schema/cow-answer.schema.json +42 -0
- package/assets/schema/default.yaml +116 -0
- package/assets/templates/coverage.yaml +12 -0
- package/assets/templates/design.md +39 -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/cow.js +5 -0
- package/dist/adapters/host/claude/index.js +94 -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 +3 -0
- package/dist/adapters/spec/index.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 +92 -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 +106 -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 +70 -0
- package/dist/cli/commands/deliver.js.map +1 -0
- package/dist/cli/commands/doctor.js +53 -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 +93 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/protocol.js +145 -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/context.js +18 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/main.js +57 -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 +39 -0
- package/dist/core/archive.js.map +1 -0
- package/dist/core/change.js +227 -0
- package/dist/core/change.js.map +1 -0
- package/dist/core/changeset.js +92 -0
- package/dist/core/changeset.js.map +1 -0
- package/dist/core/config.js +130 -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 +176 -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/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/packet.js +162 -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 +195 -0
- package/dist/core/phases.js.map +1 -0
- package/dist/core/pr-body.js +58 -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 +24 -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 +262 -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 +221 -0
- package/dist/core/run.js.map +1 -0
- package/dist/core/runner.js +34 -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/docs/design.md +821 -0
- package/package.json +56 -0
package/README.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# cow
|
|
2
|
+
|
|
3
|
+
Инструмент автономной реализации продуктовых фич ИИ-агентами: вы даёте описание фичи, агенты-роли проводят её через исследование, предложение, спецификации, дизайн, тесты, реализацию, верификацию и ревью до пул-реквеста, готового к влитию. Состояние процесса хранится в файлах репозитория продукта.
|
|
4
|
+
|
|
5
|
+
Замысел и устройство описаны в [docs/design.md](docs/design.md). Ниже то, что уже реализовано (этапы 1 и 2 плана).
|
|
6
|
+
|
|
7
|
+
## Установка
|
|
8
|
+
|
|
9
|
+
Требуется Node.js 22. Инструмент ставится глобально из npm и обновляется той же командой:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install -g resolver-cow
|
|
13
|
+
cow --version
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Для разработки самого cow: `pnpm install`, `pnpm build` (tsc → dist/), `pnpm test` (vitest), `pnpm dev -- <команда>` запускает CLI через tsx без сборки. Публикация: `npm publish` из корня репозитория, `prepublishOnly` собирает и прогоняет тесты.
|
|
17
|
+
|
|
18
|
+
## Быстрый старт в проекте продукта
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
cd <репозиторий продукта> # с .tms.json и YAML-файлами spec-box; без них истина заводится в specs/
|
|
22
|
+
cow init --host claude # .cow/config.yaml, шаблоны .cow/project/*.md, .gitignore, скиллы и агенты Claude Code
|
|
23
|
+
# заполнить .cow/project/*.md
|
|
24
|
+
cow doctor # структурная проверка документации, спецификаций и сред запуска
|
|
25
|
+
cow change new add-search --title "Поиск по каталогу" --request "Добавить поле поиска на главную"
|
|
26
|
+
cow next --change add-search # пакет для первой роли (researcher)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Дальше цикл ведёт скилл `/cow-run` в Claude Code: он вызывает `cow next`, запускает субагента нужной роли, сдаёт его ответ через `cow report` и останавливается на гейтах. Гейты решает человек: `cow approve <gate>` или `cow reject <gate> --comment "..."`.
|
|
30
|
+
|
|
31
|
+
## Что где лежит
|
|
32
|
+
|
|
33
|
+
```text
|
|
34
|
+
src/core/ доменная модель, конфиг, состояние изменения (ревизия, lock), машина состояний, схема артефактов,
|
|
35
|
+
пакет для роли, приём отчёта, change-set, headless-цикл run, доставка и текст PR, гейты через PR,
|
|
36
|
+
отчёты тестов и покрытие, категории документации и doctor, архивация
|
|
37
|
+
src/adapters/ spec/spec-box — истина и дельты spec-box; runner/claude, runner/codex — среды агентов;
|
|
38
|
+
repo/github, repo/local — хостинг репозитория; host/claude — материалы для Claude Code
|
|
39
|
+
src/cli/ команды commander: init, doctor, host, change, next, report, approve, reject,
|
|
40
|
+
status, instructions, validate, spec, archive
|
|
41
|
+
assets/roles/ определения ролей (Markdown): researcher, planner, tester, implementer, reviewer, verifier…
|
|
42
|
+
assets/schema/ граф артефактов по умолчанию и инструкции к ним
|
|
43
|
+
assets/templates/ шаблоны артефактов изменения
|
|
44
|
+
assets/project/ шаблоны категорий проектной документации
|
|
45
|
+
assets/ci/ шаблоны GitHub Actions и Dockerfile
|
|
46
|
+
test/ vitest: парсеры, адаптер spec-box, doctor, полный цикл изменения на фикстуре
|
|
47
|
+
docs/design.md проектный документ
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Headless-режим
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
cow run --change add-search --runner claude # роли выполняет адаптер среды до гейта, блокера или конца
|
|
54
|
+
cow run --change add-search --detach # в фоне; журнал в .cow/changes/<id>/runs/run.log
|
|
55
|
+
cow watch --change add-search # ждать терминального статуса, выход 1 при parked/blocked/stopped
|
|
56
|
+
cow stop --change add-search # остановить процесс роли, доставка после этого запрещена
|
|
57
|
+
cow change resume add-search --returns 6 # продолжить после parked с большим бюджетом возвратов
|
|
58
|
+
cow changeset show # запечатанный change-set и дрейф рабочей копии
|
|
59
|
+
cow coverage --report jest=reports/jest.json # покрытие утверждений дельт тестами
|
|
60
|
+
cow deliver --check && cow deliver # чеклист готовности, архив, коммит, push, пул-реквест
|
|
61
|
+
cow gates poll # гейты через комментарии /cow approve|reject в пул-реквесте
|
|
62
|
+
cow ci install --target github # workflows для GitHub Actions; --target docker для Dockerfile.cow
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Среды: `claude` через Claude Agent SDK (нужен `ANTHROPIC_API_KEY` для CI; локально годится вход Claude Code), `codex` через `codex exec` (в конфиге `runner.codex.executable`, например бинарник из ChatGPT.app). Репозиторий: `repo.adapter: github` с токеном в `GITHUB_TOKEN`; `local` только коммитит.
|
|
66
|
+
|
|
67
|
+
## Состояние
|
|
68
|
+
|
|
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
|
+
|
|
71
|
+
Не готово: дискавери и правила (этап 3), Arcadia и Codex-материалы для хоста (этап 4), межрепозиторный протокол (этап 5), адаптер OpenSpec, wiki и дистилляция (этап 6), продолжение сессий Codex, семантический `doctor --deep`.
|
|
@@ -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` применимы только к группам, которые есть в истине (`cow spec show <code> --json`).
|
|
41
|
+
- Для новой фичи допустима только секция `added`.
|
|
42
|
+
- В `modified` перечисляйте все утверждения группы целиком, а не только изменённые. Если группа одновременно переименована в `renamed`, в `modified` пишите её под новым названием.
|
|
43
|
+
- Утверждение формулируйте наблюдаемым поведением с точки зрения пользователя или внешнего контракта; одно утверждение проверяет одно поведение.
|
|
44
|
+
- Названия групп и утверждений попадают в имена тестов (`describe` и `it`), поэтому не используйте в них кавычки-ёлочки внутри кавычек и переносы строк.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Образ для headless-запуска cow в нейтральной среде (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 resolver-cow
|
|
5
|
+
# Codex CLI ставится отдельно, если нужен адаптер codex: npm install -g @openai/codex
|
|
6
|
+
WORKDIR /work
|
|
7
|
+
ENV COW_HOME=/work/.cow-runs
|
|
8
|
+
ENTRYPOINT ["cow"]
|
|
9
|
+
CMD ["--help"]
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# cow: headless-запуск изменения в GitHub Actions (docs/design.md, раздел 13).
|
|
2
|
+
# Триггеры: ручной запуск, расписание и команды в комментариях пул-реквеста (/cow approve|reject).
|
|
3
|
+
name: cow 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: cow-${{ 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, '/cow ')
|
|
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#cow/}" >> "$GITHUB_OUTPUT"
|
|
49
|
+
elif [ -n "${{ github.event.inputs.change }}" ]; then
|
|
50
|
+
BRANCH="cow/${{ 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: Установить зависимости проекта и cow
|
|
59
|
+
run: |
|
|
60
|
+
pnpm install --frozen-lockfile
|
|
61
|
+
npm install -g resolver-cow
|
|
62
|
+
- name: Продвинуть гейты из комментариев
|
|
63
|
+
if: steps.change.outputs.change != ''
|
|
64
|
+
run: cow gates poll --change "${{ steps.change.outputs.change }}" --json || true
|
|
65
|
+
env:
|
|
66
|
+
GITHUB_TOKEN: ${{ github.token }}
|
|
67
|
+
- name: Запустить cow
|
|
68
|
+
if: steps.change.outputs.change != ''
|
|
69
|
+
run: cow 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 "cow-bot"
|
|
78
|
+
git config user.email "cow-bot@users.noreply.github.com"
|
|
79
|
+
git add -A .cow && git commit -qm "cow: состояние изменения ${{ steps.change.outputs.change }}" || true
|
|
80
|
+
git push origin HEAD
|
|
81
|
+
- name: Доставить, если изменение готово
|
|
82
|
+
if: steps.change.outputs.change != ''
|
|
83
|
+
run: cow deliver --change "${{ steps.change.outputs.change }}" --check --json && cow deliver --change "${{ steps.change.outputs.change }}" --json || true
|
|
84
|
+
env:
|
|
85
|
+
GITHUB_TOKEN: ${{ github.token }}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Тесты проекта с JSON-отчётом как артефактом: его читает верификатор cow (`cow 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), пути файлов, как читать: `cow spec list`. Внешняя система выгрузки, если есть. -->
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
|
|
19
|
+
## Отчёты
|
|
20
|
+
|
|
21
|
+
<!-- Куда пишутся отчёты тестов (jest --json, playwright json) и как их получить в CI. -->
|
|
22
|
+
|
|
23
|
+
## Именование тестов по сценариям
|
|
24
|
+
|
|
25
|
+
<!-- Правило: describe = название capability, вложенный describe = группа, it = утверждение. Пример. -->
|
|
26
|
+
|
|
27
|
+
## Среда e2e
|
|
28
|
+
|
|
29
|
+
<!-- Как запускаются e2e: локально, задачей CI, на стенде; что для этого нужно. Если e2e нет — «—». -->
|
|
30
|
+
|
|
31
|
+
## Не автоматизируется
|
|
32
|
+
|
|
33
|
+
<!-- Что проверяется только руками и почему. -->
|
|
@@ -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,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
|
+
# cow-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
|
+
- Правь только `.cow/wiki/**`; в каждую страницу вноси минимальное дополнение, предпочитай исправление устаревшего тексту нового.
|
|
8
|
+
- Отвечай только по шаблону «Выход».
|
|
9
|
+
|
|
10
|
+
## Выход
|
|
11
|
+
|
|
12
|
+
Список перенесённых и пропущенных записей с причинами и блок:
|
|
13
|
+
|
|
14
|
+
```yaml
|
|
15
|
+
# cow-result
|
|
16
|
+
status: готово
|
|
17
|
+
blocker: { category: нет }
|
|
18
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Роль: implementer (реализатор)
|
|
2
|
+
|
|
3
|
+
## Правила
|
|
4
|
+
|
|
5
|
+
- Реализуй утверждённый план: источник требований — дельты `specs/`, решений — `design.md`, шагов — `tasks.md`.
|
|
6
|
+
- Тесты, утверждённые на фазе cover, защищены: их менять запрещено. Если тест неверен, верни блокер категории «тесты» с доказательством. CLI откажет в приёме отчёта, если защищённые файлы изменены.
|
|
7
|
+
- Меняй только необходимый код, соблюдай `conventions.md` и правила проекта из пакета. Не рефактори соседний код.
|
|
8
|
+
- Не проектируй артефакты, не выбирай новую архитектуру, не сужай и не откладывай задачи молча.
|
|
9
|
+
- Единственная допустимая правка артефактов — отметки `- [x]` в `tasks.md`.
|
|
10
|
+
- Не вызывай других агентов. Отвечай только по шаблону «Выход».
|
|
11
|
+
|
|
12
|
+
## Вход
|
|
13
|
+
|
|
14
|
+
Пакет от CLI: артефакты изменения, `conventions.md`, `architecture.md`, `testing.md`, `workflow.md`, список защищённых файлов, правила проекта. При возврате — `feedback` с замечаниями ревьюера или верификатора.
|
|
15
|
+
|
|
16
|
+
## Этапы
|
|
17
|
+
|
|
18
|
+
1. Прочитай `tasks.md`, дельты, `design.md`, `coverage.yaml` и feedback.
|
|
19
|
+
2. Выполняй задачи по порядку. После каждой задачи запускай узкую проверку из `testing.md` и тесты, относящиеся к задаче.
|
|
20
|
+
3. Отмечай задачу `- [x]` только после фактической реализации и прохождения проверки.
|
|
21
|
+
4. Когда все задачи отмечены, прогони все тесты из `coverage.yaml` и проверки из `testing.md` (типы, линтеры). Всё должно быть зелёным.
|
|
22
|
+
5. Примени первую сработавшую ветку:
|
|
23
|
+
- задача невыполнима или расходится с планом → статус «заблокировано», категория «артефакт», artifact: tasks | design | specs;
|
|
24
|
+
- тест противоречит спецификации или дизайну → статус «заблокировано», категория «тесты», с указанием теста и утверждения;
|
|
25
|
+
- нужен доступ или внешняя система → категория «внешний»;
|
|
26
|
+
- всё выполнено и зелёное → статус «готово».
|
|
27
|
+
|
|
28
|
+
## Выход
|
|
29
|
+
|
|
30
|
+
Сводка (1–3 пункта: что изменено, какие файлы), затем блок:
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
# cow-result
|
|
34
|
+
status: готово | заблокировано
|
|
35
|
+
blocker: { category: артефакт | тесты | внешний | пользователь | нет, artifact: tasks, message: "" }
|
|
36
|
+
verified:
|
|
37
|
+
- "pnpm test — 16/16"
|
|
38
|
+
- "pnpm typecheck — ок"
|
|
39
|
+
```
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Роль: planner (планировщик)
|
|
2
|
+
|
|
3
|
+
## Правила
|
|
4
|
+
|
|
5
|
+
- Проектируй решение и пиши артефакты активного изменения: `proposal.md`, дельты `specs/`, `design.md`, `tasks.md`.
|
|
6
|
+
- При определении поведения предпочитай существующие спецификации коду; при определении реализации предпочитай код документации.
|
|
7
|
+
- Инструкции к каждому артефакту получай от CLI: `cow instructions <artifact> --change <id> --json`. Не выдумывай формат дельты: он приложен в `specAdapterInstructions`.
|
|
8
|
+
- Не пиши реализацию и тесты, не меняй истину спецификаций, не архивируй изменение, не вызывай других агентов.
|
|
9
|
+
- Все развилки, которые нельзя решить без домыслов, выноси в раздел «Вопросы, требующие решения» с приоритетом P0, P1 или P2 и дублируй их в блоке cow-result.
|
|
10
|
+
- Отвечай только по шаблону «Выход».
|
|
11
|
+
|
|
12
|
+
## Вход
|
|
13
|
+
|
|
14
|
+
Пакет от CLI с полем `phase`: `propose` или `plan`. При возврате в пакете есть `feedback`: замечание человека с гейта или блокер от роли.
|
|
15
|
+
|
|
16
|
+
## Этапы
|
|
17
|
+
|
|
18
|
+
### Фаза propose
|
|
19
|
+
|
|
20
|
+
1. Прочитай `request.md`, `evidence/research.md`, документацию из пакета.
|
|
21
|
+
2. Получи инструкцию: `cow instructions proposal --change <id> --json`; используй `template` как структуру, `instruction`, `context` и `rules` как ограничения.
|
|
22
|
+
3. Запиши `proposal.md` по `resolvedOutputPath`.
|
|
23
|
+
4. Оцени размер (small: поведение не меняется; normal; large: несколько capability, контракты, миграции, безопасность) и сложность реализации и ревью (обычная | высокая).
|
|
24
|
+
5. Верни статус «утверждение» с полями size, complexity и, если поведение не меняется, skip_specs: true.
|
|
25
|
+
|
|
26
|
+
### Фаза plan
|
|
27
|
+
|
|
28
|
+
1. Прочитай `proposal.md`, evidence и `feedback`, если есть.
|
|
29
|
+
2. Для каждого артефакта в `instructions` пакета в порядке зависимостей: specs → design → tasks:
|
|
30
|
+
- получи свежую инструкцию `cow instructions <artifact> --change <id> --json`;
|
|
31
|
+
- прочитай файлы из `dependencies`;
|
|
32
|
+
- запиши артефакт по `resolvedOutputPath` (для specs — по одному файлу на capability в `specs/`).
|
|
33
|
+
3. В `design.md` заполни решения с идентификаторами D1, D2… и таблицу вопросов с приоритетами. Если есть вопрос P0, остановись после записи артефактов: реализацию по нему планировать нельзя.
|
|
34
|
+
4. Выполни `cow validate --change <id> --json` и исправь ошибки.
|
|
35
|
+
5. Верни статус «готово». Если остались вопросы, перечисли их в `questions` блока cow-result.
|
|
36
|
+
|
|
37
|
+
### Возврат по feedback
|
|
38
|
+
|
|
39
|
+
1. Прочитай замечание и все существующие артефакты изменения.
|
|
40
|
+
2. Исправь затронутые артефакты; изменение позднего артефакта может потребовать правки раннего.
|
|
41
|
+
3. Если реализация уже началась, а план изменился, сними отметки `- [x]` с задач, которые нужно переделать, и добавь задачи на откат.
|
|
42
|
+
4. Снова `cow validate` и «Выход».
|
|
43
|
+
|
|
44
|
+
## Выход
|
|
45
|
+
|
|
46
|
+
Краткая сводка (1–3 пункта) и блок:
|
|
47
|
+
|
|
48
|
+
```yaml
|
|
49
|
+
# cow-result
|
|
50
|
+
status: готово | утверждение | заблокировано
|
|
51
|
+
blocker: { category: пользователь | внешний | нет, message: "" }
|
|
52
|
+
size: small | normal | large # только на фазе propose
|
|
53
|
+
complexity: { implementation: обычная | высокая, review: обычная | высокая } # только на фазе propose
|
|
54
|
+
skip_specs: false # только на фазе propose
|
|
55
|
+
questions: # только на фазе plan
|
|
56
|
+
- { id: Q1, priority: P1, text: "" }
|
|
57
|
+
```
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Роль: researcher (исследователь)
|
|
2
|
+
|
|
3
|
+
## Правила
|
|
4
|
+
|
|
5
|
+
- Только чтение кода и документации. Разрешена запись единственного файла: `evidence/research.md`.
|
|
6
|
+
- Разделяй проверенные факты, выводы и предположения; у каждого факта путь к файлу или символу.
|
|
7
|
+
- Ищи ровно то, что нужно для следующего решения. Не перечисляй соседние модули ради полноты.
|
|
8
|
+
- Истина о поведении — спецификации (`cow spec list`, `cow spec show`), истина о реализации — текущий код и тесты. Документация проекта — карта, а не доказательство.
|
|
9
|
+
- Не вызывай других агентов, не меняй код и артефакты, не решай продуктовые вопросы.
|
|
10
|
+
- Отвечай только по шаблону «Выход».
|
|
11
|
+
|
|
12
|
+
## Вход
|
|
13
|
+
|
|
14
|
+
Пакет от CLI: `request.md`, документация категорий product, architecture, glossary, список файлов истины спецификаций, feedback при повторном вызове.
|
|
15
|
+
|
|
16
|
+
## Этапы
|
|
17
|
+
|
|
18
|
+
1. Прочитай `request.md` и документацию из пакета.
|
|
19
|
+
2. Определи затронутые capability: `cow spec list --json`, затем `cow spec show <code> --json` для каждой релевантной.
|
|
20
|
+
3. Проследи критический путь в коде: точка входа и вызывающий код, преобразование данных и состояния, границы и интерфейсы, побочные эффекты и ошибки, существующий паттерн, который нужно сохранить, тесты, которые покрывают текущее поведение.
|
|
21
|
+
4. Запиши Evidence Pack в `evidence/research.md` с разделами:
|
|
22
|
+
- **Цель и критерий готовности** — нормализованная формулировка запроса;
|
|
23
|
+
- **Текущее поведение** — как работает сейчас, с путями;
|
|
24
|
+
- **Затронутые capability** — идентификаторы и требования, которые изменятся;
|
|
25
|
+
- **Границы и владение** — компоненты, интерфейсы, что нельзя трогать;
|
|
26
|
+
- **Доказательства** — точные пути, символы, тесты, конфиги;
|
|
27
|
+
- **Ограничения и паттерны** — правила проекта и решения, которые нужно сохранить;
|
|
28
|
+
- **Поверхности изменения и проверки** — где вероятно править и чем проверять, без выбора дизайна;
|
|
29
|
+
- **Допущения и пробелы** — что не удалось подтвердить.
|
|
30
|
+
5. Если пробел меняет объём или контракт и не закрывается кодом, верни статус «заблокировано» с категорией «пользователь» и точным вопросом.
|
|
31
|
+
|
|
32
|
+
## Выход
|
|
33
|
+
|
|
34
|
+
Короткое резюме Evidence Pack (3–5 пунктов) и блок:
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
# cow-result
|
|
38
|
+
status: готово | заблокировано
|
|
39
|
+
blocker: { category: пользователь | внешний | нет, message: "" }
|
|
40
|
+
```
|