@gian-tiaga/eda 3.5.0 → 3.7.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 CHANGED
@@ -87,6 +87,9 @@ docs/
87
87
 
88
88
  - **Удалены двенадцать агентов `eda-plan-review-*`.** Проверку плана целиком выполняет один субагент по фиксированному чек-листу. `eda update` стирает файлы этих агентов из `.claude/agents/` и `.codex/agents/`.
89
89
  - **Секция `plan-review.agents` больше не читается.** Начиная с 3.1.1 `eda update` находит её в готовом файле настроек и убирает вместе с другими устаревшими ключами — `review-check`, `review.strict`, `review.include_code_quality`. Дефолт `plan-review.threshold` — `100`, `plan-polish.limit` — `2`.
90
+ - **Режим `single` переименован в `main`.** `eda update` переносит `review.execution: single` и `plan-execute.mode: single` в `main`, а `orhestra.execution: single` и `single_propagated` — в `main` и `main_propagated`. В `main` работу выполняет основной агент без субагентов; модели отдельных `review.agents` не применяются.
91
+ - **У `eda-review` есть режим исполнения.** `review.execution` принимает `subagents` или `main`; default `subagents` сохраняет прежнее поведение. Безусловный Claude `context: fork` удалён, поэтому `main` не создаёт отдельного агента для ревью.
92
+ - **У `eda-orhestra` появился режим исполнения.** `orhestra.execution` принимает `subagents`, `main` или `main_propagated`; default `subagents` сохраняет прежнее поведение. `main` выполняет верхние этапы текущим агентом, а `main_propagated` дополнительно передаёт `main` совместимым execute/review-этапам.
90
93
  - **У `eda-polish` больше нет порога.** Цикл завершается только при нуле находок и останавливается досрочно, если за круг число открытых находок не сократилось. Аргумент вида `args: "threshold 90 limit 2"` в шаге оркестратора `eda update` приводит к виду `args: "limit 2"`.
91
94
  - **Формат ревью дополнен.** У каждой находки появилось поле `repro` — чем проблема воспроизводится, — а в отчёт добавлен раздел «Отклонено» с причинами отклонения. `eda-fix-by-review` может отклонить находку, но только фактически неверную и с обоснованием в отчёте. Старые файлы ревью читаются как есть.
92
95
 
package/README.md CHANGED
@@ -41,7 +41,7 @@ eda update-all ~/Code
41
41
 
42
42
  | Скил | Что делает | Куда складывает |
43
43
  |---|---|---|
44
- | `eda-orhestra` | Выполняет настраиваемую цепочку `eda-*`-скилов. Каждый этап запускает в отдельном субагенте с чистым контекстом, включая составные скилы и повторы QA-цикла. По умолчанию: план без проверок → полировка плана → выполнение → автономное ревью и исправления → ручные тесты. Если QA нашёл баг, оркестра запускает fix и повторяет только ручной тест. В `orhestra.steps` шаги можно переставлять, отключать и снабжать `args`. Не коммитит | Артефакты включённых скилов |
44
+ | `eda-orhestra` | Выполняет настраиваемую цепочку `eda-*`-скилов. В `subagents` каждый этап получает чистый контекст, в `main` этапы выполняет текущий агент, а `main_propagated` дополнительно передаёт `main` в совместимые execute/review-этапы. По умолчанию: план без проверок → полировка плана → выполнение → автономное ревью и исправления → ручные тесты. Если QA нашёл баг, оркестра запускает fix и повторяет только ручной тест. В `orhestra.steps` шаги можно переставлять, отключать и снабжать `args`. Не коммитит | Артефакты включённых скилов |
45
45
  | `eda-aim` | Сначала через отдельного агента-планировщика согласует с человеком одну или несколько простых проверяемых целей, затем передаёт их агентам-исполнителям и повторяет работу до независимого подтверждения агентом-проверяющим. При необходимости использует установленные скилы в отдельных изолированных субагентах. В `automatic` отвечает на безопасные рабочие вопросы самостоятельно, в `manual` передаёт их человеку; режим задаётся через `aim.mode` или текущий вызов. Точный список новых целей человек подтверждает всегда | `docs/artifacts/aims/` и артефакты задействованных скилов |
46
46
  | `eda-new-project` | Помогает стартовать новый проект: собирает и согласует требования, функциональность и границы, ограничения и архитектурные драйверы, сравнивает варианты основного стека и фиксирует выбранные компоненты с актуальными стабильными версиями. Не проектирует архитектуру, правила, проверки, AI-скилы или MCP; сохраняет подтверждённый стартовый бриф и всегда без дополнительного вопроса запускает полный технический bootstrap через `eda-prepare-ai` | `docs/artifacts/project-starts/`, затем артефакты `eda-prepare-ai` |
47
47
  | `eda-business` | Совместно с человеком описывает целевое поведение проекта по тематическим карточкам: сложные темы фиксирует подробно, но без шума, соседних модулей и привязки к текущему коду. Может закрепить значимый механизм вроде JWT или серверного хранения токенов, но не язык, библиотеку или конкретную СУБД. `about` содержит лишь короткое описание проекта и основные возможности | `docs/business.md`, `docs/business/` |
@@ -51,17 +51,17 @@ eda update-all ~/Code
51
51
  | `eda-plan-review` | Одним read-only проходом проверяет план по фиксированному чек-листу из 16 пунктов: покрытие запроса, отсутствие развилок, соответствие правилам и архитектуре, дубли, регистр текста, фазы и объём. Замечания вне списка не принимает. Оценка — доля закрытых пунктов, поэтому растёт монотонно. План не меняет | `docs/artifacts/plan-reviews/` |
52
52
  | `eda-plan-review-fix` | Закрывает проваленные пункты чек-листа минимальным изменением плана с совпадающим SHA-256. План не растёт: сначала удаление и замена, прирост объёма за один заход не больше 3%. Новое ревью не делает и код не меняет | `docs/artifacts/plan-review-fixes/` |
53
53
  | `eda-plan-polish` | Оркестрирует изолированный цикл plan-review → plan-review-fix. Хранит снапшот лучшей версии плана: как только score перестаёт расти, останавливается и восстанавливает лучшую версию, а не последнюю. По умолчанию две review-итерации. Кросс-CLI strict не используется | `docs/artifacts/plan-reviews/`, `docs/artifacts/plan-review-fixes/` |
54
- | `eda-plan-execute` | Управляет выполнением плана по фазам в режиме `subagents`, `single` или `auto`. В `subagents` каждую фазу целиком выполняет отдельный изолированный субагент: он читает план, правила, архитектуру и только business/reference-карточки затронутого поведения и компонентов. Фазы проходят строго последовательно и принимаются независимыми проверяющими. В `single` весь план по тем же правилам выполняет и проверяет основной агент в одном контексте, а `auto` выбирает режим по плану. Отметки подтверждённых задач и журнал ведёт основной агент | `docs/artifacts/executions/` |
54
+ | `eda-plan-execute` | Управляет выполнением плана по фазам в режиме `subagents`, `main` или `auto`. В `subagents` каждую фазу целиком выполняет отдельный изолированный субагент: он читает план, правила, архитектуру и только business/reference-карточки затронутого поведения и компонентов. Фазы проходят строго последовательно и принимаются независимыми проверяющими. В `main` весь план по тем же правилам выполняет и проверяет основной агент в одном контексте, а `auto` выбирает режим по плану. Отметки подтверждённых задач и журнал ведёт основной агент | `docs/artifacts/executions/` |
55
55
  | `eda-fix` | Делает обычные фиксы по короткому контексту, баг-репорту или плану. Перед правками читает правила, архитектуру и только применимые карточки, добавляет нужные тесты, прогоняет проверки и сохраняет историю правок | `docs/artifacts/fixes/` |
