@gian-tiaga/eda 2.1.0 → 3.1.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/MIGRATION.md +68 -69
- package/README.md +37 -78
- package/agents/eda-aim-planner/prompt.md +1 -1
- package/agents/eda-review-api/prompt.md +2 -1
- package/agents/eda-review-architecture/prompt.md +3 -2
- package/agents/eda-review-business/prompt.md +2 -1
- package/agents/eda-review-code-quality/prompt.md +4 -3
- package/agents/eda-review-correctness/prompt.md +2 -1
- package/agents/eda-review-database/prompt.md +2 -1
- package/agents/eda-review-documentation/prompt.md +2 -1
- package/agents/eda-review-frontend/prompt.md +2 -1
- package/agents/eda-review-performance/prompt.md +4 -3
- package/agents/eda-review-plan-alignment/prompt.md +2 -1
- package/agents/eda-review-previous-reviews/prompt.md +2 -1
- package/agents/eda-review-references/prompt.md +2 -1
- package/agents/eda-review-rules/prompt.md +2 -1
- package/agents/eda-review-security/prompt.md +2 -1
- package/agents/eda-review-tests/prompt.md +2 -1
- package/bin/cli.js +2 -2
- package/lib/install.js +123 -159
- package/package.json +1 -1
- package/skills/eda-aim/SKILL.md +2 -2
- package/skills/eda-discover-automations/SKILL.md +9 -9
- package/skills/eda-explore/SKILL.md +3 -3
- package/skills/eda-fix/SKILL.md +6 -6
- package/skills/eda-fix-by-review/SKILL.md +20 -14
- package/skills/eda-manual-test/SKILL.md +5 -5
- package/skills/eda-new-project/SKILL.md +3 -3
- package/skills/eda-orhestra/SKILL.md +2 -2
- package/skills/eda-plan/SKILL.md +92 -106
- package/skills/eda-plan-execute/SKILL.md +43 -68
- package/skills/eda-plan-polish/SKILL.md +49 -40
- package/skills/eda-plan-review/SKILL.md +89 -136
- package/skills/eda-plan-review-fix/SKILL.md +39 -47
- package/skills/eda-polish/SKILL.md +17 -15
- package/skills/eda-prepare-ai/SKILL.md +1 -1
- package/skills/eda-review/SKILL.md +18 -9
- package/skills/eda-roadmap/SKILL.md +5 -5
- package/skills/eda-send-review/SKILL.md +5 -5
- package/agents/eda-plan-review-api/agent.json +0 -9
- package/agents/eda-plan-review-api/prompt.md +0 -35
- package/agents/eda-plan-review-architecture/agent.json +0 -9
- package/agents/eda-plan-review-architecture/prompt.md +0 -35
- package/agents/eda-plan-review-database/agent.json +0 -9
- package/agents/eda-plan-review-database/prompt.md +0 -35
- package/agents/eda-plan-review-execution/agent.json +0 -9
- package/agents/eda-plan-review-execution/prompt.md +0 -35
- package/agents/eda-plan-review-feasibility/agent.json +0 -9
- package/agents/eda-plan-review-feasibility/prompt.md +0 -35
- package/agents/eda-plan-review-frontend/agent.json +0 -9
- package/agents/eda-plan-review-frontend/prompt.md +0 -35
- package/agents/eda-plan-review-performance/agent.json +0 -9
- package/agents/eda-plan-review-performance/prompt.md +0 -35
- package/agents/eda-plan-review-previous/agent.json +0 -9
- package/agents/eda-plan-review-previous/prompt.md +0 -28
- package/agents/eda-plan-review-requirements/agent.json +0 -9
- package/agents/eda-plan-review-requirements/prompt.md +0 -35
- package/agents/eda-plan-review-rules/agent.json +0 -9
- package/agents/eda-plan-review-rules/prompt.md +0 -35
- package/agents/eda-plan-review-security/agent.json +0 -9
- package/agents/eda-plan-review-security/prompt.md +0 -35
- package/agents/eda-plan-review-verification/agent.json +0 -9
- package/agents/eda-plan-review-verification/prompt.md +0 -35
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
Не выполняй миграции и не изменяй базу. Не дублируй общую performance-, API- или correctness-находку, если риск не относится к хранению данных. Не требуй индекс без обоснованного запроса и нагрузки.
|
|
10
10
|
|
|
11
|
-
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить.
|
|
11
|
+
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить. Находка описывает дефект, который есть в коде сейчас: точное место, достижимый на текущем коде сценарий, практический ущерб и то, чем проблема воспроизводится — падающий тест, вывод линтера или конкретная строка кода либо данных. «Сломается, если позже кто-то так сделает» без достижимого сценария — не находка, как и вкусовой рефакторинг, косметика, спекулятивное усиление, необязательный тест, документация или оптимизация.
|
|
12
12
|
|
|
13
13
|
## Результат
|
|
14
14
|
|
|
@@ -27,6 +27,7 @@ summary: <краткий итог>
|
|
|
27
27
|
- path: <путь>
|
|
28
28
|
line: <строка | null>
|
|
29
29
|
detail: <конкретное подтверждение>
|
|
30
|
+
repro: <падающий тест, вывод линтера или конкретная строка кода либо данных>
|
|
30
31
|
fix: <безопасное направление исправления>
|
|
31
32
|
tests: <миграционный, интеграционный или конкурентный сценарий>
|
|
32
33
|
question: <почему работа заблокирована | null>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
Не требуй комментарии или документацию для внутренних очевидных изменений. Не выполняй редакторское ревью текста и не дублируй rules/references. Не правь файлы.
|
|
10
10
|
|
|
11
|
-
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить.
|
|
11
|
+
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить. Находка описывает дефект, который есть в коде сейчас: точное место, достижимый на текущем коде сценарий, практический ущерб и то, чем проблема воспроизводится — падающий тест, вывод линтера или конкретная строка кода либо данных. «Сломается, если позже кто-то так сделает» без достижимого сценария — не находка, как и вкусовой рефакторинг, косметика, спекулятивное усиление, необязательный тест, документация или оптимизация.
|
|
12
12
|
|
|
13
13
|
## Результат
|
|
14
14
|
|
|
@@ -27,6 +27,7 @@ summary: <краткий итог>
|
|
|
27
27
|
- path: <код или документ>
|
|
28
28
|
line: <строка | null>
|
|
29
29
|
detail: <конкретное расхождение>
|
|
30
|
+
repro: <падающий тест, вывод линтера или конкретная строка кода либо данных>
|
|
30
31
|
fix: <что обновить>
|
|
31
32
|
tests: <проверка документации или null>
|
|
32
33
|
question: <почему работа заблокирована | null>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
Не утверждай, что реально видел интерфейс: браузерная и визуальная проверка относится к `eda-manual-test`. Не дублируй общую correctness-, API- или test-находку, если проблема не специфична фронтенду, UI или UX. Не правь файлы.
|
|
10
10
|
|
|
11
|
-
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить.
|
|
11
|
+
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить. Находка описывает дефект, который есть в коде сейчас: точное место, достижимый на текущем коде сценарий, практический ущерб и то, чем проблема воспроизводится — падающий тест, вывод линтера или конкретная строка кода либо данных. «Сломается, если позже кто-то так сделает» без достижимого сценария — не находка, как и вкусовой рефакторинг, косметика, спекулятивное усиление, необязательный тест, документация или оптимизация.
|
|
12
12
|
|
|
13
13
|
## Результат
|
|
14
14
|
|
|
@@ -27,6 +27,7 @@ summary: <краткий итог>
|
|
|
27
27
|
- path: <путь>
|
|
28
28
|
line: <строка | null>
|
|
29
29
|
detail: <конкретное подтверждение>
|
|
30
|
+
repro: <падающий тест, вывод линтера или конкретная строка кода либо данных>
|
|
30
31
|
fix: <как исправить интерфейс или клиентскую логику>
|
|
31
32
|
tests: <компонентный, unit или e2e-сценарий>
|
|
32
33
|
question: <почему работа заблокирована | null>
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# Роль
|
|
2
2
|
|
|
3
|
-
Ты — read-only проверяющий производительности для `eda-review`. Ищи N+1, лишние запросы и проходы, неограниченную обработку, чрезмерные аллокации, блокировки, ошибки
|
|
3
|
+
Ты — read-only проверяющий производительности для `eda-review`. Ищи N+1, лишние запросы и проходы, неограниченную обработку, чрезмерные аллокации, блокировки, ошибки кеширования и конкурентности.
|
|
4
4
|
|
|
5
5
|
## Вход и работа
|
|
6
6
|
|
|
7
7
|
В task-сообщении получи рабочую директорию, `TARGET`, `PLAN_FILE`, `REFERENCE_FILES`, `MODEL` и краткий `REVIEW_CONTEXT`. Прочитай diff и код горячего пути, оцени размеры данных и частоту вызовов по фактам проекта. Безопасные измерения разрешены, если они не изменяют tracked-файлы.
|
|
8
8
|
|
|
9
|
-
Не сообщай микроптимизации без измеримого или очевидного эффекта. Находка должна объяснять, при какой нагрузке проблема проявится и почему изменение её создаёт. Не дублируй database- или correctness-находки. Не правь файлы.
|
|
9
|
+
Не сообщай микроптимизации без измеримого или очевидного эффекта. Находка должна объяснять, при какой нагрузке проблема проявится по фактическим объёмам проекта и почему изменение её создаёт. Не дублируй database- или correctness-находки. Не правь файлы.
|
|
10
10
|
|
|
11
|
-
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить.
|
|
11
|
+
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить. Находка описывает дефект, который есть в коде сейчас: точное место, достижимый на текущем коде сценарий, практический ущерб и то, чем проблема воспроизводится — падающий тест, вывод линтера или конкретная строка кода либо данных. «Сломается, если позже кто-то так сделает» без достижимого сценария — не находка, как и вкусовой рефакторинг, косметика, спекулятивное усиление, необязательный тест, документация или оптимизация.
|
|
12
12
|
|
|
13
13
|
## Результат
|
|
14
14
|
|
|
@@ -27,6 +27,7 @@ summary: <краткий итог>
|
|
|
27
27
|
- path: <путь>
|
|
28
28
|
line: <строка | null>
|
|
29
29
|
detail: <конкретное подтверждение>
|
|
30
|
+
repro: <падающий тест, вывод линтера или конкретная строка кода либо данных>
|
|
30
31
|
fix: <направление оптимизации>
|
|
31
32
|
tests: <benchmark, нагрузочный или регрессионный сценарий>
|
|
32
33
|
question: <почему работа заблокирована | null>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
Не перечисляй выполненные пункты и не требуй буквального совпадения там, где реализация сохранила цель плана без дополнительного риска. Не выполняй общее архитектурное или стилевое ревью. Не правь файлы.
|
|
10
10
|
|
|
11
|
-
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить.
|
|
11
|
+
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить. Находка описывает дефект, который есть в коде сейчас: точное место, достижимый на текущем коде сценарий, практический ущерб и то, чем проблема воспроизводится — падающий тест, вывод линтера или конкретная строка кода либо данных. «Сломается, если позже кто-то так сделает» без достижимого сценария — не находка, как и вкусовой рефакторинг, косметика, спекулятивное усиление, необязательный тест, документация или оптимизация.
|
|
12
12
|
|
|
13
13
|
## Результат
|
|
14
14
|
|
|
@@ -27,6 +27,7 @@ summary: <краткий итог>
|
|
|
27
27
|
- path: <план или код>
|
|
28
28
|
line: <строка | null>
|
|
29
29
|
detail: <конкретное подтверждение>
|
|
30
|
+
repro: <падающий тест, вывод линтера или конкретная строка кода либо данных>
|
|
30
31
|
fix: <как закрыть расхождение>
|
|
31
32
|
tests: <какую проверку из плана добавить или обновить>
|
|
32
33
|
question: <почему работа заблокирована | null>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
Классифицируй незакрытые замечания: проблема всё ещё существует; код исправлен, но тред открыт; невозможно проверить. В `находки` включай только проблемы, которые всё ещё существуют. Исправленные открытые треды перечисли в `resolved_but_open`.
|
|
16
16
|
|
|
17
|
-
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить.
|
|
17
|
+
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить. Находка описывает дефект, который есть в коде сейчас: точное место, достижимый на текущем коде сценарий, практический ущерб и то, чем проблема воспроизводится — падающий тест, вывод линтера или конкретная строка кода либо данных. «Сломается, если позже кто-то так сделает» без достижимого сценария — не находка, как и вкусовой рефакторинг, косметика, спекулятивное усиление, необязательный тест, документация или оптимизация.
|
|
18
18
|
|
|
19
19
|
## Результат
|
|
20
20
|
|
|
@@ -33,6 +33,7 @@ summary: <краткий итог>
|
|
|
33
33
|
- path: <путь или URL треда>
|
|
34
34
|
line: <строка | null>
|
|
35
35
|
detail: <конкретное подтверждение в текущем коде>
|
|
36
|
+
repro: <падающий тест, вывод линтера или конкретная строка кода либо данных>
|
|
36
37
|
fix: <как закрыть проблему>
|
|
37
38
|
tests: <какая проверка нужна>
|
|
38
39
|
resolved_but_open:
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
Не загружай все `docs/references/`, не ищи внешние источники и не проверяй остальные области ревью. Отличие от примера без практического риска не является проблемой. Не правь файлы.
|
|
10
10
|
|
|
11
|
-
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить.
|
|
11
|
+
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить. Находка описывает дефект, который есть в коде сейчас: точное место, достижимый на текущем коде сценарий, практический ущерб и то, чем проблема воспроизводится — падающий тест, вывод линтера или конкретная строка кода либо данных. «Сломается, если позже кто-то так сделает» без достижимого сценария — не находка, как и вкусовой рефакторинг, косметика, спекулятивное усиление, необязательный тест, документация или оптимизация.
|
|
12
12
|
|
|
13
13
|
## Результат
|
|
14
14
|
|
|
@@ -27,6 +27,7 @@ summary: <краткий итог>
|
|
|
27
27
|
- path: <карточка или изменённый файл>
|
|
28
28
|
line: <строка | null>
|
|
29
29
|
detail: <конкретное подтверждение>
|
|
30
|
+
repro: <падающий тест, вывод линтера или конкретная строка кода либо данных>
|
|
30
31
|
fix: <как согласовать реализацию с эталоном>
|
|
31
32
|
tests: <нужная проверка или null>
|
|
32
33
|
question: <почему работа заблокирована | null>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
Не проверяй архитектуру, references или качество кода вместо соответствующих агентов. Не выдумывай правила и не превращай предпочтение в нарушение. Не правь файлы.
|
|
10
10
|
|
|
11
|
-
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить.
|
|
11
|
+
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить. Находка описывает дефект, который есть в коде сейчас: точное место, достижимый на текущем коде сценарий, практический ущерб и то, чем проблема воспроизводится — падающий тест, вывод линтера или конкретная строка кода либо данных. «Сломается, если позже кто-то так сделает» без достижимого сценария — не находка, как и вкусовой рефакторинг, косметика, спекулятивное усиление, необязательный тест, документация или оптимизация.
|
|
12
12
|
|
|
13
13
|
## Результат
|
|
14
14
|
|
|
@@ -27,6 +27,7 @@ summary: <краткий итог>
|
|
|
27
27
|
- path: <путь к правилу или коду>
|
|
28
28
|
line: <строка | null>
|
|
29
29
|
detail: <цитата правила в пересказе и подтверждение нарушения>
|
|
30
|
+
repro: <падающий тест, вывод линтера или конкретная строка кода либо данных>
|
|
30
31
|
fix: <как привести код в соответствие>
|
|
31
32
|
tests: <нужная проверка или null>
|
|
32
33
|
question: <почему работа заблокирована | null>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
Не выдавай гипотетические общие советы без конкретного пути эксплуатации или нарушения защитного инварианта. Не дублируй обычные ошибки корректности и API-контракта. Не выполняй активные атаки и не правь файлы.
|
|
10
10
|
|
|
11
|
-
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить.
|
|
11
|
+
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить. Находка описывает дефект, который есть в коде сейчас: точное место, достижимый на текущем коде сценарий, практический ущерб и то, чем проблема воспроизводится — падающий тест, вывод линтера или конкретная строка кода либо данных. «Сломается, если позже кто-то так сделает» без достижимого сценария — не находка, как и вкусовой рефакторинг, косметика, спекулятивное усиление, необязательный тест, документация или оптимизация.
|
|
12
12
|
|
|
13
13
|
## Результат
|
|
14
14
|
|
|
@@ -27,6 +27,7 @@ summary: <краткий итог>
|
|
|
27
27
|
- path: <путь>
|
|
28
28
|
line: <строка | null>
|
|
29
29
|
detail: <конкретное подтверждение>
|
|
30
|
+
repro: <падающий тест, вывод линтера или конкретная строка кода либо данных>
|
|
30
31
|
fix: <как закрыть уязвимость>
|
|
31
32
|
tests: <негативный или защитный тест>
|
|
32
33
|
question: <почему работа заблокирована | null>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
Не требуй тест на каждую строку. Находка должна описывать конкретную регрессию, которую текущие тесты не поймают, либо ошибку в самих тестах. Не дублируй функциональную проблему, если можешь сформулировать только тестовый пробел. Не правь файлы.
|
|
10
10
|
|
|
11
|
-
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить.
|
|
11
|
+
Добавляй находку только для конкретной доказанной проблемы, которую обязательно исправить. Находка описывает дефект, который есть в коде сейчас: точное место, достижимый на текущем коде сценарий, практический ущерб и то, чем проблема воспроизводится — падающий тест, вывод линтера или конкретная строка кода либо данных. «Сломается, если позже кто-то так сделает» без достижимого сценария — не находка, как и вкусовой рефакторинг, косметика, спекулятивное усиление, необязательный тест, документация или оптимизация.
|
|
12
12
|
|
|
13
13
|
## Результат
|
|
14
14
|
|
|
@@ -27,6 +27,7 @@ summary: <краткий итог>
|
|
|
27
27
|
- path: <код или тест>
|
|
28
28
|
line: <строка | null>
|
|
29
29
|
detail: <конкретное подтверждение>
|
|
30
|
+
repro: <падающий тест, вывод линтера или конкретная строка кода либо данных>
|
|
30
31
|
fix: <какой тест добавить или изменить>
|
|
31
32
|
tests: <конкретный сценарий>
|
|
32
33
|
question: <почему работа заблокирована | null>
|
package/bin/cli.js
CHANGED
|
@@ -10,8 +10,8 @@ const HELP = `eda — установка и обновление скилов и
|
|
|
10
10
|
|
|
11
11
|
Использование:
|
|
12
12
|
eda init — выбрать целевые среды (Claude / Codex / обе) и установить пакет
|
|
13
|
-
eda update — перенести
|
|
14
|
-
eda update-all [dir] — перенести
|
|
13
|
+
eda update — перенести артефакты и настройки, обновить текущий проект
|
|
14
|
+
eda update-all [dir] — перенести артефакты и настройки найденных проектов
|
|
15
15
|
eda --version — показать версию
|
|
16
16
|
eda --help — показать эту справку
|
|
17
17
|
`;
|
package/lib/install.js
CHANGED
|
@@ -19,6 +19,22 @@ const SKILLS_SRC = path.join(PACKAGE_ROOT, 'skills');
|
|
|
19
19
|
const AGENTS_SRC = path.join(PACKAGE_ROOT, 'agents');
|
|
20
20
|
const PACKAGE_JSON_PATH = path.join(PACKAGE_ROOT, 'package.json');
|
|
21
21
|
const SETTINGS_RELATIVE_PATH = 'docs/settings.yaml';
|
|
22
|
+
const ARTIFACTS_RELATIVE_PATH = 'docs/artifacts';
|
|
23
|
+
const ARTIFACT_DIRECTORY_NAMES = [
|
|
24
|
+
'aims',
|
|
25
|
+
'automations',
|
|
26
|
+
'executions',
|
|
27
|
+
'fixes',
|
|
28
|
+
'manual-tests',
|
|
29
|
+
'plan-review-fixes',
|
|
30
|
+
'plan-reviews',
|
|
31
|
+
'plans',
|
|
32
|
+
'project-starts',
|
|
33
|
+
'researches',
|
|
34
|
+
'review-fixes',
|
|
35
|
+
'reviews',
|
|
36
|
+
'roadmaps'
|
|
37
|
+
];
|
|
22
38
|
const TARGET_CHOICES = [
|
|
23
39
|
{ value: 'claude', label: 'Claude Code', dir: '.claude/skills/' },
|
|
24
40
|
{ value: 'codex', label: 'Codex CLI', dir: '.codex/skills/' }
|
|
@@ -34,7 +50,19 @@ const RETIRED_SKILLS = [
|
|
|
34
50
|
'eda-start'
|
|
35
51
|
];
|
|
36
52
|
const RETIRED_AGENTS = [
|
|
37
|
-
'eda-commit-context'
|
|
53
|
+
'eda-commit-context',
|
|
54
|
+
'eda-plan-review-requirements',
|
|
55
|
+
'eda-plan-review-rules',
|
|
56
|
+
'eda-plan-review-architecture',
|
|
57
|
+
'eda-plan-review-feasibility',
|
|
58
|
+
'eda-plan-review-execution',
|
|
59
|
+
'eda-plan-review-verification',
|
|
60
|
+
'eda-plan-review-api',
|
|
61
|
+
'eda-plan-review-database',
|
|
62
|
+
'eda-plan-review-security',
|
|
63
|
+
'eda-plan-review-frontend',
|
|
64
|
+
'eda-plan-review-performance',
|
|
65
|
+
'eda-plan-review-previous'
|
|
38
66
|
];
|
|
39
67
|
const MANIFEST_FILE = 'eda-manifest.json';
|
|
40
68
|
const SETTINGS_VERSION = 3;
|
|
@@ -170,114 +198,6 @@ const DEFAULT_REVIEW_AGENTS = Object.fromEntries(REVIEW_AGENT_DEFINITIONS.map(ag
|
|
|
170
198
|
}
|
|
171
199
|
}
|
|
172
200
|
]));
|
|
173
|
-
const PLAN_REVIEW_AGENT_DEFINITIONS = [
|
|
174
|
-
{
|
|
175
|
-
key: 'requirements',
|
|
176
|
-
description: 'Проверяет соответствие плана задаче, scope, критериям готовности и применимым business-требованиям.',
|
|
177
|
-
auto: 'Эта базовая проверка по умолчанию запускается всегда.',
|
|
178
|
-
mode: 'always',
|
|
179
|
-
claude: 'sonnet',
|
|
180
|
-
codex: 'gpt-5.6-terra'
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
key: 'rules',
|
|
184
|
-
description: 'Проверяет соблюдение AGENTS.md, CLAUDE.md и docs/rules.md.',
|
|
185
|
-
auto: 'Эта базовая проверка по умолчанию запускается всегда.',
|
|
186
|
-
mode: 'always',
|
|
187
|
-
claude: 'haiku',
|
|
188
|
-
codex: 'gpt-5.6-luna'
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
key: 'architecture',
|
|
192
|
-
description: 'Проверяет архитектурные границы, зависимости и соответствие docs/arch.md.',
|
|
193
|
-
auto: 'Эта базовая проверка по умолчанию запускается всегда.',
|
|
194
|
-
mode: 'always',
|
|
195
|
-
claude: 'opus',
|
|
196
|
-
codex: 'gpt-5.6-sol'
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
key: 'feasibility',
|
|
200
|
-
description: 'Проверяет реализуемость плана относительно фактического кода и отсутствие скрытого исследования.',
|
|
201
|
-
auto: 'Эта базовая проверка по умолчанию запускается всегда.',
|
|
202
|
-
mode: 'always',
|
|
203
|
-
claude: 'opus',
|
|
204
|
-
codex: 'gpt-5.6-sol'
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
key: 'execution',
|
|
208
|
-
description: 'Проверяет связность фаз, ID задач, зависимости и размер работы для одного исполнителя.',
|
|
209
|
-
auto: 'Эта базовая проверка по умолчанию запускается всегда.',
|
|
210
|
-
mode: 'always',
|
|
211
|
-
claude: 'sonnet',
|
|
212
|
-
codex: 'gpt-5.6-terra'
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
key: 'verification',
|
|
216
|
-
description: 'Проверяет тесты, команды проверок, ошибки, логирование, документацию и эксплуатационную готовность.',
|
|
217
|
-
auto: 'Эта базовая проверка по умолчанию запускается всегда.',
|
|
218
|
-
mode: 'always',
|
|
219
|
-
claude: 'sonnet',
|
|
220
|
-
codex: 'gpt-5.6-terra'
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
key: 'api',
|
|
224
|
-
description: 'Проверяет API, DTO, события, очереди, внешние интеграции и совместимость контрактов.',
|
|
225
|
-
auto: 'В auto запускается при изменении API, событий, очередей или внешних интеграций.',
|
|
226
|
-
mode: 'auto',
|
|
227
|
-
claude: 'sonnet',
|
|
228
|
-
codex: 'gpt-5.6-terra'
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
key: 'database',
|
|
232
|
-
description: 'Проверяет схему данных, миграции, backfill, индексы, транзакции и rollback.',
|
|
233
|
-
auto: 'В auto запускается при изменении хранения, моделей, SQL, схем или миграций.',
|
|
234
|
-
mode: 'auto',
|
|
235
|
-
claude: 'opus',
|
|
236
|
-
codex: 'gpt-5.6-sol'
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
key: 'security',
|
|
240
|
-
description: 'Проверяет auth, permissions, внешний ввод, секреты, персональные данные и опасные операции.',
|
|
241
|
-
auto: 'В auto запускается для auth, permissions, внешнего ввода, секретов и чувствительных данных.',
|
|
242
|
-
mode: 'auto',
|
|
243
|
-
claude: 'opus',
|
|
244
|
-
codex: 'gpt-5.6-sol'
|
|
245
|
-
},
|
|
246
|
-
{
|
|
247
|
-
key: 'frontend',
|
|
248
|
-
description: 'Проверяет пользовательский сценарий, состояния UI, ошибки, accessibility и адаптивность.',
|
|
249
|
-
auto: 'В auto запускается для компонентов, стилей, клиентских маршрутов и состояния UI.',
|
|
250
|
-
mode: 'auto',
|
|
251
|
-
claude: 'sonnet',
|
|
252
|
-
codex: 'gpt-5.6-terra'
|
|
253
|
-
},
|
|
254
|
-
{
|
|
255
|
-
key: 'performance',
|
|
256
|
-
description: 'Проверяет нагрузку, запросы, конкурентность, кеши и горячие пути.',
|
|
257
|
-
auto: 'В auto запускается для запросов, пакетной обработки, кешей, конкурентности и горячих путей.',
|
|
258
|
-
mode: 'auto',
|
|
259
|
-
claude: 'opus',
|
|
260
|
-
codex: 'gpt-5.6-sol'
|
|
261
|
-
},
|
|
262
|
-
{
|
|
263
|
-
key: 'previous',
|
|
264
|
-
description: 'Проверяет закрытие находок предыдущей связанной итерации plan-review.',
|
|
265
|
-
auto: 'В auto запускается только при наличии связанной цепочки review/fix для текущего SHA-256 плана.',
|
|
266
|
-
mode: 'auto',
|
|
267
|
-
claude: 'haiku',
|
|
268
|
-
codex: 'gpt-5.6-luna'
|
|
269
|
-
}
|
|
270
|
-
];
|
|
271
|
-
const DEFAULT_PLAN_REVIEW_AGENTS = Object.fromEntries(PLAN_REVIEW_AGENT_DEFINITIONS.map(agent => [
|
|
272
|
-
agent.key,
|
|
273
|
-
{
|
|
274
|
-
mode: agent.mode,
|
|
275
|
-
model: {
|
|
276
|
-
claude: agent.claude,
|
|
277
|
-
codex: agent.codex
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
]));
|
|
281
201
|
const ORHESTRA_STEP_DEFINITIONS = [
|
|
282
202
|
{
|
|
283
203
|
id: 'plan',
|
|
@@ -343,11 +263,10 @@ const DEFAULT_SETTINGS = {
|
|
|
343
263
|
loggingStrategy: 'ask_each_time'
|
|
344
264
|
},
|
|
345
265
|
planReview: {
|
|
346
|
-
threshold:
|
|
347
|
-
agents: DEFAULT_PLAN_REVIEW_AGENTS
|
|
266
|
+
threshold: 100
|
|
348
267
|
},
|
|
349
268
|
planPolish: {
|
|
350
|
-
limit:
|
|
269
|
+
limit: 2
|
|
351
270
|
},
|
|
352
271
|
review: {
|
|
353
272
|
agents: DEFAULT_REVIEW_AGENTS
|
|
@@ -431,11 +350,11 @@ const ORHESTRA_POLISH_LIMIT_CHOICES = [1, 2, 3, 5, 10].map(value => ({
|
|
|
431
350
|
value,
|
|
432
351
|
name: `${value} ${value === 1 ? 'итерация' : value < 5 ? 'итерации' : 'итераций'}`
|
|
433
352
|
}));
|
|
434
|
-
const PLAN_REVIEW_THRESHOLD_CHOICES = [
|
|
353
|
+
const PLAN_REVIEW_THRESHOLD_CHOICES = [80, 90, 100].map(value => ({
|
|
435
354
|
value,
|
|
436
355
|
name: `${value}/100`
|
|
437
356
|
}));
|
|
438
|
-
const PLAN_POLISH_LIMIT_CHOICES = [1, 2, 3
|
|
357
|
+
const PLAN_POLISH_LIMIT_CHOICES = [1, 2, 3].map(value => ({
|
|
439
358
|
value,
|
|
440
359
|
name: `${value} ${value === 1 ? 'итерация' : value < 5 ? 'итерации' : 'итераций'}`
|
|
441
360
|
}));
|
|
@@ -542,6 +461,7 @@ export async function update({ cwd, input = process.stdin, output = process.stdo
|
|
|
542
461
|
return;
|
|
543
462
|
}
|
|
544
463
|
output.write(`Найдены установленные среды: ${targets.join(', ')}\n`);
|
|
464
|
+
await migrateArtifactDirectories(cwd, output);
|
|
545
465
|
await configureSettings(cwd, { input, output });
|
|
546
466
|
await syncPackage(cwd, targets, output, { action: 'update' });
|
|
547
467
|
}
|
|
@@ -611,6 +531,7 @@ export async function updateAll({
|
|
|
611
531
|
}
|
|
612
532
|
|
|
613
533
|
output.write(`Найдены установленные среды: ${targets.join(', ')}\n`);
|
|
534
|
+
await migrateArtifactDirectories(projectDir, output);
|
|
614
535
|
const projectSettingsPath = path.join(projectDir, SETTINGS_RELATIVE_PATH);
|
|
615
536
|
if (resolvedSettingsMode === 'skip' && await fileExists(projectSettingsPath)) {
|
|
616
537
|
const existingContent = await fs.readFile(projectSettingsPath, 'utf8');
|
|
@@ -793,15 +714,6 @@ export async function askSettings({
|
|
|
793
714
|
target[property] = await selectPrompt({ message, choices, default: target[property] }, { input, output });
|
|
794
715
|
}
|
|
795
716
|
|
|
796
|
-
if (requestedSections.has('plan-review')) {
|
|
797
|
-
settings.planReview.agents = await askPlanReviewAgentSettings({
|
|
798
|
-
input,
|
|
799
|
-
output,
|
|
800
|
-
selectPrompt,
|
|
801
|
-
seedAgents: settings.planReview.agents,
|
|
802
|
-
missingKeys
|
|
803
|
-
});
|
|
804
|
-
}
|
|
805
717
|
if (requestedSections.has('review')) {
|
|
806
718
|
settings.review.agents = await askReviewAgentSettings({
|
|
807
719
|
input,
|
|
@@ -833,25 +745,6 @@ export async function askReviewAgentSettings({
|
|
|
833
745
|
});
|
|
834
746
|
}
|
|
835
747
|
|
|
836
|
-
export async function askPlanReviewAgentSettings({
|
|
837
|
-
input = process.stdin,
|
|
838
|
-
output = process.stdout,
|
|
839
|
-
selectPrompt = select,
|
|
840
|
-
seedAgents = DEFAULT_PLAN_REVIEW_AGENTS,
|
|
841
|
-
missingKeys = null
|
|
842
|
-
} = {}) {
|
|
843
|
-
return askAgentSettings({
|
|
844
|
-
input,
|
|
845
|
-
output,
|
|
846
|
-
selectPrompt,
|
|
847
|
-
definitions: PLAN_REVIEW_AGENT_DEFINITIONS,
|
|
848
|
-
seedAgents,
|
|
849
|
-
missingKeys,
|
|
850
|
-
keyPrefix: 'planReview.agents',
|
|
851
|
-
label: 'plan-review'
|
|
852
|
-
});
|
|
853
|
-
}
|
|
854
|
-
|
|
855
748
|
async function askAgentSettings({ input, output, selectPrompt, definitions, seedAgents, missingKeys, keyPrefix, label }) {
|
|
856
749
|
const configuredAgents = structuredClone(seedAgents);
|
|
857
750
|
const shouldAsk = key => missingKeys === null || missingKeys.has(key);
|
|
@@ -1010,6 +903,92 @@ async function findInstalledProjects(rootDir, maxDepth) {
|
|
|
1010
903
|
return projects;
|
|
1011
904
|
}
|
|
1012
905
|
|
|
906
|
+
async function migrateArtifactDirectories(cwd, output = process.stdout) {
|
|
907
|
+
const docsDir = path.join(cwd, 'docs');
|
|
908
|
+
const artifactsDir = path.join(cwd, ARTIFACTS_RELATIVE_PATH);
|
|
909
|
+
const legacyDirectories = [];
|
|
910
|
+
|
|
911
|
+
for (const directoryName of ARTIFACT_DIRECTORY_NAMES) {
|
|
912
|
+
const legacyPath = path.join(docsDir, directoryName);
|
|
913
|
+
const legacyStat = await lstatIfExists(legacyPath);
|
|
914
|
+
if (!legacyStat) continue;
|
|
915
|
+
if (!legacyStat.isDirectory() || legacyStat.isSymbolicLink()) {
|
|
916
|
+
throw new Error(`Ожидался каталог артефактов: ${legacyPath}`);
|
|
917
|
+
}
|
|
918
|
+
legacyDirectories.push({ directoryName, legacyPath });
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
if (legacyDirectories.length === 0) {
|
|
922
|
+
return { migratedDirectories: 0, movedFiles: 0, discardedFiles: 0 };
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
const artifactsStat = await lstatIfExists(artifactsDir);
|
|
926
|
+
if (artifactsStat && (!artifactsStat.isDirectory() || artifactsStat.isSymbolicLink())) {
|
|
927
|
+
throw new Error(`Ожидался каталог артефактов: ${artifactsDir}`);
|
|
928
|
+
}
|
|
929
|
+
await fs.mkdir(artifactsDir, { recursive: true });
|
|
930
|
+
|
|
931
|
+
const result = {
|
|
932
|
+
migratedDirectories: legacyDirectories.length,
|
|
933
|
+
movedFiles: 0,
|
|
934
|
+
discardedFiles: 0
|
|
935
|
+
};
|
|
936
|
+
for (const { directoryName, legacyPath } of legacyDirectories) {
|
|
937
|
+
await mergeArtifactEntry(legacyPath, path.join(artifactsDir, directoryName), result);
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
output.write(
|
|
941
|
+
`Артефакты перенесены в ${ARTIFACTS_RELATIVE_PATH}/: каталогов ${result.migratedDirectories}, `
|
|
942
|
+
+ `файлов перемещено ${result.movedFiles}, конфликтующих старых файлов удалено ${result.discardedFiles}.\n`
|
|
943
|
+
);
|
|
944
|
+
return result;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
async function mergeArtifactEntry(sourcePath, destinationPath, result) {
|
|
948
|
+
const sourceStat = await fs.lstat(sourcePath);
|
|
949
|
+
const destinationStat = await lstatIfExists(destinationPath);
|
|
950
|
+
|
|
951
|
+
if (!destinationStat) {
|
|
952
|
+
result.movedFiles += await countArtifactFiles(sourcePath, sourceStat);
|
|
953
|
+
await fs.mkdir(path.dirname(destinationPath), { recursive: true });
|
|
954
|
+
await fs.rename(sourcePath, destinationPath);
|
|
955
|
+
return;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
const mergeDirectories = sourceStat.isDirectory()
|
|
959
|
+
&& !sourceStat.isSymbolicLink()
|
|
960
|
+
&& destinationStat.isDirectory()
|
|
961
|
+
&& !destinationStat.isSymbolicLink();
|
|
962
|
+
if (!mergeDirectories) {
|
|
963
|
+
result.discardedFiles += await countArtifactFiles(sourcePath, sourceStat);
|
|
964
|
+
await fs.rm(sourcePath, { recursive: true, force: true });
|
|
965
|
+
return;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
const entries = await fs.readdir(sourcePath, { withFileTypes: true });
|
|
969
|
+
entries.sort((left, right) => left.name.localeCompare(right.name));
|
|
970
|
+
for (const entry of entries) {
|
|
971
|
+
await mergeArtifactEntry(
|
|
972
|
+
path.join(sourcePath, entry.name),
|
|
973
|
+
path.join(destinationPath, entry.name),
|
|
974
|
+
result
|
|
975
|
+
);
|
|
976
|
+
}
|
|
977
|
+
await fs.rmdir(sourcePath);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
async function countArtifactFiles(entryPath, entryStat = null) {
|
|
981
|
+
const stat = entryStat ?? await fs.lstat(entryPath);
|
|
982
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) return 1;
|
|
983
|
+
|
|
984
|
+
let count = 0;
|
|
985
|
+
const entries = await fs.readdir(entryPath, { withFileTypes: true });
|
|
986
|
+
for (const entry of entries) {
|
|
987
|
+
count += await countArtifactFiles(path.join(entryPath, entry.name));
|
|
988
|
+
}
|
|
989
|
+
return count;
|
|
990
|
+
}
|
|
991
|
+
|
|
1013
992
|
async function ensureSettings(cwd, { input = process.stdin, output = process.stdout } = {}) {
|
|
1014
993
|
const settingsPath = path.join(cwd, SETTINGS_RELATIVE_PATH);
|
|
1015
994
|
const existingContent = await readFileIfExists(settingsPath);
|
|
@@ -1144,13 +1123,6 @@ function migrateSettingsContent(content) {
|
|
|
1144
1123
|
|
|
1145
1124
|
const planReview = objectValue(raw['plan-review']);
|
|
1146
1125
|
transfer('planReview.threshold', planReview.threshold, score, value => { settings.planReview.threshold = value; });
|
|
1147
|
-
transferAgentSettings({
|
|
1148
|
-
rawAgents: objectValue(planReview.agents),
|
|
1149
|
-
settingsAgents: settings.planReview.agents,
|
|
1150
|
-
definitions: PLAN_REVIEW_AGENT_DEFINITIONS,
|
|
1151
|
-
prefix: 'planReview.agents',
|
|
1152
|
-
missingKeys
|
|
1153
|
-
});
|
|
1154
1126
|
|
|
1155
1127
|
const planPolish = objectValue(raw['plan-polish']);
|
|
1156
1128
|
transfer('planPolish.limit', planPolish.limit, positiveInt, value => { settings.planPolish.limit = value; });
|
|
@@ -1295,11 +1267,6 @@ ${onFailureThen}
|
|
|
1295
1267
|
# Модель для Codex.
|
|
1296
1268
|
codex: ${configured.model.codex}`;
|
|
1297
1269
|
}).join('\n\n');
|
|
1298
|
-
const planReviewAgents = formatAgents(
|
|
1299
|
-
PLAN_REVIEW_AGENT_DEFINITIONS,
|
|
1300
|
-
settings.planReview.agents,
|
|
1301
|
-
DEFAULT_PLAN_REVIEW_AGENTS
|
|
1302
|
-
);
|
|
1303
1270
|
const reviewAgents = formatAgents(REVIEW_AGENT_DEFINITIONS, settings.review.agents, DEFAULT_REVIEW_AGENTS);
|
|
1304
1271
|
|
|
1305
1272
|
return `version: ${SETTINGS_VERSION}
|
|
@@ -1346,12 +1313,9 @@ plan:
|
|
|
1346
1313
|
logging_strategy: ${settings.plan.loggingStrategy}
|
|
1347
1314
|
|
|
1348
1315
|
plan-review:
|
|
1349
|
-
#
|
|
1316
|
+
# Доля закрытых пунктов чек-листа, при которой план считается готовым.
|
|
1350
1317
|
# 1..100
|
|
1351
1318
|
threshold: ${settings.planReview.threshold}
|
|
1352
|
-
# Каждая проверка имеет собственный режим запуска и модели для обеих сред.
|
|
1353
|
-
agents:
|
|
1354
|
-
${planReviewAgents}
|
|
1355
1319
|
|
|
1356
1320
|
plan-polish:
|
|
1357
1321
|
# Максимальное число подтверждающих review-итераций.
|
|
@@ -1369,7 +1333,7 @@ send-review:
|
|
|
1369
1333
|
close_previous_reviews: ${settings.sendReview.closePreviousReviews ? 'true' : 'false'}
|
|
1370
1334
|
|
|
1371
1335
|
discover-automations:
|
|
1372
|
-
# Добавляет docs/plans/ в обычный запуск eda-discover-automations.
|
|
1336
|
+
# Добавляет docs/artifacts/plans/ в обычный запуск eda-discover-automations.
|
|
1373
1337
|
# true | false
|
|
1374
1338
|
include_plans: ${settings.discoverAutomations.includePlans ? 'true' : 'false'}
|
|
1375
1339
|
`;
|
package/package.json
CHANGED
package/skills/eda-aim/SKILL.md
CHANGED
|
@@ -28,7 +28,7 @@ aim:
|
|
|
28
28
|
|
|
29
29
|
В автоматическом режиме основной агент сам выбирает ответ на рабочие вопросы по рекомендации субагента и фактам проекта. Это не отменяет одно обязательное подтверждение человеком точного списка целей до создания нового файла.
|
|
30
30
|
|
|
31
|
-
Если пользователь передал существующий файл из `docs/aims/`, продолжай его с текущего статуса. Не создавай второй файл для той же цели.
|
|
31
|
+
Если пользователь передал существующий файл из `docs/artifacts/aims/`, продолжай его с текущего статуса. Не создавай второй файл для той же цели.
|
|
32
32
|
|
|
33
33
|
## Пакетные агенты
|
|
34
34
|
|
|
@@ -59,7 +59,7 @@ aim:
|
|
|
59
59
|
|
|
60
60
|
## Файл цели
|
|
61
61
|
|
|
62
|
-
После подтверждения `eda-aim-planner` создаёт `docs/aims/{YYYY-MM-DD}_{HH-MM}_{slug}.md`. Файл должен оставаться коротким и содержать только цель и фактический журнал:
|
|
62
|
+
После подтверждения `eda-aim-planner` создаёт `docs/artifacts/aims/{YYYY-MM-DD}_{HH-MM}_{slug}.md`. Файл должен оставаться коротким и содержать только цель и фактический журнал:
|
|
63
63
|
|
|
64
64
|
```markdown
|
|
65
65
|
# <Короткое название>
|