@gian-tiaga/eda 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md 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 или обе среды сразу.
22
+ Установщик покажет чекбоксы: стрелками выбираешь среду, пробелом отмечаешь, Enter продолжает. Можно поставить Claude Code, Codex CLI или обе среды сразу. Если `docs/settings.yaml` ещё нет, установщик также предложит выбрать настройки скилов и создаст этот файл.
23
23
 
24
24
  ---
25
25
 
@@ -27,11 +27,11 @@ eda init
27
27
 
28
28
  | Скил | Что делает | Куда складывает |
29
29
  |---|---|---|
30
- | `eda-research` | Глубоко изучает тему или задачу. Без правок кода. Все вопросы через интерактивный диалог. На выходепонятный отчёт со ссылками на источники, диаграммами и таблицами | `docs/researches/` |
30
+ | `eda-explore` | Исследует тему до конкретного результата: описание проблемы, релевантная архитектура, закрытые развилки и риски, короткий выбранный вариант решения без плана. Если нужны пакеты или ПО проверяет актуальные стабильные версии через context7 или web search | `docs/researches/` |
31
31
  | `eda-plan` | Пишет план реализации через стандартный Plan Mode хост-агента. Подтягивает контекст из `docs/rules.md`, `docs/arch.md`, при желании — релевантное исследование. Затем три параллельных модели (слабая, средняя, мощная) проверяют план на реалистичность, пропущенные шаги и нарушения правил — главный планировщик сам решает, что применить | `docs/plans/` |
32
32
  | `eda-execute` | Выполняет план. Спрашивает, где работать (текущая ветка, новая ветка, отдельный worktree). Тесты пишет внутри каждого шага. В конце — полный прогон тестов и линтеров | `docs/executions/` |
33
33
  | `eda-fix` | Делает обычные фиксы по короткому контексту, баг-репорту или файлу плана. Перед правками читает правила и архитектуру, добавляет нужные тесты, прогоняет проверки и сохраняет историю правок | `docs/fixes/` |
34
- | `eda-review` | Делает код-ревью с оценкой 0–100 и сверкой с планом работ. Замечания пишет блоками: сначала контекст и риск, потом конкретные файлы/строки и шаги исправления. Затем три параллельных специализированных агента проверяют выполнение плана, архитектуру и правила. В строгом режиме — ещё и кросс-ревью между Claude и Codex | `docs/reviews/` |
34
+ | `eda-review` | Делает код-ревью с оценкой 0–100 и сверкой с планом работ. Замечания пишет блоками: сначала контекст и риск, потом конкретные файлы/строки и шаги исправления. Затем параллельные специализированные агенты проверяют выполнение плана, архитектуру, правила и при включённой настройке качество кода. В строгом режиме — ещё и кросс-ревью между Claude и Codex | `docs/reviews/` |
35
35
  | `eda-fix-by-review` | Применяет замечания из ревью. Обязательные — сразу. Спорные — спрашивает. В конце ссылается на отчёт прямо в файле ревью | `docs/review-fixes/` |
36
36
  | `eda-send-review` | Отправляет ревью на GitHub PR через `gh` — как комментарий, review, approve или request-changes. Сам определяет PR по текущей ветке | (комментарий в PR) |
37
37
  | `eda-commit` | Делает один аккуратный коммит в стиле проекта. В конце спрашивает: push, merge в main + удалить ветку, или ничего | (git) |
@@ -42,38 +42,63 @@ eda init
42
42
 
43
43
  ## 🚩 Флаги скилов
44
44
 
45
- У некоторых скилов есть флаг `strict` — он включает дополнительные тяжёлые проверки. Передаётся как часть запроса агенту, например: `eda-research strict <тема>` или просто `сделай ревью этого PR в strict-режиме`.
45
+ У некоторых скилов есть флаг `strict` — он включает дополнительные тяжёлые проверки. Передаётся как часть запроса агенту, например: `eda-explore strict <тема>` или просто `сделай ревью этого PR в strict-режиме`. Также strict можно включить по умолчанию через `defaults.strict: true` в `docs/settings.yaml`.
46
46
 
47
47
  Скилы, которых нет в таблице ниже, флагов не поддерживают — у них всё включено по умолчанию.
48
48
 
49
49
  | Скил | Флаг | Что включает | Когда стоит использовать |
50
50
  |---|---|---|---|
51
- | `eda-research` | `strict` | После сохранения отчёта отдаёт его соседнему CLI (Claude → Codex или наоборот) на критическое ревью; затем доправляет отчёт по их замечаниям | Серьёзные исследования, которые лягут в основу больших решений; когда хочется второго мнения от другой модели/среды |
51
+ | `eda-explore` | `strict` | После сохранения отчёта отдаёт его соседнему CLI (Claude → Codex или наоборот) на критическое ревью конкретности, фактов, развилок, рисков и версий; затем доправляет отчёт по замечаниям | Серьёзные исследования, которые лягут в основу больших решений; когда хочется второго мнения от другой модели/среды |
52
52
  | `eda-plan` | `strict` | После мета-ревью трёх моделей (это есть всегда) отдаёт план соседнему CLI на дополнительный круг проверки; доправляет план | Большие или ответственные планы, особенно затрагивающие смежные системы |