56
56
  | `eda-review` | Оркестрирует отдельные read-only проверки корректности, архитектуры, правил, references, business-правил, плана, качества, тестов, безопасности, производительности, frontend/UI/UX, API, БД, документации и предыдущих ревью. Сохраняет только доказанные дефекты, которые обязательно исправить; косметические и спекулятивные предложения отбрасывает. Любая находка даёт `changes-required`, а чистое ревью — `clean` и 100/100. Без аргументов ревьюит `git diff HEAD` | `docs/artifacts/reviews/` |
57
57
  | `eda-fix-by-review` | Применяет все находки из ревью с учётом правил, архитектуры и применимых карточек. Спрашивает только при неоднозначности, конфликте, расширении scope или рискованном действии. В конце ссылается на отчёт прямо в файле ревью | `docs/artifacts/review-fixes/` |
58
58
  | `eda-manual-test` | Делает ручную проверку после изменений. По умолчанию проверка полная: разбирает план или другой артефакт по разделам, дополняет его фактическим `git diff HEAD` и закрывает матрицу областей — API, база данных, консольные команды, интерфейс, алгоритмы, фон и интеграции, права и роли, конфигурация, логи, регрессии рядом. Область нельзя закрыть чтением кода или зелёными автотестами; незакрытая область даёт `blocked`. Быстрый smoke включается настройкой `manual-test.depth` или словом в запросе. Применимая business-карточка может добавить только относящийся к задаче инвариант или сценарий. Не правит код, не пишет автотесты и не коммитит | `docs/artifacts/manual-tests/` |
59
- | `eda-polish` | Оркестрирует доводку изменений: запускает полное `eda-review`, затем `eda-fix-by-review` и повторяет цикл до `clean` и отсутствия находок либо до лимита 5 итераций. Все находки исправляются, score остаётся справочным. Каждый шаг идёт в изолированном нативном субагенте. Не коммитит | `docs/artifacts/reviews/`, `docs/artifacts/review-fixes/` |
59
+ | `eda-polish` | Оркестрирует доводку изменений: запускает полное `eda-review`, затем `eda-fix-by-review` и повторяет цикл до `clean` и отсутствия находок либо до лимита 5 итераций. В `main` оба контракта выполняет основной агент без субагентов, в `subagents` каждый шаг получает отдельный изолированный контекст. Все находки исправляются, score остаётся справочным. Не коммитит | `docs/artifacts/reviews/`, `docs/artifacts/review-fixes/` |
60
60
  | `eda-send-review` | На `sonnet` / `gpt-5.6-terra` отправляет ревью на GitHub PR через `gh` всегда в едином формате: общий комментарий-сводка плюс комментарии к строкам кода. Без явно указанного типа использует `comment`; `approve` и `request-changes` берёт только из контекста текущего вызова. По настройке может скрыть предыдущие сводки eda-send-review и зарезолвить их inline-треды. По умолчанию шлёт все пункты. Claude-модель закрепляется при установке; Codex-модель хранится как рекомендуемый будущий override | (комментарий в PR) |
61
- | `eda-commit` | Работает как лёгкий оркестратор одного `haiku` / `gpt-5.6-luna` агента: тот сам собирает git-контекст, делит выбранный состав на логические коммиты, пишет сообщения, точечно коммитит и выполняет явно заданные push/PR/merge-действия. С явным контекстом охватывает указанный состав; без контекста берёт все tracked-изменения и содержательные untracked-файлы, кроме очевидных кэшей и локальных служебных артефактов. В Claude Code сам оркестратор закреплён за `haiku`; в Codex остаётся на активной модели сессии из-за отсутствия per-skill override. При вероятном секрете агент блокируется до индексации затронутой группы. После любого push всегда возвращает ссылку — на существующий PR или на его создание — и спрашивает, создавать ли PR, если его нет. Если продолжение не задано, предлагает применимые варианты | (git, опционально GitHub PR) |
61
+ | `eda-commit` | Работает как лёгкий оркестратор одного `sonnet` / `gpt-5.6-terra` агента: тот сам собирает git-контекст, делит выбранный состав на логические коммиты, пишет сообщения и тексты PR по исходному запросу и фактическому diff, точечно коммитит и выполняет явно заданные push/PR/merge-действия. Для PR использует шаблон репозитория, отражает все группы изменений и указывает только реально выполненные проверки. С явным контекстом охватывает указанный состав; без контекста берёт все tracked-изменения и содержательные untracked-файлы, кроме очевидных кэшей и локальных служебных артефактов. В Claude Code сам оркестратор закреплён за `sonnet`; в Codex остаётся на активной модели сессии из-за отсутствия per-skill override. При вероятном секрете агент блокируется до индексации затронутой группы. После любого push всегда возвращает ссылку — на существующий PR или на его создание — и спрашивает, создавать ли PR, если его нет. Если продолжение не задано, предлагает применимые варианты | (git, опционально GitHub PR) |
62
62
  | `eda-worktree` | На `haiku` / `gpt-5.6-luna` создаёт через пакетного агента git worktree рядом с основным проектом в папке `{name}-work-{n}` и одноимённую ветку. Базу берёт из аргумента или спрашивает | соседняя папка `{name}-work-{n}` |
63
63
  | `eda-merge-worktree` | На `haiku` / `gpt-5.6-luna` мержит через пакетного агента ветку из соседнего worktree в текущую ветку. Принимает номер `1`, короткое имя `work-1` или полное имя `{name}-work-1`. Worktree и ветку после merge не удаляет | (git) |
64
- | `eda-prepare-ai` | Выполняет технический bootstrap нового или существующего проекта: проектирует архитектуру, строгие правила и профиль инструментов, проходит полный каталог автоматических проверок, подбирает применимые AI-скилы, роли и MCP, затем создаёт AI-документацию. Подтверждённые требования, стек и архитектурные драйверы из `eda-new-project` принимает как обязательный вход и не переоткрывает без обнаруженного конфликта. Для пустого проекта не выдумывает reference-карточки и не выдаёт неустановленные инструменты за доступные | `docs/rules.md`, `docs/arch.md`, `docs/references.md`, `docs/references/`, `AGENTS.md`, `CLAUDE.md` |
64
+ | `eda-prepare-ai` | Выполняет технический bootstrap нового или существующего проекта: проектирует архитектуру, строгие правила и профиль инструментов, проходит полный каталог автоматических проверок, подбирает применимые AI-скилы, роли и MCP, затем создаёт AI-документацию. Один факт хранит у одного владельца: `docs/rules.md` содержит рабочие действия, запреты и команды проверок, а `docs/arch.md` — топологию исходного кода, ownership, зависимости и потоки без рабочих инструкций. Подтверждённые требования, стек и архитектурные драйверы из `eda-new-project` принимает как обязательный вход и не переоткрывает без обнаруженного конфликта. Для пустого проекта не выдумывает reference-карточки и не выдаёт неустановленные инструменты за доступные | `docs/rules.md`, `docs/arch.md`, `docs/references.md`, `docs/references/`, `AGENTS.md`, `CLAUDE.md` |
65
65
  | `eda-discover-automations` | Проводит baseline gap-аудит проекта даже без истории, а при наличии анализирует ревью, планы и фиксы. Не ограничивает число предложений: проверяет тесты/e2e, стиль, статанализ, границы модулей, конфиги/IaC, API/БД, security/supply chain, performance, release, эксплуатацию, browser MCP и MCP стека. Для каждой идеи даёт команду, контур запуска и приоритет; ничего не внедряет | `docs/artifacts/automations/` |
