@gian-tiaga/eda 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,7 +19,7 @@ npm install -g @gian-tiaga/eda
19
19
  eda init
20
20
  ```
21
21
 
22
- Установщик покажет чекбоксы: стрелками выбираешь среду, пробелом отмечаешь, Enter продолжает. Можно поставить Claude Code, Codex CLI или обе среды сразу. Если `docs/settings.yaml` ещё нет, установщик также предложит выбрать настройки скилов и создаст этот файл. В конце `eda init` пишет, сколько скилов установлено.
22
+ Установщик покажет чекбоксы: стрелками выбираешь среду, пробелом отмечаешь, Enter продолжает. Можно поставить Claude Code, Codex CLI или обе среды сразу. Если `docs/settings.yaml` ещё нет, установщик также предложит выбрать настройки скилов и создаст этот файл. В конце `eda init` пишет, какие скилы реально установлены или изменились.
23
23
 
24
24
  ---
25
25
 
@@ -28,8 +28,8 @@ eda init
28
28
  | Скил | Что делает | Куда складывает |
29
29
  |---|---|---|
30
30
  | `eda-roadmap` | Создаёт roadmap-файл: список будущих задач с короткими, понятными и недвусмысленными описаниями без деталей реализации, файлов, библиотек, API и пошагового плана | `docs/roadmaps/` |
31
- | `eda-explore` | Исследует тему до конкретного результата: описание проблемы, релевантная архитектура, закрытые развилки, риски внутри решений и короткий выбранный вариант решения без плана. Если нужны пакеты или ПО — проверяет актуальные стабильные версии через context7 или web search | `docs/researches/` |
32
- | `eda-plan` | Пишет план реализации через стандартный Plan Mode хост-агента. Подтягивает контекст из `docs/rules.md`, `docs/arch.md`, при желании — релевантное исследование. Затем три параллельных модели (слабая, средняя, мощная) проверяют план на реалистичность, пропущенные шаги и нарушения правил — главный планировщик сам решает, что применить | `docs/plans/` |
31
+ | `eda-explore` | Исследует тему до конкретного результата: описание проблемы, релевантная архитектура, закрытые развилки, риски внутри решений и короткий выбранный вариант решения без плана. В дефолтном режиме ведёт исследование как диалог: факты собирает сам, а значимые развилки выносит тебе с рекомендацией. Если нужны пакеты или ПО — проверяет актуальные стабильные версии через context7 или web search | `docs/researches/` |
32
+ | `eda-plan` | Пишет план реализации через стандартный Plan Mode хост-агента. Подтягивает контекст из `docs/rules.md`, `docs/arch.md`, при желании — релевантное исследование. В плане явно фиксирует контракты БД/API, если задача их затрагивает. Затем три параллельных модели (слабая, средняя, мощная) проверяют план на реалистичность, пропущенные шаги и нарушения правил — главный планировщик сам решает, что применить | `docs/plans/` |
33
33
  | `eda-execute` | Выполняет план. Спрашивает, где работать (текущая ветка, новая ветка, отдельный worktree). Тесты пишет внутри каждого шага. В конце — полный прогон тестов и линтеров | `docs/executions/` |
34
34
  | `eda-fix` | Делает обычные фиксы по короткому контексту, баг-репорту или файлу плана. Перед правками читает правила и архитектуру, добавляет нужные тесты, прогоняет проверки и сохраняет историю правок | `docs/fixes/` |
35
35
  | `eda-review` | Делает код-ревью с оценкой 0–100 и сверкой с планом работ, но в файл пишет только проблемы: ошибки, недоделки, неточности, нарушения правил/архитектуры, риски и недостающие тесты. Не перечисляет выполненную работу. Затем параллельные специализированные агенты проверяют выполнение плана, архитектуру, правила и при включённой настройке качество кода. В строгом режиме — ещё и кросс-ревью между Claude и Codex | `docs/reviews/` |
@@ -71,7 +71,7 @@ defaults:
71
71
  # Задаёт размер плана по умолчанию для eda-plan.
72
72
  # normal | short | ask_each_time
73
73
  plan_size: normal
74
- # Определяет, как eda-explore и eda-plan принимают существенные решения.
74
+ # Определяет, как eda-explore ведёт исследовательские развилки, а eda-plan принимает существенные решения.
75
75
  # autonomous | recommend_and_ask | ask_each_time
76
76
  decision_mode: recommend_and_ask
77
77
  # Задаёт стратегию тестов по умолчанию для eda-plan.
@@ -95,7 +95,7 @@ review:
95
95
  Что означают настройки:
96
96
  - `defaults.strict` — включает strict-режим по умолчанию для `eda-explore`, `eda-plan` и `eda-review`.
97
97
  - `defaults.plan_size` — размер плана для `eda-plan`: `normal`, `short` или `ask_each_time`.
98
- - `defaults.decision_mode` — как `eda-explore` и `eda-plan` принимают существенные решения: `autonomous` выбирает сам, `recommend_and_ask` рекомендует и спрашивает, `ask_each_time` спрашивает по каждой значимой развилке.
98
+ - `defaults.decision_mode` — как `eda-explore` ведёт исследовательские развилки, а `eda-plan` принимает существенные решения: `autonomous` выбирает сам, `recommend_and_ask` рекомендует и спрашивает по значимым развилкам, `ask_each_time` спрашивает по каждой развилке, которая влияет на ход работы или итоговый выбор.
99
99
  - `defaults.test_strategy` — стратегия тестов для `eda-plan`: `after_each_phase`, `tdd_each_phase`, `end_of_plan` или `ask_each_time`.
100
100
  - `defaults.logging_strategy` — стратегия логирования для `eda-plan`: `debug_precise`, `standard` или `ask_each_time`.
101
101
  - `automate.include_plans` — добавляет `docs/plans/` в обычный запуск `eda-automate`.
@@ -137,7 +137,7 @@ automate может запускаться от review, fix-by-review или fix
137
137
 
138
138
  ```bash
