@gredescerber/agent-crew 0.0.0-stage → 0.6.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.
Files changed (101) hide show
  1. package/AGENTS.md +25 -0
  2. package/LICENSE +201 -0
  3. package/README.md +418 -2
  4. package/README.ru.md +421 -0
  5. package/adapters/claude/adapter.js +107 -0
  6. package/adapters/codex/adapter.js +101 -0
  7. package/bin/crew.js +60 -0
  8. package/docs/AGENT-SETUP.md +138 -0
  9. package/ecc/profile.json +16 -0
  10. package/evals/README.md +123 -0
  11. package/evals/fixtures/mini-app/README.md +10 -0
  12. package/evals/fixtures/mini-app/contracts/health.json +11 -0
  13. package/evals/fixtures/mini-app/package.json +10 -0
  14. package/evals/fixtures/mini-app/src/cart.js +14 -0
  15. package/evals/fixtures/mini-app/src/handlers.js +16 -0
  16. package/evals/fixtures/mini-app/src/pager.js +7 -0
  17. package/evals/fixtures/mini-app/test/cart.test.js +10 -0
  18. package/evals/fixtures/mini-app/test/handlers.test.js +13 -0
  19. package/evals/fixtures/mini-app/test/pager.test.js +8 -0
  20. package/evals/tasks/add-input-validation.json +15 -0
  21. package/evals/tasks/fix-off-by-one.json +14 -0
  22. package/evals/tasks/handler-per-contract.json +15 -0
  23. package/evals/tasks/judges/add-input-validation.judge.mjs +28 -0
  24. package/evals/tasks/judges/fix-off-by-one.judge.mjs +22 -0
  25. package/evals/tasks/judges/handler-per-contract.judge.mjs +18 -0
  26. package/package.json +46 -4
  27. package/roles/analyst.md +11 -0
  28. package/roles/builder.md +16 -0
  29. package/roles/implementer.md +17 -0
  30. package/roles/integrator.md +12 -0
  31. package/roles/planner.md +19 -0
  32. package/roles/reviewer.md +16 -0
  33. package/roles/scout.md +15 -0
  34. package/skills/crew-brief-analysis/SKILL.md +32 -0
  35. package/skills/crew-kickoff/SKILL.md +77 -0
  36. package/skills/crew-kickoff/task-format.md +215 -0
  37. package/skills/crew-review/SKILL.md +22 -0
  38. package/skills/crew-workflow/SKILL.md +46 -0
  39. package/src/commands/adapters.js +85 -0
  40. package/src/commands/ask.js +123 -0
  41. package/src/commands/board.js +88 -0
  42. package/src/commands/check.js +148 -0
  43. package/src/commands/commit.js +105 -0
  44. package/src/commands/compliance.js +109 -0
  45. package/src/commands/digest.js +64 -0
  46. package/src/commands/doctor.js +48 -0
  47. package/src/commands/eval.js +507 -0
  48. package/src/commands/github.js +169 -0
  49. package/src/commands/guard.js +101 -0
  50. package/src/commands/init.js +76 -0
  51. package/src/commands/kickoff.js +275 -0
  52. package/src/commands/labels.js +28 -0
  53. package/src/commands/merge-ready.js +33 -0
  54. package/src/commands/metrics.js +48 -0
  55. package/src/commands/pr.js +273 -0
  56. package/src/commands/shots.js +51 -0
  57. package/src/commands/status.js +48 -0
  58. package/src/commands/task.js +590 -0
  59. package/src/commands/up.js +355 -0
  60. package/src/commands/upgrade.js +178 -0
  61. package/src/commands/worker.js +322 -0
  62. package/src/core/board.js +127 -0
  63. package/src/core/config.js +83 -0
  64. package/src/core/digest.js +67 -0
  65. package/src/core/exec.js +50 -0
  66. package/src/core/guard.js +273 -0
  67. package/src/core/issues.js +154 -0
  68. package/src/core/lease.js +48 -0
  69. package/src/core/metrics.js +232 -0
  70. package/src/core/output.js +56 -0
  71. package/src/core/prd.js +612 -0
  72. package/src/core/proc.js +52 -0
  73. package/src/core/questions.js +51 -0
  74. package/src/core/queue.js +94 -0
  75. package/src/core/registry.js +143 -0
  76. package/src/core/session.js +61 -0
  77. package/src/core/shots.js +68 -0
  78. package/src/core/supervisor.js +56 -0
  79. package/src/core/version.js +44 -0
  80. package/src/mcp/server.js +81 -0
  81. package/templates/labels.json +23 -0
  82. package/templates/mcp.optional.json +23 -0
  83. package/templates/product/.github/ISSUE_TEMPLATE/epic.yml +22 -0
  84. package/templates/product/.github/ISSUE_TEMPLATE/feedback.yml +36 -0
  85. package/templates/product/.github/ISSUE_TEMPLATE/task.yml +62 -0
  86. package/templates/product/.github/pull_request_template.md +16 -0
  87. package/templates/product/.github/workflows/crew-guard.yml +45 -0
  88. package/templates/product/.github/workflows/crew.yml +118 -0
  89. package/templates/product/AGENTS.md +109 -0
  90. package/templates/product/contracts/README.md +8 -0
  91. package/templates/product/docs/architecture.md +41 -0
  92. package/templates/product/docs/brief-analysis.md +62 -0
  93. package/templates/product/docs/brief.md +25 -0
  94. package/templates/product/docs/playbooks/issues.md +91 -0
  95. package/templates/product/docs/playbooks/preflight.md +28 -0
  96. package/templates/product/docs/playbooks/timeline.md +52 -0
  97. package/templates/product/docs/prd.md +58 -0
  98. package/templates/product/events/event.example.json +10 -0
  99. package/templates/product/tests/acceptance/README.md +9 -0
  100. package/templates/stacks/web-fastapi.json +74 -0
  101. package/templates/stacks/web-node.json +70 -0