53
- | `eda-review` | `strict` | После мета-ревью тремя специализированными агентами отдаёт ревью соседнему CLI на дополнительный круг проверки; доправляет ревью по его замечаниям | Ревью важных PR; когда нужен максимальный охват |
53
+ | `eda-review` | `strict` | После мета-ревью специализированными агентами отдаёт ревью соседнему CLI на дополнительный круг проверки; доправляет ревью по его замечаниям | Ревью важных PR; когда нужен максимальный охват |
54
+
55
+ ---
56
+
57
+ ## ⚙️ Настройки проекта
58
+
59
+ Скилы читают `docs/settings.yaml`, если файл есть. Прямое указание в текущем запросе важнее настроек: например, `strict` включает строгий режим для одного запуска, а `normal` / `без strict` выключает его. Для `eda-plan` явный `short` включает короткий план, а `normal` / `обычный план` — обычный.
60
+
61
+ Файл по умолчанию:
62
+
63
+ ```yaml
64
+ version: 1
65
+
66
+ defaults:
67
+ strict: false
68
+ plan_size: normal
69
+
70
+ automate:
71
+ include_plans: false
72
+
73
+ review:
74
+ include_code_quality: true
75
+ ```
76
+
77
+ Что означают настройки:
78
+ - `defaults.strict` — включает strict-режим по умолчанию для `eda-explore`, `eda-plan` и `eda-review`.
79
+ - `defaults.plan_size` — размер плана для `eda-plan`: `normal`, `short` или `ask_each_time`.
80
+ - `automate.include_plans` — добавляет `docs/plans/` в обычный запуск `eda-automate`.
81
+ - `review.include_code_quality` — добавляет в `eda-review` проверку качества кода и отдельного мета-ревьюера `quality-check`.
82
+
83
+ `eda init` и `eda update` создают `docs/settings.yaml`, только если файла ещё нет. Существующий файл не перезаписывается.
54
84
 
55
85
  ---
56
86
 
57
87
  ## 🔄 Воркфлоу
58
88
 
59
- ```mermaid
60
- flowchart LR
61
- R[🔍 research] --> P[📝 plan]
62
- P --> E[⚙️ execute]
63
- E --> X[🛠️ fix]
64
- X --> V[🧐 review]
65
- E --> V
66
- V --> F[🛠️ fix-by-review]
67
- F --> S[📤 send-review]
68
- F --> C[💾 commit]
69
- V -.-> A[⚡ automate]
70
- F -.-> A
71
- X -.-> A
72
- D[📚 docs] -.-> P
73
- D -.-> E
89
+ ```text
90
+ docs ───────────────┬───────────────┐
91
+ │ │
92
+ v v
93
+ explore ─────────> plan ────────> execute ───┬──> review ───> fix-by-review ───┬──> send-review
94
+ │ │
95
+ v └──> commit
96
+ fix ─────────────> review
97
+
98
+ automate может запускаться от review, fix-by-review или fix.
74
99
  ```
75
100
 
76
- Использовать всю цепочку не обязательно — каждый скил самодостаточен. Можно начать с `eda-research`, или сразу с `eda-execute` на готовом плане, или просто `eda-commit`, когда правки уже сделаны.
101
+ Использовать всю цепочку не обязательно — каждый скил самодостаточен. Можно начать с `eda-explore`, или сразу с `eda-execute` на готовом плане, или просто `eda-commit`, когда правки уже сделаны.
77
102
 
78
103
  ---
79
104
 
@@ -91,7 +116,7 @@ flowchart LR
91
116
 
92
117
  ```bash
93
118
  eda init # выбрать Claude Code / Codex / обе среды и установить скилы
94
- eda update # обновить уже установленные скилы из текущей версии пакета
119
+ eda update # обновить скилы и создать docs/settings.yaml, если его ещё нет
95
120
  eda --help # справка