66
66
 
67
67
  ### Структура `docs/`
@@ -95,7 +95,7 @@ eda update-all ~/Code
95
95
  | `eda-aim-planner` | `sonnet`, workspace-write | `gpt-5.6-terra`, workspace-write | Задаёт вопросы, формулирует простой проверяемый список и создаёт файл только после подтверждения человека |
96
96
  | `eda-aim-executor` | `opus`, workspace-write | `gpt-5.6-sol`, workspace-write | Выполняет назначенные пункты, при необходимости запрашивает установленные скилы для запуска в изолированных субагентах и дополняет общий журнал |
97
97
  | `eda-aim-verifier` | `opus`, workspace-write | `gpt-5.6-sol`, workspace-write | Независимо проверяет каждый критерий, отмечает подтверждённые цели и возвращает пробелы на новый круг выполнения |
98
- | `eda-commit-executor` | `haiku` | `gpt-5.6-luna` | Собирает git-контекст, выбирает заданный scope или все содержательные незакоммиченные изменения, делит их на логические коммиты и выполняет явно разрешённые push/PR/merge-действия |
98
+ | `eda-commit-executor` | `sonnet` | `gpt-5.6-terra` | Собирает git-контекст, пишет сообщения коммитов и PR по запросу и фактическим изменениям, делит выбранный scope на логические коммиты и выполняет явно разрешённые push/PR/merge-действия |
99
99
  | `eda-worktree-executor` | `haiku` | `gpt-5.6-luna` | Создаёт соседний worktree и одноимённую ветку, не изменяя файлы проекта |
100
100
  | `eda-merge-worktree-executor` | `haiku` | `gpt-5.6-luna` | Мержит ветку из соседнего worktree в текущую без cleanup и ручного разрешения конфликтов |
101
101
  | `eda-review-correctness` | `sonnet`, read-only | `gpt-5.6-terra`, read-only | Проверяет функциональную корректность и крайние случаи |
@@ -114,17 +114,17 @@ eda update-all ~/Code
114
114
  | `eda-review-documentation` | `haiku`, read-only | `gpt-5.6-luna`, read-only | Проверяет обязательные обновления документации |
115
115
  | `eda-review-previous-reviews` | `haiku`, read-only | `gpt-5.6-luna`, read-only | Перепроверяет незакрытые удалённые замечания |
116
116
 
117
- Агенты устанавливаются отдельно от скилов. Модели review-агентов в таблице — сбалансированные defaults; `docs/settings.yaml` или прямое указание пользователя может заменить модель конкретной проверки на текущий запуск. `eda-aim` последовательно разделяет согласование, выполнение и независимую проверку, а при необходимости использует установленные скилы только в отдельных изолированных субагентах; основной агент передаёт вопросы и структурированные результаты. `eda-commit` сохраняет исходный запрос и целиком передаёт сбор контекста, выбор файлов, коммит и разрешённое продолжение одному простому агенту. `eda-worktree` и `eda-merge-worktree` передают одному специализированному агенту git-операцию, обрабатывают его вопрос или результат и сами команды не выполняют. `eda-review` параллельно запускает только применимые review-агенты; полный prompt каждой роли хранится в агенте, а скил отвечает за выбор, retry и агрегацию. В Claude Code установленный `eda-review` всегда выполняется через `context: fork`, в том числе из `eda-polish`. В Codex шаги polish и специализированные review-агенты запускаются с `fork_turns: "none"`, без наследования истории. Все выбранные проверки отправляются одним нативным параллельным пакетом без ручных партий и shell-опроса.
117
+ Агенты устанавливаются отдельно от скилов. Модели review-агентов в таблице — сбалансированные defaults; `docs/settings.yaml` или прямое указание пользователя может заменить модель конкретной проверки на текущий запуск в режиме `subagents`. `eda-aim` последовательно разделяет согласование, выполнение и независимую проверку, а при необходимости использует установленные скилы только в отдельных изолированных субагентах; основной агент передаёт вопросы и структурированные результаты. `eda-commit` сохраняет исходный запрос и целиком передаёт сбор контекста, выбор файлов, коммит и разрешённое продолжение одному простому агенту. `eda-worktree` и `eda-merge-worktree` передают одному специализированному агенту git-операцию, обрабатывают его вопрос или результат и сами команды не выполняют. `eda-review` поддерживает два режима: `subagents` параллельно запускает применимых review-агентов, а `main` выполняет те же проверки основным агентом по встроенной матрице без субагентов. В Codex специализированные review-агенты запускаются с `fork_turns: "none"`, без наследования истории. В `subagents` все выбранные проверки отправляются одним нативным параллельным пакетом без ручных партий и shell-опроса.
118
118
 
119
- Для Claude Code установленные `eda-commit`, `eda-worktree` и `eda-merge-worktree` получают `model: haiku`. В Codex у скилов пока нет отдельного per-skill model override: основной поток остаётся на выбранной пользователем модели, но он выполняет только лёгкую оркестрацию, а содержательная работа `eda-commit` и worktree-операций закреплена за `gpt-5.6-luna`.
119
+ Для Claude Code установленный `eda-commit` получает `model: sonnet`, а `eda-worktree` и `eda-merge-worktree` — `model: haiku`. В Codex у скилов пока нет отдельного per-skill model override: основной поток остаётся на выбранной пользователем модели, но он выполняет только лёгкую оркестрацию; содержательная работа `eda-commit` закреплена за `gpt-5.6-terra`, а worktree-операции — за `gpt-5.6-luna`.
120
120
 
121
121
  ---
122
122
 
123
123
  ## 🚩 Флаги скилов
124
124
 
125
- У некоторых скилов есть флаг `strict` — он включает дополнительные тяжёлые проверки. Передаётся как часть запроса агенту, например: `eda-explore strict <тема>`. Также strict можно включить отдельно в `docs/settings.yaml`, например через `explore.strict: true`. У `eda-review` вместо общего режима каждая проверка имеет собственные `mode` и `model`.
125
+ У некоторых скилов есть флаг `strict` — он включает дополнительные тяжёлые проверки. Передаётся как часть запроса агенту, например: `eda-explore strict <тема>`. Также strict можно включить отдельно в `docs/settings.yaml`, например через `explore.strict: true`. У `eda-review` режим исполнения задаётся через `subagents` / `main`, а состав проверок — через собственные `mode` и `model`.
126
126
 
127
- У `eda-plan-execute` есть режимы `subagents` / `single` / `auto`. Режим можно разово указать в вызове, например `eda-plan-execute single docs/artifacts/plans/....md`; без него используется `plan-execute.mode` из настроек, а без настроек — `auto`.
127
+ У `eda-plan-execute` есть режимы `subagents` / `main` / `auto`. Режим можно разово указать в вызове, например `eda-plan-execute main docs/artifacts/plans/....md`; без него используется `plan-execute.mode` из настроек, а без настроек — `auto`.
128
128
 
129
129
  У `eda-aim` есть режимы `automatic` / `manual`. В автоматическом основной агент сам отвечает на безопасные рабочие вопросы по рекомендации субагента и фактам проекта, в ручном передаёт их человеку. Режим можно разово указать в вызове; без него используется `aim.mode` из настроек. Точный список новых целей перед записью в `docs/artifacts/aims/` всё равно один раз подтверждает человек.
130
130
 
@@ -132,14 +132,15 @@ eda update-all ~/Code
132
132
 
133
133
  | Скил | Флаг | Что включает | Когда стоит использовать |
134
134
  |---|---|---|---|
