@gian-tiaga/eda 0.8.4 → 0.8.6
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 +7 -6
- package/lib/install.js +25 -3
- package/package.json +1 -1
- package/skills/eda-plan-polish.md +43 -14
- package/skills/eda-review.md +7 -9
- package/skills/eda-send-review.md +59 -33
package/README.md
CHANGED
|
@@ -39,15 +39,15 @@ eda update-all ~/Code
|
|
|
39
39
|
| `eda-roadmap` | Создаёт roadmap-файл: список будущих задач с короткими, понятными и недвусмысленными описаниями без деталей реализации, файлов, библиотек, API и пошагового плана | `docs/roadmaps/` |
|
|
40
40
|
| `eda-explore` | Исследует тему до конкретного результата: описание проблемы, релевантная архитектура, закрытые развилки, риски внутри решений и короткий выбранный вариант решения без плана. В дефолтном режиме ведёт исследование как диалог: факты собирает сам, а значимые развилки выносит тебе с рекомендацией. Если нужны пакеты или ПО — проверяет актуальные стабильные версии через context7 или web search | `docs/researches/` |
|
|
41
41
|
| `eda-plan` | Пишет план реализации через стандартный Plan Mode хост-агента. `docs/rules.md` и `docs/arch.md` использует как обязательную рамку, а не справочный контекст: план должен строго следовать правилам и архитектуре. В плане явно фиксирует контракты БД/API, если задача их затрагивает. Затем три параллельных субагента/модели (слабая, средняя, мощная) проверяют план на реалистичность, пропущенные шаги и нарушения правил — главный планировщик сам решает, что применить | `docs/plans/` |
|
|
42
|
-
| `eda-plan-polish` | Полирует уже готовый план до оценки 95/100 или заданного порога. Каждая итерация сразу запускает три изолированных параллельных агента на быстрой, кодовой и флагманской моделях.
|
|
42
|
+
| `eda-plan-polish` | Полирует уже готовый план до оценки 95/100 или заданного порога. Каждая итерация сразу запускает три изолированных параллельных агента на быстрой, кодовой и флагманской моделях. В strict дополнительно отдаёт план соседнему CLI (Claude ↔ Codex) на кросс-ревью. Основной агент после ответов выставляет оценку, анализирует предложения, содержательно правит только файл плана при оценке ниже порога и не запускает проверки проекта | `docs/plans/` |
|
|
43
43
|
| `eda-execute` | Выполняет план. Спрашивает, где работать (текущая ветка, новая ветка, отдельный worktree). Перед правками читает план, `docs/rules.md` и `docs/arch.md`; правила и архитектура обязательны к исполнению. Если шаг плана им противоречит, останавливается и спрашивает. Тесты пишет внутри каждого шага. В конце — полный прогон тестов и линтеров | `docs/executions/` |
|
|
44
44
|
| `eda-fix` | Делает обычные фиксы по короткому контексту, баг-репорту или файлу плана. Перед правками читает правила и архитектуру, добавляет нужные тесты, прогоняет проверки и сохраняет историю правок | `docs/fixes/` |
|
|
45
|
-
| `eda-review` | Делает код-ревью с оценкой 0–100 и сверкой с планом работ, но в файл пишет только проблемы: ошибки, недоделки, неточности, нарушения правил/архитектуры, риски и недостающие тесты.
|
|
45
|
+
| `eda-review` | Делает код-ревью с оценкой 0–100 и сверкой с планом работ, но в файл пишет только проблемы: ошибки, недоделки, неточности, нарушения правил/архитектуры, риски и недостающие тесты. Сверяет с планом, только если он указан или однозначно найден; иначе ревьюит без сверки с планом и про план не спрашивает. Без аргументов ревьюит незакоммиченный `git diff HEAD`. Не перечисляет выполненную работу. В обычном режиме после черновика передаёт файл в `eda-review-check`; с флагом `draft` сохраняет только первичное ревью без субагентов | `docs/reviews/` |
|
|
46
46
|
| `eda-review-check` | Проверяет готовое ревью из `docs/reviews/` специализированными субагентами: архитектуру, правила, выполнение плана при указанном plan-файле и при включённой настройке качество кода. В строгом режиме добавляет кросс-ревью между Claude и Codex. Сам применяет подтверждённые замечания к файлу ревью, но не правит код | `docs/reviews/` |
|
|
47
47
|
| `eda-fix-by-review` | Применяет замечания из ревью. Обязательные — все сразу. Optional-пункты в обычном режиме спрашивает, а в `apply-optional` сам решает: применяет полезные, отклонённые обосновывает в отчёте. В конце ссылается на отчёт прямо в файле ревью | `docs/review-fixes/` |
|
|
48
48
|
| `eda-manual-test` | Делает ручную smoke/acceptance-проверку после изменений: API прогоняет через `curl`/HTTP-запросы, фронт — через Playwright или доступную browser automation. Сам строит чеклист из входа, плана или diff, запускает очевидные dev/API-серверы и сохраняет QA-отчёт. Не правит код, не пишет автотесты и не коммитит | `docs/manual-tests/` |
|
|
49
49
|
| `eda-polish` | Оркестрирует доводку изменений: запускает `eda-review draft`, затем `eda-review-check`, затем `eda-fix-by-review apply-optional` и повторяет цикл до оценки 95/100 или лимита 5 итераций. Обязательные замечания чинятся все, optional-пункты fix-агент применяет или отклоняет сам с обоснованием. Каждый шаг идёт в изолированном субагенте или отдельном CLI-процессе. Не коммитит | `docs/reviews/`, `docs/review-fixes/` |
|
|
50
|
-
| `eda-send-review` | Отправляет ревью на GitHub PR через `gh`
|
|
50
|
+
| `eda-send-review` | Отправляет ревью на GitHub PR через `gh` всегда в едином формате: общий комментарий-сводка плюс комментарии к строкам кода. Тип (`comment`/`approve`/`request-changes`) задаёт только статус review; `approve` и `request-changes` подтверждаются. По умолчанию шлёт все пункты. Сам определяет PR по текущей ветке | (комментарий в PR) |
|
|
51
51
|
| `eda-commit` | Делает один аккуратный коммит в стиле проекта. В конце спрашивает: push, merge в main + удалить ветку, или ничего | (git) |
|
|
52
52
|
| `eda-worktree` | Создаёт git worktree рядом с основным проектом в папке `{name}-work-{n}` и одноимённую ветку. Базу берёт из аргумента или спрашивает | соседняя папка `{name}-work-{n}` |
|
|
53
53
|
| `eda-merge-worktree` | Мержит ветку из соседнего worktree в текущую ветку. Принимает номер `1`, короткое имя `work-1` или полное имя `{name}-work-1`. Worktree и ветку после merge не удаляет | (git) |
|
|
@@ -66,6 +66,7 @@ eda update-all ~/Code
|
|
|
66
66
|
|---|---|---|---|
|
|
67
67
|
| `eda-explore` | `strict` | После сохранения отчёта отдаёт его соседнему CLI (Claude → Codex или наоборот) на критическое ревью конкретности, фактов, развилок, рисков и версий; затем доправляет отчёт по замечаниям | Серьёзные исследования, которые лягут в основу больших решений; когда хочется второго мнения от другой модели/среды |
|
|
68
68
|
| `eda-plan` | `strict` | После обычного мета-ревью трёх субагентов/моделей отдаёт план соседнему CLI на дополнительный круг проверки; доправляет план | Большие или ответственные планы, особенно затрагивающие смежные системы |
|
|
69
|
+
| `eda-plan-polish` | `strict` | В каждой итерации после трёх полных ревью плана отдаёт план соседнему CLI (Claude → Codex или Codex → Claude) на кросс-ревью; затем учитывает его в итоговой оценке и правках | Максимальная полировка ответственных планов перед `eda-execute` |
|
|
69
70
|
| `eda-review` | `draft` | Сохраняет первичное ревью со статусом `draft` и не запускает `eda-review-check`, субагентов и кросс-CLI | Когда ревью нужно как черновик для внешней оркестрации, например `eda-polish` |
|
|
70
71
|
| `eda-review` | `strict` | После draft-ревью запускает `eda-review-check strict`: специализированные субагенты плюс соседний CLI; доправляет ревью по подтверждённым замечаниям | Ревью важных PR; когда нужен максимальный охват |
|
|
71
72
|
| `eda-review-check` | `strict` | Проверяет уже готовое ревью специализированными субагентами и затем отдаёт его соседнему CLI на дополнительный круг проверки | Когда черновик ревью уже есть и нужно усилить только проверку ревью |
|
|
@@ -83,7 +84,7 @@ eda update-all ~/Code
|
|
|
83
84
|
version: 1
|
|
84
85
|
|
|
85
86
|
defaults:
|
|
86
|
-
# Включает strict-режим по умолчанию для eda-explore, eda-plan, eda-review и eda-review-check.
|
|
87
|
+
# Включает strict-режим по умолчанию для eda-explore, eda-plan, eda-plan-polish, eda-review и eda-review-check.
|
|
87
88
|
# true | false
|
|
88
89
|
strict: false
|
|
89
90
|
# Задаёт размер плана по умолчанию для eda-plan.
|
|
@@ -111,7 +112,7 @@ review:
|
|
|
111
112
|
```
|
|
112
113
|
|
|
113
114
|
Что означают настройки:
|
|
114
|
-
- `defaults.strict` — включает strict-режим по умолчанию для `eda-explore`, `eda-plan`, `eda-review` и `eda-review-check`.
|
|
115
|
+
- `defaults.strict` — включает strict-режим по умолчанию для `eda-explore`, `eda-plan`, `eda-plan-polish`, `eda-review` и `eda-review-check`.
|
|
115
116
|
- `defaults.plan_size` — размер плана для `eda-plan`: `normal`, `short` или `ask_each_time`.
|
|
116
117
|
- `defaults.decision_mode` — как `eda-explore` ведёт исследовательские развилки, а `eda-plan` принимает существенные решения: `autonomous` выбирает сам, `recommend_and_ask` рекомендует и спрашивает по значимым развилкам, `ask_each_time` спрашивает по каждой развилке, которая влияет на ход работы или итоговый выбор.
|
|
117
118
|
- `defaults.test_strategy` — стратегия тестов для `eda-plan`: `after_each_phase`, `tdd_each_phase`, `end_of_plan` или `ask_each_time`.
|
|
@@ -147,7 +148,7 @@ roadmap ────────> explore ─────> plan ───> plan-
|
|
|
147
148
|
fix ─────────────> manual-test
|
|
148
149
|
|
|
149
150
|
polish = review draft ─> review-check ─> fix-by-review apply-optional ─> повтор до нужной оценки
|
|
150
|
-
plan-polish = 3 полных ревью плана разными моделями ─> оценка ─> правка плана ─> повтор до 95/100
|
|
151
|
+
plan-polish = 3 полных ревью плана разными моделями ─> strict: кросс-CLI ─> оценка ─> правка плана ─> повтор до 95/100
|
|
151
152
|
|
|
152
153
|
automate может запускаться от review, fix-by-review или fix.
|
|
153
154
|
```
|
package/lib/install.js
CHANGED
|
@@ -165,7 +165,7 @@ export async function updateAll({
|
|
|
165
165
|
output.write(`\n=== ${projectLabel} ===\n`);
|
|
166
166
|
|
|
167
167
|
try {
|
|
168
|
-
const targets = await
|
|
168
|
+
const targets = await detectInstalledTargets(projectDir);
|
|
169
169
|
if (targets.length === 0) {
|
|
170
170
|
output.write('Пропускаю: установленные среды исчезли во время обхода.\n');
|
|
171
171
|
skippedProjects.push(projectDir);
|
|
@@ -295,6 +295,28 @@ async function detectTargets(cwd) {
|
|
|
295
295
|
return targets;
|
|
296
296
|
}
|
|
297
297
|
|
|
298
|
+
// Среда считается установленной, только если в её папке скилов лежит хотя бы один eda-скил.
|
|
299
|
+
// Используется при массовом обходе (update-all), чтобы не засыпать скилами проекты,
|
|
300
|
+
// где папка .claude/skills или .codex/skills есть, но eda-скилов в ней нет.
|
|
301
|
+
async function detectInstalledTargets(cwd) {
|
|
302
|
+
const targets = [];
|
|
303
|
+
if (await hasInstalledSkill(path.join(cwd, '.claude/skills'))) targets.push('claude');
|
|
304
|
+
if (await hasInstalledSkill(path.join(cwd, '.codex/skills'))) targets.push('codex');
|
|
305
|
+
return targets;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
async function hasInstalledSkill(skillsDir) {
|
|
309
|
+
let entries;
|
|
310
|
+
try {
|
|
311
|
+
entries = await fs.readdir(skillsDir, { withFileTypes: true });
|
|
312
|
+
} catch (err) {
|
|
313
|
+
if (['ENOENT', 'ENOTDIR', 'EACCES', 'EPERM'].includes(err?.code)) return false;
|
|
314
|
+
throw err;
|
|
315
|
+
}
|
|
316
|
+
// eda-скилы лежат как папка eda-* (новый layout) или файл eda-*.md (старый Codex layout).
|
|
317
|
+
return entries.some(entry => entry.name.startsWith('eda-'));
|
|
318
|
+
}
|
|
319
|
+
|
|
298
320
|
async function syncSkills(cwd, targets, output = process.stdout, { action = 'update', writeDone = true } = {}) {
|
|
299
321
|
const skills = await listSkills();
|
|
300
322
|
if (skills.length === 0) {
|
|
@@ -326,7 +348,7 @@ async function findInstalledProjects(rootDir, maxDepth) {
|
|
|
326
348
|
const projects = [];
|
|
327
349
|
|
|
328
350
|
async function walk(dir, depth) {
|
|
329
|
-
const targets = await
|
|
351
|
+
const targets = await detectInstalledTargets(dir);
|
|
330
352
|
if (targets.length > 0) projects.push(dir);
|
|
331
353
|
if (depth >= maxDepth) return;
|
|
332
354
|
|
|
@@ -378,7 +400,7 @@ function formatSettings(settings) {
|
|
|
378
400
|
return `version: 1
|
|
379
401
|
|
|
380
402
|
defaults:
|
|
381
|
-
# Включает strict-режим по умолчанию для eda-explore, eda-plan, eda-review и eda-review-check.
|
|
403
|
+
# Включает strict-режим по умолчанию для eda-explore, eda-plan, eda-plan-polish, eda-review и eda-review-check.
|
|
382
404
|
# true | false
|
|
383
405
|
strict: ${settings.strict ? 'true' : 'false'}
|
|
384
406
|
# Задаёт размер плана по умолчанию для eda-plan.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gian-tiaga/eda",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.6",
|
|
4
4
|
"description": "Набор скилов eda-* для Claude Code и Codex CLI: start, roadmap, explore, plan, plan-polish, execute, fix, review, review-check, fix-by-review, manual-test, polish, send-review, commit, worktree, merge-worktree, docs, automate",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: eda-plan-polish
|
|
3
|
-
description: 'Полирует готовый план из `docs/plans/...` до оценки 95/100 или заданного порога. Каждая итерация начинается с трёх изолированных параллельных агентов на быстрой, кодовой и флагманской моделях.
|
|
3
|
+
description: 'Полирует готовый план из `docs/plans/...` до оценки 95/100 или заданного порога. Каждая итерация начинается с трёх изолированных параллельных агентов на быстрой, кодовой и флагманской моделях. В strict дополнительно запускает кросс-CLI ревью плана: Claude отдаёт план Codex, Codex отдаёт план Claude. Основной агент читает результаты, выставляет итоговую оценку, принимает или отклоняет предложения, содержательно правит только файл плана, не меняет код и не запускает проверки.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Скил: Полировка плана (eda-plan-polish)
|
|
7
7
|
|
|
8
|
-
Берёшь готовый план из `docs/plans/` и доводишь его до состояния, когда его можно передать в `eda-execute`. Порог по умолчанию — `95`, лимит по умолчанию — `5` итераций.
|
|
8
|
+
Берёшь готовый план из `docs/plans/` и доводишь его до состояния, когда его можно передать в `eda-execute`. Порог по умолчанию — `95`, лимит по умолчанию — `5` итераций. В `strict` каждая итерация после трёх моделей дополнительно отдаёт план соседнему CLI на кросс-ревью.
|
|
9
9
|
|
|
10
10
|
Каждая итерация начинается с трёх независимых моделей с одним и тем же промптом. Основной агент не ставит предварительную оценку сам: он оценивает план только после ответов агентов, принимает или отклоняет предложения, правит план при оценке ниже порога и запускает новую итерацию.
|
|
11
11
|
|
|
@@ -17,6 +17,11 @@ description: 'Полирует готовый план из `docs/plans/...` д
|
|
|
17
17
|
|
|
18
18
|
## Настройки
|
|
19
19
|
|
|
20
|
+
Прочитай `docs/settings.yaml`, если файл есть. Прямое указание пользователя в текущем сообщении важнее настроек.
|
|
21
|
+
|
|
22
|
+
Дефолты: `defaults.strict: false`.
|
|
23
|
+
|
|
24
|
+
- `strict` включает кросс-CLI ревью плана после трёх агентов в каждой итерации; выключение: `normal`, `без strict`, `без строгого режима`.
|
|
20
25
|
- Порог качества по умолчанию — `95`, можно переопределить словами `до 90`, `threshold 90`, `цель 90`.
|
|
21
26
|
- Лимит по умолчанию — `5` итераций, можно переопределить словами `лимит 3`, `max iterations 3`, `не больше 3 кругов`.
|
|
22
27
|
- Оценка `95–100` означает готовность к исполнению; `80–94` — нужно уточнить; `60–79` — рискованный план; ниже `60` — нужен серьёзный переплан или вопросы пользователю.
|
|
@@ -24,14 +29,15 @@ description: 'Полирует готовый план из `docs/plans/...` д
|
|
|
24
29
|
## Жёсткие правила
|
|
25
30
|
|
|
26
31
|
1. Работай только с готовым файлом плана в `docs/plans/`.
|
|
27
|
-
2. Не правишь код.
|
|
32
|
+
2. Не правишь код. Содержательно менять можно только выбранный файл плана; в `strict` можно создать или обновить только вспомогательный файл `${PLAN_FILE%.md}_strict_cli_review.md`. Миграции, конфиги, зависимости и lock-файлы не трогай.
|
|
28
33
|
3. Не запускай проверки и исполняющие команды: `test`, `lint`, `build`, `typecheck`, `check`, `dev`, `start`, миграции, seed, smoke-тесты, браузерные проверки и API-запросы. При полировке плана можно читать файлы и искать по коду, но нельзя проверять проект выполнением команд.
|
|
29
34
|
4. Не ставь предварительную оценку без агентов. Сразу запускай три изолированных агента параллельно, одним batch, до чтения любого результата.
|
|
30
|
-
5. Итоговую оценку 0–100 выставляй только после чтения результатов всех трёх
|
|
35
|
+
5. Итоговую оценку 0–100 выставляй только после чтения результатов всех трёх агентов, а в `strict` — ещё и результата соседнего CLI.
|
|
31
36
|
6. У всех трёх агентов один общий промпт: каждый проверяет весь план целиком, а не отдельную роль.
|
|
32
37
|
7. Не добавляй неподтверждённые существенные решения: БД/API-контракты, зависимости, архитектурные развилки, auth/permissions/payments/secrets/персональные данные и миграции.
|
|
33
38
|
8. Сохраняй структуру `eda-plan`: `Целевой алгоритм`, `Контракты реализации`, `Фазы выполнения`, `Тесты`, `Логирование`, если эти разделы есть или должны быть по формату.
|
|
34
|
-
9.
|
|
39
|
+
9. Не пропускай кросс-CLI молча в `strict`: если соседней CLI нет, спроси через `AskUserQuestion`, завершить как normal или прервать.
|
|
40
|
+
10. Если качество не растёт два круга подряд, достигнут лимит или нужен ответ пользователя, остановись и честно назови причину.
|
|
35
41
|
|
|
36
42
|
## Интерактивные вопросы
|
|
37
43
|
|
|
@@ -87,9 +93,29 @@ score: <0–100>
|
|
|
87
93
|
? Вопрос: <что нельзя безопасно решить без пользователя>
|
|
88
94
|
```
|
|
89
95
|
|
|
90
|
-
### 3.
|
|
96
|
+
### 3. Strict: кросс-CLI ревью плана
|
|
97
|
+
|
|
98
|
+
Обычный режим пропускает этот этап. В `strict` после ответов трёх агентов, но до итоговой оценки, отдай план соседнему CLI через `Bash`.
|
|
99
|
+
|
|
100
|
+
Если ты в Claude Code — запускай Codex CLI:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
codex exec "Прочитай $PLAN_FILE, docs/rules.md, docs/arch.md, sources.research при наличии и релевантные файлы, на которые ссылается план. Глубоко проверь весь план целиком: исполнимость, соответствие правилам и архитектуре, полноту целевого алгоритма, БД/API/внешние контракты, фазы, тесты, логирование, неподтверждённые решения, скрытые риски и места, где eda-execute не сможет продолжить без нового исследования. Не правь файлы и не запускай проверки, тесты, линтеры, билды, typecheck, dev-серверы, миграции, браузерные проверки или API-запросы. Можно только читать файлы. Ответь кратко: score: <0–100>; + Принять; ~ Уточнить; -- Убрать; ? Вопрос." > "${PLAN_FILE%.md}_strict_cli_review.md"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Если ты в Codex — запускай Claude CLI:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
claude -p "Прочитай $PLAN_FILE, docs/rules.md, docs/arch.md, sources.research при наличии и релевантные файлы, на которые ссылается план. Глубоко проверь весь план целиком: исполнимость, соответствие правилам и архитектуре, полноту целевого алгоритма, БД/API/внешние контракты, фазы, тесты, логирование, неподтверждённые решения, скрытые риски и места, где eda-execute не сможет продолжить без нового исследования. Не правь файлы и не запускай проверки, тесты, линтеры, билды, typecheck, dev-серверы, миграции, браузерные проверки или API-запросы. Можно только читать файлы. Ответь кратко: score: <0–100>; + Принять; ~ Уточнить; -- Убрать; ? Вопрос." > "${PLAN_FILE%.md}_strict_cli_review.md"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Если соседней CLI нет — `AskUserQuestion`: продолжить как `normal` без кросс-CLI или прервать полировку. Не заменяй кросс-CLI четвёртым локальным субагентом.
|
|
113
|
+
|
|
114
|
+
Прочитай ответ соседнего CLI и дальше оцени его вместе с тремя агентами. Файл `${PLAN_FILE%.md}_strict_cli_review.md` можно создать и обновлять в `strict`; это единственный вспомогательный файл, кроме самого плана, который разрешён в strict-режиме.
|
|
115
|
+
|
|
116
|
+
### 4. Оценить результаты
|
|
91
117
|
|
|
92
|
-
Когда все три агента ответили, прочитай их замечания и оценки. После этого основной агент выставляет итоговый `$SCORE` по шкале 0–100.
|
|
118
|
+
Когда все три агента ответили, а в `strict` ещё и соседний CLI, прочитай их замечания и оценки. После этого основной агент выставляет итоговый `$SCORE` по шкале 0–100.
|
|
93
119
|
|
|
94
120
|
Оцени:
|
|
95
121
|
- план следует `docs/rules.md` и `docs/arch.md`;
|
|
@@ -108,13 +134,14 @@ score: <0–100>
|
|
|
108
134
|
- **Итоговая оценка:** <score>/100
|
|
109
135
|
- **Порог:** <threshold>/100
|
|
110
136
|
- **Итерации:** <N>
|
|
111
|
-
- **Модели:** <фактически запущенные
|
|
137
|
+
- **Модели:** <фактически запущенные модели и соседний CLI в strict>
|
|
138
|
+
- **Режим:** <normal | strict>
|
|
112
139
|
- **Решение:** план готов к исполнению.
|
|
113
140
|
```
|
|
114
141
|
|
|
115
142
|
На этом остановись.
|
|
116
143
|
|
|
117
|
-
###
|
|
144
|
+
### 5. Отредактировать план
|
|
118
145
|
|
|
119
146
|
Если `$SCORE < threshold`, сгруппируй замечания:
|
|
120
147
|
- **Принять** — подтверждено планом, правилами, архитектурой, research или кодом и улучшает исполнимость без новой развилки.
|
|
@@ -130,7 +157,7 @@ score: <0–100>
|
|
|
130
157
|
|
|
131
158
|
### Итерация <N>
|
|
132
159
|
- **Оценка после проверки:** <score>/100
|
|
133
|
-
- **Модели:** <фактически запущенные
|
|
160
|
+
- **Модели:** <фактически запущенные модели и соседний CLI в strict>
|
|
134
161
|
- **+ Добавлено:** <3–7 главных изменений>
|
|
135
162
|
- **~ Уточнено:** <1–5 важных уточнений>
|
|
136
163
|
- **− Убрано:** <если удалено>
|
|
@@ -138,9 +165,9 @@ score: <0–100>
|
|
|
138
165
|
- **Вопросы пользователя:** <если были, кратко решение>
|
|
139
166
|
```
|
|
140
167
|
|
|
141
|
-
В `meta_reviewers`, если поле есть, добавь фактически запущенные
|
|
168
|
+
В `meta_reviewers`, если поле есть, добавь фактически запущенные модели и имя соседнего CLI в `strict`. Если `status: draft` и открытых вопросов не осталось, поменяй на `status: meta-reviewed`; `meta-reviewed` и `reviewed` не понижай.
|
|
142
169
|
|
|
143
|
-
###
|
|
170
|
+
### 6. Продолжить или остановиться
|
|
144
171
|
|
|
145
172
|
После правок обнови:
|
|
146
173
|
|
|
@@ -149,7 +176,8 @@ score: <0–100>
|
|
|
149
176
|
- **Итоговая оценка:** <score>/100
|
|
150
177
|
- **Порог:** <threshold>/100
|
|
151
178
|
- **Итерации:** <N>
|
|
152
|
-
- **Модели:** <фактически запущенные
|
|
179
|
+
- **Модели:** <фактически запущенные модели и соседний CLI в strict>
|
|
180
|
+
- **Режим:** <normal | strict>
|
|
153
181
|
- **Решение:** <готов к исполнению | нужен следующий круг | blocked | достигнут лимит>
|
|
154
182
|
```
|
|
155
183
|
|
|
@@ -157,7 +185,7 @@ score: <0–100>
|
|
|
157
185
|
|
|
158
186
|
## Финал
|
|
159
187
|
|
|
160
|
-
Сообщи кратко: путь к плану, итоговую оценку и порог, число итераций, какие модели запускались, главные принятые изменения, существенные отклонения, причину остановки и следующий шаг `eda-execute <PLAN_FILE>` при успехе.
|
|
188
|
+
Сообщи кратко: режим (`normal` или `strict`), путь к плану, путь к strict-review-файлу при наличии, итоговую оценку и порог, число итераций, какие модели и CLI запускались, главные принятые изменения, существенные отклонения, причину остановки и следующий шаг `eda-execute <PLAN_FILE>` при успехе. Если режим был обычный — добавь строку «кросс-CLI не запускался; для проверки соседним агентом — `eda-plan-polish strict <PLAN_FILE>`».
|
|
161
189
|
|
|
162
190
|
## Чего НЕ делать
|
|
163
191
|
|
|
@@ -167,6 +195,7 @@ score: <0–100>
|
|
|
167
195
|
- Ставить предварительную оценку без трёх агентных проверок.
|
|
168
196
|
- Запускать агентов последовательно или давать им разные промпты.
|
|
169
197
|
- Запускать все три прохода на одной модели.
|
|
198
|
+
- Пропускать кросс-CLI молча в `strict`.
|
|
170
199
|
- Вставлять предложения агентов без анализа.
|
|
171
200
|
- Добавлять существенные решения без подтверждения пользователя.
|
|
172
201
|
- Превращать план в длинный отчёт о ревью.
|
package/skills/eda-review.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: eda-review
|
|
3
|
-
description: 'Ревью изменений (незакоммиченный diff, ветка, PR, папка/файл) с оценкой и сверкой с планом работ из `docs/plans/`, когда план указан или однозначно найден. Если
|
|
3
|
+
description: 'Ревью изменений (незакоммиченный diff, ветка, PR, папка/файл) с оценкой и сверкой с планом работ из `docs/plans/`, когда план указан или однозначно найден. Если план не указан и не найден однозначно, ревьюит без сверки с планом и не спрашивает про него. Без аргументов ревьюит незакоммиченный `git diff HEAD`. Перед ревью читает `docs/rules.md` и `docs/arch.md`. Формирует ревью только по проблемам, сохраняет в `docs/reviews/` и в обычном режиме передаёт файл в `eda-review-check` для мета-проверки субагентами. Флаг `draft` сохраняет только черновое ревью без субагентов. Кросс-CLI включается флагом `strict` или настройкой `defaults.strict: true`. Не правит код — это `eda-fix-by-review`.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Скил: Ревьюер (eda-review)
|
|
7
7
|
|
|
8
|
-
Делаешь ревью изменений: сверяешь diff с планом работ, правилами и архитектурой, пишешь только найденные проблемы, ставишь оценку, сохраняешь файл. Если скилл вызван без аргументов, ревьюишь незакоммиченный `git diff HEAD
|
|
8
|
+
Делаешь ревью изменений: сверяешь diff с планом работ, правилами и архитектурой, пишешь только найденные проблемы, ставишь оценку, сохраняешь файл. Если скилл вызван без аргументов, ревьюишь незакоммиченный `git diff HEAD`. План сверяешь, только если он указан или однозначно найден; иначе ревьюишь без сверки с планом и про план не спрашиваешь. Каждый пункт начинаешь с короткого человеческого объяснения риска, без технической перегрузки; файлы, строки, детали кода и способ исправления даёшь ниже в блоке «Технические детали». Не перечисляешь, что выполнено хорошо или без замечаний. Затем в обычном режиме запускаешь `eda-review-check`, который проверяет ревью параллельными специализированными агентами; в `strict` он добавляет соседний CLI. В `draft` останавливаешься сразу после сохранения черновика.
|
|
9
9
|
|
|
10
10
|
## Режим запуска
|
|
11
11
|
|
|
@@ -33,7 +33,7 @@ description: 'Ревью изменений (незакоммиченный diff
|
|
|
33
33
|
1. **Перед ревью** прочитай `docs/rules.md` и `docs/arch.md`, если есть, и строго следуй им. Замечания должны опираться на правила и архитектуру проекта, а не на твои общие представления.
|
|
34
34
|
2. **Интерактивные вопросы** — по разделу ниже. Если контекст понятен, не спрашивай.
|
|
35
35
|
3. **Не правишь код.** Только ревью. Запись только в `docs/reviews/`.
|
|
36
|
-
4.
|
|
36
|
+
4. **Сверка с планом — только если план есть.** Используй план, если пользователь указал путь к нему или его можно однозначно определить из diff/ссылок/существующего review-файла. Если плана нет или вариантов несколько — не спрашивай: делай ревью без сверки с планом и отметь это в ревью. Не подставляй «последний план» наугад.
|
|
37
37
|
5. **Мета-ревью специализированными агентами — обязательно в normal/strict**, но выполняется отдельным скиллом `eda-review-check`. В `draft` мета-ревью не запускается.
|
|
38
38
|
6. **Главный ревьюер — ты.** Мета-ревьюеры дают подсказки; решение — добавить, убрать или оставить пункт — за тобой. Не вставляй чужие пункты механически.
|
|
39
39
|
7. **Простой язык** в формулировках замечаний и рекомендаций. Технические термины — только если без них нельзя, и сразу с пояснением.
|
|
@@ -48,7 +48,7 @@ description: 'Ревью изменений (незакоммиченный diff
|
|
|
48
48
|
|
|
49
49
|
## Интерактивные вопросы
|
|
50
50
|
|
|
51
|
-
Если цель ревью понятна из запроса или текущего состояния репозитория, **не задавай вопрос о цели ревью**.
|
|
51
|
+
Если цель ревью понятна из запроса или текущего состояния репозитория, **не задавай вопрос о цели ревью**. Вопрос о плане не задавай никогда: если план не указан и не найден однозначно, ревьюй без сверки с планом. Примеры понятного контекста:
|
|
52
52
|
- пользователь указал файл, папку, PR, ветку или тип diff;
|
|
53
53
|
- в запросе есть «ревью незакоммиченных изменений», «ревью текущей ветки», «проверь PR #N»;
|
|
54
54
|
- в рабочем дереве есть незакоммиченные изменения и пользователь просит «сделай ревью» без других целей.
|
|
@@ -70,12 +70,10 @@ description: 'Ревью изменений (незакоммиченный diff
|
|
|
70
70
|
|
|
71
71
|
Получи diff/исходник в `$TARGET`. Прочитай `docs/rules.md`, `docs/arch.md` и строго следуй им.
|
|
72
72
|
|
|
73
|
-
Определи `$PLAN_FILE
|
|
74
|
-
- если пользователь вызвал скилл без аргументов, а целью выбран незакоммиченный `git diff HEAD` — установи `$PLAN_FILE=none`, `$PLAN_MODE=skipped_no_args` и не спрашивай план;
|
|
73
|
+
Определи `$PLAN_FILE`, не задавая вопросов о плане:
|
|
75
74
|
- если пользователь указал путь к плану — используй его;
|
|
76
75
|
- если в diff, описании задачи или уже существующем review-файле есть однозначная ссылка на `docs/plans/...` — используй её;
|
|
77
|
-
-
|
|
78
|
-
- если пользователь явно просит ревью без сверки с планом — продолжай, но в ревью укажи, что проверка выполнения плана пропущена по явному указанию пользователя.
|
|
76
|
+
- иначе (план не указан, не найден или вариантов несколько) — установи `$PLAN_FILE=none` и ревьюй без сверки с планом. Не подставляй «последний план» наугад.
|
|
79
77
|
|
|
80
78
|
Если в diff видно отсылки к исследованию из `docs/researches/` — прочитай его тоже.
|
|
81
79
|
|
|
@@ -111,7 +109,7 @@ meta_reviewers: []
|
|
|
111
109
|
|
|
112
110
|
## Проблемы сверки с планом
|
|
113
111
|
|
|
114
|
-
<Если `$PLAN_FILE=none`: «Проверка плана пропущена:
|
|
112
|
+
<Если `$PLAN_FILE=none`: «Проверка плана пропущена: план не указан и не найден.» Если проблем по плану нет: «Явных проблем по плану не найдено.»>
|
|
115
113
|
|
|
116
114
|
### 1. <недоделка, отклонение или непроверенный пункт>
|
|
117
115
|
|
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: eda-send-review
|
|
3
|
-
description: 'Отправляет ревью из `docs/reviews/...`, выбранное по тексту рядом с вызовом, на GitHub PR через `gh` —
|
|
3
|
+
description: 'Отправляет ревью из `docs/reviews/...`, выбранное по тексту рядом с вызовом, на GitHub PR через `gh` — всегда в едином формате: общий комментарий-сводка плюс комментарии к строкам кода (inline). Тип отправки (`comment`/`approve`/`request-changes`) задаёт только статус review, но не структуру вывода. По умолчанию отправляет все пункты; если в тексте указано подмножество — только его. Перед отправкой читает `docs/rules.md` и `docs/arch.md` и строго следует им. Целевой PR определяется из текста или по текущей ветке; если PR нет — предлагает создать. После отправки в конец файла ревью дописывает ссылку. Не правит код, не делает само ревью. Вопросы задаёт только когда без ответа нельзя безопасно продолжать.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Скил: Отправитель ревью (eda-send-review)
|
|
7
7
|
|
|
8
|
-
Берёшь готовое ревью из `docs/reviews/`, отправляешь его на GitHub PR через `gh`. В конец файла ревью дописываешь, куда отправил.
|
|
8
|
+
Берёшь готовое ревью из `docs/reviews/`, отправляешь его на GitHub PR через `gh`. Отправляешь **всегда в одном формате**: общий комментарий-сводка плюс комментарии к строкам кода. В конец файла ревью дописываешь, куда отправил.
|
|
9
9
|
|
|
10
10
|
## Вход из сообщения пользователя
|
|
11
11
|
|
|
12
|
-
Текст рядом с вызовом скилла в текущем сообщении пользователя — главный вход. Сначала разбери именно его: тему, задачу, путь к файлу, режим,
|
|
12
|
+
Текст рядом с вызовом скилла в текущем сообщении пользователя — главный вход. Сначала разбери именно его: тему, задачу, путь к файлу, режим, ограничения, какие пункты отправлять и прямые указания.
|
|
13
13
|
|
|
14
14
|
Если этого входа достаточно, продолжай без вопроса. `AskUserQuestion` задавай только если входа нет, он противоречивый, найдено несколько равных вариантов или есть риск выполнить не ту задачу. Старое обсуждение в истории не считай входом, если пользователь не связал его с текущим вызовом явно.
|
|
15
15
|
|
|
16
16
|
## Главные правила
|
|
17
17
|
|
|
18
|
-
1.
|
|
19
|
-
2.
|
|
20
|
-
3.
|
|
21
|
-
4.
|
|
22
|
-
5.
|
|
18
|
+
1. **Единый формат всегда.** Отправляешь как GitHub review: тело — общий комментарий-сводка, а каждое замечание с привязкой к строке — отдельным комментарием к строке кода (inline). Тип отправки меняет только статус review (`event`), но не структуру вывода.
|
|
19
|
+
2. **По умолчанию — все пункты.** Если пользователь не указал, что отправлять, отправляешь все замечания ревью. Если указал подмножество — только его.
|
|
20
|
+
3. **Интерактивные вопросы** — по разделу ниже.
|
|
21
|
+
4. **Прочитай `docs/rules.md` и `docs/arch.md`**, если есть, и строго следуй им при выборе способа отправки и финальной отметке.
|
|
22
|
+
5. **Не правишь код, не делаешь само ревью.** Только переупаковка и отправка.
|
|
23
|
+
6. **Никаких самостоятельных оценок.** Статус review определяется по оценке ревью и тексту пользователя. `approve` и `request-changes` всегда подтверждаются пользователем.
|
|
24
|
+
7. **Простой язык.** В сообщениях пользователю и комментариях PR без лишних терминов.
|
|
23
25
|
|
|
24
26
|
## Интерактивные вопросы
|
|
25
27
|
|
|
@@ -28,61 +30,82 @@ description: 'Отправляет ревью из `docs/reviews/...`, выбр
|
|
|
28
30
|
- Codex interactive: если доступен `request_user_input`, используй его. Если tool недоступен, задай один короткий вопрос в чат, дай варианты 1–3, напиши «Ответь номером или своим вариантом. Я продолжу только после ответа.» и остановись.
|
|
29
31
|
- Codex exec / неинтерактивный запуск: не задавай вопросы и не пытайся читать stdin. Если без ответа нельзя безопасно продолжать, заверши работу со статусом `blocked: нужен ответ пользователя`, перечисли вопросы и варианты, не выполняй рискованные действия.
|
|
30
32
|
- Не запускай команды, которые ждут интерактивного ввода в терминале; перед такими командами спроси в хост-интерфейсе или остановись с `blocked`.
|
|
31
|
-
- Для отправки ревью это правило важнее продолжения: не создавай PR, не отправляй approve/request-changes и не меняй
|
|
33
|
+
- Для отправки ревью это правило важнее продолжения: не создавай PR, не отправляй approve/request-changes и не меняй статус отправки вместо ответа пользователя.
|
|
32
34
|
|
|
33
35
|
## Этапы
|
|
34
36
|
|
|
35
37
|
### 1. Проверить инструменты
|
|
36
38
|
`gh --version` + `gh auth status`. Если `gh` отсутствует или не авторизован — остановись, сообщи и выйди (это пользователю нужно решить).
|
|
37
39
|
|
|
38
|
-
### 2. Выбрать ревью
|
|
39
|
-
Сначала разбери текст рядом с вызовом: путь к ревью, название или часть названия, «последнее ревью», PR (`PR 12`, `#12`) и
|
|
40
|
+
### 2. Выбрать ревью и что отправлять
|
|
41
|
+
Сначала разбери текст рядом с вызовом: путь к ревью, название или часть названия, «последнее ревью», PR (`PR 12`, `#12`) и статус отправки (`comment`, `review-comment`, `approve`, `request-changes`).
|
|
40
42
|
|
|
41
43
|
Если найдено ровно одно ревью — продолжай без вопроса. Если найдено несколько одинаково подходящих ревью — `AskUserQuestion` со списком вариантов. Если входа нет — `AskUserQuestion` со списком последних файлов из `docs/reviews/`. Если `docs/reviews/` отсутствует или пуста — остановись с понятным вопросом или статусом `blocked: нужно ревью`. Прочитай файл целиком: оценку, замечания, рекомендации.
|
|
42
44
|
|
|
45
|
+
**Что отправлять.** По умолчанию — все замечания. Если в тексте указано подмножество, отправь только его. Синтаксис свободный, распознавай по смыслу: по номерам («пункты 1, 3, 5»), по обязательности («только обязательные» → раздел «Править обязательно»), по типу («только security» → замечания с этим `Тип`). Выбор влияет и на сводку, и на комментарии к строкам.
|
|
46
|
+
|
|
43
47
|
### 3. Найти целевой PR
|
|
44
48
|
Если номер PR указан в тексте пользователя — используй его. Иначе попробуй `gh pr view --json number,url,headRefName` — если у текущей ветки уже есть PR, возьми его номер.
|
|
45
49
|
|
|
46
50
|
Если PR нет — `AskUserQuestion`: «PR ещё нет: создать PR из текущей ветки / указать номер существующего PR / прервать». При создании используй `gh pr create` (заголовок и тело — по последним коммитам ветки).
|
|
47
51
|
|
|
48
|
-
### 4. Выбрать
|
|
49
|
-
|
|
52
|
+
### 4. Выбрать статус review
|
|
53
|
+
Review отправляется всегда; здесь выбирается только его статус (`event`).
|
|
54
|
+
|
|
55
|
+
| Условие | event | Подтверждение |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| score ≥ 80 (или в тексте `approve`) | `APPROVE` | всегда `AskUserQuestion` |
|
|
58
|
+
| score < 50 (или в тексте `request-changes`) | `REQUEST_CHANGES` | всегда `AskUserQuestion` |
|
|
59
|
+
| иначе (или в тексте `comment` / `review-comment`) | `COMMENT` | без подтверждения |
|
|
60
|
+
|
|
61
|
+
`comment` и `review-comment` означают review без статуса (`event=COMMENT`) — обычный комментарий-ревью, который тоже несёт сводку и комментарии к строкам. `approve` и `request-changes` подтверждай через `AskUserQuestion` всегда, даже если указаны в тексте. Если предложенный статус противоречит ревью — `AskUserQuestion`: подтвердить / выбрать другой.
|
|
50
62
|
|
|
51
|
-
|
|
63
|
+
### 5. Собрать сводку и комментарии к строкам
|
|
64
|
+
Из выбранных пунктов собери две части.
|
|
52
65
|
|
|
53
|
-
|
|
54
|
-
Структура комментария:
|
|
66
|
+
**Сводка** — тело review:
|
|
55
67
|
|
|
56
68
|
```markdown
|
|
57
69
|
## Ревью: <заголовок>
|
|
58
70
|
|
|
59
71
|
**Оценка:** N/100. <одно-два предложения почему>
|
|
60
72
|
|
|
61
|
-
|
|
62
|
-
1. **[тип]** `path/file.py:42` — <что не так>. → <что предлагаешь>
|
|
63
|
-
2. ...
|
|
73
|
+
<короткое резюме: что отправлено и общий вывод>
|
|
64
74
|
|
|
65
75
|
### Рекомендации
|
|
66
76
|
- **Править обязательно:** 1, 3, 5
|
|
67
77
|
- **На усмотрение автора:** 2, 4
|
|
68
|
-
|
|
78
|
+
|
|
79
|
+
### Замечания вне diff
|
|
80
|
+
1. **[тип]** `path/file.py:42` — <что не так>. → <что предлагаешь>
|
|
69
81
|
|
|
70
82
|
_Сгенерировано из `<путь к docs/reviews/...>`_
|
|
71
83
|
```
|
|
72
84
|
|
|
85
|
+
Раздел «Замечания вне diff» добавляй только если такие пункты есть (см. ниже); иначе опусти его.
|
|
86
|
+
|
|
87
|
+
**Комментарии к строкам** — по одному на каждое отправляемое замечание, чьё `Где: path:line` входит в diff PR. Для каждого: `{ "path": "<path>", "line": <line>, "side": "RIGHT", "body": "<суть простым языком + рекомендация + как исправить>" }`. Для замечания об удалённой строке используй `"side": "LEFT"`.
|
|
88
|
+
|
|
89
|
+
Какие строки входят в diff — определи по `gh pr diff <num>`. Замечания, чьи строки в diff не попали (или без `path:line`), в комментарии к строкам **не** клади — перенеси их в раздел «Замечания вне diff» сводки, чтобы ничего не потерялось.
|
|
90
|
+
|
|
73
91
|
### 6. Отправить
|
|
74
|
-
|
|
92
|
+
Тело сводки и комментарии собери в один JSON через `mktemp`:
|
|
75
93
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
| request-changes | `gh pr review <num> --request-changes --body-file <tmpfile>` |
|
|
94
|
+
```json
|
|
95
|
+
{ "body": "<сводка>", "event": "COMMENT|APPROVE|REQUEST_CHANGES", "comments": [ { "path": "...", "line": 42, "side": "RIGHT", "body": "..." } ] }
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Отправь одним вызовом Reviews API:
|
|
82
99
|
|
|
83
|
-
|
|
100
|
+
```bash
|
|
101
|
+
OWNER_REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)
|
|
102
|
+
gh api "repos/$OWNER_REPO/pulls/<num>/reviews" --method POST --input <payload.json>
|
|
103
|
+
```
|
|
84
104
|
|
|
85
|
-
|
|
105
|
+
Fallback'ы:
|
|
106
|
+
- API упал с `422` из-за конкретных строк — перенеси эти пункты в раздел «Замечания вне diff» сводки и переотправь без них.
|
|
107
|
+
- У цели нет diff/строк PR вовсе (нечего привязывать) — отправь только сводку обычным комментарием: `gh pr comment <num> --body-file <tmpfile>`.
|
|
108
|
+
- Другая ошибка — покажи вывод пользователю и спроси через `AskUserQuestion` (повторить / другой статус / прервать).
|
|
86
109
|
|
|
87
110
|
### 7. Дописать ссылку в файл ревью
|
|
88
111
|
В конец `$REVIEW_FILE` добавь:
|
|
@@ -90,16 +113,19 @@ _Сгенерировано из `<путь к docs/reviews/...>`_
|
|
|
90
113
|
```markdown
|
|
91
114
|
## Отправлено
|
|
92
115
|
- PR: <URL из ответа gh>
|
|
93
|
-
-
|
|
116
|
+
- Статус: <comment | approve | request-changes>
|
|
117
|
+
- Отправлено пунктов: <сколько / inline + сколько в сводке>
|
|
94
118
|
- Дата: <YYYY-MM-DD HH:MM>
|
|
95
119
|
```
|
|
96
120
|
|
|
97
121
|
### 8. Финал
|
|
98
|
-
Короткое сообщение: PR-номер и URL,
|
|
122
|
+
Короткое сообщение: PR-номер и URL, статус отправки, сколько пунктов ушло комментариями к строкам и сколько в сводку, путь к файлу ревью.
|
|
99
123
|
|
|
100
124
|
## Чего НЕ делать
|
|
101
125
|
- Делать само ревью или править замечания — это `eda-review` / `eda-fix-by-review`.
|
|
102
|
-
- Отправлять
|
|
103
|
-
-
|
|
126
|
+
- Отправлять всё одним обычным комментарием PR, когда строки можно привязать к diff — обычный комментарий только fallback при отсутствии diff.
|
|
127
|
+
- Терять замечания вне diff — они идут в сводку отдельным разделом.
|
|
128
|
+
- Отправлять `approve` или `request-changes` без явного подтверждения через `AskUserQuestion`, даже если оценка ≥ 80.
|
|
129
|
+
- Передавать тело через `-b "..."` со спецсимволами — только `--input` (Reviews API) или `--body-file` (fallback).
|
|
104
130
|
- Создавать PR молча, если его нет — только через `AskUserQuestion`.
|
|
105
131
|
- Сохранять копии отправленного в отдельные файлы — связь через ссылку в файле ревью.
|