96
121
  ```
97
122
 
package/lib/install.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import checkbox from '@inquirer/checkbox';
2
+ import select from '@inquirer/select';
2
3
  import fs from 'node:fs/promises';
3
4
  import path from 'node:path';
4
5
  import { fileURLToPath } from 'node:url';
@@ -7,10 +8,49 @@ const __filename = fileURLToPath(import.meta.url);
7
8
  const __dirname = path.dirname(__filename);
8
9
  const PACKAGE_ROOT = path.resolve(__dirname, '..');
9
10
  const SKILLS_SRC = path.join(PACKAGE_ROOT, 'skills');
11
+ const SETTINGS_RELATIVE_PATH = 'docs/settings.yaml';
10
12
  const TARGET_CHOICES = [
11
13
  { value: 'claude', label: 'Claude Code', dir: '.claude/skills/' },
12
14
  { value: 'codex', label: 'Codex CLI', dir: '.codex/skills/' }
13
15
  ];
16
+ const RETIRED_SKILLS = ['eda-research'];
17
+ const DEFAULT_SETTINGS = {
18
+ strict: false,
19
+ planSize: 'normal',
20
+ includePlans: false,
21
+ includeCodeQuality: true
22
+ };
23
+ const SETTINGS_CHOICES = [
24
+ {
25
+ value: 'strict',
26
+ name: 'Strict по умолчанию для explore / plan / review',
27
+ checked: DEFAULT_SETTINGS.strict
28
+ },
29
+ {
30
+ value: 'includePlans',
31
+ name: 'Анализировать планы в eda-automate по умолчанию',
32
+ checked: DEFAULT_SETTINGS.includePlans
33
+ },
34
+ {
35
+ value: 'includeCodeQuality',
36
+ name: 'Проверять качество кода в eda-review',
37
+ checked: DEFAULT_SETTINGS.includeCodeQuality
38
+ }
39
+ ];
40
+ const PLAN_SIZE_CHOICES = [
41
+ {
42
+ value: 'normal',
43
+ name: 'Обычный план по умолчанию'
44
+ },
45
+ {
46
+ value: 'short',
47
+ name: 'Короткий plan short по умолчанию'
48
+ },
49
+ {
50
+ value: 'ask_each_time',
51
+ name: 'Спрашивать размер плана каждый раз'
52
+ }
53
+ ];
14
54
 
15
55
  export async function init({ cwd, input = process.stdin, output = process.stdout }) {
16
56
  const targets = await askTargets({ input, output });
@@ -18,17 +58,19 @@ export async function init({ cwd, input = process.stdin, output = process.stdout
18
58
  output.write('Ничего не выбрано — выходим.\n');
19
59
  return;
20
60
  }
21
- await syncSkills(cwd, targets);
61
+ await ensureSettings(cwd, { input, output });
62
+ await syncSkills(cwd, targets, output);
22
63
  }
23
64
 
24
- export async function update({ cwd }) {
65
+ export async function update({ cwd, input = process.stdin, output = process.stdout }) {
25
66
  const targets = await detectTargets(cwd);
26
67
  if (targets.length === 0) {
27
- process.stdout.write('Не нашёл установленных скилов в этом проекте. Запусти `eda init`.\n');
68
+ output.write('Не нашёл установленных скилов в этом проекте. Запусти `eda init`.\n');
28
69
  return;
29
70
  }
30
- process.stdout.write(`Найдены установленные среды: ${targets.join(', ')}\n`);
31
- await syncSkills(cwd, targets);
71
+ output.write(`Найдены установленные среды: ${targets.join(', ')}\n`);
72
+ await ensureSettings(cwd, { input, output });
73
+ await syncSkills(cwd, targets, output);
32
74
  }
33
75
 
34
76
  export async function askTargets({ input = process.stdin, output = process.stdout } = {}) {
@@ -51,6 +93,38 @@ export async function askTargets({ input = process.stdin, output = process.stdou
51
93
  });
52
94
  }
53
95
 
96
+ export async function askSettings({ input = process.stdin, output = process.stdout } = {}) {
97
+ if (!input.isTTY || !output.isTTY) {
98
+ output.write(`Нет интерактивного терминала — создаю ${SETTINGS_RELATIVE_PATH} с настройками по умолчанию.\n`);
99
+ return { ...DEFAULT_SETTINGS };
100
+ }
101
+
102
+ const selected = await checkbox({
103
+ message: 'Какие настройки включить?',
104
+ instructions: 'Стрелки — выбрать, Space — отметить, Enter — продолжить',
105
+ choices: SETTINGS_CHOICES
106
+ }, {
107
+ input,
108
+ output
109
+ });
110
+
111
+ const planSize = await select({
112
+ message: 'Какой размер плана eda-plan использовать по умолчанию?',
113
+ choices: PLAN_SIZE_CHOICES,
114
+ default: DEFAULT_SETTINGS.planSize
115
+ }, {
116
+ input,
117
+ output
118
+ });
119
+
120
+ return {
121
+ strict: selected.includes('strict'),
122
+ planSize,
123
+ includePlans: selected.includes('includePlans'),
124
+ includeCodeQuality: selected.includes('includeCodeQuality')
125
+ };
126
+ }
127
+
54
128
  async function detectTargets(cwd) {
55
129
  const targets = [];
56
130
  if (await dirExists(path.join(cwd, '.claude/skills'))) targets.push('claude');
@@ -58,17 +132,18 @@ async function detectTargets(cwd) {
58
132
  return targets;
59
133
  }
60
134
 
61
- async function syncSkills(cwd, targets) {
135
+ async function syncSkills(cwd, targets, output = process.stdout) {
62
136
  const skills = await listSkills();
63
137
  if (skills.length === 0) {
64
138
  throw new Error(`В пакете нет скилов (искал в ${SKILLS_SRC}).`);
65
139
  }
66
- process.stdout.write(`Скилы для установки: ${skills.map(s => s.name).join(', ')}\n`);
140
+ output.write(`Скилы для установки: ${skills.map(s => s.name).join(', ')}\n`);
67
141
 
68
- if (targets.includes('claude')) await installToClaude(cwd, skills);
69
- if (targets.includes('codex')) await installToCodex(cwd, skills);
142
+ if (targets.includes('claude')) await installToClaude(cwd, skills, output);
143
+ if (targets.includes('codex')) await installToCodex(cwd, skills, output);
144
+ await removeRetiredSkills(cwd, targets);
70
145
 
71
- process.stdout.write('\nГотово.\n');
146
+ output.write('\nГотово.\n');
72
147
  }
73
148
 
74
149
  async function listSkills() {
@@ -79,7 +154,35 @@ async function listSkills() {
79
154
  .sort((a, b) => a.name.localeCompare(b.name));
80
155
  }
81
156
 
82
- async function installToClaude(cwd, skills) {
157
+ async function ensureSettings(cwd, { input = process.stdin, output = process.stdout } = {}) {
158
+ const settingsPath = path.join(cwd, SETTINGS_RELATIVE_PATH);
159
+ if (await fileExists(settingsPath)) {
160
+ output.write(`Настройки уже есть: ${SETTINGS_RELATIVE_PATH}\n`);
161
+ return;
162
+ }
163
+
164
+ const settings = await askSettings({ input, output });
165
+ await fs.mkdir(path.dirname(settingsPath), { recursive: true });
166
+ await fs.writeFile(settingsPath, formatSettings(settings));
167
+ output.write(`Создан файл настроек: ${SETTINGS_RELATIVE_PATH}\n`);
168
+ }
169
+
170
+ function formatSettings(settings) {
171
+ return `version: 1
172
+
173
+ defaults:
174
+ strict: ${settings.strict ? 'true' : 'false'}
175
+ plan_size: ${settings.planSize}
176
+
177
+ automate:
178
+ include_plans: ${settings.includePlans ? 'true' : 'false'}
179
+
180
+ review:
181
+ include_code_quality: ${settings.includeCodeQuality ? 'true' : 'false'}
182
+ `;
183
+ }
184
+
185
+ async function installToClaude(cwd, skills, output = process.stdout) {
83
186
  const dst = path.join(cwd, '.claude/skills');
84
187
  await fs.mkdir(dst, { recursive: true });
85
188
  for (const skill of skills) {
@@ -88,10 +191,10 @@ async function installToClaude(cwd, skills) {
88
191
  const content = await fs.readFile(skill.path, 'utf-8');
89
192
  await fs.writeFile(path.join(skillDir, 'SKILL.md'), content);
90
193
  }
91
- process.stdout.write(` ✓ Claude Code: ${dst}\n`);
194
+ output.write(` ✓ Claude Code: ${dst}\n`);
92
195
  }
93
196
 
94
- async function installToCodex(cwd, skills) {
197
+ async function installToCodex(cwd, skills, output = process.stdout) {
95
198
  const dst = path.join(cwd, '.codex/skills');
96
199
  await fs.mkdir(dst, { recursive: true });
97
200
  for (const skill of skills) {
@@ -101,7 +204,7 @@ async function installToCodex(cwd, skills) {
101
204
  await fs.writeFile(path.join(skillDir, 'SKILL.md'), content);
102
205
  await removeObsoleteCodexFile(dst, skill.name);
103
206
  }
104
- process.stdout.write(` ✓ Codex CLI: ${dst}\n`);
207
+ output.write(` ✓ Codex CLI: ${dst}\n`);
105
208
  }
106
209
 
107
210
  async function removeObsoleteCodexFile(dst, skillName) {
@@ -112,6 +215,23 @@ async function removeObsoleteCodexFile(dst, skillName) {
112
215
  }
113
216
  }
114
217
 
218
+ async function removeRetiredSkills(cwd, targets) {
219
+ const targetDirs = {
220
+ claude: path.join(cwd, '.claude/skills'),
221
+ codex: path.join(cwd, '.codex/skills')
222
+ };
223
+
224
+ for (const target of targets) {
225
+ const dst = targetDirs[target];
226
+ if (!dst) continue;
227
+
228
+ for (const skillName of RETIRED_SKILLS) {
229
+ await fs.rm(path.join(dst, skillName), { recursive: true, force: true });
230
+ await fs.rm(path.join(dst, `${skillName}.md`), { force: true });
231
+ }
232
+ }
233
+ }
234
+
115
235
  async function dirExists(p) {
116
236
  try {
117
237
  const st = await fs.stat(p);
@@ -120,3 +240,12 @@ async function dirExists(p) {
120
240
  return false;
121
241
  }
122
242
  }
243
+
244
+ async function fileExists(p) {
245
+ try {
246
+ const st = await fs.stat(p);
247
+ return st.isFile();
248
+ } catch {
249
+ return false;
250
+ }
251
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gian-tiaga/eda",
3
- "version": "0.3.4",
4
- "description": "Набор скилов eda-* для Claude Code и Codex CLI: research, plan, execute, fix, review, fix-by-review, send-review, commit, docs, automate",
3
+ "version": "0.4.0",
4
+ "description": "Набор скилов eda-* для Claude Code и Codex CLI: explore, plan, execute, fix, review, fix-by-review, send-review, commit, docs, automate",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "eda": "bin/cli.js"
@@ -37,6 +37,7 @@
37
37
  "url": "https://github.com/falur/eda/issues"
38
38
  },
39
39
  "dependencies": {
40
- "@inquirer/checkbox": "^4.3.2"
40
+ "@inquirer/checkbox": "^4.3.2",
41
+ "@inquirer/select": "^5.1.5"
41
42
  }
42
43
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: eda-automate
3
- description: 'Анализирует историю `docs/reviews/`, `docs/review-fixes/` и `docs/fixes/`, а по тексту рядом с вызовом может включать `docs/plans/`, последние N, период или конкретные файлы. Ищет повторяющиеся замечания, фиксы и проблемы планирования, предлагает автоматизации, а также черновики дополнений для `docs/rules.md` и `docs/arch.md`. Опирается на инструменты, которые уже работают в проекте; если ничего не подходит — предлагает новый, без дублей с уже установленными. Не внедряет изменения — выдаёт приоритезированный список с черновиками правил, проверок и правок документации. Внедрение — отдельная задача через `eda-plan` + `eda-execute`. Вопросы задаёт только когда без ответа нельзя безопасно продолжать.'
3
+ description: 'Анализирует историю `docs/reviews/`, `docs/review-fixes/` и `docs/fixes/`, а по тексту рядом с вызовом или настройке `automate.include_plans: true` в `docs/settings.yaml` может включать `docs/plans/`, последние N, период или конкретные файлы. Ищет повторяющиеся замечания, фиксы и проблемы планирования, предлагает автоматизации, а также черновики дополнений для `docs/rules.md` и `docs/arch.md`. Опирается на инструменты, которые уже работают в проекте; если ничего не подходит — предлагает новый, без дублей с уже установленными. Не внедряет изменения — выдаёт приоритезированный список с черновиками правил, проверок и правок документации. Внедрение — отдельная задача через `eda-plan` + `eda-execute`. Вопросы задаёт только когда без ответа нельзя безопасно продолжать.'
4
4
  ---
5
5
 
6
6
  # Скил: Автоматизатор (eda-automate)
@@ -14,12 +14,23 @@ description: 'Анализирует историю `docs/reviews/`, `docs/revie
14
14
  | Обычный | `eda-automate` | `docs/reviews/` + `docs/review-fixes/` + `docs/fixes/` |