package/README.ru.md ADDED
@@ -0,0 +1,421 @@
1
+ [English](README.md) | **Русский**
2
+
3
+ # agent-crew
4
+
5
+ **Нейтральная к вендору среда разработки, где несколько кодинг-агентов (Claude Code, Codex, другие через адаптеры) и люди работают как одна команда над любым проектом, координируясь через GitHub Issues и Pull Requests.**
6
+
7
+ Люди пишут понятные задачи, агенты на машинах участников берут их из общей очереди, пишут код, проверяют его и сдают на ревью, а инструмент следит, чтобы они не мешали друг другу, не ломали `main` и работали по одним правилам, будь то Claude или GPT. Его обкатали на хакатоне из 4 человек (10-13 ноября 2026, около 160 смерженных PR); хакатонные функции вынесены в необязательный [режим события](#режим-события).
8
+
9
+ ---
10
+
11
+ ## Зачем
12
+
13
+ Когда несколько агентов (и людей) делят один репозиторий, каждый раз возникают одни и те же проблемы:
14
+
15
+ - два агента берут одну задачу, или упавший агент навсегда оставляет задачу «зависшей»;
16
+ - код агентов никто не ревьюит, или агент одобряет собственную работу;
17
+ - агент «зеленит CI», ослабив тест или поправив конфиг CI;
18
+ - у каждого вендора свои файлы инструкций, и правила расходятся;
19
+ - `main` сломан именно тогда, когда он нужен рабочим.
20
+
21
+ agent-crew отвечает на это небольшим протоколом поверх GitHub, который обеспечивается кодом и CI, а не текстом.
22
+
23
+ ## Из чего он состоит
24
+
25
+ | Часть | Что это | Зачем |
26
+ |---|---|---|
27
+ | **Правила** | `AGENTS.md`, роли, навыки | Как регламент для нового сотрудника: что делать, когда остановиться, что запрещено |
28
+ | **Пульт `crew`** | маленькая программа на Node.js без зависимостей (она же MCP-сервер) | Взять задачу, проверить код, сдать работу: одинаково для всех агентов |
29
+ | **Проверки** | GitHub Actions, шаблоны, защита веток | Агент может не послушаться текста, но обойти CI не может |
30
+
31
+ Всё живёт в **GitHub**: Issues это очередь задач, Pull Requests это сдача работы, Actions это проверки. Отдельного сервера нет. Агенты работают **на машинах участников, на их подписках**.
32
+
33
+ **Правило языка:** всё, что пишется в GitHub (issues, PR, коммиты, комментарии), и всё, что агенты пишут друг другу, по-английски. С каждым человеком агенты говорят на языке этого человека.
34
+
35
+ ## Как это работает
36
+
37
+ ```mermaid
38
+ flowchart LR
39
+ B[ТЗ<br/>docs/brief.md] --> P[Planner<br/>crew-kickoff]
40
+ P --> Q[(GitHub Issues<br/>очередь задач)]
41
+ Q -->|crew task next / claim| W1[Claude<br/>ноутбук alice]
42
+ Q -->|crew task next / claim| W2[Codex<br/>ноутбук bob]
43
+ Q -->|crew task next / claim| W3[...<br/>ноутбук carol]
44
+ W1 & W2 & W3 -->|crew check -> crew pr open| PR[Pull Requests]
45
+ PR -->|ревью агентом<br/>другого вендора| R[Ревью]
46
+ R -->|мерж| M[main, всегда<br/>готов к выпуску]
47
+ ```
48
+
49
+ Жизнь одной задачи:
50
+
51
+ ```
52
+ needs-spec ──(человек дописал критерии)──► ready ──(crew task claim)──► claimed ──(crew pr open)──► review ──► done
53
+ ▲ │
54
+ └──── аренда истекла / ───────┘
55
+ crew task release
56
+ ```
57
+
58
+ ## Быстрый старт
59
+
60
+ **Быстрее всего: одно сообщение агенту.** Агент читает [docs/AGENT-SETUP.md](docs/AGENT-SETUP.md) и разворачивает всё сам. Готовые сообщения для капитана, участника и плана лежат в конце того файла. Команды, которые за ними стоят:
61
+
62
+ ```bash
63
+ # капитан: проект, репо на GitHub, приглашения и защита main
64
+ crew up --repo owner/name --invite alice,bob
65
+
66
+ # участник: принять приглашение, клонировать, собрать локальные конфиги агентов
67
+ crew up --join owner/name
68
+ ```
69
+
70
+ Вручную остаётся то, что агенту нельзя или нечем: вход в аккаунты (`gh auth login`, Claude, Codex) и подтверждение доверия проекту в Codex.
71
+
72
+ ### 1. Установить (один раз на каждой машине)
73
+
74
+ Нужны Node.js 22+, git, [GitHub CLI](https://cli.github.com/) (`gh auth login`) и хотя бы один агент: [Claude Code](https://code.claude.com) или [Codex CLI](https://github.com/openai/codex).
75
+
76
+ Инструмент ставится прямо из публичного репо GitHub (без реестра и токенов):
77
+
78
+ ```bash
79
+ npm install -g @gredescerber/agent-crew
80
+ ```
81
+
82
+ Команда называется `crew`. Напрямую из GitHub: `npm install -g --allow-git=all github:GredesCerber/agent-crew#v0.6.0` (npm 12+ без флага запрещает установку из git).
83
+
84
+ Или клонировать и подключить (зависимостей нет; `npm link` только кладёт `crew` в PATH):
85
+
86
+ ```bash
87
+ gh repo clone GredesCerber/agent-crew && cd agent-crew && npm link
88
+ ```
89
+
90
+ ```bash
91
+ crew doctor
92
+ ```
93
+
94
+ `crew doctor` покажет, чего не хватает.
95
+
96
+ **Windows:** включите длинные пути в git, иначе он падает на worktree задач и `node_modules`:
97
+
98
+ ```bash
99
+ git config --global core.longpaths true
100
+ ```
101
+
102
+ ### 2. Создать проект (капитан)
103
+
104
+ ```bash
105
+ crew up my-product --repo owner/my-product --stack web-node --invite alice,bob --public
106
+ ```
107
+
108
+ `crew up` запускает `crew init`, делает первый коммит, создаёт репо на GitHub и пушит, приглашает участников, настраивает защиту `main`, метки и `CREW_HARNESS`. Повторный запуск безопасен: сделанные шаги пропускаются. Хосты агентов выбираются флагом `--hosts claude,codex`.
109
+
110
+ Или по шагам:
111
+
112
+ ```bash
113
+ crew init my-product --stack web-fastapi
114
+ cd my-product && git add -A && git commit -m "chore: crew init"
115
+ gh repo create owner/my-product --public --source . --push
116
+ crew github setup --apply
117
+ ```
118
+
119
+ Что появится в `my-product/`:
120
+
121
+ ```
122
+ AGENTS.md ← главные правила для всех агентов
123
+ CLAUDE.md ← одна строка: @AGENTS.md (Claude читает правила оттуда)
124
+ crew.config.json ← зоны, проверки, уровни моделей, MCP
125
+ agents/roles/ ← analyst, planner, builder, reviewer, integrator + помощники scout, implementer
126
+ agents/skills/ ← crew-workflow, crew-kickoff, crew-review, crew-brief-analysis
127
+ .claude/ .mcp.json ← сгенерировано для Claude Code (+ плагин ECC)
128
+ .codex/ .agents/skills/ ← сгенерировано для Codex
129
+ .github/ ← шаблоны задач и PR, CI-проверки (crew.yml) и правила PR (crew-guard.yml)
130
+ contracts/ tests/ docs/ ← контракты API, приёмочные тесты, ТЗ и плейбуки
131
+ events/ ← необязательные правила события (окно времени, состав команды)
132
+ ```
133
+
134
+ Пресеты стека: `web-fastapi` (React + FastAPI) и `web-node` (React + Node.js). Пресет это **не готовый код**, а список генераторов (`npm create vite`, `uv init`) и проверок; каркас создаёт сам агент.
135
+
136
+ ### 3. Настроить репо на GitHub (`crew github setup`)
137
+
138
+ Одна команда вместо кликов в Settings (нужны права admin на репо):
139
+
140
+ ```bash
141
+ crew github setup # показать план вызовов gh api, ничего не менять
142
+ crew github setup --apply # выполнить
143
+ ```
144
+
145
+ С `--apply` она:
146
+
147
+ - защищает `main`: только через PR, обязательны зелёные `check` (тесты) и `crew-guard` (правила PR + ревью агента), без force-push. **Ручных одобрений ноль**: человек не «кнопка approve»;
148
+ - включает авто-мерж и только обычный merge-коммит (squash и rebase выключены, потому что теряют trailers `Agent`/`Issue`);
149
+ - ставит переменную репо `CREW_HARNESS`: спецификацию установки, которую использует CI, по умолчанию `github:GredesCerber/agent-crew#v<версия>` (другая через `--harness`);
150
+ - создаёт или обновляет все метки (как `crew labels sync`).
151
+
152
+ Повторный запуск безопасен. Репо берётся из текущей папки (`gh repo view`) или из `--repo owner/name`; другая ветка через `--branch`.
153
+
154
+ > **Для защиты веток нужен публичный репо или GitHub Pro/Team.** На бесплатном тарифе приватный репо не может защитить `main`, и `crew github setup --apply` вернёт HTTP 403.
155
+
156
+ ### 4. Подключиться к готовому проекту (участники)
157
+
158
+ ```bash
159
+ crew up --join owner/name
160
+ ```
161
+
162
+ Команда принимает приглашение, клонирует репо, настраивает git и запускает `crew adapters build`, который создаёт локальные конфиги агентов (`.mcp.json`, `.codex/config.toml`, навыки, роли). Они зависят от машины и не коммитятся; `crew task claim` копирует их в каждый worktree задачи.
163
+
164
+ Имя агента в задачах и коммитах это `CREW_AGENT` плюс имя машины (`claude@alice-laptop`), его добавляет `crew`. Для двух сессий на одной машине задайте каждой свой `CREW_AGENT_ID`.
165
+
166
+ ### 5. План: ТЗ -> PRD -> задачи (капитан)
167
+
168
+ Капитан кладёт ТЗ в `docs/brief.md`, а агент-planner превращает его в `docs/prd.md` (навыки `crew-brief-analysis` и `crew-kickoff`). В PRD есть блок `crew-team` (кто за какую зону отвечает, кто ревьюит) и блоки `crew-task` / `crew-epic`. Дальше:
169
+
170
+ ```bash
171
+ crew task lint # проверить PRD без сети
172
+ crew kickoff # план (dry-run): что создастся
173
+ crew kickoff --apply # создать issues, когда PRD одобрен
174
+ ```
175
+
176
+ Подробности в разделе [crew kickoff](#crew-kickoff).
177
+
178
+ ### 6. Запустить агентов
179
+
180
+ **Claude Code**: откройте папку проекта; он сам прочитает `CLAUDE.md` -> `AGENTS.md` и подключит MCP-сервер `crew`. Затем:
181
+
182
+ > /loop 10m Work the crew-workflow loop
183
+
184
+ **Codex**: запустите `codex` в корне проекта и подтвердите доверие проекту (иначе он не прочитает `.codex/config.toml`). В Codex нет `/loop`, поэтому цикл крутится в чате поверх `crew task next --wait`:
185
+
186
+ > Work the crew-workflow loop without stopping: run `crew task next --wait 20`, do what its next_actions say, then run it again. Stop after three "no free tasks" answers in a row.
187
+
188
+ Участники никогда не планируют; `crew kickoff` запускает только капитан.
189
+
190
+ ## Концепции
191
+
192
+ ### Задачи и аренда
193
+ Задача это GitHub issue с метками `status:*`, `area:*`, `tier:*` и `risk:*`. `crew task claim <id>` берёт её: меняется метка, в комментарий пишется маркер аренды, создаются ветка `crew/<id>-...` и отдельный worktree. Аренда длится 45 минут и продлевается активностью (`crew task heartbeat`, маркеры crew в issue или пуш в ветку `crew/<id>-*`). Если агент умер, задача сама возвращается в очередь (GitHub Action проходит каждые 15 минут). `crew task cleanup` убирает worktree закрытых задач без незакоммиченных правок и с работой, уже сохранённой в `main` или на GitHub.
194
+
195
+ ### Зоны и хозяева
196
+ Каждая задача относится ровно к одной зоне (`web`, `api`, `infra`, ...). Блок `crew-team` в PRD сопоставляет зоны людям:
197
+
198
+ ````
199
+ ```crew-team
200
+ alice: web, review # фронтенд + ревьюер
201
+ bob: api
202
+ ```
203
+ ````
204
+
205
+ `crew task next` сначала предлагает агенту человека его собственные задачи, потом ничьи, потом чужие зоны («помоги хозяину»). Роль `review` отмечает ревьюеров команды.
206
+
207
+ ### Очередь «сначала ревью»
208
+ `crew task next` сначала обслуживает команду, потом себя: свой PR, которому нужны правки, затем готовый к мержу PR, затем PR, ждущий вашего ревью, и только потом новая задача. Так работа не копится за ревью.
209
+
210
+ ### Перекрёстное ревью и `crew-guard`
211
+ Код Claude ревьюит Codex и наоборот: разные модели ловят разные ошибки. `crew-guard` это коммит-статус на каждом PR:
212
+
213
+ - `failure`, если PR меняет правила агентов или CI (`crew.config.json`, `.github/**`, `AGENTS.md`, `CLAUDE.md`, `agents/**`, `events/**`). Агентам это нельзя совсем; правила меняет мейнтейнер;
214
+ - `failure`, если PR меняет или удаляет **существующий** приёмочный тест, а его задача этого не разрешает (поле `changes_acceptance` задачи в PRD). Новые тесты добавлять можно;
215
+ - `failure`, если ревьюер попросил правки; `pending`, пока ждёт ревью; `success`, когда ревью сделал **другой агент** на текущем коммите (`crew pr review <n> --verdict approve`), для `risk:high` два ревью;
216
+ - для `risk:high` тесты и код пишут **разные агенты**: задача на тесты (`tests_for`) кладёт их в `tests/pending/<T>/`, а основная задача обязана перенести их в `tests/acceptance/` без единой правки (иначе `failure`); `crew task claim` не даёт автору тестов взять код;
217
+ - кто ревьюит, задаётся в `crew.config.json -> review`: по умолчанию агент другого вендора, а если такого нет 30 минут, любой другой агент. Команда только с Claude использует `"require": "other-agent"` или `"hosts": ["claude"]`;
218
+ - workflow `crew-guard.yml` берётся из `main`, а не из ветки PR (`pull_request_target`), и код PR не запускает, поэтому PR не может ослабить проверку сам себе;
219
+ - на PR `crew check` в CI использует `crew.config.json` из base-коммита, а не из ветки PR; на push в `main` использует свой.
220
+
221
+ `crew guard --pr <n>` покажет то же самое локально: почему PR не мержится.
222
+
223
+ ### Защищённый `main`
224
+ `crew github setup --apply` делает `main` доступным только через PR с обязательными `check` и `crew-guard`. Люди не одобряют каждый PR: они тестируют работающий продукт и пишут фидбек, а planner превращает его в задачи. См. замечание о публичных репо выше.
225
+
226
+ **Аварийная остановка:** создайте issue с меткой `crew:pause`; агенты закончат текущий шаг и остановятся. Это в коде: пока такой issue открыт, `crew task next` и `crew task claim` возвращают ошибку `paused`.
227
+
228
+ ## Команды `crew`
229
+
230
+ | Команда | Что делает |
231
+ |---|---|
232
+ | `crew task next [--area web] [--tier low] [--wait 20]` | следующее дело для вас: свой PR на правки, PR на мерж, ревью или свободная задача под вашу зону и уровень модели; с `--wait N` в простое опрашивает раз в минуту до N минут (цикл в чате для Codex) |
233
+ | `crew task claim <id>` | взять задачу: метка, аренда, ветка `crew/<id>-...`, отдельный worktree |
234
+ | `crew check` | прогнать линтер/типы/тесты из `crew.config.json`; коротко про ошибки, полный лог в `.crew/logs/`; у шага есть `timeout_s` (по умолчанию 600), зависший шаг убивается и даёт `ci_red` |
235
+ | `crew commit -m "feat: ..."` | коммит с trailers `Agent` и `Issue` |
236
+ | `crew pr open` | открыть PR (только после зелёного check), задача -> `review` |
237
+ | `crew pr review <n> --verdict approve\|changes --note "..."` | вердикт ревьюера-агента (засчитывается `crew-guard`; своё ревью нельзя) |
238
+ | `crew guard --pr <n>` | почему PR не мержится: правила, приёмочные тесты, ревью (CI ставит статус с `--report`) |
239
+ | `crew task status <id> blocked --note "..."` | сменить статус и оставить хендофф |
240
+ | `crew task release <id>` / `heartbeat <id>` | вернуть задачу / продлить аренду (только свою; чужую человек с `--force`) |
241
+ | `crew shots before\|after --url <страница> [--name <экран>]` | скриншот «до» и «после» (Playwright) для задачи, меняющей интерфейс; `crew pr open` показывает их таблицей Before / After |
242
+ | `crew board [--port 4747]` | локальная доска задач в браузере: очередь по статусам, ждущие PR; вручную назначить исполнителя, статус и приоритет (без токенов агентов) |
243
+ | `crew upgrade [--apply]` | обновить существующий проект до установленной версии (правила, навыки, workflows, конфиги агентов; переводит проекты с hk); `--apply` открывает PR |
244
+ | `crew ask <зона\|@логин> --text "..." [--task N] [--human]` | вопрос хозяину зоны; вопрос — это issue (`crew:question`), ответ приходит в `crew task next` |
245
+ | `crew inbox [--ack N]` / `crew answer N --text "..." [--human]` | вопросы к тебе и ответы на твои / ответить и закрыть (или передать человеку с `needs-human`) |
246
+ | `crew pr waive <n> --rule <r> --reason "..."` | только человек: снять «бумажное» правило crew-guard (closes, agent_trailer, not_crew_pr) для текущего коммита PR, сделанного без crew; ревью всё равно нужно |
247
+ | `crew merge-ready [--dry_run]` | смержить готовые PR (ревью, зелёные check и crew-guard), которые не сольются сами; запускает job в CI по расписанию, сессия агента не нужна |
248
+ | `crew digest [--post]` | сводка команды без LLM: что ждёт человека, зависшие аренды, PR в ожидании, открытые вопросы, кто простаивает; job в CI по расписанию держит её в закреплённом issue |
249
+ | `crew task cleanup [--dry_run]` | убрать worktree закрытых задач (только без незакоммиченных правок и с работой, уже сохранённой в main или на GitHub) |
250
+ | `crew task lint` | проверить `docs/prd.md` без сети: все ошибки сразу (строка, id, правило) |
251
+ | `crew task sweep` / `crew task promote` | вернуть просроченные аренды в очередь / перевести `waiting` в `ready`, когда зависимости закрыты (запускает CI) |
252
+ | `crew kickoff [--apply]` | создать issues и эпики из одобренного PRD (по умолчанию dry-run) |
253
+ | `crew status` | что в очереди, кто что делает, что заблокировано |
254
+ | `crew worker --host codex` | безголовый цикл, который берёт задачи и запускает агента на каждую (только для людей) |
255
+ | `crew metrics`, `crew eval` | метрики по агентам из журнала / сравнение агентов на эталонных задачах |
256
+ | `crew compliance check` / `disclosure` | режим события: проверка правил / файл раскрытия для сабмита |
257
+ | `crew up`, `crew init`, `crew adapters build`, `crew labels sync`, `crew doctor` | настройка (для людей; `crew up` делает всё сразу, см. docs/AGENT-SETUP.md) |
258
+ | `crew github setup [--apply]` | защита `main`, переменная `CREW_HARNESS`, метки: план, а с `--apply` выполнить (для людей) |
259
+ | `crew mcp` | MCP-сервер: те же команды как инструменты `crew_*` для агентов |
260
+
261
+ MCP-сервер запущен в корне проекта, поэтому `crew_check`, `crew_commit`, `crew_pr_open`, `crew_task_claim` и `crew_compliance_check` принимают необязательный `cwd`: абсолютный путь worktree из `crew_task_claim -> artifacts.worktree`. Без него инструменты работают с корнем, а не с веткой задачи.
262
+
263
+ Каждая команда отвечает в одной форме, чтобы агенту не приходилось гадать:
264
+
265
+ ```json
266
+ {
267
+ "schema": "crew/v1",
268
+ "status": "error",
269
+ "summary": "Failed: api-test",
270
+ "next_actions": ["fix it and run crew check again"],
271
+ "artifacts": { "log": ".crew/logs/check-2026-12-05T12-00-00.txt" },
272
+ "error": {
273
+ "code": "ci_red",
274
+ "cause_hint": "FAILED tests/test_auth.py::test_login - assert 401 == 200",
275
+ "retry": "fix it and run crew check again",
276
+ "stop_when": "the same error 3 times in a row -> crew task status <id> blocked"
277
+ }
278
+ }
279
+ ```
280
+
281
+ (Тексты в ответах команд английские, как и всё, что пишется в GitHub и между агентами.)
282
+
283
+ ## crew kickoff
284
+
285
+ Planner (навык `crew-kickoff`) читает `docs/brief.md` и `docs/brief-analysis.md` и пишет только `docs/prd.md` с блоками `crew-team`, `crew-task` и `crew-epic` ([формат](skills/crew-kickoff/task-format.md)). Issues создаёт код:
286
+
287
+ ```bash
288
+ crew task lint # проверить PRD без сети: все ошибки сразу (строка, id, правило)
289
+ crew kickoff # план (dry-run): что создастся, статусы, порядок
290
+ crew kickoff --apply # создать задачи и эпики, только если PRD одобрен
291
+ ```
292
+
293
+ - **Одобрение** это первая строка PRD `<!-- crew:prd status: approved by: <login> at: <ISO> -->`. Без неё `--apply` отвечает `plan_not_approved`. Применять может только капитан. `--apply` также отказывает с `team_not_collaborator`, если в блоке `crew-team` указан человек, который не является участником репо.
294
+ - **Каркас**: первый блок (`skeleton: true`, `tier/risk: high`); остальные задачи неявно ждут его. Задача с зависимостями создаётся в `status:waiting` («после #N»), без них в `ready`, а `ready: false` даёт `needs-spec`.
295
+ - **waiting -> ready** делает `crew task promote`: job `promote` в `crew.yml` при закрытии issue и `crew task sweep` по расписанию.
296
+ - **Риск** `low | med | high` (по умолчанию `med`), одна зона на задачу, критерии приёмки `Given/When/Then` (русские `Дано/Когда/Тогда` тоже принимаются), `req: [R1]` превращается в «Требования ТЗ» в issue.
297
+ - **Повтор безопасен**: задачи находятся по маркеру `crew:task` в теле, создаются только новые; изменённые или удалённые блоки дают лишь предупреждения. Между вызовами `gh issue create` пауза 1 с, при rate limit повтор через 10/30/60 с; сбой посередине это `kickoff_partial`, просто запустите снова.
298
+
299
+ ## crew worker
300
+
301
+ Агент может крутить очередь и без интерфейса: человек запускает воркер и занимается своим.
302
+
303
+ ```bash
304
+ crew worker --host codex --area api --tier mid # Codex берёт задачи зоны api
305
+ crew worker --host claude --max-tasks 3 --dry-run # показать, что взял бы, ничего не трогая
306
+ ```
307
+
308
+ Цикл: `crew task next` -> `crew task claim <id>` -> агент запускается в worktree задачи (`CREW_AGENT=<host>/<model>`) с коротким промптом («работай только над #id по crew-workflow; закончи `crew pr open` или `crew task status blocked/needs-spec`») -> воркер смотрит статус issue -> следующая задача. **Каждая задача это новый процесс агента**, то есть чистый контекст на границе фазы.
309
+
310
+ | Флаг | По умолчанию | Что делает |
311
+ |---|---|---|
312
+ | `--host claude\|codex` | нет | какой агент запускать (`adapter.headless()`) |
313
+ | `--area`, `--tier` | любая, `high` | как у `crew task next`; модель берётся из `crew.config.json -> tiers` |
314
+ | `--model` | из tier | конкретная модель |
315
+ | `--max-tasks` | 5 | сколько задач взять за запуск |
316
+ | `--max-failures` | 3 | стоп после N неудач подряд |
317
+ | `--task-timeout-min` | 60 | убить агента (всё дерево процессов) на задаче |
318
+ | `--wait` | выкл | очередь пуста: опрос раз в 5 мин вместо выхода |
319
+ | `--dry-run` | выкл | только показать задачу и команду запуска |
320
+
321
+ - **Успех**: после выхода агента задача в `review`/`done`. `blocked`/`needs-spec` это хендофф, а не неудача.
322
+ - **Неудача**: задача осталась `claimed` (агент упал, вышел молча, таймаут): воркер делает `crew task release` с заметкой и ссылкой на лог.
323
+ - **Стоп**: пауза (`crew:pause`), пустая очередь, лимит задач, N неудач подряд, 3 конфликта claim подряд, агент не запускается.
324
+ - Прогресс по задачам идёт в stderr, вывод агента в `.crew/logs/worker-<id>-*.log`, итог это ответ `crew/v1` с `artifacts: { done, failed, blocked, stopped_reason }`.
325
+ - Codex запускается как `codex exec --json -s workspace-write -c sandbox_workspace_write.network_access=true -C <worktree> --add-dir <.git репо> -` (промпт в stdin). Claude как `claude -p <промпт> --output-format json --permission-mode acceptEdits` с явным списком `--allowedTools`.
326
+ - Только для людей: в MCP воркер не попадает.
327
+
328
+ ## Метрики и eval
329
+
330
+ Без данных нельзя понять, стал ли инструмент лучше, поэтому каждая команда `crew` пишет событие в журнал.
331
+
332
+ **Журнал.** После каждой команды в `.crew/metrics.jsonl` (в корне основного репо, общий для всех worktree) дописывается строка:
333
+
334
+ ```json
335
+ {"command":"check","issue":12,"agent":"codex/gpt-5","status":"error","error_code":"ci_red","duration_ms":8123,"at":"2026-12-05T12:00:00.000Z"}
336
+ ```
337
+
338
+ Номер задачи берётся из аргумента `id`, из `artifacts.issue` или из ветки `crew/<id>-...`. Пишется только в проекте с `crew.config.json`, и запись никогда не ломает команду. Отключить: `CREW_METRICS=off`.
339
+
340
+ **Сводка:** `crew metrics [--agent codex] [--since 2d]` показывает по каждому агенту:
341
+
342
+ | Метрика | Как считается |
343
+ |---|---|
344
+ | доведено (completion rate) | успешные `pr open` / успешные `task claim` |
345
+ | check на задачу (retries) | среднее число запусков `crew check` на задачу |
346
+ | claim -> PR | медиана времени от claim до первого успешного `pr open` по той же задаче |
347
+ | частые ошибки | топ-5 `error.code` по всем событиям |
348
+
349
+ `--agent codex` ловит и `codex/gpt-5`; `--since` принимает дату, ISO-время или `30m` / `6h` / `2d`.
350
+
351
+ **Eval.** `crew eval` сравнивает агентов на одних и тех же эталонных задачах. Он нужен, чтобы понять, не ухудшила ли правка `AGENTS.md`, навыков или ролей работу агентов, и какую модель на какой уровень ставить:
352
+
353
+ ```bash
354
+ crew eval --dry-run # проверить задачи и показать план, агенты не запускаются
355
+ crew eval --agents claude,codex --runs 3 # задачи x агенты x прогоны
356
+ crew eval --agents claude:opus,claude:sonnet --task fix-off-by-one
357
+ ```
358
+
359
+ Каждый прогон идёт в свежей временной копии репо-фикстуры (на закреплённом `commit`, если он задан): агент запускается через `headless()` своего адаптера, потом детерминированные судьи (`command` для тестов/сборки, `grep` для шаблона в файлах) решают pass/fail. Отчёт это таблица и `artifacts.results`: **pass@1**, **pass@k**, **стабильность (consistency)**, среднее время и стоимость (если агент её сообщает) по каждому агенту и задаче; полный отчёт в `.crew/evals/`.
360
+
361
+ Задачи это `evals/tasks/*.json` в формате, близком к [agent-eval](https://github.com/joaquinhuigomez/agent-eval) (JSON вместо YAML, без зависимостей), фикстура это `evals/fixtures/mini-app/`. Формат, соответствие agent-eval и как добавить задачу описаны в [`evals/README.md`](evals/README.md). В CI (`.github/workflows/eval.yml`) на PR в `templates/product/AGENTS.md`, `skills/`, `roles/`, `evals/` гоняется `--dry-run`; настоящий прогон запускается вручную, потому что агентам нужны ключи API.
362
+
363
+ ## ECC и необязательные MCP-серверы
364
+
365
+ - **[ECC](https://github.com/affaan-m/ECC)** включается для Claude Code автоматически (`.claude/settings.json`). Какие навыки ECC брать по ролям, описано в [`ecc/profile.json`](ecc/profile.json). ECC это ускоритель, а не зависимость: протокол `crew` работает и без него, поэтому Codex работает наравне.
366
+ - **Необязательные MCP-серверы** лежат в `crew.config.json -> mcp` и по умолчанию выключены. Ключи только из переменных окружения, никогда из файлов:
367
+ - `context7`: свежая документация библиотек и API (включать первым);
368
+ - `perplexity`: глубокий веб-поиск для kickoff и питчей (`PERPLEXITY_API_KEY`; имя пакета проверить перед включением);
369
+ - `playwright`: браузер для сквозных тестов демо-пути.
370
+
371
+ После изменения: `crew adapters build`.
372
+
373
+ ## Режим события
374
+
375
+ Сам инструмент нейтрален; для хакатонов и других событий с ограничением по времени есть необязательный режим на основе `events/event.json` (скопируйте его из `event.example.json` и пропишите `"event": "events/event.json"` в `crew.config.json`; `crew up --start ... --end ...` делает это за вас):
376
+
377
+ - CI проверяет, что нет коммитов до старта и после конца, что PR идут только от `team_members` и что ИИ используется только если разрешён;
378
+ - `crew compliance check` запускает те же проверки локально; `crew compliance disclosure` пишет `DISCLOSURE.md`: какие инструменты и агенты использовались и сколько коммитов от кого;
379
+ - репо продукта создаётся пустым на старте (`crew init`), и во время события в него коммитят только участники команды;
380
+ - плейбуки продукта в `templates/product/docs/playbooks/` описывают расписание дня такого события ([`timeline.md`](templates/product/docs/playbooks/timeline.md)), чек-лист перед событием ([`preflight.md`](templates/product/docs/playbooks/preflight.md)) и правила ведения задач: статусы, метки, Definition of Ready, кто что делает ([`issues.md`](templates/product/docs/playbooks/issues.md)).
381
+
382
+ Правила каждого события всё равно читайте заново: у организаторов они разные. Без `events/event.json` ничего из этого не действует.
383
+
384
+ ## Как расширять
385
+
386
+ | Хочу | Что сделать |
387
+ |---|---|
388
+ | Новую команду `crew` | файл в `src/commands/` + строка в `src/core/registry.js`; она появится и в CLI, и в MCP |
389
+ | Поддержку нового агента (Gemini, Cursor, ...) | `adapters/<host>/adapter.js` с `generate()` и `headless()`, добавить хост в `hosts` |
390
+ | Новый стек | `templates/stacks/<name>.json`: зоны, генераторы, проверки |
391
+ | Новую роль или навык | `roles/<name>.md` или `skills/<name>/SKILL.md` (формат Agent Skills) |
392
+
393
+ Подробности: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) (на английском). Какие готовые решения мы изучили и чем отличаемся: [`docs/RESEARCH.md`](docs/RESEARCH.md).
394
+
395
+ ## Ограничения
396
+
397
+ - **Для защиты веток нужен публичный репо или GitHub Pro/Team.** Приватный репо на бесплатном тарифе GitHub не может защитить `main`; `crew github setup --apply` вернёт HTTP 403.
398
+ - **`crew-guard` ловит лень и ошибки, а не злой умысел.** Агенты работают под аккаунтами людей, поэтому агент, который *намеренно* подделает маркер `crew:review` от чужого имени или вмержит с `--admin`, технически не остановлен; это запрещено в `AGENTS.md` и видно в истории PR. Ослабить тест, «починить» CI или одобрить себя случайно не выйдет.
399
+ - **Headless-запуск Claude** для `crew worker` использует `claude -p` с `--permission-mode acceptEdits` и явным списком `--allowedTools` (правки файлов, `npm`/`node`/`uv`, чтение `git`, `crew`); флаги взяты из документации Claude Code и проверялись вживую меньше, чем Codex. Сначала попробуйте одну задачу на своей машине. Headless-запуск Codex (`codex exec`) проверен вживую на codex-cli 0.166: инструменты `crew` вызываются без подтверждения (`default_tools_approval_mode = "approve"` только для сервера `crew`).
400
+ - **Пакет Perplexity MCP не выбран:** в `templates/mcp.optional.json` стоит заглушка `VERIFY-PACKAGE-NAME-BEFORE-ENABLING`; включайте только после проверки имени пакета.
401
+ - **Приватность ваших правил:** `crew init` копирует в репо продукта правила, роли, навыки и workflow, поэтому если этот репо публичный, эти файлы видны всем.
402
+ - Коммит-статус `crew-guard`, поставленный `GITHUB_TOKEN`, засчитывается с `app_id` GitHub Actions; если у вас иначе, в защите ветки поставьте «any source».
403
+
404
+ ## Роадмап
405
+
406
+ - [x] **v0**: `crew` (CLI + MCP), AGENTS.md, роли и навыки, адаптеры Claude Code и Codex, шаблоны GitHub, CI, compliance
407
+ - [x] **v1**: MCP в worktree задачи (`cwd`), аренда по коммитам, `crew:pause` в коде, таймауты `crew check`, защита конфигов в CI, `crew github setup`, `crew worker`, `crew metrics`, `crew eval`, `crew kickoff` с блоком `crew-team`, `crew up`, очередь «сначала ревью»; см. [`docs/ROADMAP-v1.md`](docs/ROADMAP-v1.md)
408
+ - [ ] **v1 (остаток)**: флаг `--budget` у воркера, проверенные флаги Claude для headless
409
+ - [ ] **v2**: автомерж зелёных PR, ночные проверки, бот-дайджест, адаптеры для Gemini и Cursor
410
+
411
+ ## Разработка самого инструмента
412
+
413
+ ```bash
414
+ npm test
415
+ ```
416
+
417
+ Правила для контрибьюторов (и их агентов) лежат в [`AGENTS.md`](AGENTS.md) в корне этого репо.
418
+
419
+ ## Лицензия
420
+
421
+ Apache-2.0. См. [LICENSE](LICENSE).
@@ -0,0 +1,107 @@
1
+ // Claude Code adapter.
2
+ // Generates: CLAUDE.md (imports AGENTS.md), .claude/settings.json (ECC + env), .mcp.json (crew + optional MCPs),
3
+ // .claude/skills/<name>/SKILL.md, .claude/agents/<role>.md.
4
+ // commit: true means the file is the same for everyone and is committed; false means it is machine-specific, kept in .gitignore.
5
+ import { statSync } from 'node:fs';
6
+ import { join, resolve } from 'node:path';
7
+
8
+ const isFile = (path) => { try { return statSync(path).isFile(); } catch { return false; } };
9
+
10
+ /**
11
+ * Windows: launch without cmd /c (cmd parses &, %, parentheses and quotes in arguments its own way).
12
+ * PATH order: native claude.exe, then the npm install (its binary or cli.js via node).
13
+ */
14
+ export function windowsCommand(searchPath = '') {
15
+ for (const entry of searchPath.split(';')) {
16
+ const dir = entry.replace(/^"(.*)"$/, '$1');
17
+ if (!dir) continue;
18
+ const prefix = resolve(dir);
19
+ if (isFile(join(prefix, 'claude.exe'))) return { cmd: join(prefix, 'claude.exe'), args: [] };
20
+ if (!isFile(join(prefix, 'claude.cmd'))) continue;
21
+ const pkg = join(prefix, 'node_modules', '@anthropic-ai', 'claude-code');
22
+ if (isFile(join(pkg, 'bin', 'claude.exe'))) return { cmd: join(pkg, 'bin', 'claude.exe'), args: [] };
23
+ if (isFile(join(pkg, 'cli.js'))) return { cmd: process.execPath, args: [join(pkg, 'cli.js')] };
24
+ }
25
+ return { cmd: 'claude.exe', args: [] }; // spawn will report that Claude is not installed; we do not use a shell
26
+ }
27
+
28
+ /**
29
+ * What crew worker's agent may do without a human (claude -p cannot ask for permission: forbidden things are simply rejected).
30
+ * File edits + build/tests + reading git; commit and PR only through crew (trailers, lease, checks).
31
+ * Not allowed: git push/commit/reset directly, gh pr merge, arbitrary shell.
32
+ */
33
+ export const HEADLESS_TOOLS = [
34
+ 'Read', 'Edit', 'Write', 'MultiEdit', 'Glob', 'Grep', 'TodoWrite', 'Task', 'Agent', 'mcp__crew',
35
+ 'Bash(crew:*)', 'Bash(npm:*)', 'Bash(npx:*)', 'Bash(node:*)', 'Bash(uv:*)',
36
+ 'Bash(git status:*)', 'Bash(git diff:*)', 'Bash(git log:*)', 'Bash(git show:*)',
37
+ 'Bash(git add:*)', 'Bash(git mv:*)', 'Bash(git rm:*)',
38
+ 'Bash(gh issue view:*)', 'Bash(gh pr view:*)', 'Bash(gh pr diff:*)',
39
+ ];
40
+
41
+ const mcpEntry = (srv, platform) => {
42
+ const winWrap = platform === 'win32' && ['npx', 'crew', 'npm'].includes(srv.command);
43
+ const entry = winWrap ? { command: 'cmd', args: ['/c', srv.command, ...(srv.args ?? [])] } : { command: srv.command, args: srv.args ?? [] };
44
+ const env = { ...(srv.env ?? {}) };
45
+ for (const k of srv.env_from ?? []) env[k] = `\${${k}}`; // Claude Code expands ${VAR} from the environment
46
+ if (Object.keys(env).length) entry.env = env;
47
+ return entry;
48
+ };
49
+
50
+ export default {
51
+ id: 'claude',
52
+ binary: 'claude',
53
+
54
+ generate({ config, roles, skills, frontmatter, platform }) {
55
+ const files = [];
56
+
57
+ files.push({
58
+ path: 'CLAUDE.md',
59
+ commit: true,
60
+ content: '@AGENTS.md\n\n<!-- Generated by crew adapters build. All rules are in AGENTS.md; do not edit this file. -->\n',
61
+ });
62
+
63
+ const ecc = config.ecc ?? {};
64
+ const settings = {
65
+ env: { CREW_AGENT: 'claude' },
66
+ permissions: { allow: ['Bash(crew:*)', 'Bash(gh issue view:*)', 'Bash(gh pr view:*)', 'mcp__crew'] },
67
+ };
68
+ if (ecc.enabled !== false) {
69
+ settings.extraKnownMarketplaces = { ecc: { source: { source: 'git', url: ecc.marketplace ?? 'https://github.com/affaan-m/ECC.git' } } };
70
+ settings.enabledPlugins = { 'ecc@ecc': true };
71
+ }
72
+ files.push({ path: '.claude/settings.json', commit: true, content: JSON.stringify(settings, null, 2) + '\n' });
73
+
74
+ const servers = { crew: mcpEntry({ command: 'crew', args: ['mcp'], env: { CREW_AGENT: 'claude' } }, platform) };
75
+ for (const [name, srv] of Object.entries(config.mcp ?? {})) if (srv.enabled) servers[name] = mcpEntry(srv, platform);
76
+ files.push({ path: '.mcp.json', commit: false, content: JSON.stringify({ mcpServers: servers }, null, 2) + '\n' });
77
+
78
+ for (const s of skills) files.push({ path: `.claude/skills/${s.name}/SKILL.md`, commit: false, content: s.content });
79
+
80
+ for (const r of roles) {
81
+ const { meta, body } = frontmatter(r.content);
82
+ const model = config.tiers?.[meta.tier ?? 'mid']?.claude;
83
+ const fm = [`name: ${r.name}`, `description: ${meta.description ?? r.name}`, model ? `model: ${model}` : null].filter(Boolean);
84
+ files.push({ path: `.claude/agents/${r.name}.md`, commit: false, content: `---\n${fm.join('\n')}\n---\n${body}` });
85
+ }
86
+ return files;
87
+ },
88
+
89
+ /**
90
+ * Headless run for crew worker. cwd = the task worktree (the worker starts the process in it).
91
+ * #19 (M9): in -p mode nobody can be asked for permission, and .claude/settings.json allows only crew and gh view,
92
+ * so file edits would be rejected. Hence: --permission-mode acceptEdits (edits in cwd without prompts)
93
+ * and an explicit --allowedTools HEADLESS_TOOLS (each rule as a separate argument, as in the Claude Code docs).
94
+ * Flags follow the Claude Code docs; a live run on a machine with the claude CLI is still needed.
95
+ */
96
+ headless({ prompt, model, platform = process.platform, searchPath = process.env.PATH ?? '' }) {
97
+ const args = ['-p', prompt, '--output-format', 'json', '--permission-mode', 'acceptEdits'];
98
+ if (model) args.push('--model', model);
99
+ args.push('--allowedTools', ...HEADLESS_TOOLS);
100
+ const launch = platform === 'win32' ? windowsCommand(searchPath) : { cmd: 'claude', args: [] };
101
+ return {
102
+ cmd: launch.cmd,
103
+ args: [...launch.args, ...args],
104
+ env: { CREW_AGENT: `claude/${model || 'default'}` },
105
+ };
106
+ },
107
+ };