@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.
Files changed (63) hide show
  1. package/MIGRATION.md +68 -69
  2. package/README.md +37 -78
  3. package/agents/eda-aim-planner/prompt.md +1 -1
  4. package/agents/eda-review-api/prompt.md +2 -1
  5. package/agents/eda-review-architecture/prompt.md +3 -2
  6. package/agents/eda-review-business/prompt.md +2 -1
  7. package/agents/eda-review-code-quality/prompt.md +4 -3
  8. package/agents/eda-review-correctness/prompt.md +2 -1
  9. package/agents/eda-review-database/prompt.md +2 -1
  10. package/agents/eda-review-documentation/prompt.md +2 -1
  11. package/agents/eda-review-frontend/prompt.md +2 -1
  12. package/agents/eda-review-performance/prompt.md +4 -3
  13. package/agents/eda-review-plan-alignment/prompt.md +2 -1
  14. package/agents/eda-review-previous-reviews/prompt.md +2 -1
  15. package/agents/eda-review-references/prompt.md +2 -1
  16. package/agents/eda-review-rules/prompt.md +2 -1
  17. package/agents/eda-review-security/prompt.md +2 -1
  18. package/agents/eda-review-tests/prompt.md +2 -1
  19. package/bin/cli.js +2 -2
  20. package/lib/install.js +123 -159
  21. package/package.json +1 -1
  22. package/skills/eda-aim/SKILL.md +2 -2
  23. package/skills/eda-discover-automations/SKILL.md +9 -9
  24. package/skills/eda-explore/SKILL.md +3 -3
  25. package/skills/eda-fix/SKILL.md +6 -6
  26. package/skills/eda-fix-by-review/SKILL.md +20 -14
  27. package/skills/eda-manual-test/SKILL.md +5 -5
  28. package/skills/eda-new-project/SKILL.md +3 -3
  29. package/skills/eda-orhestra/SKILL.md +2 -2
  30. package/skills/eda-plan/SKILL.md +92 -106
  31. package/skills/eda-plan-execute/SKILL.md +43 -68
  32. package/skills/eda-plan-polish/SKILL.md +49 -40
  33. package/skills/eda-plan-review/SKILL.md +89 -136
  34. package/skills/eda-plan-review-fix/SKILL.md +39 -47
  35. package/skills/eda-polish/SKILL.md +17 -15
  36. package/skills/eda-prepare-ai/SKILL.md +1 -1
  37. package/skills/eda-review/SKILL.md +18 -9
  38. package/skills/eda-roadmap/SKILL.md +5 -5
  39. package/skills/eda-send-review/SKILL.md +5 -5
  40. package/agents/eda-plan-review-api/agent.json +0 -9
  41. package/agents/eda-plan-review-api/prompt.md +0 -35
  42. package/agents/eda-plan-review-architecture/agent.json +0 -9
  43. package/agents/eda-plan-review-architecture/prompt.md +0 -35
  44. package/agents/eda-plan-review-database/agent.json +0 -9
  45. package/agents/eda-plan-review-database/prompt.md +0 -35
  46. package/agents/eda-plan-review-execution/agent.json +0 -9
  47. package/agents/eda-plan-review-execution/prompt.md +0 -35
  48. package/agents/eda-plan-review-feasibility/agent.json +0 -9
  49. package/agents/eda-plan-review-feasibility/prompt.md +0 -35
  50. package/agents/eda-plan-review-frontend/agent.json +0 -9
  51. package/agents/eda-plan-review-frontend/prompt.md +0 -35
  52. package/agents/eda-plan-review-performance/agent.json +0 -9
  53. package/agents/eda-plan-review-performance/prompt.md +0 -35
  54. package/agents/eda-plan-review-previous/agent.json +0 -9
  55. package/agents/eda-plan-review-previous/prompt.md +0 -28
  56. package/agents/eda-plan-review-requirements/agent.json +0 -9
  57. package/agents/eda-plan-review-requirements/prompt.md +0 -35
  58. package/agents/eda-plan-review-rules/agent.json +0 -9
  59. package/agents/eda-plan-review-rules/prompt.md +0 -35
  60. package/agents/eda-plan-review-security/agent.json +0 -9
  61. package/agents/eda-plan-review-security/prompt.md +0 -35
  62. package/agents/eda-plan-review-verification/agent.json +0 -9
  63. 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 — перенести настройки на v3 и обновить текущий проект
14
- eda update-all [dir] — перенести настройки проектов или записать общий профиль v3
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: 95,
347
- agents: DEFAULT_PLAN_REVIEW_AGENTS
266
+ threshold: 100
348
267
  },
349
268
  planPolish: {
350
- limit: 3
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 = [90, 95, 100].map(value => ({
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, 5, 10].map(value => ({
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
- # План готов только без открытых находок и при score не ниже этого порога.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gian-tiaga/eda",
3
- "version": "2.1.0",
3
+ "version": "3.1.0",
4
4
  "description": "Пакет скилов и специализированных агентов eda-* для Claude Code и Codex CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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
  # <Короткое название>