15
15
  | С планами | `eda-automate plans` | `docs/reviews/` + `docs/review-fixes/` + `docs/fixes/` + `docs/plans/` |
16
16
 
17
+ Если в `docs/settings.yaml` указано `automate.include_plans: true`, режим с планами включён по умолчанию. Явное указание пользователя в текущем сообщении важнее настройки: `plans` / «с планами» включает планы, `normal` / «без планов» выключает их для текущего запуска.
18
+
17
19
  ## Вход из сообщения пользователя
18
20
 
19
21
  Текст рядом с вызовом скилла в текущем сообщении пользователя — главный вход. Сначала разбери именно его: тему, задачу, путь к файлу, режим, ограничения и прямые указания.
20
22
 
21
23
  Если этого входа достаточно, продолжай без вопроса. `AskUserQuestion` задавай только если входа нет, он противоречивый, найдено несколько равных вариантов или есть риск выполнить не ту задачу. Старое обсуждение в истории не считай входом, если пользователь не связал его с текущим вызовом явно.
22
24
 
25
+ ## Настройки проекта
26
+
27
+ Перед выбором режима прочитай `docs/settings.yaml`, если файл есть.
28
+
29
+ Если файла нет — используй значение по умолчанию:
30
+ - `automate.include_plans: false`
31
+
32
+ Прямое указание пользователя в текущем сообщении важнее `docs/settings.yaml`.
33
+
23
34
  ## Главные правила
