@gian-tiaga/eda 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 +128 -0
- package/bin/cli.js +34 -0
- package/docs/skills/eda-automate.md +108 -0
- package/docs/skills/eda-commit.md +71 -0
- package/docs/skills/eda-docs.md +146 -0
- package/docs/skills/eda-execute.md +111 -0
- package/docs/skills/eda-fix-by-review.md +86 -0
- package/docs/skills/eda-plan.md +118 -0
- package/docs/skills/eda-research.md +97 -0
- package/docs/skills/eda-review.md +124 -0
- package/docs/skills/eda-send-review.md +90 -0
- package/lib/install.js +108 -0
- package/package.json +39 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eda-fix-by-review
|
|
3
|
+
description: Применяет замечания из ревью (`docs/reviews/...`) к коду. Бесспорные («править обязательно») — правит сразу; «на усмотрение» — спрашивает через AskUserQuestion; «не править» — пропускает. После всех правок — полный прогон тестов и линтеров. Отчёт сохраняется в `docs/review-fixes/`. Не делает само ревью (это `eda-review`), не коммитит (это `eda-commit`). Все вопросы — через AskUserQuestion.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Скил: Исправитель по ревью (eda-fix-by-review)
|
|
7
|
+
|
|
8
|
+
Берёшь готовое ревью из `docs/reviews/`, применяешь замечания к коду, сохраняешь отчёт о фиксах в `docs/review-fixes/`. После всех правок — полный прогон тестов и линтеров.
|
|
9
|
+
|
|
10
|
+
## Главные правила
|
|
11
|
+
|
|
12
|
+
1. **Перед правкой кода** прочитай `docs/rules.md` и `docs/arch.md`, если есть. Это рамка проекта. Один раз в начале.
|
|
13
|
+
2. **Все вопросы — через `AskUserQuestion`** (в Codex — короткий нумерованный список).
|
|
14
|
+
3. **Не переформулируй замечания.** Применяй то, что написано в ревью. Если непонятно — спроси через `AskUserQuestion`.
|
|
15
|
+
4. **Не делаешь само ревью и не коммитишь.** Только применяешь замечания и пишешь отчёт.
|
|
16
|
+
5. **Логика по группам ревью:**
|
|
17
|
+
- «Править обязательно» — правишь сразу, без вопросов.
|
|
18
|
+
- «На усмотрение автора» — спроси через `AskUserQuestion` (объединяй до 4 пунктов за раунд: применить / пропустить / переформулировать).
|
|
19
|
+
- «Не править» — пропускаешь молча, в отчёте отметь как «осознанно не применено».
|
|
20
|
+
6. **Тесты — внутри той же правки.** Замечание касается поведения → правка кода + тесты к ней в одном шаге, точечно прогнал.
|
|
21
|
+
7. **Финальный полный прогон тестов и линтеров — обязателен.** В конце, не на каждой правке.
|
|
22
|
+
8. **Простой язык** в формулировках и сообщениях. **Таблицы** для отчёта о фиксах.
|
|
23
|
+
|
|
24
|
+
## Этапы
|
|
25
|
+
|
|
26
|
+
### 1. Выбрать ревью
|
|
27
|
+
Если путь не передан — `AskUserQuestion` со списком последних файлов из `docs/reviews/`. Получи `$REVIEW_FILE`.
|
|
28
|
+
|
|
29
|
+
### 2. Прочитать контекст
|
|
30
|
+
`docs/rules.md`, `docs/arch.md` (если есть). Сам файл ревью. Если ревью ссылается на план/research — прочитай и их.
|
|
31
|
+
|
|
32
|
+
### 3. Применить замечания
|
|
33
|
+
Раздели пункты ревью по группам (берёшь из раздела «Рекомендации»):
|
|
34
|
+
- **Править обязательно** → правишь сразу. Если меняешь поведение — добавь точечный тест в этой же правке.
|
|
35
|
+
- **На усмотрение автора** → собери в один-два раунда `AskUserQuestion`, применяй по решению пользователя.
|
|
36
|
+
- **Не править** → пропусти.
|
|
37
|
+
|
|
38
|
+
Останавливайся и спрашивай, если: замечание непонятно / противоречит коду / задевает рискованное вне ревью (удаление, миграции, секреты).
|
|
39
|
+
|
|
40
|
+
### 4. Финальная проверка
|
|
41
|
+
Прогони полный сьют тестов и линтеры. Команды — стандартные для стека; непонятно — `AskUserQuestion`. Свои поломки — правишь и повторяешь. Чужие/несвязанные — `AskUserQuestion`.
|
|
42
|
+
|
|
43
|
+
### 5. Сохранить отчёт о фиксах и связать с ревью
|
|
44
|
+
Сохрани отчёт в `docs/review-fixes/{YYYY-MM-DD}_{HH-MM}_{slug}.md` (slug — тот же что у ревью или близкий). Затем **допиши в конец файла ревью** (`$REVIEW_FILE`) раздел со ссылкой:
|
|
45
|
+
|
|
46
|
+
```markdown
|
|
47
|
+
## Применённые фиксы
|
|
48
|
+
Отчёт: `docs/review-fixes/{file}.md`
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Шаблон отчёта:
|
|
52
|
+
|
|
53
|
+
```markdown
|
|
54
|
+
---
|
|
55
|
+
review: <путь к docs/reviews/...>
|
|
56
|
+
date: <YYYY-MM-DD HH:MM>
|
|
57
|
+
status: done
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
# Фиксы по ревью: <заголовок>
|
|
61
|
+
|
|
62
|
+
## Применённые правки
|
|
63
|
+
| # | Замечание | Файлы | Тесты | Статус |
|
|
64
|
+
|---|-----------|-------|-------|--------|
|
|
65
|
+
| 1 | <кратко из ревью> | `path/a.py` | `path/test_a.py` (2 ✓) | ✓ применено |
|
|
66
|
+
| 2 | ... | ... | — | ✓ применено |
|
|
67
|
+
| 3 | ... | — | — | ✗ пропущено (на усмотрение, пользователь отклонил) |
|
|
68
|
+
| 4 | ... | — | — | — не править (по решению ревью) |
|
|
69
|
+
|
|
70
|
+
## Финальная проверка
|
|
71
|
+
- **Тесты:** `<команда>` — ✓ / ✗
|
|
72
|
+
- **Линтер:** `<команда>` — ✓ / ✗
|
|
73
|
+
- **Заметки:** <если что-то осталось не зелёным — почему>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 6. Финал
|
|
77
|
+
Короткое сообщение: путь к ревью, путь к отчёту о фиксах, сколько применено / пропущено / отклонено, результат финальной проверки, состояние git («не закоммичено»). Подсказка дальше — `eda-commit`.
|
|
78
|
+
|
|
79
|
+
## Чего НЕ делать
|
|
80
|
+
- Делать само ревью — это `eda-review`.
|
|
81
|
+
- Коммитить, пушить — это `eda-commit`.
|
|
82
|
+
- Применять «на усмотрение» молча — только через `AskUserQuestion`.
|
|
83
|
+
- Игнорировать «не править» и пробовать «на всякий случай» — это нарушает решение ревью.
|
|
84
|
+
- Гонять полный сьют и линтеры на каждой правке — только в конце.
|
|
85
|
+
- Пропускать финальную проверку.
|
|
86
|
+
- Сохранять отчёт куда-либо кроме `docs/review-fixes/`.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eda-plan
|
|
3
|
+
description: Написание плана реализации через стандартный Plan Mode (Claude Code / Codex). Перед планированием подтягивает docs/rules.md, docs/arch.md, при необходимости — релевантное исследование. Согласованный план сохраняется в docs/plans/. Всегда проверяет план тремя параллельными моделями (слабая, средняя, мощная) на реалистичность, пропущенные шаги, нарушения правил и риски — главный планировщик сам решает, что добавить/убрать. В `strict` — ещё и кросс-CLI (Claude ↔ Codex). Все вопросы — через AskUserQuestion.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Скил: Планировщик (eda-plan)
|
|
7
|
+
|
|
8
|
+
Собираешь контекст, прогоняешь задачу через **стандартный Plan Mode** хост-агента, сохраняешь план в файл. Затем три параллельные модели проверяют план на реалистичность — главный планировщик сам решает, что применить из их предложений. При `strict` — ещё и кросс-CLI на втором круге.
|
|
9
|
+
|
|
10
|
+
## Режимы вызова
|
|
11
|
+
|
|
12
|
+
| Режим | Запуск | Что делает |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| Обычный | `eda-plan <тема>` | Этапы 1–6 + финал. Кросс-CLI не запускается. |
|
|
15
|
+
| Строгий | `eda-plan strict <тема>` | + кросс-CLI соседним агентом + допил. |
|
|
16
|
+
|
|
17
|
+
## Главные правила
|
|
18
|
+
|
|
19
|
+
1. **Никаких правок кода.** Запись только в `docs/plans/`.
|
|
20
|
+
2. **Все вопросы — через `AskUserQuestion`** (в Codex, если его нет — короткий нумерованный список).
|
|
21
|
+
3. **Plan Mode — главный инструмент.** Не изобретай свой формат планирования поверх — используй то, что Plan Mode даёт.
|
|
22
|
+
4. **Не переформулируй запрос пользователя** перед Plan Mode. Уйдёт оригинал + ответы на уточнения. Своя цель/критерии разводят смысл.
|
|
23
|
+
5. **План сохраняется в файл до любой верификации** — иначе ревьюеру нечего читать.
|
|
24
|
+
6. **Простой язык** в сообщениях, вопросах, шапке плана. Термины — только если без них нельзя, и сразу с пояснением. Текст самого Plan Mode не переписывай.
|
|
25
|
+
7. **Диаграммы — желательно, не любой ценой.** Линейный план — диаграмма не нужна.
|
|
26
|
+
8. **Таблицы > сплошной текст** для структурируемых данных.
|
|
27
|
+
|
|
28
|
+
## Этапы
|
|
29
|
+
|
|
30
|
+
### 1. Подтянуть контекст
|
|
31
|
+
Прочитай `docs/rules.md`, `docs/arch.md` (если есть). Через `AskUserQuestion` спроси про релевантное исследование — покажи последние файлы из `docs/researches/` + опция «нет».
|
|
32
|
+
|
|
33
|
+
### 2. Уточнить, если есть неясность
|
|
34
|
+
Не переформулируй запрос. Если есть конкретная неясность, без которой планировать нельзя — задай 1–4 точечных вопроса через `AskUserQuestion`. Не задавай «на всякий случай». Пары «вопрос → ответ» сохрани — они идут в Plan Mode.
|
|
35
|
+
|
|
36
|
+
### 3. Спланировать через Plan Mode
|
|
37
|
+
Войди в Plan Mode хост-агента (`EnterPlanMode` в Claude Code, встроенный план-режим в Codex). На вход:
|
|
38
|
+
1. Дословный запрос пользователя.
|
|
39
|
+
2. Пары «вопрос → ответ» из этапа 2.
|
|
40
|
+
3. Ссылки на `docs/rules.md`, `docs/arch.md`, исследование (без пересказа — Plan Mode прочитает сам).
|
|
41
|
+
4. Инструкция: «все вопросы пользователю — только через `AskUserQuestion`, никаких догадок и свободного текста».
|
|
42
|
+
|
|
43
|
+
Не выходи, пока пользователь не подтвердил план.
|
|
44
|
+
|
|
45
|
+
### 4. Сохранить файл
|
|
46
|
+
`docs/plans/{YYYY-MM-DD}_{HH-MM}_{slug}.md`. Структура — **только YAML-шапка и текст плана от Plan Mode**, как он его выдал:
|
|
47
|
+
|
|
48
|
+
```markdown
|
|
49
|
+
---
|
|
50
|
+
title: <заголовок>
|
|
51
|
+
date: <YYYY-MM-DD HH:MM>
|
|
52
|
+
mode: <normal | strict>
|
|
53
|
+
status: <draft | meta-reviewed | reviewed>
|
|
54
|
+
reviewer: <pending | none | claude | codex>
|
|
55
|
+
meta_reviewers: []
|
|
56
|
+
sources:
|
|
57
|
+
rules: <путь или —>
|
|
58
|
+
arch: <путь или —>
|
|
59
|
+
research: <путь или —>
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
<текст плана из Plan Mode дословно>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Покажи путь.
|
|
66
|
+
|
|
67
|
+
### 5. Мета-ревью плана тремя моделями (параллельно)
|
|
68
|
+
Запусти **в одном сообщении** трёх агентов на трёх разных моделях — слабая, средняя, мощная.
|
|
69
|
+
|
|
70
|
+
| Среда | Слабая (быстрая) | Средняя (код) | Мощная (флагман) |
|
|
71
|
+
|---|---|---|---|
|
|
72
|
+
| Claude Code (`Agent` tool) | `model: "haiku"` | `model: "sonnet"` | `model: "opus"` |
|
|
73
|
+
| Codex CLI (`codex exec --model …`) | `gpt-5.4-mini` | `gpt-5.3-codex` | `gpt-5.5` |
|
|
74
|
+
|
|
75
|
+
В Codex запускай три параллельных `codex exec --model <id>` через `Bash` с `&`. Если `gpt-5.5` недоступен (ограничение account/auth) — возьми `gpt-5.4` как мощную. Если какой-либо идентификатор отсутствует у тебя — возьми ближайший аналог того же тира из доступных в твоей версии Codex.
|
|
76
|
+
|
|
77
|
+
Каждому передай путь к файлу плана и `docs/rules.md`, `docs/arch.md` (если есть). Попроси: «прочитай план; проверь, что шаги **реалистичны и не ломают ничего вокруг** — нет ли пропущенных шагов, неучтённых зависимостей, нарушений правил и архитектуры, рисков для смежного кода, шагов без критерия готовности. Верни список `+ N | − N | ~ N: причина` без воды.»
|
|
78
|
+
|
|
79
|
+
Когда все три ответили — прочитай ответы, **сам реши**, что применять (не вставляй чужие пункты механически). Внеси правки в файл плана. Допиши в конец раздел:
|
|
80
|
+
|
|
81
|
+
```markdown
|
|
82
|
+
## Изменения после мета-ревью
|
|
83
|
+
|
|
84
|
+
### После моделей
|
|
85
|
+
- **+ Добавлено:** ...
|
|
86
|
+
- **− Убрано:** ...
|
|
87
|
+
- **Отклонено:** ...
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
В YAML-шапке: `status: draft` → `meta-reviewed`, в `meta_reviewers` — имена/идентификаторы моделей.
|
|
91
|
+
|
|
92
|
+
### 6. Кросс-CLI — только в `strict`
|
|
93
|
+
Обычный режим — пропусти этапы 6–7, иди на финал.
|
|
94
|
+
|
|
95
|
+
В `strict`: отдай файл соседнему агенту через `Bash`:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
codex exec "Прочитай $PLAN_FILE. Критическое ревью на русском: пропущенные шаги, неучтённые зависимости, нарушения docs/rules.md и docs/arch.md, скрытые риски, шаги без критериев готовности. Список '- [тип] описание — что предлагаешь'." > "${PLAN_FILE%.md}_review.md"
|
|
99
|
+
# Если ты Codex — claude -p вместо codex exec.
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Соседней CLI нет — `AskUserQuestion`: продолжать без ревью или прервать.
|
|
103
|
+
|
|
104
|
+
### 7. Допилить по ревью — только в `strict`
|
|
105
|
+
Бесспорные замечания → правишь сразу. Спорные → `AskUserQuestion`. Отклонённые → оставляешь, причина в журнал. В конец файла добавь раздел `## Реакция на ревью` (Принято / Отклонено / Спорное). Поменяй `status: meta-reviewed` → `reviewed`. Покажи дифф.
|
|
106
|
+
|
|
107
|
+
### 8. Финал
|
|
108
|
+
Короткое сообщение: режим, путь к плану, путь к ревью (если был `strict`), 3–5 главных шагов простыми словами, что предлагаешь дальше (но не делай — это `eda-execute`).
|
|
109
|
+
|
|
110
|
+
## Чего НЕ делать
|
|
111
|
+
- Править код, запускать миграции.
|
|
112
|
+
- Задавать вопросы свободным текстом.
|
|
113
|
+
- Переформулировать запрос пользователя своими словами перед Plan Mode.
|
|
114
|
+
- Пропускать сохранение файла плана.
|
|
115
|
+
- Дублировать логику Plan Mode своим самописным форматом.
|
|
116
|
+
- Пропускать мета-ревью тремя моделями — это часть обычного режима, не под флагом.
|
|
117
|
+
- Вставлять предложения мета-ревьюеров механически — каждое решение принимаешь ты.
|
|
118
|
+
- Пропускать кросс-CLI молча в `strict` (если CLI нет — спроси).
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eda-research
|
|
3
|
+
description: Глубокое исследование темы или задачи. Без правки кода. Все вопросы — через AskUserQuestion. Mermaid-диаграммы и markdown-таблицы — там где это даёт ясность. Итог сохраняется в docs/researches/. По умолчанию без кросс-ревью; кросс-ревью соседним агентом (Claude ↔ Codex) включается флагом `strict`.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Скил: Исследователь (eda-research)
|
|
7
|
+
|
|
8
|
+
Разбираешься в теме, собираешь понятный отчёт. Не правишь код, не торопишься с выводами.
|
|
9
|
+
|
|
10
|
+
## Режимы вызова
|
|
11
|
+
|
|
12
|
+
| Режим | Запуск | Что делает |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| Обычный | `eda-research <тема>` | Этапы 1–4 + финал. |
|
|
15
|
+
| Строгий | `eda-research strict <тема>` | + кросс-ревью соседним агентом + допил. |
|
|
16
|
+
|
|
17
|
+
## Главные правила
|
|
18
|
+
|
|
19
|
+
1. **Никаких правок кода.** Запись только в `docs/researches/`.
|
|
20
|
+
2. **Все вопросы — через `AskUserQuestion`** (в Codex, если его нет — короткий нумерованный список).
|
|
21
|
+
3. **Простой язык.** Термины — только когда без них нельзя, сразу с пояснением.
|
|
22
|
+
4. **Каждое утверждение — со ссылкой** (`file.ext:42`, URL, коммит). Без ссылки — помечай как «гипотеза».
|
|
23
|
+
5. **Диаграммы — желательно, не любой ценой.** Тема плоская — не выдумывай.
|
|
24
|
+
6. **Таблицы > сплошной текст** для структурируемых данных.
|
|
25
|
+
|
|
26
|
+
## Этапы
|
|
27
|
+
|
|
28
|
+
### 1. Понять задачу
|
|
29
|
+
Прочитай запрос. Сформулируй цель и 3–7 конкретных вопросов. Неясности — задай через `AskUserQuestion`. Не уходи дальше, пока цель не подтверждена.
|
|
30
|
+
|
|
31
|
+
### 2. Собрать материал
|
|
32
|
+
Включи explore / read-only режим хост-агента (в Claude Code — `EnterPlanMode`, в Codex — встроенный режим без правок). Инструменты выбирай сам, рамка одна — ничего не правишь в коде. Перед сохранением отчёта (этап 4) выйди из режима.
|
|
33
|
+
|
|
34
|
+
### 3. Диаграммы (если уместно)
|
|
35
|
+
Есть поток / связи / состояния / последовательность шагов — нарисуй 1–3 Mermaid-диаграммы. Подписи на русском. Если показывать нечего — в разделе диаграмм отчёта одна строка: «Не требуется — тема не имеет графовой структуры.»
|
|
36
|
+
|
|
37
|
+
### 4. Собрать отчёт
|
|
38
|
+
`docs/researches/{YYYY-MM-DD}_{HH-MM}_{slug}.md`.
|
|
39
|
+
|
|
40
|
+
```markdown
|
|
41
|
+
---
|
|
42
|
+
title: <заголовок>
|
|
43
|
+
date: <YYYY-MM-DD HH:MM>
|
|
44
|
+
mode: <normal | strict>
|
|
45
|
+
status: <draft | reviewed>
|
|
46
|
+
reviewer: <pending | none | claude | codex>
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
# <Заголовок>
|
|
50
|
+
|
|
51
|
+
## 1. Цель и вопросы
|
|
52
|
+
**Цель:** ...
|
|
53
|
+
**Вопросы:** 1) ... 2) ...
|
|
54
|
+
|
|
55
|
+
## 2. Диаграммы
|
|
56
|
+
<Mermaid или строка про «не требуется»>
|
|
57
|
+
|
|
58
|
+
## 3. Находки
|
|
59
|
+
| # | Факт | Источник | Что это значит |
|
|
60
|
+
|---|------|----------|-----------------|
|
|
61
|
+
|
|
62
|
+
## 4. Риски и открытые вопросы
|
|
63
|
+
| Риск/неясность | Почему важно | Что предлагаешь |
|
|
64
|
+
|----------------|---------------|------------------|
|
|
65
|
+
|
|
66
|
+
## 5. Итог
|
|
67
|
+
<3–7 предложений простыми словами>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Покажи путь.
|
|
71
|
+
|
|
72
|
+
### 5. Кросс-ревью — только в `strict`
|
|
73
|
+
Обычный режим — пропусти этапы 5–6, иди на финал. `reviewer: none`, `status: draft`.
|
|
74
|
+
|
|
75
|
+
В `strict`: отдай файл соседнему агенту через `Bash`:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
codex exec "Прочитай $RESEARCH_FILE. Критическое ревью на русском: фактические ошибки, пропущенные риски, неподтверждённые утверждения, неточности диаграмм. Список '- [тип] описание — что предлагаешь'." > "${RESEARCH_FILE%.md}_review.md"
|
|
79
|
+
# Если ты Codex — claude -p вместо codex exec.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
CLI нет — `AskUserQuestion`: продолжать без ревью или прервать.
|
|
83
|
+
|
|
84
|
+
### 6. Допилить по ревью — только в `strict`
|
|
85
|
+
Бесспорные → правишь. Спорные → `AskUserQuestion`. Отклонённые → оставляешь с причиной. В конец отчёта раздел `## 6. Реакция на ревью` (Принято / Отклонено / Спорное). `status: reviewed`. Покажи дифф.
|
|
86
|
+
|
|
87
|
+
### 7. Финал
|
|
88
|
+
Короткое сообщение: режим, путь к отчёту, путь к ревью (если `strict`), 3–5 главных выводов простыми словами, что предлагаешь дальше (но не делай — это работа другого скила).
|
|
89
|
+
|
|
90
|
+
## Чего НЕ делать
|
|
91
|
+
- Править код, запускать миграции, менять конфиги.
|
|
92
|
+
- Задавать вопросы свободным текстом.
|
|
93
|
+
- Делать выводы без ссылок на источник.
|
|
94
|
+
- Пропускать кросс-ревью молча в `strict`.
|
|
95
|
+
- Сохранять отчёт куда-либо кроме `docs/researches/`.
|
|
96
|
+
- Рисовать диаграмму ради галочки.
|
|
97
|
+
- Оформлять структурируемые данные сплошным текстом.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eda-review
|
|
3
|
+
description: Ревью изменений (незакоммиченный diff, ветка, PR, папка/файл). Формирует пронумерованные замечания, оценку 0–100, рекомендации «править / на усмотрение / не править». Сохраняет в docs/reviews/. Всегда проверяет своё же ревью тремя параллельными моделями (Sonnet, Haiku, Opus); кросс-CLI (Claude ↔ Codex) включается только флагом `strict`. После каждой проверки сам корректирует ревью. Не правит код — это `eda-fix-by-review`. Все вопросы — через AskUserQuestion.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Скил: Ревьюер (eda-review)
|
|
7
|
+
|
|
8
|
+
Делаешь ревью изменений: пишешь замечания, ставишь оценку, сохраняешь файл. Затем проверяешь сам себя через три параллельные модели; в `strict` — ещё и через соседний CLI. После каждой проверки **сам корректируешь** своё ревью: что-то добавляешь, что-то убираешь, что-то переформулируешь.
|
|
9
|
+
|
|
10
|
+
## Режимы вызова
|
|
11
|
+
|
|
12
|
+
| Режим | Запуск | Что делает |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| Обычный | `eda-review` | Этапы 1–3 + финал. Кросс-CLI не запускается. |
|
|
15
|
+
| Строгий | `eda-review strict` | + кросс-CLI соседним агентом + допил. |
|
|
16
|
+
|
|
17
|
+
## Главные правила
|
|
18
|
+
|
|
19
|
+
1. **Перед ревью** прочитай `docs/rules.md` и `docs/arch.md`, если есть. Замечания должны опираться на правила проекта, а не на твои общие представления.
|
|
20
|
+
2. **Все вопросы — через `AskUserQuestion`** (в Codex — короткий нумерованный список).
|
|
21
|
+
3. **Не правишь код.** Только ревью. Запись только в `docs/reviews/`.
|
|
22
|
+
4. **Мета-ревью тремя моделями — обязательно**, без флага. Кросс-CLI — только в `strict`.
|
|
23
|
+
5. **Главный ревьюер — ты.** Мета-ревьюеры дают подсказки; решение — добавить, убрать или оставить пункт — за тобой. Не вставляй чужие пункты механически.
|
|
24
|
+
6. **Простой язык** в формулировках замечаний и рекомендаций. Технические термины — только если без них нельзя, и сразу с пояснением.
|
|
25
|
+
7. **Таблицы для замечаний.** Сплошной текст — только для оценки и общего вывода.
|
|
26
|
+
|
|
27
|
+
## Этапы
|
|
28
|
+
|
|
29
|
+
### 1. Выбрать вход и прочитать контекст
|
|
30
|
+
Через `AskUserQuestion` спроси, что ревьюим: незакоммиченный diff (`git diff HEAD`) / diff ветки от main (`git diff main...HEAD`) / конкретный файл или папка / номер PR. Получи diff/исходник в `$TARGET`. Прочитай `docs/rules.md`, `docs/arch.md`. Если в diff видно отсылки к плану из `docs/plans/` или исследованию из `docs/researches/` — прочитай их тоже.
|
|
31
|
+
|
|
32
|
+
### 2. Сделать первичное ревью и сохранить
|
|
33
|
+
Пройдись по изменениям. Замечания группируй по типу: bug / архитектура / стиль / тесты / безопасность / производительность / документация. Каждое — с локацией (`file:line`) и предложением «что сделать». Поставь оценку 0–100 (100 — идеально, 0 — переделывать).
|
|
34
|
+
|
|
35
|
+
Сохрани в `docs/reviews/{YYYY-MM-DD}_{HH-MM}_{slug}.md`:
|
|
36
|
+
|
|
37
|
+
```markdown
|
|
38
|
+
---
|
|
39
|
+
title: <заголовок>
|
|
40
|
+
date: <YYYY-MM-DD HH:MM>
|
|
41
|
+
target: <git diff HEAD | main...HEAD | path | PR#>
|
|
42
|
+
mode: <normal | strict>
|
|
43
|
+
score: <0..100>
|
|
44
|
+
status: draft
|
|
45
|
+
meta_reviewers: []
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
# Ревью: <заголовок>
|
|
49
|
+
|
|
50
|
+
## Оценка
|
|
51
|
+
**<N>/100.** <одно-два предложения почему>
|
|
52
|
+
|
|
53
|
+
## Замечания
|
|
54
|
+
| # | Тип | Где | Что не так | Что предлагаешь |
|
|
55
|
+
|---|-----|-----|------------|-----------------|
|
|
56
|
+
| 1 | bug | `path/file.py:42` | ... | ... |
|
|
57
|
+
|
|
58
|
+
## Рекомендации
|
|
59
|
+
- **Править обязательно:** <номера>
|
|
60
|
+
- **На усмотрение автора:** <номера>
|
|
61
|
+
- **Не править:** <номера или —>
|
|
62
|
+
|
|
63
|
+
## Изменения после мета-ревью
|
|
64
|
+
<заполняется на этапах 3 и 4>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Покажи путь.
|
|
68
|
+
|
|
69
|
+
### 3. Мета-ревью тремя моделями (параллельно)
|
|
70
|
+
Запусти **в одном сообщении** трёх агентов на трёх разных моделях — слабая, средняя, мощная.
|
|
71
|
+
|
|
72
|
+
| Среда | Слабая (быстрая) | Средняя (код) | Мощная (флагман) |
|
|
73
|
+
|---|---|---|---|
|
|
74
|
+
| Claude Code (`Agent` tool) | `model: "haiku"` | `model: "sonnet"` | `model: "opus"` |
|
|
75
|
+
| Codex CLI (`codex exec --model …`) | `gpt-5.4-mini` | `gpt-5.3-codex` | `gpt-5.5` |
|
|
76
|
+
|
|
77
|
+
В Codex — три параллельных `codex exec --model <id>` через `Bash` с `&`. Если `gpt-5.5` недоступен (ограничение account/auth) — возьми `gpt-5.4` как мощную. Если какой-либо идентификатор отсутствует у тебя — возьми ближайший аналог того же тира из доступных в твоей версии Codex.
|
|
78
|
+
|
|
79
|
+
Каждому дай путь к файлу ревью + указание на `$TARGET` и попроси: «прочитай ревью и diff; предложи, какие пункты добавить (которых не хватает), какие убрать (избыточные/неверные), какие переформулировать. Список `+ N | − N | ~ N: причина`. Без воды.»
|
|
80
|
+
|
|
81
|
+
Когда все три ответили: прочитай ответы, **сам реши**, что применять. Внеси правки в файл ревью. В разделе `## Изменения после мета-ревью` запиши:
|
|
82
|
+
|
|
83
|
+
```markdown
|
|
84
|
+
### После Sonnet/Haiku/Opus
|
|
85
|
+
- **+ Добавлено:** <короткий список>
|
|
86
|
+
- **− Убрано:** <короткий список>
|
|
87
|
+
- **Отклонено:** <короткий список с причиной>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Поменяй `status: draft` → `meta-reviewed`, в `meta_reviewers` добавь `sonnet, haiku, opus`. Если оценка после корректировок изменилась — обнови `score`.
|
|
91
|
+
|
|
92
|
+
### 4. Кросс-CLI: отдать соседнему агенту — только в `strict`
|
|
93
|
+
Обычный режим — пропусти этап 4, иди на финал. `status: meta-reviewed` оставь как есть.
|
|
94
|
+
|
|
95
|
+
В `strict`: если ты Claude → отдай Codex, и наоборот. Передай путь к файлу ревью и `$TARGET`:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
codex exec "Прочитай $REVIEW_FILE и $TARGET. Мета-ревью на русском: какие пункты добавить, убрать, переформулировать. Список '+ N | − N | ~ N: причина'." > "${REVIEW_FILE%.md}_cli_meta.md"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Соседней CLI нет — `AskUserQuestion`: завершить как есть или прервать.
|
|
102
|
+
|
|
103
|
+
Прочитай ответ, **сам реши**, что применять. Допиши в `## Изменения после мета-ревью`:
|
|
104
|
+
|
|
105
|
+
```markdown
|
|
106
|
+
### После соседнего CLI (codex|claude)
|
|
107
|
+
- **+ Добавлено:** ...
|
|
108
|
+
- **− Убрано:** ...
|
|
109
|
+
- **Отклонено:** ...
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Добавь в `meta_reviewers` имя CLI. `status: meta-reviewed` → `final`.
|
|
113
|
+
|
|
114
|
+
### 5. Финал
|
|
115
|
+
Короткое сообщение: режим (`normal` или `strict`), путь к файлу ревью, итоговая оценка, сколько пунктов «править обязательно» / «на усмотрение» / «не править». Если режим был обычный — добавь строку «кросс-CLI не запускался; для проверки соседним агентом — `eda-review strict`». Что предлагаешь дальше — `eda-fix-by-review` для применения или `eda-commit` если оценка приемлема.
|
|
116
|
+
|
|
117
|
+
## Чего НЕ делать
|
|
118
|
+
- Править код. Это `eda-fix-by-review`.
|
|
119
|
+
- Пропускать мета-ревью тремя моделями (это часть обычного режима, не под флагом).
|
|
120
|
+
- Пропускать кросс-CLI молча в `strict` (если соседней CLI нет — спроси через `AskUserQuestion`).
|
|
121
|
+
- Вставлять чужие предложения механически — каждое решение принимай ты.
|
|
122
|
+
- Задавать вопросы свободным текстом.
|
|
123
|
+
- Сохранять ревью куда-либо кроме `docs/reviews/`.
|
|
124
|
+
- Оформлять замечания сплошным текстом — только таблица.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eda-send-review
|
|
3
|
+
description: Отправляет ревью из `docs/reviews/...` на GitHub PR через `gh` — как review (comment/approve/request-changes) или как обычный комментарий. Целевой PR определяется автоматически по текущей ветке; если PR нет — предлагает создать. После отправки в конец файла ревью дописывает ссылку на PR-комментарий. Не правит код, не делает само ревью. Все вопросы — через AskUserQuestion.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Скил: Отправитель ревью (eda-send-review)
|
|
7
|
+
|
|
8
|
+
Берёшь готовое ревью из `docs/reviews/`, отправляешь его на GitHub PR через `gh`. В конец файла ревью дописываешь, куда отправил.
|
|
9
|
+
|
|
10
|
+
## Главные правила
|
|
11
|
+
|
|
12
|
+
1. **Все вопросы — через `AskUserQuestion`** (в Codex — короткий нумерованный список).
|
|
13
|
+
2. **Не правишь код, не делаешь само ревью.** Только переупаковка и отправка.
|
|
14
|
+
3. **Никаких самостоятельных оценок.** Тип отправки (comment / approve / request-changes) определяется на основе ревью + подтверждается пользователем.
|
|
15
|
+
4. **Простой язык.** В сообщениях пользователю и комментарии PR без лишних терминов.
|
|
16
|
+
|
|
17
|
+
## Этапы
|
|
18
|
+
|
|
19
|
+
### 1. Проверить инструменты
|
|
20
|
+
`gh --version` + `gh auth status`. Если `gh` отсутствует или не авторизован — остановись, сообщи и выйди (это пользователю нужно решить).
|
|
21
|
+
|
|
22
|
+
### 2. Выбрать ревью
|
|
23
|
+
Если путь не передан — `AskUserQuestion` со списком последних файлов из `docs/reviews/`. Прочитай файл целиком: оценку, замечания, рекомендации.
|
|
24
|
+
|
|
25
|
+
### 3. Найти целевой PR
|
|
26
|
+
Попробуй `gh pr view --json number,url,headRefName` — если у текущей ветки уже есть PR, возьми его номер.
|
|
27
|
+
|
|
28
|
+
Если PR нет — `AskUserQuestion`: «PR ещё нет: создать PR из текущей ветки / указать номер существующего PR / прервать». При создании используй `gh pr create` (заголовок и тело — по последним коммитам ветки).
|
|
29
|
+
|
|
30
|
+
### 4. Выбрать тип отправки
|
|
31
|
+
Предложи вариант на основе оценки в ревью:
|
|
32
|
+
- score ≥ 80 → предложить **approve** (с комментарием).
|
|
33
|
+
- score < 50 → предложить **request-changes**.
|
|
34
|
+
- иначе → **comment** (review без статуса).
|
|
35
|
+
|
|
36
|
+
`AskUserQuestion`: подтвердить предложенный тип / выбрать другой / отправить как обычный комментарий PR (вне review).
|
|
37
|
+
|
|
38
|
+
### 5. Сформировать тело
|
|
39
|
+
Структура комментария:
|
|
40
|
+
|
|
41
|
+
```markdown
|
|
42
|
+
## Ревью: <заголовок>
|
|
43
|
+
|
|
44
|
+
**Оценка:** N/100. <одно-два предложения почему>
|
|
45
|
+
|
|
46
|
+
### Замечания
|
|
47
|
+
1. **[тип]** `path/file.py:42` — <что не так>. → <что предлагаешь>
|
|
48
|
+
2. ...
|
|
49
|
+
|
|
50
|
+
### Рекомендации
|
|
51
|
+
- **Править обязательно:** 1, 3, 5
|
|
52
|
+
- **На усмотрение автора:** 2, 4
|
|
53
|
+
- **Не править:** —
|
|
54
|
+
|
|
55
|
+
_Сгенерировано из `<путь к docs/reviews/...>`_
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 6. Отправить
|
|
59
|
+
По выбранному типу:
|
|
60
|
+
|
|
61
|
+
| Тип | Команда |
|
|
62
|
+
|---|---|
|
|
63
|
+
| comment (PR comment) | `gh pr comment <num> --body-file <tmpfile>` |
|
|
64
|
+
| review-comment | `gh pr review <num> --comment --body-file <tmpfile>` |
|
|
65
|
+
| approve | `gh pr review <num> --approve --body-file <tmpfile>` |
|
|
66
|
+
| request-changes | `gh pr review <num> --request-changes --body-file <tmpfile>` |
|
|
67
|
+
|
|
68
|
+
Тело пиши во временный файл (`mktemp`) и передавай через `--body-file` — иначе спецсимволы и переносы поедут не туда.
|
|
69
|
+
|
|
70
|
+
Если команда упала — покажи вывод пользователю и спроси через `AskUserQuestion` (повторить / другой тип / прервать).
|
|
71
|
+
|
|
72
|
+
### 7. Дописать ссылку в файл ревью
|
|
73
|
+
В конец `$REVIEW_FILE` добавь:
|
|
74
|
+
|
|
75
|
+
```markdown
|
|
76
|
+
## Отправлено
|
|
77
|
+
- PR: <URL из ответа gh>
|
|
78
|
+
- Тип: <comment | review-comment | approve | request-changes>
|
|
79
|
+
- Дата: <YYYY-MM-DD HH:MM>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 8. Финал
|
|
83
|
+
Короткое сообщение: PR-номер и URL, тип отправки, путь к файлу ревью.
|
|
84
|
+
|
|
85
|
+
## Чего НЕ делать
|
|
86
|
+
- Делать само ревью или править замечания — это `eda-review` / `eda-fix-by-review`.
|
|
87
|
+
- Отправлять `approve` без явного подтверждения через `AskUserQuestion`, даже если оценка ≥ 80.
|
|
88
|
+
- Передавать тело комментария через `-b "..."` со спецсимволами без `--body-file` — поломает форматирование.
|
|
89
|
+
- Создавать PR молча, если его нет — только через `AskUserQuestion`.
|
|
90
|
+
- Сохранять копии отправленного в отдельные файлы — связь через ссылку в файле ревью.
|
package/lib/install.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import readline from 'node:readline/promises';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = path.dirname(__filename);
|
|
8
|
+
const PACKAGE_ROOT = path.resolve(__dirname, '..');
|
|
9
|
+
const SKILLS_SRC = path.join(PACKAGE_ROOT, 'docs/skills');
|
|
10
|
+
|
|
11
|
+
export async function init({ cwd }) {
|
|
12
|
+
const targets = await askTargets();
|
|
13
|
+
if (targets.length === 0) {
|
|
14
|
+
process.stdout.write('Ничего не выбрано — выходим.\n');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
await syncSkills(cwd, targets);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export async function update({ cwd }) {
|
|
21
|
+
const targets = await detectTargets(cwd);
|
|
22
|
+
if (targets.length === 0) {
|
|
23
|
+
process.stdout.write('Не нашёл установленных скилов в этом проекте. Запусти `eda init`.\n');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
process.stdout.write(`Найдены установленные среды: ${targets.join(', ')}\n`);
|
|
27
|
+
await syncSkills(cwd, targets);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function askTargets() {
|
|
31
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
32
|
+
const answer = await rl.question(
|
|
33
|
+
'Куда устанавливать скилы?\n' +
|
|
34
|
+
' [1] Claude Code (.claude/skills/)\n' +
|
|
35
|
+
' [2] Codex CLI (.codex/skills/)\n' +
|
|
36
|
+
' [3] Обе среды\n' +
|
|
37
|
+
'Выбор [3]: '
|
|
38
|
+
);
|
|
39
|
+
rl.close();
|
|
40
|
+
const choice = answer.trim() || '3';
|
|
41
|
+
switch (choice) {
|
|
42
|
+
case '1': return ['claude'];
|
|
43
|
+
case '2': return ['codex'];
|
|
44
|
+
case '3': return ['claude', 'codex'];
|
|
45
|
+
default:
|
|
46
|
+
process.stdout.write(`Неизвестный выбор «${choice}» — выходим.\n`);
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function detectTargets(cwd) {
|
|
52
|
+
const targets = [];
|
|
53
|
+
if (await dirExists(path.join(cwd, '.claude/skills'))) targets.push('claude');
|
|
54
|
+
if (await dirExists(path.join(cwd, '.codex/skills'))) targets.push('codex');
|
|
55
|
+
return targets;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function syncSkills(cwd, targets) {
|
|
59
|
+
const skills = await listSkills();
|
|
60
|
+
if (skills.length === 0) {
|
|
61
|
+
throw new Error(`В пакете нет скилов (искал в ${SKILLS_SRC}).`);
|
|
62
|
+
}
|
|
63
|
+
process.stdout.write(`Скилы для установки: ${skills.map(s => s.name).join(', ')}\n`);
|
|
64
|
+
|
|
65
|
+
if (targets.includes('claude')) await installToClaude(cwd, skills);
|
|
66
|
+
if (targets.includes('codex')) await installToCodex(cwd, skills);
|
|
67
|
+
|
|
68
|
+
process.stdout.write('\nГотово.\n');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function listSkills() {
|
|
72
|
+
const entries = await fs.readdir(SKILLS_SRC);
|
|
73
|
+
return entries
|
|
74
|
+
.filter(f => f.endsWith('.md'))
|
|
75
|
+
.map(f => ({ name: f.replace(/\.md$/, ''), path: path.join(SKILLS_SRC, f) }))
|
|
76
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function installToClaude(cwd, skills) {
|
|
80
|
+
const dst = path.join(cwd, '.claude/skills');
|
|
81
|
+
await fs.mkdir(dst, { recursive: true });
|
|
82
|
+
for (const skill of skills) {
|
|
83
|
+
const skillDir = path.join(dst, skill.name);
|
|
84
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
85
|
+
const content = await fs.readFile(skill.path, 'utf-8');
|
|
86
|
+
await fs.writeFile(path.join(skillDir, 'SKILL.md'), content);
|
|
87
|
+
}
|
|
88
|
+
process.stdout.write(` ✓ Claude Code: ${dst}\n`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function installToCodex(cwd, skills) {
|
|
92
|
+
const dst = path.join(cwd, '.codex/skills');
|
|
93
|
+
await fs.mkdir(dst, { recursive: true });
|
|
94
|
+
for (const skill of skills) {
|
|
95
|
+
const content = await fs.readFile(skill.path, 'utf-8');
|
|
96
|
+
await fs.writeFile(path.join(dst, `${skill.name}.md`), content);
|
|
97
|
+
}
|
|
98
|
+
process.stdout.write(` ✓ Codex CLI: ${dst}\n`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async function dirExists(p) {
|
|
102
|
+
try {
|
|
103
|
+
const st = await fs.stat(p);
|
|
104
|
+
return st.isDirectory();
|
|
105
|
+
} catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|