135
- | `eda-orhestra` | `automatic` / `manual`, `без полировки плана`, `без полировки кода`, `полировка кода N итераций`, `без ручных тестов` | Разово меняет режим, состав цепочки и параметры шагов поверх `docs/settings.yaml` | Когда нужно довести задачу по сохранённому workflow или временно сократить дорогие этапы |
135
+ | `eda-orhestra` | `automatic` / `manual`, `subagents` / `main` / `main_propagated`, `без полировки плана`, `без полировки кода`, `полировка кода N итераций`, `без ручных тестов` | Разово меняет вопросы, исполнение, состав цепочки и параметры шагов поверх `docs/settings.yaml` | `main` экономит верхний слой, `main_propagated` также включает main у совместимых execute/review-этапов |
136
136
  | `eda-aim` | `automatic` / `manual` | Разово меняет способ ответа на рабочие вопросы поверх `aim.mode`; подтверждение точного списка новых целей остаётся обязательным | Автономная работа или совместное прохождение развилок с человеком |
137
137
  | `eda-explore` | `strict` | После сохранения отчёта отдаёт его соседнему CLI (Claude → Codex или наоборот) на критическое ревью конкретности, фактов, развилок, рисков и версий; затем доправляет отчёт по замечаниям | Серьёзные исследования, которые лягут в основу больших решений; когда хочется второго мнения от другой модели/среды |
138
138
  | `eda-plan` | `strict`, `без ревью плана`, `без проверок` | `strict` независимо включает кросс-CLI проверку; `без ревью плана` отключает встроенный review/fix; `без проверок` отключает оба вида ревью | Когда нужно разделить создание плана и его последующую полировку |
139
139
  | `eda-plan-review` | `threshold N` | Разово меняет долю закрытых пунктов, при которой план считается готовым | Для самостоятельного аудита готового плана |
140
- | `eda-plan-execute` | `subagents` / `single` / `auto` | Разово меняет, где выполняются фазы, поверх `plan-execute.mode` | `single` для небольшого плана в одном контексте, `subagents` для большого или тяжёлого |
140
+ | `eda-plan-execute` | `subagents` / `main` / `auto` | Разово меняет, где выполняются фазы, поверх `plan-execute.mode` | `main` для небольшого плана в одном контексте, `subagents` для большого или тяжёлого |
141
141
  | `eda-plan-polish` | `threshold N`, `limit N` | Меняет gate и максимальное число подтверждающих review-итераций | Для доводки ответственных планов перед `eda-plan-execute` |
142
142
  | `eda-manual-test` | `full` / `полная проверка`, `smoke` / `быстро` | Разово меняет глубину ручной проверки поверх `manual-test.depth` | `smoke` для короткой правки, `full` — когда нужно закрыть все области после плана |
143
+ | `eda-review` | `subagents` / `main` | Разово меняет способ выполнения выбранных проверок поверх `review.execution` | `main` экономит контекст на частых локальных ревью; `subagents` сохраняет независимость ролей для ответственных изменений |
143
144
 
144
145
  ---
145
146
 
@@ -156,6 +157,9 @@ orhestra:
156
157
  # Режим полного цикла eda-orhestra.
157
158
  # automatic | manual
158
159
  mode: automatic
160
+ # Где выполняются этапы и передаётся ли main совместимым вложенным скилам.
161
+ # subagents | main | main_propagated
162
+ execution: subagents
159
163
  # Упорядоченная цепочка. Шаги можно отключать, удалять и переставлять.
160
164
  steps:
161
165
  - id: plan
@@ -235,7 +239,7 @@ plan-polish:
235
239
 
236
240
  plan-execute:
237
241
  # Где eda-plan-execute выполняет фазы плана.
238
- # subagents — каждая фаза в отдельном субагенте, single — весь план одним контекстом, auto — решает по плану.
242
+ # subagents — каждая фаза в отдельном субагенте, main — весь план одним контекстом, auto — решает по плану.
239
243
  mode: auto
240
244
 
241
245
  manual-test:
@@ -246,7 +250,9 @@ manual-test:
246
250
  depth: full
247
251
 
248
252
  review:
249
- # Каждая проверка имеет собственный режим запуска и модели для обеих сред.
253
+ # subagents — отдельный специализированный агент на проверку, main — все проверки основным агентом без субагентов.
254
+ execution: subagents
255
+ # Каждая проверка имеет собственный режим запуска; модели применяются только в subagents.
250
256
  agents:
251
257
  # Проверяет ошибки в логике, крайние случаи и обработку ошибок.
252
258
  # Эта базовая проверка по умолчанию запускается всегда.
@@ -384,6 +390,7 @@ discover-automations:
384
390
 
385
391
  Что означают настройки:
386
392
  - `orhestra.mode` — `automatic` безопасно закрывает рабочие вопросы без промежуточных подтверждений; `manual` пишет план вместе с человеком и передаёт ему вопросы.
393
+ - `orhestra.execution` — `subagents` запускает каждый этап отдельно, `main` выполняет верхнюю цепочку текущим агентом, `main_propagated` дополнительно передаёт `main` шагам `eda-plan-execute`, `eda-polish` и прямому `eda-review`; default `subagents`. Другие вложенные скилы сохраняют собственный контракт.
387
394
  - `orhestra.steps` — выполняемый сверху вниз workflow. `enabled: false` отключает шаг, а `args` передаёт ему дополнительные параметры. Например, для `eda-polish`: `args: "limit 2"`. Шаги можно переставлять или добавлять, но git/publish-скиллы оркестратор не запускает.
388
395
  - Старое значение `steps[].skill: eda-execute` во время запуска автоматически понимается как `eda-plan-execute`; существующий `docs/settings.yaml` установщик не переписывает.
389
396
  - `steps[].on_failure` — настраивает исправление failed manual-test прямо рядом с этим шагом: `skill` и `args` задают фикс, `then` — повторяемые id шагов, `max_cycles` — лимит. Если обработчика нет, оркестратор сохраняет failed-отчёт и останавливается.
@@ -393,10 +400,11 @@ discover-automations:
393
400
  - `plan.size`, `plan.decision_mode`, `plan.test_strategy`, `plan.logging_strategy` — режим и структура работы `eda-plan`.
394
401
  - `plan-review.threshold` — доля закрытых пунктов чек-листа для статуса `ready`, default `100`. Отдельных агентов у `plan-review` больше нет: проверку целиком делает один субагент.
395
402
  - `plan-polish.limit` — максимальное число подтверждающих review-итераций; default `2`. Цикл останавливается раньше, если score перестал расти.
396
- - `plan-execute.mode` — где `eda-plan-execute` выполняет фазы: `subagents` — каждая фаза в отдельном изолированном субагенте с независимой проверкой, `single` — весь план одним контекстом без субагентов, `auto` — выбор по плану; default `auto`. Явный режим в вызове имеет приоритет.
403
+ - `plan-execute.mode` — где `eda-plan-execute` выполняет фазы: `subagents` — каждая фаза в отдельном изолированном субагенте с независимой проверкой, `main` — весь план одним контекстом без субагентов, `auto` — выбор по плану; default `auto`. Явный режим в вызове имеет приоритет.
397
404
  - `manual-test.depth` — глубина ручной проверки в `eda-manual-test`: `full` — закрыть все применимые области матрицы покрытия, `smoke` — только запуск и основной сценарий изменённой области, `ask_each_time` — спрашивать каждый раз; default `full`. Явная глубина в вызове имеет приоритет.