24
35
 
25
36
  1. **Прочитай `docs/rules.md` и `docs/arch.md`**, если есть, и строго следуй им. Не предлагай то, что уже зафиксировано как автоматизированное правило или архитектурное решение.
@@ -28,7 +39,7 @@ description: 'Анализирует историю `docs/reviews/`, `docs/revie
28
39
  4. **Предлагай только повторяющееся.** Минимум — паттерн встречается в 2+ разных ревью или в 3+ местах одного. Единичные замечания не автоматизируем.
29
40
  5. **Каждое предложение — с черновиком.** Не «надо бы что-то сделать», а конкретный фрагмент: правило линтера, псевдокод/skeleton, текст для `docs/rules.md` или патч для `docs/arch.md`.
30
41
  6. **Простой язык. Таблицы** для приоритезации.
31
- 7. **Планы анализируй только с аргументом `plans`.** Без него не читай `docs/plans/`, если пользователь не указал конкретные файлы планов.
42
+ 7. **Планы анализируй только когда режим с планами включён.** Режим включают аргумент `plans`, явная просьба пользователя или `automate.include_plans: true` в `docs/settings.yaml`. Если пользователь явно написал `normal` / «без планов», не читай `docs/plans/`.
32
43
 
33
44
  ## Интерактивные вопросы