139
139
  eda init # выбрать Claude Code / Codex / обе среды и установить скилы
140
- eda update # обновить скилы, показать их количество и создать docs/settings.yaml, если его ещё нет
140
+ eda update # обновить скилы, показать реально изменившиеся и создать docs/settings.yaml, если его ещё нет
141
141
  eda --version # показать версию установленного пакета
142
142
  eda --help # справка
143
143
  ```
@@ -160,7 +160,7 @@ eda update # синхронизировать скилы в текущ
160
160
  | **Claude Code** | `<project>/.claude/skills/<skill>/SKILL.md` — отдельная папка на каждый скил |
161
161
  | **Codex CLI** | `<project>/.codex/skills/<skill>/SKILL.md` — отдельная папка на каждый скил |
162
162
 
163
- `eda update` идемпотентно перезаписывает файлы в обеих папках и в конце пишет, сколько скилов обновлено. При обновлении старые файлы Codex-формата `<project>/.codex/skills/<skill>.md`, созданные версиями `eda` до этой структуры, удаляются. Если ты хочешь подправить скил локально — лучше копию сделай рядом, а не прямо в `.claude/skills/` или `.codex/skills/`, иначе при следующем `update` твои правки потеряются.
163
+ `eda update` идемпотентно перезаписывает файлы в обеих папках и в конце пишет только те скилы, содержимое которых реально изменилось относительно установленной копии. При обновлении старые файлы Codex-формата `<project>/.codex/skills/<skill>.md`, созданные версиями `eda` до этой структуры, удаляются. Если ты хочешь подправить скил локально — лучше копию сделай рядом, а не прямо в `.claude/skills/` или `.codex/skills/`, иначе при следующем `update` твои правки потеряются.
164
164
 
165
165
  `AGENTS.md` (как и любые другие файлы в корне проекта) установщик **не трогает**. Если хочешь, чтобы Codex автоматически подгружал скилы, дай ему знать сам — например, одной строкой в `AGENTS.md`: «следуй инструкциям из `.codex/skills/`».
166
166
 
package/lib/install.js CHANGED
@@ -218,12 +218,22 @@ async function syncSkills(cwd, targets, output = process.stdout, { action = 'upd
218
218
  }
219
219
  output.write(`Скилы для установки: ${skills.map(s => s.name).join(', ')}\n`);
220
220
 
221
- if (targets.includes('claude')) await installToClaude(cwd, skills, output);
222
- if (targets.includes('codex')) await installToCodex(cwd, skills, output);
221
+ const changedSkills = new Set();
222
+ if (targets.includes('claude')) {
223
+ const result = await installToClaude(cwd, skills, output);
224
+ for (const skillName of result.changedSkills) changedSkills.add(skillName);
225
+ }
226
+ if (targets.includes('codex')) {
227
+ const result = await installToCodex(cwd, skills, output);
228
+ for (const skillName of result.changedSkills) changedSkills.add(skillName);
229
+ }
223
230
  await removeRetiredSkills(cwd, targets);
224
231
 
225
232
  const actionLabel = action === 'install' ? 'Установлено' : 'Обновлено';
226
- output.write(`${actionLabel} ${formatSkillCount(skills.length)}.\n`);
233
+ const changedSkillNames = skills
234
+ .map(skill => skill.name)
235
+ .filter(skillName => changedSkills.has(skillName));
236
+ output.write(formatChangedSkills(actionLabel, changedSkillNames));
227
237
  output.write('\nГотово.\n');
228
238
  }
229
239
 
@@ -260,7 +270,7 @@ defaults:
260
270
  # Задаёт размер плана по умолчанию для eda-plan.
261
271
  # normal | short | ask_each_time
262
272
  plan_size: ${settings.planSize}
263
- # Определяет, как eda-explore и eda-plan принимают существенные решения.
273
+ # Определяет, как eda-explore ведёт исследовательские развилки, а eda-plan принимает существенные решения.
264
274
  # autonomous | recommend_and_ask | ask_each_time
265
275
  decision_mode: ${settings.decisionMode}
266
276
  # Задаёт стратегию тестов по умолчанию для eda-plan.
@@ -285,26 +295,52 @@ review:
285
295
  async function installToClaude(cwd, skills, output = process.stdout) {
286
296
  const dst = path.join(cwd, '.claude/skills');
287
297
  await fs.mkdir(dst, { recursive: true });
298
+ const changedSkills = [];
288
299
  for (const skill of skills) {
289
300
  const skillDir = path.join(dst, skill.name);
290
301
  await fs.mkdir(skillDir, { recursive: true });
291
302
  const content = await fs.readFile(skill.path, 'utf-8');
292
- await fs.writeFile(path.join(skillDir, 'SKILL.md'), content);
303
+ const changed = await writeSkillFile(path.join(skillDir, 'SKILL.md'), content);
304
+ if (changed) changedSkills.push(skill.name);
293
305
  }
294
- output.write(` ✓ Claude Code: ${dst} (${formatSkillCount(skills.length)})\n`);
306
+ output.write(` ✓ Claude Code: ${dst} (изменилось ${formatSkillCount(changedSkills.length)})\n`);
307
+ return { changedSkills };
295
308
  }
296
309
 
297
310
  async function installToCodex(cwd, skills, output = process.stdout) {
298
311
  const dst = path.join(cwd, '.codex/skills');
299
312
  await fs.mkdir(dst, { recursive: true });
313
+ const changedSkills = [];
300
314
  for (const skill of skills) {
301
315
  const skillDir = path.join(dst, skill.name);
302
316
  await fs.mkdir(skillDir, { recursive: true });
303
317
  const content = await fs.readFile(skill.path, 'utf-8');
304
- await fs.writeFile(path.join(skillDir, 'SKILL.md'), content);
318
+ const changed = await writeSkillFile(path.join(skillDir, 'SKILL.md'), content);
319
+ if (changed) changedSkills.push(skill.name);
305
320
  await removeObsoleteCodexFile(dst, skill.name);
306
321
  }
307
- output.write(` ✓ Codex CLI: ${dst} (${formatSkillCount(skills.length)})\n`);
322
+ output.write(` ✓ Codex CLI: ${dst} (изменилось ${formatSkillCount(changedSkills.length)})\n`);
323
+ return { changedSkills };
324
+ }
325
+
326
+ async function writeSkillFile(filePath, content) {
327
+ const previousContent = await readFileIfExists(filePath);
328
+ await fs.writeFile(filePath, content);
329
+ return previousContent !== content;
330
+ }
331
+
332
+ async function readFileIfExists(filePath) {
333
+ try {
334
+ return await fs.readFile(filePath, 'utf-8');
335
+ } catch (err) {
336
+ if (err?.code !== 'ENOENT') throw err;
337
+ return null;
338
+ }
339
+ }
340
+
341
+ function formatChangedSkills(actionLabel, skillNames) {
342
+ if (skillNames.length === 0) return `${actionLabel} 0 скилов.\n`;
343
+ return `${actionLabel} ${formatSkillCount(skillNames.length)}: ${skillNames.join(', ')}.\n`;
308
344
  }
309
345
 
310
346
  function formatSkillCount(count) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gian-tiaga/eda",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "Набор скилов eda-* для Claude Code и Codex CLI: roadmap, explore, plan, execute, fix, review, fix-by-review, send-review, commit, docs, automate",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: eda-explore
3
- description: 'Исследует тему или задачу до конкретного результата: проясняет проблему, архитектуру, развилки, связанные риски и короткий выбранный вариант решения без плана реализации. Работает read-only, задаёт блокирующие вопросы, когда без ответа нельзя выбрать решение, а существенные решения подтверждает по `defaults.decision_mode` из `docs/settings.yaml`. Если исследование касается пакетов, библиотек, CLI, сервисов или другого ПО, проверяет актуальные стабильные версии через context7, если он доступен, или через web search по официальным источникам. Итог сохраняет в docs/researches/. Кросс-ревью соседним агентом (Claude ↔ Codex) включается флагом `strict` или настройкой `defaults.strict: true` в `docs/settings.yaml`.'
3
+ description: 'Исследует тему или задачу до конкретного результата: проясняет проблему, архитектуру, развилки, риски и короткий выбранный вариант решения без плана реализации. Работает read-only и ведёт исследование как диалог: факты собирает сам, а значимые развилки выносит пользователю по `defaults.decision_mode` из `docs/settings.yaml`. Если исследование касается пакетов, библиотек, CLI, сервисов или другого ПО, проверяет актуальные стабильные версии через context7, если он доступен, или через web search по официальным источникам. Итог сохраняет в docs/researches/. Кросс-ревью соседним агентом (Claude ↔ Codex) включается флагом `strict` или настройкой `defaults.strict: true`.'
4
4
  ---
5
5
 
6
6
  # Скил: Исследователь решений (eda-explore)
@@ -20,7 +20,7 @@ description: 'Исследует тему или задачу до конкре
20
20
 
21
21
  Текст рядом с вызовом скилла в текущем сообщении пользователя — главный вход. Сначала разбери именно его: тему, задачу, путь к файлу, режим, ограничения и прямые указания.
22
22
 
23
- Если входа достаточно, продолжай без подтверждения. `AskUserQuestion` задавай только если входа нет, он противоречивый, найдено несколько равных вариантов или есть риск исследовать не то. Старое обсуждение в истории не считай входом, если пользователь не связал его с текущим вызовом явно.
23
+ Если входа достаточно, не спрашивай подтверждение самой темы. `AskUserQuestion` на этом этапе задавай только если входа нет, он противоречивый, найдено несколько равных вариантов или есть риск исследовать не то. Это не отменяет обязательные вопросы по исследовательским развилкам ниже. Старое обсуждение в истории не считай входом, если пользователь не связал его с текущим вызовом явно.
24
24
 
25
25
  ## Настройки проекта
26
26
 
@@ -37,24 +37,28 @@ description: 'Исследует тему или задачу до конкре
37
37
  | Ключ | Значения | Что значит |
38
38
  |---|---|---|
39
39
  | `defaults.decision_mode` | `autonomous` | Агент сам выбирает по коду, правилам, архитектуре, источникам и рискам, затем записывает причину. |
40
- | `defaults.decision_mode` | `recommend_and_ask` | Агент исследует варианты, рекомендует один, но по существенным решениям задаёт блокирующий вопрос до финализации. |
41
- | `defaults.decision_mode` | `ask_each_time` | Агент спрашивает по каждой значимой развилке, даже если есть сильная рекомендация. |
40
+ | `defaults.decision_mode` | `recommend_and_ask` | Дефолт. Агент сам собирает факты, рекомендует вариант и спрашивает пользователя по каждой значимой развилке исследования до финализации. |
41
+ | `defaults.decision_mode` | `ask_each_time` | Агент спрашивает по каждой развилке, которая влияет на направление исследования или итоговый выбор, даже если есть сильная рекомендация. |
42
42
 
43
43
  Если `defaults.decision_mode` отсутствует или неизвестен, считай его `recommend_and_ask`.
44
44
 
45
- Существенные решения — это решения, которые меняют архитектуру, зависимости, стоимость, безопасность, эксплуатацию или будущую миграцию проекта. Всегда считай существенными:
45
+ Значимая исследовательская развилка — это выбор, который меняет направление исследования, итоговую рекомендацию, границы задачи, архитектуру, зависимости, стоимость, безопасность, эксплуатацию, совместимость или будущую миграцию проекта. Не спрашивай о фактах, которые можно выяснить через код, документы или источники; спрашивай о выборе, предпочтении или компромиссе.
46
+
47
+ Всегда считай значимыми:
46
48
  - выбор нового пакета, библиотеки, фреймворка, SDK, CLI или сервиса;
47
49
  - выбор базы данных, ORM/query builder, очереди, кэша, storage, search, background jobs;
48
50
  - миграции данных, изменение схемы, формат хранения или стратегия совместимости;
49
51
  - auth, permissions, payments, crypto, secrets, персональные данные и другие security-sensitive решения;
50
52
  - cloud/provider choices, managed services, лицензии, cost/lock-in и SLA;
51
53
  - архитектурные паттерны, затрагивающие несколько модулей или публичные контракты.
54
+ - продуктовый компромисс между скоростью, качеством, UX, стоимостью, сроком или объёмом;
55
+ - выбор, который влияет на то, какой результат будет передан в `eda-plan`.
52
56
 
53
57
  ## Главные правила
54
58
 
55
59
  1. **Никаких правок кода.** Запись только в `docs/researches/`.
56
60
  2. **Итог — конкретика.** Нельзя заканчивать абстрактными описаниями, списком возможностей или «можно выбрать один из вариантов».
57
- 3. **Развилки закрывай по `decision_mode`.** Обычные локальные развилки можно выбрать по коду, правилам, архитектуре, источникам и рискам. Существенные решения в `recommend_and_ask` и `ask_each_time` подтверждай у пользователя до финализации. Если выбор зависит только от пользователя задай блокирующий вопрос в любом режиме.
61
+ 3. **Развилки закрывай по `decision_mode`.** В `recommend_and_ask` значимые развилки исследования подтверждай у пользователя до финализации: сначала собери факты, затем дай рекомендацию и варианты. В `ask_each_time` спрашивай ещё чаще: по каждой развилке, которая влияет на ход исследования или итоговый выбор. В `autonomous` выбирай сам, если выбор можно обосновать кодом, правилами, архитектурой, источниками и рисками. Мелкие локальные решения, которые не меняют смысл исследования и легко обратимы, выбирай сам и не создавай шум.
58
62
  4. **Риски вплетай в исследование.** Не создавай отдельный обязательный раздел или этап рисков. Если риск влияет на выбор, источник, ограничение или будущую проверку, фиксируй его рядом с соответствующим решением: что может пойти не так и как это учитывается — снимаем, принимаем или выносим за рамки.
59
63
  5. **Версии проверяй.** Если речь о пакетах, библиотеках, CLI, сервисах или другом ПО, а версия не задана контекстом, проверь последнюю стабильную версию через context7, если он доступен, или через web search по официальным источникам.
60
64
  6. **Прочитай `docs/rules.md` и `docs/arch.md`**, если есть, и используй их как рамку.
@@ -94,19 +98,21 @@ description: 'Исследует тему или задачу до конкре
94
98
 
95
99
  ### 3. Закрыть развилки
96
100
 
97
- Собери все существенные развилки: архитектурные, продуктовые, технические, миграционные, по зависимостям и совместимости.
101
+ Собери все значимые развилки: архитектурные, продуктовые, технические, миграционные, по зависимостям и совместимости.
102
+
103
+ Не начинай с вопросов, если можно сначала быстро собрать факты. После первичного контекста сгруппируй близкие развилки в пакет из 1–3 вопросов, чтобы пользователь принимал решения осознанно, а диалог не распадался на мелочи.
98
104
 
99
105
  Для каждой развилки:
100
106
  - перечисли варианты;
101
107
  - выбери один вариант или подготовь рекомендацию;
102
108
  - запиши источник и причину выбора;
103
109
  - если у варианта есть важный риск, опиши его здесь же и сразу зафиксируй, как он влияет на выбранное решение;
104
- - если развилка существенная и `decision_mode: recommend_and_ask` — задай `AskUserQuestion`: 2–3 варианта, первым рекомендованный, короткая причина рекомендации, вариант «свой вариант», фраза «Я продолжу только после ответа.»;
105
- - если развилка значимая и `decision_mode: ask_each_time` — задай `AskUserQuestion` даже при сильной рекомендации;
110
+ - если развилка значимая и `decision_mode: recommend_and_ask` — задай `AskUserQuestion`: 2–3 варианта, первым рекомендованный, короткая причина рекомендации, вариант «свой вариант», фраза «Я продолжу только после ответа.»;
111
+ - если развилка влияет на ход исследования или итоговый выбор и `decision_mode: ask_each_time` — задай `AskUserQuestion` даже при сильной рекомендации;
106
112
  - если `decision_mode: autonomous` и выбор можно обосновать кодом, правилами, архитектурой, источниками и рисками — выбери сам и запиши почему;
107
113
  - если выбрать нельзя без пользовательского решения — задай `AskUserQuestion` и не продолжай финализацию.
108
114
 
109
- Не прячь существенный выбор внутри текста. Например, если нужен пакет для базы данных, сначала сравни 2–3 подходящих варианта, затем в `recommend_and_ask` спроси подтверждение выбора пакета/БД до записи финального решения.
115
+ Не прячь значимый выбор внутри текста. Например, если нужен пакет для базы данных, сначала сравни 2–3 подходящих варианта, затем в `recommend_and_ask` спроси подтверждение выбора пакета/БД до записи финального решения.
110
116
 
111
117
  Если по ходу исследования находится высокий риск без понятного решения, это блокер: задай `AskUserQuestion` или заверши со статусом `blocked`. Не выноси риски в отдельную секцию ради формы; они должны естественно лежать в `Решении`, причинах выбора, ограничениях, проверках версий или итоговом выводе.
112
118
 
@@ -143,7 +149,7 @@ sources:
143
149
  - объяснение, почему выбран этот вариант, а не альтернативы.
144
150
 
145
151
  ## Ответы на вопросы
146
- Вопросы, которые были заданы в процессе исследования, и ответы пользователя. Если вопросов не было — «Не требовались.»
152
+ Вопросы и развилки, которые были вынесены пользователю в процессе исследования, а также ответы пользователя. Если вопросов не было — «Не требовались.»
147
153
 
148
154
  ## Итог
149
155
  Короткая конкретика: что делать дальше на уровне подхода, без плана реализации.
@@ -154,7 +160,7 @@ Quality gate перед сохранением:
154
160
  - в `Суть` чётко описано, что исследовали и какая проблема решается;
155
161
  - в `Решение` есть выбранный вариант решения, а не набор равных альтернатив;
156
162
  - в `Решение` есть описание архитектуры или явно сказано, почему архитектурный слой не затронут;
157
- - в `Ответы на вопросы` записаны все вопросы, заданные пользователю в процессе исследования, и ответы на них, чтобы `eda-plan` не задавал их повторно;
163
+ - в `Ответы на вопросы` записаны все вопросы и пользовательские выборы по развилкам, заданные в процессе исследования, чтобы `eda-plan` не задавал их повторно;
158
164
  - в `Итог` есть короткая конкретика, что делать дальше на уровне подхода, без пошагового плана;
159
165
  - нет незакрытых развилок;
160
166
  - нет рисков, которые перечислены отдельно от решения и никак не влияют на выбор, ограничения или будущие проверки;
@@ -95,6 +95,8 @@ description: 'Пишет план реализации по тексту ряд
95
95
  - выбор нового пакета, библиотеки, фреймворка, SDK, CLI или сервиса;
96
96
  - выбор базы данных, ORM/query builder, очереди, кэша, storage, search, background jobs;
97
97
  - миграции данных, изменение схемы, формат хранения или стратегия совместимости;
98
+ - новые или изменённые схемы таблиц: поля, типы, связи, индексы, уникальные ограничения;
99
+ - новые или изменённые API/внешние контракты: маршруты, auth/permissions, request/query/body, response, ошибки и статус-коды;
98
100
  - auth, permissions, payments, crypto, secrets, персональные данные и другие security-sensitive решения;
99
101
  - cloud/provider choices, managed services, лицензии, cost/lock-in и SLA;
100
102
  - архитектурные паттерны, затрагивающие несколько модулей или публичные контракты.
@@ -179,6 +181,8 @@ Research подтягивай так:
179
181
  До Plan Mode закрой существенные решения:
180
182
  - выпиши существенные развилки, которые следуют из задачи и контекста;
181
183
  - если research содержит подтверждённый ответ пользователя по развилке — используй его и запиши как подтверждённое решение;
184
+ - если задача меняет БД или API/внешний контракт, проверь, подтверждены ли конкретные схемы таблиц или API-контракты пользователем в текущем сообщении, правилах, архитектуре или research с подтверждённым ответом пользователя;
185
+ - если конкретные схемы БД или API-контракты не подтверждены явно, до Plan Mode задай блокирующий вопрос и получи подтверждение пользователя; не проектируй таблицы и маршруты молча внутри Plan Mode;
182
186
  - если `decision_mode: autonomous` и выбор можно обосновать кодом, правилами, архитектурой, источниками и рисками — выбери сам и запиши почему;
183
187
  - если `decision_mode: recommend_and_ask` — задай `AskUserQuestion`: 2–3 варианта, первым рекомендованный, короткая причина рекомендации, вариант «свой вариант», фраза «Я продолжу только после ответа.»;
184
188
  - если `decision_mode: ask_each_time` — задай `AskUserQuestion` по каждой значимой развилке, даже при сильной рекомендации;
@@ -231,11 +235,10 @@ Research подтягивай так:
231
235
  6. Пары «вопрос → ответ» из этапа 3 и подтверждения существенных решений из research.
232
236
  7. Ссылки на `docs/rules.md`, `docs/arch.md`, исследование (без пересказа — Plan Mode прочитает сам) и явное требование строго следовать правилам и архитектуре.
233
237
  8. Инструкция: «все вопросы пользователю — только по разделу "Интерактивные вопросы", никаких догадок и продолжения без ответа».
234
- 9. Инструкция: «финальный план должен иметь раздел "Целевой алгоритм", фазы с целью/результатом/проверкой и не должен смешивать исследование с планом исполнения».
235
- 10. Инструкция: «стратегии тестов и логирования обязательны: они должны быть отражены в решениях, фазах, проверках, разделах "Тесты" и "Логирование"».
236
- 11. Инструкция: «если `plan_size: short`, план обязан уложиться в 1–2 фазы, компактный ревьюируемый объём и объяснение ожидаемого объёма изменений».
237
- 12. Инструкция: «если нужны пакеты или ПО, используй только конкретные версии; если версия не задана контекстом, она должна быть проверена через context7 или поиск и указана с источником».
238
- 13. Инструкция: «не добавляй неподтверждённые существенные решения в финальный план; если они возникли внутри Plan Mode, остановись и спроси пользователя».
238
+ 9. Инструкция: «финальный план должен быть нормализован в обязательную структуру из этапа 5 и не должен смешивать исследование с планом исполнения».
239
+ 10. Инструкция: «зафиксированные стратегии тестов и логирования должны быть применены в плане, а не просто записаны в YAML».
240
+ 11. Инструкция: «если `plan_size: short`, соблюдай ограничения короткого плана из раздела "Размер плана"».
241
+ 12. Инструкция: «не добавляй неподтверждённые существенные решения в финальный план; если они возникли внутри Plan Mode, остановись и спроси пользователя».
239
242
 
240
243
  Не выходи, пока пользователь не подтвердил план.
241
244
 
@@ -278,6 +281,18 @@ sources:
278
281
  ## Целевой алгоритм
279
282
  Пошаговое описание целевого поведения системы от входного события до финального состояния. Это обзор всей картины, не список файлов.
280
283
 
284
+ ## Контракты реализации
285
+
286
+ ### Данные и БД
287
+ Если БД не меняется: `Не затрагивается`.
288
+
289
+ Если меняется, явно укажи таблицы, поля, типы, обязательность, default, связи, индексы, уникальные ограничения, миграции и совместимость со старыми данными. Backfill и rollback укажи, если они нужны.
290
+
291
+ ### API и внешние контракты
292
+ Если API и внешние контракты не меняются: `Не затрагивается`.
293
+
294
+ Если меняются, явно укажи метод и путь, auth/permissions, request/query/body, response, ошибки и статус-коды. Webhooks, events, queues и внешние сервисы укажи, если они есть.
295
+
281
296
  ## Фазы выполнения
282
297
 
283
298
  ### 1. <Название фазы>
@@ -310,8 +325,12 @@ sources:
310
325
  - Риски не выносятся в отдельный обязательный раздел. Закрытые риски из research, контекста и мета-ревью должны быть встроены туда, где они исполняются: в `Принятые решения`, фазы, сценарии тестирования, проверки, логирование или эксплуатационные шаги.
311
326
  - Существенные решения в `Принятых решениях` имеют источник подтверждения или явное обоснование автономного выбора.
312
327
  - В `Целевой алгоритм` попадает сквозная картина процесса.
328
+ - В `Контракты реализации` попадают схемы данных, БД, API и внешние контракты. Если область не затрагивается, напиши `Не затрагивается`.
329
+ - Если план меняет БД, `Данные и БД` обязаны явно описывать таблицы, поля, типы, обязательность/default, связи, индексы/unique, миграции и совместимость со старыми данными.
330
+ - Если план меняет API или внешний контракт, `API и внешние контракты` обязаны явно описывать method/path, auth/permissions, request/query/body, response, ошибки/status codes и внешние каналы при наличии.
313
331
  - В `Фазы выполнения` попадают только исполнимые шаги.
314
332
  - Каждая фаза обязана иметь `Цель`, `Что сделать`, `Результат`, `Сценарии тестирования`, `Проверка`.
333
+ - В фазах нельзя ограничиваться общими формулировками вроде «обновить UI», «добавить сервис», «реализовать логику». Если фаза затрагивает UI, опиши пользовательский сценарий, состояния успеха/ошибки и видимый результат. Если фаза затрагивает внутреннюю логику, опиши ответственность изменяемых частей, поток данных, новые состояния/ошибки и существующие места, которые нужно адаптировать.
315
334
  - Отдельный раздел порядка выполнения не нужен: линейный порядок задаётся номерами фаз и шагами внутри фаз.
316
335
  - `test_strategy` обязан менять структуру фаз: TDD — тесты в начале фаз, after_each_phase — тесты после каждой фазы, end_of_plan — отдельная финальная фаза тестов.
317
336
  - `logging_strategy` обязан быть отражён в целевом алгоритме, фазах и отдельном разделе `Логирование`.
@@ -321,8 +340,12 @@ sources:
321
340
 
322
341
  Перед сохранением проверь quality gate:
323
342
  - есть `Целевой алгоритм`;
343
+ - есть `Контракты реализации` с подразделами `Данные и БД` и `API и внешние контракты`;
344
+ - если задача затрагивает БД, схема данных не пропущена и не заменена общими словами;
345
+ - если задача затрагивает API или внешний контракт, маршруты/контракты не пропущены и не заменены общими словами;
324
346
  - фазы идут в реалистичном порядке реализации;
325
347
  - у каждой фазы есть цель, результат, сценарии тестирования и проверка;
348
+ - UI и внутренняя логика в фазах описаны через конкретное поведение, поток данных, состояния и ошибки, если задача их затрагивает;
326
349
  - нет неразрешённых формулировок «выбрать», «решить», «можно так или так», «предпочтительно», «при необходимости»;
327
350
  - текст написан простым языком: без лишнего жаргона, непояснённых сокращений и тяжёлых терминов;
328
351
  - мета-уровень не смешан с шагами исполнения;