405
+ - `review.execution` — где выполняются проверки `eda-review`: `subagents` запускает отдельные специализированные роли, `main` выполняет те же выбранные проверки основным агентом без субагентов и с однократной загрузкой общего контекста; default `subagents`. Явный режим в вызове имеет приоритет.
398
406
  - `review.agents.<check>.mode` — запускать проверку всегда, автоматически по контексту или отключить.
399
- - `review.agents.<check>.model.claude` и `.codex` — модель конкретной проверки в соответствующей среде.
407
+ - `review.agents.<check>.model.claude` и `.codex` — модель конкретной проверки в соответствующей среде для `subagents`; в `main` используется текущая модель агента.
400
408
  - `eda-review` не делит находки по обязательности: каждый принятый пункт требует исправления, а предложения без доказанного практического дефекта отбрасываются. Score остаётся экспертной оценкой серьёзности; любая находка блокирует `clean` независимо от score.
401
409
  - `send-review.close_previous_reviews` — после успешной новой отправки скрывает предыдущие сводки, созданные `eda-send-review` текущим GitHub-пользователем, и резолвит связанные inline-треды; прямое указание в текущем запросе переопределяет настройку.
402
410
  - `discover-automations.include_plans` — добавляет `docs/artifacts/plans/` в обычный запуск `eda-discover-automations`.
@@ -413,7 +421,7 @@ discover-automations:
413
421
 
414
422
  `eda-orhestra` по умолчанию запускает основной цикл одной командой:
415
423
 
416
- Каждая стрелка между этапами передаёт только явный вход и пути к артефактам: каждый этап работает в новом изолированном субагенте без истории диалога.
424
+ В default `subagents` каждая стрелка передаёт явный вход и пути к артефактам в новый изолированный субагент. В `main` и `main_propagated` верхние этапы идут последовательно в текущем контексте.
417
425
 