34
45
 
@@ -41,10 +52,11 @@ description: 'Анализирует историю `docs/reviews/`, `docs/revie
41
52
  ## Этапы
42
53
 
43
54
  ### 1. Выбрать диапазон
44
- Определи режим и диапазон по тексту рядом с вызовом. Если передан `plans`, указаны файлы из `docs/plans/` или пользователь явно просит анализ планов — включи планы в источники без отдельного вопроса.
55
+ Определи режим и диапазон по тексту рядом с вызовом и `docs/settings.yaml`. Если передан `plans`, указаны файлы из `docs/plans/`, пользователь явно просит анализ планов или `automate.include_plans: true` — включи планы в источники без отдельного вопроса. Если пользователь явно просит `normal` / «без планов» — не включай планы, даже если настройка включена.
45
56
 
46
57
  Без вопроса используй вход, если он задаёт:
47
58
  - `plans` / анализ планов;
59
+ - `normal` / без планов;
48
60
  - последние N (`последние 5`, `last 10`);
49
61
  - период (`за 30 дней`, `с YYYY-MM-DD по YYYY-MM-DD`);
50
62
  - конкретные файлы или папки.
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  name: eda-docs
3
- description: 'Создаёт или обновляет документы, указанные рядом с вызовом: `docs/rules.md` (максимально строгие правила для стека + предложения новых инструментов), `docs/arch.md` (архитектура проекта), `AGENTS.md` (описание проекта, стек, ссылки на документы и команды) или все три. Анализирует стек сам. Не правит код. Вопросы задаёт только когда без ответа нельзя безопасно продолжать.'
3
+ description: 'Создаёт или обновляет документы, указанные рядом с вызовом: `docs/rules.md` (правила, подстроенные под реальный проект), `docs/arch.md` (архитектура проекта), `AGENTS.md` (описание проекта, стек, ссылки на документы и команды) или все три. Анализирует стек сам, учитывает переданный контекст и уже существующие практики. Не правит код.'
4
4
  ---
5
5
 
6
6
  # Скил: Документатор (eda-docs)
7
7
 
8
- Создаёшь или обновляешь три документа: `docs/rules.md`, `docs/arch.md` и шапку `AGENTS.md`. Правила **максимально строгие** для стека проекта; смело предлагай инструменты, которых ещё нет, если они повышают строгость.
8
+ Создаёшь или обновляешь три документа: `docs/rules.md`, `docs/arch.md` и шапку `AGENTS.md`. Документы должны быть подстроены под конкретный проект: его стек, текущую структуру, уже установленные инструменты, стиль кода, тесты, инфраструктуру и контекст, который передал пользователь.
9
9
 
10
10
  ## Вход из сообщения пользователя
11
11
 
12
- Текст рядом с вызовом скилла в текущем сообщении пользователя — главный вход. Сначала разбери именно его: тему, задачу, путь к файлу, режим, ограничения и прямые указания.
12
+ Текст рядом с вызовом скилла в текущем сообщении пользователя — главный вход. Сначала разбери именно его: тему, задачу, путь к файлу, режим, ограничения, прямые указания и дополнительный контекст о том, какие правила, архитектурные решения или боли проекта пользователь хочет зафиксировать.
13
13
 
