@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 +48 -23
- package/lib/install.js +143 -14
- package/package.json +4 -3
- package/skills/eda-automate.md +15 -3
- package/skills/eda-docs.md +40 -66
- package/skills/eda-execute.md +6 -7
- package/skills/eda-explore.md +181 -0
- package/skills/eda-plan.md +167 -17
- package/skills/eda-review.md +43 -20
- package/skills/eda-research.md +0 -119
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-
|
|
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 и сверкой с планом работ. Замечания пишет блоками: сначала контекст и риск, потом конкретные файлы/строки и шаги исправления. Затем
|
|
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-
|
|
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-
|
|
51
|
+
| `eda-explore` | `strict` | После сохранения отчёта отдаёт его соседнему CLI (Claude → Codex или наоборот) на критическое ревью конкретности, фактов, развилок, рисков и версий; затем доправляет отчёт по замечаниям | Серьёзные исследования, которые лягут в основу больших решений; когда хочется второго мнения от другой модели/среды |
|
|
52
52
|
| `eda-plan` | `strict` | После мета-ревью трёх моделей (это есть всегда) отдаёт план соседнему CLI на дополнительный круг проверки; доправляет план | Большие или ответственные планы, особенно затрагивающие смежные системы |
|
|
53
|
-
| `eda-review` | `strict` | После мета-ревью
|
|
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
|
-
```
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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-
|
|
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
|
|
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
|
-
|
|
68
|
+
output.write('Не нашёл установленных скилов в этом проекте. Запусти `eda init`.\n');
|
|
28
69
|
return;
|
|
29
70
|
}
|
|
30
|
-
|
|
31
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
4
|
-
"description": "Набор скилов eda-* для Claude Code и Codex CLI:
|
|
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
|
}
|
package/skills/eda-automate.md
CHANGED
|
@@ -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. **Планы анализируй только с
|
|
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
|
-
Определи режим и диапазон по тексту рядом с
|
|
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
|
- конкретные файлы или папки.
|
package/skills/eda-docs.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: eda-docs
|
|
3
|
-
description: 'Создаёт или обновляет документы, указанные рядом с вызовом: `docs/rules.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.
|
|
21
|
-
4.
|
|
22
|
-
5.
|
|
23
|
-
|
|
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.
|
|
47
|
-
|
|
47
|
+
### 4. Сформировать план `docs/rules.md`
|
|
48
|
+
Не используй фиксированный шаблон разделов. Сначала на основе анализа проекта и контекста пользователя предложи набор правил, которые действительно нужны этому проекту.
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
67
|
+
### 5. Сформировать план `docs/arch.md`
|
|
68
|
+
Не используй фиксированный шаблон архитектуры. Архитектурный документ должен описывать фактическую форму проекта: модули, границы, потоки данных, внешние зависимости и решения, которые реально видны в коде или переданы пользователем.
|
|
97
69
|
|
|
98
|
-
|
|
99
|
-
|
|
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
|
- Добавлять разделы ради красоты — если для проекта раздел не релевантен, опусти его.
|