418
426
  ```text
419
427
  plan без проверок → plan-polish → plan-execute → polish → manual-test ──passed──> готово
@@ -458,7 +466,7 @@ discover-automations может запускаться от review, fix-by-revie
458
466
 
459
467
  `eda-manual-test` обычно ставится после `eda-plan-execute`, `eda-fix` или `eda-fix-by-review`, чтобы руками проверить API, базу, консольные команды, интерфейс и алгоритмы перед ревью или коммитом.
460
468
 
461
- Использовать всю цепочку не обязательно — каждый скил самодостаточен. Для полного прохода одной задачи можно вызвать `eda-orhestra automatic <задача>` или `eda-orhestra manual <задача>`. Разовые варианты: `eda-orhestra automatic без полировки плана <задача>`, `eda-orhestra полировка кода 2 итерации <задача>`, `eda-orhestra без ручных тестов <задача>`. Постоянный порядок и аргументы задаются в `orhestra.steps`. Новый проект можно начать с `eda-new-project`; существующий — с `eda-prepare-ai`, `eda-roadmap`, `eda-explore`, или сразу с `eda-plan-execute` на готовом плане, или просто `eda-commit`, когда правки уже сделаны. Для параллельной работы есть `eda-worktree`, а для возврата ветки из worktree в текущую ветку — `eda-merge-worktree`.
469
+ Использовать всю цепочку не обязательно — каждый скил самодостаточен. Для полного прохода одной задачи можно вызвать `eda-orhestra automatic <задача>` или `eda-orhestra manual <задача>`. Разовые варианты: `eda-orhestra main <задача>`, `eda-orhestra main_propagated <задача>`, `eda-orhestra automatic без полировки плана <задача>`, `eda-orhestra полировка кода 2 итерации <задача>`, `eda-orhestra без ручных тестов <задача>`. Постоянный режим исполнения задаётся в `orhestra.execution`, порядок и аргументы — в `orhestra.steps`. Новый проект можно начать с `eda-new-project`; существующий — с `eda-prepare-ai`, `eda-roadmap`, `eda-explore`, или сразу с `eda-plan-execute` на готовом плане, или просто `eda-commit`, когда правки уже сделаны. Для параллельной работы есть `eda-worktree`, а для возврата ветки из worktree в текущую ветку — `eda-merge-worktree`.
462
470
 
463
471
  Вызов `eda-commit` без контекста охватывает все незакоммиченные tracked-изменения и содержательные untracked-файлы; очевидные кэши, временные и локальные служебные артефакты остаются вне коммитов. Executor сам делит полный состав на необходимое число логически цельных коммитов — один, три или больше. Например, запрос `eda-commit сразу отправь ветку, создай PR и дай ссылку` использует тот же полный состав и выполняет всю указанную цепочку без отдельного вопроса после серии коммитов.
464
472
 
@@ -468,7 +476,7 @@ discover-automations может запускаться от review, fix-by-revie
468
476
 
469
477
  - **Простой язык.** Скилы общаются с тобой так, чтобы понял человек без глубоких знаний предмета. Термины — только когда без них нельзя.
470
478
  - **Все вопросы — интерактивно.** В Claude Code — через `AskUserQuestion`; в интерактивном Codex — через `request_user_input` или блокирующий вопрос в чат. В `codex exec` и других неинтерактивных запусках скил не имитирует диалог: если без ответа нельзя безопасно продолжать, он завершает работу со статусом `blocked: нужен ответ пользователя`.
471
- - **Проверки — через субагентов.** `eda-review` запускает установленных read-only агентов нативным механизмом Claude/Codex. Если субагенты недоступны, review останавливается: CLI-fallback, кросс-проверки соседним провайдером и подмена ролей главным агентом не используются.
479
+ - **Способ review настраивается.** В `subagents` `eda-review` запускает установленных read-only агентов нативным механизмом Claude/Codex и блокируется при их недоступности без CLI-fallback. В `main` основной агент выполняет те же выбранные проверки по общей матрице без субагентов и повторной загрузки общего контекста.
472
480
  - **Технические остановки обрабатываются по причине.** Оркестраторы ждут свободный слот при лимите параллельности, запрашивают недостающее разрешение, один раз продолжают агента после временной API-ошибки и без бессмысленных retry останавливаются при лимите глубины, исчерпанной квоте или неизвестном сбое.
473
481
  - **Повторяемые роли — в пакетных агентах.** Скилы управляют процессом, а стабильные изолированные роли получают собственный prompt, модель и доступ. Полные review-prompts не дублируются в оркестраторе.
474
482
  - **Артефакты по папкам.** Исследования отдельно, планы отдельно, ревью отдельно. Между файлами — ссылки. Через месяц легко найти, кто что когда решал.
@@ -3,12 +3,12 @@
3
3
  "name": "eda-commit-executor",
4
4
  "description": "Самостоятельно собирает git-контекст, делит выбранные или все незакоммиченные изменения на логические коммиты и выполняет явно разрешённые push, PR или merge-действия для eda-commit.",
5
5
  "models": {
6
- "claude": "haiku",
7
- "codex": "gpt-5.6-luna"
6
+ "claude": "sonnet",
7
+ "codex": "gpt-5.6-terra"
8
8
  },
9
9
  "reasoning": {
10
- "claude": "low",
11
- "codex": "low"
10
+ "claude": "medium",
11
+ "codex": "medium"
12
12
  },
13
13
  "access": "git-write"
14
14
  }
@@ -37,7 +37,7 @@
37
37
  2. Прочитай последние 5–10 коммитов и определи наблюдаемый стиль сообщений.
38
38
  3. Получи текущую ветку, upstream, remotes и основную ветку из `origin/HEAD`.
39
39
  4. Прочитай `AGENTS.md`, `CLAUDE.md`, `docs/rules.md`, `docs/arch.md` и связанные артефакты из `docs/**`, если они есть и применимы к изменениям.
40
- 5. Проверяй существующий PR текущей ветки, когда `USER_REQUEST` или `REQUESTED_ACTIONS` упоминает PR или push.
40
+ 5. Проверяй существующий PR текущей ветки, когда `USER_REQUEST` или `REQUESTED_ACTIONS` упоминает PR или push. Если предстоит создание или обновление PR, найди применимый шаблон PR в репозитории и прочитай его целиком.
41
41
  6. Определи состав коммита:
42
42
  - если `COMMIT_SCOPE` непустой, выбери соответствующий ему логический набор и отдели несвязанные пользовательские изменения;
43
43
  - если `COMMIT_SCOPE` пустой, выбери все незакоммиченные tracked-изменения — staged, unstaged и удаления — и все содержательные untracked-файлы во всём репозитории. Несколько задач или несвязанных изменений в этом режиме охватываются одной серией коммитов и не требуют вопроса;
@@ -60,7 +60,7 @@
60
60
  1. Непосредственно перед индексацией повторно проверь `git status` и diff оставшихся изменений. Если состояние неожиданно изменилось или при непустом `COMMIT_SCOPE` состав стал неоднозначным, верни `blocked` до `git add` этой группы.
61
61
  2. Добавляй новые файлы и подготавливай обычный изолированный индекс только точечно через `git add -- <paths>`; не используй `git add -A` или `git add .`. Если в индексе остаются файлы других групп или изменения вне scope, используй `git commit --only -- <paths>` либо эквивалентную безопасную path-limited стратегию: чужие staged-изменения не должны попасть в текущий коммит, исчезнуть из индекса или расшириться за счёт их unstaged-части.
62
62
  3. Проверь точный кандидат текущего коммита: `git diff --cached` для изолированного индекса или соответствующий path-limited diff для `--only`. Убедись, что кандидат содержит только текущую логическую группу без служебных артефактов или секретных файлов. При обнаружении проблемы не коммить и верни `blocked` с точным состоянием индекса и списком уже созданных коммитов.
63
- 4. Составь отдельное сообщение в стиле истории проекта: заголовок до примерно 70 символов, при необходимости тело с объяснением причины.
63
+ 4. Составь отдельное сообщение в стиле истории проекта. Заголовок до примерно 70 символов должен конкретно называть результат группы, а не повторять имя ветки, список файлов или общие слова вроде `changes`, `updates` и «правки». Если причина или важное изменение поведения не очевидны из заголовка, добавь короткое тело. Описывай только фактический кандидат коммита и не приписывай ему изменения или проверки из других групп.
64
64
  5. Выполни `git commit` выбранным изолированным способом без `--amend`, `--no-verify` и `--no-gpg-sign`. Проверь фактический состав нового commit, сохрани hash, subject и files, затем переходи к следующей группе.
65
65
 
66
66
  После последнего коммита проверь, что из выбранного состава ничего не осталось. Только затем выполняй действия после коммитов.
@@ -71,9 +71,18 @@
71
71
 
72
72
  Выполни `REQUESTED_ACTIONS` по порядку без повторного вопроса. Явное «создай PR» разрешает обычный push текущей ветки как необходимую предпосылку.
73
73
 
74
+ Для создания или явно запрошенного обновления PR составь заголовок и описание по полному `USER_REQUEST`, фактическим коммитам текущей ветки относительно base и итоговому diff. Не своди PR к копии последнего commit message, если коммитов несколько.
75
+
76
+ - Явно заданные пользователем заголовок, текст или обязательные разделы имеют приоритет. Иначе следуй найденному шаблону PR; если шаблона нет, дай короткое описание цели, список фактических изменений и раздел проверки.
77
+ - Заголовок должен описывать общий результат PR конкретно и без имени ветки, номера коммита, служебных префиксов или общих формулировок вроде `updates` и «изменения».
78
+ - В описании объясни, зачем нужен PR и что изменилось с точки зрения проверяемого поведения или контракта. Не пересказывай diff по файлам и не добавляй ритуальные разделы без содержательной информации.
79
+ - В разделе проверки перечисли только реально выполненные команды и их результат. Если проверки не запускались, так и напиши; не выдумывай тесты, issue, метрики, совместимость или breaking changes.
80
+ - Перед отправкой сверь текст с base...HEAD diff: каждое утверждение должно подтверждаться текущим PR, а все основные логические группы коммитов должны быть отражены.
81
+ - Передавай многострочное описание через временный файл и `--body-file`, чтобы shell quoting не повредил Markdown. Не оставляй незаполненные placeholder'ы шаблона.
82
+
74
83
  - Для push используй существующий upstream, иначе `git push -u origin <branch>`.
75
84
  - Для PR определи base по `origin/HEAD`, сначала проверь текущую ветку через `gh pr view`; существующий PR не дублируй.
76
- - Если PR отсутствует, создай его через `gh pr create`, затем получи фактические номер и URL через `gh`; не угадывай ссылку.
85
+ - Если PR отсутствует, создай его через `gh pr create --title <title> --body-file <file>`, затем получи фактические номер и URL через `gh`; не угадывай ссылку. Если PR уже существует, меняй его заголовок или описание только по явному запросу пользователя через `gh pr edit`; обычный push не перезаписывает текст PR.
77
86
  - После любого выполненного push всегда возвращай ссылку. Если PR текущей ветки есть — `pr.status: existing` и его фактический URL. Если PR нет — `pr.status: absent` и `pr.create_url`: ссылка на создание PR, собранная из фактического URL репозитория (`gh repo view`), base из `origin/HEAD` и имени ветки.
78
87
  - Если PR нет, а его создание не запрошено, сам PR не создавай: верни `completed`, `pr.create_url`, вопрос «Создать PR?» и варианты «создать PR» / «оставить ссылку на создание».
79
88
  - Если репозиторий не на GitHub или `gh` недоступен, верни `pr.create_url: null` и назови причину в `error`.
package/lib/install.js CHANGED
@@ -251,6 +251,7 @@ const DEFAULT_ORHESTRA_STEPS = ORHESTRA_STEP_DEFINITIONS.map(({ name, ...step })
251
251
  const DEFAULT_SETTINGS = {
252
252
  orhestra: {
253
253
  mode: 'automatic',
254
+ execution: 'subagents',
254
255
  steps: DEFAULT_ORHESTRA_STEPS
255
256
  },
256
257
  aim: {
@@ -281,6 +282,7 @@ const DEFAULT_SETTINGS = {
281
282
  depth: 'full'
282
283
  },
283
284
  review: {
285
+ execution: 'subagents',
284
286
  agents: DEFAULT_REVIEW_AGENTS
285
287
  },
286
288
  sendReview: {
@@ -350,6 +352,20 @@ const ORHESTRA_MODE_CHOICES = [
350
352
  name: 'Писать план вместе с человеком и передавать ему вопросы'
351
353
  }
352
354
  ];
355
+ const ORHESTRA_EXECUTION_CHOICES = [
356
+ {
357
+ value: 'subagents',
358
+ name: 'Каждый этап выполнять отдельным изолированным субагентом'
359
+ },
360
+ {
361
+ value: 'main',
362
+ name: 'Все этапы выполнять основным агентом без передачи режима внутрь'
363
+ },
364
+ {
365
+ value: 'main_propagated',
366
+ name: 'Все этапы выполнять основным агентом и передавать main совместимым скилам'
367
+ }
368
+ ];
353
369
  const AIM_MODE_CHOICES = [
354
370
  {
355
371
  value: 'automatic',
@@ -382,8 +398,8 @@ const PLAN_EXECUTE_MODE_CHOICES = [
382
398
  name: 'Каждую фазу выполнять отдельным изолированным субагентом'
383
399
  },
384
400
  {
385
- value: 'single',
386
- name: 'Выполнять весь план одним контекстом без субагентов'
401
+ value: 'main',
402
+ name: 'Выполнять весь план основным агентом без субагентов'
387
403
  }
388
404
  ];
389
405
  const PLAN_SIZE_CHOICES = [
@@ -465,6 +481,16 @@ const REVIEW_MODE_CHOICES = [
465
481
  { value: 'auto', name: 'auto — запускать только когда проверка применима' },
466
482
  { value: 'off', name: 'off — отключить проверку' }
467
483
  ];
484
+ const REVIEW_EXECUTION_CHOICES = [
485
+ {
486
+ value: 'subagents',
487
+ name: 'Каждую review-проверку выполнять отдельным специализированным субагентом'
488
+ },
489
+ {
490
+ value: 'main',
491
+ name: 'Все review-проверки выполнять основным агентом без субагентов'
492
+ }
493
+ ];
468
494
  const CLAUDE_REVIEW_MODEL_CHOICES = [
469
495
  { value: 'haiku', name: 'haiku — быстрая проверка' },
470
496
  { value: 'sonnet', name: 'sonnet — сильная проверка кода' },
@@ -578,13 +604,20 @@ export async function updateAll({
578
604
  if (resolvedSettingsMode === 'skip' && await fileExists(projectSettingsPath)) {
579
605
  const existingContent = await fs.readFile(projectSettingsPath, 'utf8');
580
606
  const migrated = migrateSettingsContent(existingContent);
581
- if (migrated.version === SETTINGS_VERSION && migrated.missingKeys.size === 0 && migrated.retiredPaths.length === 0) {
607
+ if (
608
+ migrated.version === SETTINGS_VERSION
609
+ && migrated.missingKeys.size === 0
610
+ && migrated.retiredPaths.length === 0
611
+ && migrated.normalizedPaths.length === 0
612
+ ) {
582
613
  output.write(`Полный файл настроек сохранён: ${SETTINGS_RELATIVE_PATH}\n`);
583
614
  } else {
584
615
  await writeSettingsContent(projectDir, formatSettings(migrated.settings));
585
616
  output.write(migrated.retiredPaths.length > 0
586
617
  ? `Из файла настроек убраны устаревшие ключи (${migrated.retiredPaths.join(', ')}): ${SETTINGS_RELATIVE_PATH}\n`
587
- : `Старый или неполный файл настроек перенесён на version: ${SETTINGS_VERSION}: ${SETTINGS_RELATIVE_PATH}\n`);
618
+ : migrated.normalizedPaths.length > 0
619
+ ? `Переименованы значения настроек (${migrated.normalizedPaths.join(', ')}): ${SETTINGS_RELATIVE_PATH}\n`
620
+ : `Старый или неполный файл настроек перенесён на version: ${SETTINGS_VERSION}: ${SETTINGS_RELATIVE_PATH}\n`);
588
621
  }
589
622
  } else {
590
623
  await writeSettingsContent(projectDir, sharedSettingsContent);
@@ -744,6 +777,7 @@ export async function askSettings({
744
777
  }
745
778
 
746
779
  const scalarPrompts = [
780
+ ['orhestra', 'orhestra.execution', settings.orhestra, 'execution', 'Как eda-orhestra должен выполнять этапы по умолчанию?', ORHESTRA_EXECUTION_CHOICES],
747
781
  ['aim', 'aim.mode', settings.aim, 'mode', 'Как eda-aim должен отвечать на рабочие вопросы по умолчанию?', AIM_MODE_CHOICES],
748
782
  ['explore', 'explore.decisionMode', settings.explore, 'decisionMode', 'Как принимать важные решения в eda-explore?', DECISION_MODE_CHOICES],
749
783
  ['plan', 'plan.size', settings.plan, 'size', 'Какой размер плана eda-plan использовать по умолчанию?', PLAN_SIZE_CHOICES],
@@ -753,7 +787,8 @@ export async function askSettings({
753
787
  ['plan-review', 'planReview.threshold', settings.planReview, 'threshold', 'Какой порог готовности использовать в eda-plan-review?', PLAN_REVIEW_THRESHOLD_CHOICES],
754
788
  ['plan-polish', 'planPolish.limit', settings.planPolish, 'limit', 'Сколько review-итераций разрешить eda-plan-polish?', PLAN_POLISH_LIMIT_CHOICES],
755
789
  ['plan-execute', 'planExecute.mode', settings.planExecute, 'mode', 'Как eda-plan-execute должен выполнять фазы по умолчанию?', PLAN_EXECUTE_MODE_CHOICES],
756
- ['manual-test', 'manualTest.depth', settings.manualTest, 'depth', 'Какую глубину ручной проверки использовать в eda-manual-test по умолчанию?', MANUAL_TEST_DEPTH_CHOICES]
790
+ ['manual-test', 'manualTest.depth', settings.manualTest, 'depth', 'Какую глубину ручной проверки использовать в eda-manual-test по умолчанию?', MANUAL_TEST_DEPTH_CHOICES],
791
+ ['review', 'review.execution', settings.review, 'execution', 'Как eda-review должен выполнять проверки по умолчанию?', REVIEW_EXECUTION_CHOICES]
757
792
  ];
758
793
  for (const [section, key, target, property, message, choices] of scalarPrompts) {
759
794
  if (!requestedSections.has(section) || !shouldAsk(key)) continue;
@@ -766,7 +801,8 @@ export async function askSettings({
766
801
  output,
767
802
  selectPrompt,
768
803
  seedAgents: settings.review.agents,
769
- missingKeys
804
+ missingKeys,
805
+ skipModels: settings.review.execution === 'main'
770
806
  });
771
807
  }
772
808
  return settings;
@@ -777,7 +813,8 @@ export async function askReviewAgentSettings({
777
813
  output = process.stdout,
778
814
  selectPrompt = select,
779
815
  seedAgents = DEFAULT_REVIEW_AGENTS,
780
- missingKeys = null
816
+ missingKeys = null,
817
+ skipModels = false
781
818
  } = {}) {
782
819
  return askAgentSettings({
783
820
  input,
@@ -787,11 +824,12 @@ export async function askReviewAgentSettings({
787
824
  seedAgents,
788
825
  missingKeys,
789
826
  keyPrefix: 'review.agents',
790
- label: 'review'
827
+ label: 'review',
828
+ skipModels
791
829
  });
792
830
  }
793
831
 
794
- async function askAgentSettings({ input, output, selectPrompt, definitions, seedAgents, missingKeys, keyPrefix, label }) {
832
+ async function askAgentSettings({ input, output, selectPrompt, definitions, seedAgents, missingKeys, keyPrefix, label, skipModels = false }) {
795
833
  const configuredAgents = structuredClone(seedAgents);
796
834
  const shouldAsk = key => missingKeys === null || missingKeys.has(key);
797
835
  for (const agent of definitions) {
@@ -809,14 +847,14 @@ async function askAgentSettings({ input, output, selectPrompt, definitions, seed
809
847
 
810
848
  let claude = configuredAgents[agent.key].model.claude;
811
849
  let codex = configuredAgents[agent.key].model.codex;
812
- if (mode !== 'off' && shouldAsk(claudeKey)) {
850
+ if (!skipModels && mode !== 'off' && shouldAsk(claudeKey)) {
813
851
  claude = await selectPrompt({
814
852
  message: `Какой моделью Claude проверять ${agent.key}?`,
815
853
  choices: CLAUDE_REVIEW_MODEL_CHOICES,
816
854
  default: claude
817
855
  }, { input, output });
818
856
  }
819
- if (mode !== 'off' && shouldAsk(codexKey)) {
857
+ if (!skipModels && mode !== 'off' && shouldAsk(codexKey)) {
820
858
  codex = await selectPrompt({
821
859
  message: `Какой моделью Codex проверять ${agent.key}?`,
822
860
  choices: CODEX_REVIEW_MODEL_CHOICES,
@@ -1048,7 +1086,9 @@ async function ensureSettings(cwd, { input = process.stdin, output = process.std
1048
1086
  }
1049
1087
 
1050
1088
  const migrated = migrateSettingsContent(existingContent);
1051
- const needsMigration = migrated.version !== SETTINGS_VERSION || migrated.missingKeys.size > 0;
1089
+ const needsMigration = migrated.version !== SETTINGS_VERSION
1090
+ || migrated.missingKeys.size > 0
1091
+ || migrated.normalizedPaths.length > 0;
1052
1092
  if (!needsMigration && migrated.retiredPaths.length === 0) {
1053
1093
  output.write(`Настройки уже есть: ${SETTINGS_RELATIVE_PATH}\n`);
1054
1094
  return;
@@ -1082,7 +1122,9 @@ async function configureSettings(cwd, { input = process.stdin, output = process.
1082
1122
  }
1083
1123
 
1084
1124
  const migrated = migrateSettingsContent(existingContent);
1085
- const needsMigration = migrated.version !== SETTINGS_VERSION || migrated.missingKeys.size > 0;
1125
+ const needsMigration = migrated.version !== SETTINGS_VERSION
1126
+ || migrated.missingKeys.size > 0
1127
+ || migrated.normalizedPaths.length > 0;
1086
1128
  if (!needsMigration && migrated.retiredPaths.length === 0) {
1087
1129
  output.write(`Настройки ${SETTINGS_RELATIVE_PATH} версии ${SETTINGS_VERSION} полные — вопросы не требуются.\n`);
1088
1130
  return;
@@ -1125,6 +1167,7 @@ function migrateSettingsContent(content) {
1125
1167
 
1126
1168
  const settings = structuredClone(DEFAULT_SETTINGS);
1127
1169
  const missingKeys = new Set();
1170
+ const normalizedPaths = [];
1128
1171
  const transfer = (key, value, validator, setter) => {
1129
1172
  if (validator(value)) setter(value);
1130
1173
  else missingKeys.add(key);
@@ -1133,10 +1176,24 @@ function migrateSettingsContent(content) {
1133
1176
  const bool = value => typeof value === 'boolean';
1134
1177
  const positiveInt = value => Number.isInteger(value) && value > 0;
1135
1178
  const score = value => Number.isInteger(value) && value >= 1 && value <= 100;
1179
+ const normalizeExecutionValue = (key, value, aliases) => {
1180
+ if (!Object.hasOwn(aliases, value)) return value;
1181
+ normalizedPaths.push(key);
1182
+ return aliases[value];
1183
+ };
1136
1184
 
1137
1185
  const legacyDefaults = objectValue(raw.defaults);
1138
1186
  const orhestra = objectValue(raw.orhestra);
1139
1187
  transfer('orhestra.mode', orhestra.mode, oneOf(['automatic', 'manual']), value => { settings.orhestra.mode = value; });
1188
+ transfer(
1189
+ 'orhestra.execution',
1190
+ normalizeExecutionValue('orhestra.execution', orhestra.execution, {
1191
+ single: 'main',
1192
+ single_propagated: 'main_propagated'
1193
+ }),
1194
+ oneOf(['subagents', 'main', 'main_propagated']),
1195
+ value => { settings.orhestra.execution = value; }
1196
+ );
1140
1197
  const steps = normalizeStoredOrhestraSteps(orhestra.steps);
1141
1198
  transfer('orhestra.steps', steps, value => Array.isArray(value), value => { settings.orhestra.steps = value; });
1142
1199
 
@@ -1190,8 +1247,8 @@ function migrateSettingsContent(content) {
1190
1247
  const planExecute = objectValue(raw['plan-execute']);
1191
1248
  transfer(
1192
1249
  'planExecute.mode',
1193
- planExecute.mode,
1194
- oneOf(['subagents', 'single', 'auto']),
1250
+ normalizeExecutionValue('plan-execute.mode', planExecute.mode, { single: 'main' }),
1251
+ oneOf(['subagents', 'main', 'auto']),
1195
1252
  value => { settings.planExecute.mode = value; }
1196
1253
  );
1197
1254
 
@@ -1204,6 +1261,12 @@ function migrateSettingsContent(content) {
1204
1261
  );
1205
1262
 
1206
1263
  const review = objectValue(raw.review);
1264
+ transfer(
1265
+ 'review.execution',
1266
+ normalizeExecutionValue('review.execution', review.execution, { single: 'main' }),
1267
+ oneOf(['subagents', 'main']),
1268
+ value => { settings.review.execution = value; }
1269
+ );
1207
1270
  transferAgentSettings({
1208
1271
  rawAgents: objectValue(review.agents),
1209
1272
  settingsAgents: settings.review.agents,
@@ -1235,6 +1298,7 @@ function migrateSettingsContent(content) {
1235
1298
  return {
1236
1299
  settings,
1237
1300
  missingKeys,
1301
+ normalizedPaths,
1238
1302
  retiredPaths: findRetiredSettingsPaths(raw),
1239
1303
  version: Number.isInteger(raw.version) ? raw.version : null
1240
1304
  };
@@ -1375,6 +1439,9 @@ orhestra:
1375
1439
  # Режим полного цикла eda-orhestra.
1376
1440
  # automatic | manual
1377
1441
  mode: ${orhestra.mode ?? 'automatic'}
1442
+ # Где выполняются этапы и передаётся ли main совместимым вложенным скилам.
1443
+ # subagents | main | main_propagated
1444
+ execution: ${orhestra.execution ?? 'subagents'}
1378
1445
  # Упорядоченная цепочка. Шаги можно отключать, удалять и переставлять.
1379
1446
  steps:
1380
1447
  ${orhestraSteps}
@@ -1424,7 +1491,7 @@ plan-polish:
1424
1491
 
1425
1492
  plan-execute:
1426
1493
  # Где eda-plan-execute выполняет фазы плана.
1427
- # subagents — каждая фаза в отдельном субагенте, single — весь план одним контекстом, auto — решает по плану.
1494
+ # subagents — каждая фаза в отдельном субагенте, main — весь план одним контекстом, auto — решает по плану.
1428
1495
  mode: ${settings.planExecute.mode}
1429
1496
 
1430
1497
  manual-test:
@@ -1435,7 +1502,10 @@ manual-test:
1435
1502
  depth: ${settings.manualTest.depth}
1436
1503
 
1437
1504
  review:
1438
- # Каждая проверка имеет собственный режим запуска и модели для обеих сред.
1505
+ # Где eda-review выполняет выбранные проверки.
1506
+ # subagents — отдельный специализированный агент на проверку, main — все проверки основным агентом без субагентов.
1507
+ execution: ${settings.review.execution ?? 'subagents'}
1508
+ # Каждая проверка имеет собственный режим запуска; модели применяются только в subagents.
1439
1509
  agents:
1440
1510
  ${reviewAgents}
1441
1511
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gian-tiaga/eda",
3
- "version": "3.5.0",
3
+ "version": "3.7.0",
4
4
  "description": "Пакет скилов и специализированных агентов eda-* для Claude Code и Codex CLI",
5
5
  "type": "module",
6
6
  "bin": {