14
14
  Если этого входа достаточно, продолжай без вопроса. `AskUserQuestion` задавай только если входа нет, он противоречивый, найдено несколько равных вариантов или есть риск выполнить не ту задачу. Старое обсуждение в истории не считай входом, если пользователь не связал его с текущим вызовом явно.
15
15
 
@@ -17,10 +17,11 @@ description: 'Создаёт или обновляет документы, ук
17
17
 
18
18
  1. **Интерактивные вопросы** — по разделу ниже.
19
19
  2. **Не правишь код**, не ставишь пакеты, не меняешь конфиги. Только документы.
20
- 3. **Максимальная строгость по умолчанию.** Все доступные strict-флаги, запреты «гибких» конструкций, обязательные типы / тесты / обработка ошибок. Если правило бьёт по продуктивности пометь, но не выкидывай.
21
- 4. **Можно предлагать инструменты, которых ещё нет в проекте**, если они стандартные для стека и повышают строгость. Не предлагай дубль уже установленному того же класса.
22
- 5. **Существующие документы** не переписываем молча. Если файл уже есть `AskUserQuestion`: переписать / дополнить / создать рядом.
23
- 7. **Простой язык.** В правилах объясняй *почему*, не только *что*. **Таблицы** для перечислений.
20
+ 3. **Подстройка под проект.** Не генерируй универсальный шаблон. Каждое правило и архитектурное описание должны опираться на найденные файлы, стек, текущие команды, зависимости, структуру директорий, существующие docs и контекст пользователя.
21
+ 4. **Строгость только там, где она уместна для проекта.** Правила должны помогать поддерживать проект, а не превращаться в список всех возможных best practices. Если предлагаешь усиление строгости объясни, какую реальную проблему проекта оно закрывает.
22
+ 5. **Можно предлагать инструменты, которых ещё нет в проекте**, если они стандартные для стека и закрывают найденную проблему. Не предлагай дубль уже установленному того же класса. Предложение нового инструмента не становится правилом, пока пользователь не согласовал его.
23
+ 6. **Существующие документы** не переписываем молча. Если файл уже есть `AskUserQuestion`: переписать / дополнить / создать рядом.
24
+ 7. **Простой язык.** Сначала объясняй простыми словами, зачем правило или архитектурный блок нужен проекту. Потом формулируй конкретику.
24
25
 
25
26
  ## Интерактивные вопросы
26
27
 
@@ -43,71 +44,43 @@ description: 'Создаёт или обновляет документы, ук
43
44
 
44
45
  Для каждого существующего файла — **отдельный** `AskUserQuestion`: переписать с нуля / дополнить / оставить как есть.
45
46
 
46
- ### 4. Сгенерировать `docs/rules.md`
47
- Структура (примерная адаптируй под стек):
47
+ ### 4. Сформировать план `docs/rules.md`
48
+ Не используй фиксированный шаблон разделов. Сначала на основе анализа проекта и контекста пользователя предложи набор правил, которые действительно нужны этому проекту.
48
49
 
49
- ```markdown
50
- # Правила проекта
51
-
52
- ## Зачем эти правила
53
- <2–3 предложения: что мы хотим от кода, какую боль закрываем>
54
-
55
- ## Стиль кода
56
- <строгие настройки форматтера, имена, длина строк, импорты>
57
-
58
- ## Типы
59
- <обязательные типы, запрет any/mixed, strict-режимы>
60
-
61
- ## Тесты
62
- <минимальное покрытие, расположение, именование, что обязательно покрывать>
63
-
64
- ## Обработка ошибок
65
- <запрет «глотания» ошибок, обязательное логирование, типы исключений>
66
-
67
- ## Безопасность
68
- <секреты, валидация ввода, SQL, XSS, ...>
69
-
70
- ## Производительность
71
- <запрет N+1, ограничения сложности, ...>
50
+ Перед записью файла задай `AskUserQuestion` с коротким планом правил:
51
+ - 5–12 предлагаемых правил или групп правил.
52
+ - Для каждого пункта: короткое название и 1–2 простых предложения, зачем это нужно именно этому проекту.
53
+ - Отдельно пометь, какие пункты основаны на уже существующих практиках проекта, а какие являются предложениями.
54
+ - Спроси, с чем пользователь согласен, что убрать, что изменить и какой дополнительный контекст учесть.
72
55
 
73
- ## Коммиты и ветки
74
- <стиль сообщений, главная ветка, политика merge>
56
+ Если пользователь передал контекст заранее, используй его как основной источник намерения, но всё равно сверяй с реальным стеком и файлами проекта. Не добавляй правило только потому, что оно типично для языка или фреймворка; добавляй его, если оно помогает этому проекту.
75
57
 
76
- ## Инструменты
77
- | Инструмент | Установлен | Назначение | Конфиг (черновик) |
78
- |---|---|---|---|
79
- | ... | ✓/новый | ... | <фрагмент> |
58
+ Из ответа пользователя сформируй план `docs/rules.md`, а затем сам документ. Формат документа выбирай под проект: разделы, таблицы, списки и примеры должны помогать читать и применять правила, а не соответствовать заранее заданной форме.
80
59
 
81
- ## Что предлагается добавить
82
- <список инструментов, которых нет, но стоит поставить — для каждого: чем закрывает, черновик минимального конфига>
83
- ```
84
-
85
- Каждое правило с короткой строкой «почему» (ссылка на типичную ошибку или класс багов).
86
-
87
- ### 5. Сгенерировать `docs/arch.md`
88
- Структура:
89
-
90
- ```markdown
91
- # Архитектура проекта
92
-
93
- ## Картина целиком
94
- <2–4 абзаца простыми словами: что делает система, какие у неё границы>
60
+ В готовом `docs/rules.md` обязательно должны быть:
61
+ - краткое объяснение, зачем документ нужен;
62
+ - правила, привязанные к текущему стеку, структуре и командам проекта;
63
+ - объяснение простым языком, зачем нужно каждое важное правило;
64
+ - команды проверки, если они реально есть в проекте;
65
+ - отдельный блок предложений, если есть полезные идеи, которые ещё не приняты или не настроены.
95
66
 
96
- <Mermaid-диаграмма верхнего уровня модули и потоки. Если архитектура линейная и схемы не нужно — одна строка про это>
67
+ ### 5. Сформировать план `docs/arch.md`
68
+ Не используй фиксированный шаблон архитектуры. Архитектурный документ должен описывать фактическую форму проекта: модули, границы, потоки данных, внешние зависимости и решения, которые реально видны в коде или переданы пользователем.
97
69
 
98
- ## Модули
99
- | Модуль | Назначение | Зависит от | API наружу |
100
- |---|---|---|---|
70
+ Перед записью файла задай `AskUserQuestion` с коротким планом архитектурного описания:
71
+ - 4–10 предлагаемых архитектурных блоков.
72
+ - Для каждого блока: короткое название и 1–2 простых предложения, зачем этот блок нужен читателю.
73
+ - Отдельно пометь, что подтверждено кодом, что является выводом из структуры, а что требует подтверждения пользователя.
74
+ - Спроси, с чем пользователь согласен, что убрать, что изменить и какой дополнительный контекст учесть.
101
75
 
102
- ## Потоки данных
103
- <ключевые сценарии — sequenceDiagram или текст>
76
+ Из ответа пользователя сформируй план `docs/arch.md`, а затем сам документ. Формат выбирай под проект. Если схему, таблицу модулей или список потоков данных полезно читать — добавь. Если они создают шум — не добавляй.
104
77
 
105
- ## Решения и ограничения
106
- <важные архитектурные решения с обоснованием почему так, а не иначе>
107
-
108
- ## Что вне области
109
- <что система осознанно НЕ делает>
110
- ```
78
+ В готовом `docs/arch.md` обязательно должны быть:
79
+ - простое описание, что делает система и где её границы;
80
+ - описание ключевых частей проекта на языке текущего стека;
81
+ - зависимости между важными частями;
82
+ - фактические команды, входные точки или runtime-компоненты, если они есть;
83
+ - явное разделение подтверждённых фактов, выводов из кода и предположений, если уверенности недостаточно.
111
84
 
112
85
  ### 6. Обновить `AGENTS.md`
113
86
  Если файл существует — `AskUserQuestion`: переписать / дополнить / оставить. Если нет — создай.
@@ -150,11 +123,12 @@ description: 'Создаёт или обновляет документы, ук
150
123
  ```
151
124
 
152
125
  ### 7. Финал
153
- Короткое сообщение: какие файлы созданы/обновлены, путь к каждому, ключевые предложения по новым инструментам списком, подсказка дальше — «прочитай файлы, скорректируй вручную, что не подходит».
126
+ Короткое сообщение: какие файлы созданы/обновлены, путь к каждому, какие предложения остались непринятыми или требуют отдельного решения, подсказка дальше — «прочитай файлы, скорректируй вручную, что не подходит».
154
127
 
155
128
  ## Чего НЕ делать
156
129
  - Править код, ставить пакеты, менять конфиги — только документы.
157
130
  - Молча переписывать существующие документы — каждый раз `AskUserQuestion`.
158
- - Смягчать правила «потому что так удобнее» стек строгий по умолчанию; послабления отдельно отмечай.
131
+ - Генерировать универсальные правила без связи с реальным проектом, стеком и контекстом пользователя.
132
+ - Превращать предложения в правила без согласия пользователя.
159
133
  - Предлагать второй инструмент того же класса в дополнение к уже установленному.
160
134
  - Добавлять разделы ради красоты — если для проекта раздел не релевантен, опусти его.