@gian-tiaga/eda 0.5.0 → 0.5.1
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 +10 -3
- package/lib/install.js +26 -5
- package/package.json +1 -1
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` ещё нет, установщик также предложит выбрать настройки скилов и создаст этот файл.
|
|
22
|
+
Установщик покажет чекбоксы: стрелками выбираешь среду, пробелом отмечаешь, Enter продолжает. Можно поставить Claude Code, Codex CLI или обе среды сразу. Если `docs/settings.yaml` ещё нет, установщик также предложит выбрать настройки скилов и создаст этот файл. В конце `eda init` пишет, сколько скилов установлено.
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -65,22 +65,29 @@ eda init
|
|
|
65
65
|
version: 1
|
|
66
66
|
|
|
67
67
|
defaults:
|
|
68
|
+
# Включает strict-режим по умолчанию для eda-explore, eda-plan и eda-review.
|
|
68
69
|
# true | false
|
|
69
70
|
strict: false
|
|
71
|
+
# Задаёт размер плана по умолчанию для eda-plan.
|
|
70
72
|
# normal | short | ask_each_time
|
|
71
73
|
plan_size: normal
|
|
74
|
+
# Определяет, как eda-explore и eda-plan принимают существенные решения.
|
|
72
75
|
# autonomous | recommend_and_ask | ask_each_time
|
|
73
76
|
decision_mode: recommend_and_ask
|
|
77
|
+
# Задаёт стратегию тестов по умолчанию для eda-plan.
|
|
74
78
|
# after_each_phase | tdd_each_phase | end_of_plan | ask_each_time
|
|
75
79
|
test_strategy: ask_each_time
|
|
80
|
+
# Задаёт стратегию логирования по умолчанию для eda-plan.
|
|
76
81
|
# debug_precise | standard | ask_each_time
|
|
77
82
|
logging_strategy: ask_each_time
|
|
78
83
|
|
|
79
84
|
automate:
|
|
85
|
+
# Добавляет docs/plans/ в обычный запуск eda-automate.
|
|
80
86
|
# true | false
|
|
81
87
|
include_plans: false
|
|
82
88
|
|
|
83
89
|
review:
|
|
90
|
+
# Добавляет в eda-review проверку качества кода и meta-reviewer quality-check.
|
|
84
91
|
# true | false
|
|
85
92
|
include_code_quality: true
|
|
86
93
|
```
|
|
@@ -130,7 +137,7 @@ automate может запускаться от review, fix-by-review или fix
|
|
|
130
137
|
|
|
131
138
|
```bash
|
|
132
139
|
eda init # выбрать Claude Code / Codex / обе среды и установить скилы
|
|
133
|
-
eda update # обновить
|
|
140
|
+
eda update # обновить скилы, показать их количество и создать docs/settings.yaml, если его ещё нет
|
|
134
141
|
eda --version # показать версию установленного пакета
|
|
135
142
|
eda --help # справка
|
|
136
143
|
```
|
|
@@ -153,7 +160,7 @@ eda update # синхронизировать скилы в текущ
|
|
|
153
160
|
| **Claude Code** | `<project>/.claude/skills/<skill>/SKILL.md` — отдельная папка на каждый скил |
|
|
154
161
|
| **Codex CLI** | `<project>/.codex/skills/<skill>/SKILL.md` — отдельная папка на каждый скил |
|
|
155
162
|
|
|
156
|
-
`eda update` идемпотентно перезаписывает файлы в обеих
|
|
163
|
+
`eda update` идемпотентно перезаписывает файлы в обеих папках и в конце пишет, сколько скилов обновлено. При обновлении старые файлы Codex-формата `<project>/.codex/skills/<skill>.md`, созданные версиями `eda` до этой структуры, удаляются. Если ты хочешь подправить скил локально — лучше копию сделай рядом, а не прямо в `.claude/skills/` или `.codex/skills/`, иначе при следующем `update` твои правки потеряются.
|
|
157
164
|
|
|
158
165
|
`AGENTS.md` (как и любые другие файлы в корне проекта) установщик **не трогает**. Если хочешь, чтобы Codex автоматически подгружал скилы, дай ему знать сам — например, одной строкой в `AGENTS.md`: «следуй инструкциям из `.codex/skills/`».
|
|
159
166
|
|
package/lib/install.js
CHANGED
|
@@ -108,7 +108,7 @@ export async function init({ cwd, input = process.stdin, output = process.stdout
|
|
|
108
108
|
return;
|
|
109
109
|
}
|
|
110
110
|
await ensureSettings(cwd, { input, output });
|
|
111
|
-
await syncSkills(cwd, targets, output);
|
|
111
|
+
await syncSkills(cwd, targets, output, { action: 'install' });
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
export async function update({ cwd, input = process.stdin, output = process.stdout }) {
|
|
@@ -119,7 +119,7 @@ export async function update({ cwd, input = process.stdin, output = process.stdo
|
|
|
119
119
|
}
|
|
120
120
|
output.write(`Найдены установленные среды: ${targets.join(', ')}\n`);
|
|
121
121
|
await ensureSettings(cwd, { input, output });
|
|
122
|
-
await syncSkills(cwd, targets, output);
|
|
122
|
+
await syncSkills(cwd, targets, output, { action: 'update' });
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
export async function askTargets({ input = process.stdin, output = process.stdout } = {}) {
|
|
@@ -211,7 +211,7 @@ async function detectTargets(cwd) {
|
|
|
211
211
|
return targets;
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
-
async function syncSkills(cwd, targets, output = process.stdout) {
|
|
214
|
+
async function syncSkills(cwd, targets, output = process.stdout, { action = 'update' } = {}) {
|
|
215
215
|
const skills = await listSkills();
|
|
216
216
|
if (skills.length === 0) {
|
|
217
217
|
throw new Error(`В пакете нет скилов (искал в ${SKILLS_SRC}).`);
|
|
@@ -222,6 +222,8 @@ async function syncSkills(cwd, targets, output = process.stdout) {
|
|
|
222
222
|
if (targets.includes('codex')) await installToCodex(cwd, skills, output);
|
|
223
223
|
await removeRetiredSkills(cwd, targets);
|
|
224
224
|
|
|
225
|
+
const actionLabel = action === 'install' ? 'Установлено' : 'Обновлено';
|
|
226
|
+
output.write(`${actionLabel} ${formatSkillCount(skills.length)}.\n`);
|
|
225
227
|
output.write('\nГотово.\n');
|
|
226
228
|
}
|
|
227
229
|
|
|
@@ -252,22 +254,29 @@ function formatSettings(settings) {
|
|
|
252
254
|
return `version: 1
|
|
253
255
|
|
|
254
256
|
defaults:
|
|
257
|
+
# Включает strict-режим по умолчанию для eda-explore, eda-plan и eda-review.
|
|
255
258
|
# true | false
|
|
256
259
|
strict: ${settings.strict ? 'true' : 'false'}
|
|
260
|
+
# Задаёт размер плана по умолчанию для eda-plan.
|
|
257
261
|
# normal | short | ask_each_time
|
|
258
262
|
plan_size: ${settings.planSize}
|
|
263
|
+
# Определяет, как eda-explore и eda-plan принимают существенные решения.
|
|
259
264
|
# autonomous | recommend_and_ask | ask_each_time
|
|
260
265
|
decision_mode: ${settings.decisionMode}
|
|
266
|
+
# Задаёт стратегию тестов по умолчанию для eda-plan.
|
|
261
267
|
# after_each_phase | tdd_each_phase | end_of_plan | ask_each_time
|
|
262
268
|
test_strategy: ${settings.testStrategy}
|
|
269
|
+
# Задаёт стратегию логирования по умолчанию для eda-plan.
|
|
263
270
|
# debug_precise | standard | ask_each_time
|
|
264
271
|
logging_strategy: ${settings.loggingStrategy}
|
|
265
272
|
|
|
266
273
|
automate:
|
|
274
|
+
# Добавляет docs/plans/ в обычный запуск eda-automate.
|
|
267
275
|
# true | false
|
|
268
276
|
include_plans: ${settings.includePlans ? 'true' : 'false'}
|
|
269
277
|
|
|
270
278
|
review:
|
|
279
|
+
# Добавляет в eda-review проверку качества кода и meta-reviewer quality-check.
|
|
271
280
|
# true | false
|
|
272
281
|
include_code_quality: ${settings.includeCodeQuality ? 'true' : 'false'}
|
|
273
282
|
`;
|
|
@@ -282,7 +291,7 @@ async function installToClaude(cwd, skills, output = process.stdout) {
|
|
|
282
291
|
const content = await fs.readFile(skill.path, 'utf-8');
|
|
283
292
|
await fs.writeFile(path.join(skillDir, 'SKILL.md'), content);
|
|
284
293
|
}
|
|
285
|
-
output.write(` ✓ Claude Code: ${dst}\n`);
|
|
294
|
+
output.write(` ✓ Claude Code: ${dst} (${formatSkillCount(skills.length)})\n`);
|
|
286
295
|
}
|
|
287
296
|
|
|
288
297
|
async function installToCodex(cwd, skills, output = process.stdout) {
|
|
@@ -295,7 +304,19 @@ async function installToCodex(cwd, skills, output = process.stdout) {
|
|
|
295
304
|
await fs.writeFile(path.join(skillDir, 'SKILL.md'), content);
|
|
296
305
|
await removeObsoleteCodexFile(dst, skill.name);
|
|
297
306
|
}
|
|
298
|
-
output.write(` ✓ Codex CLI: ${dst}\n`);
|
|
307
|
+
output.write(` ✓ Codex CLI: ${dst} (${formatSkillCount(skills.length)})\n`);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function formatSkillCount(count) {
|
|
311
|
+
return `${count} ${pluralizeSkill(count)}`;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function pluralizeSkill(count) {
|
|
315
|
+
const mod10 = count % 10;
|
|
316
|
+
const mod100 = count % 100;
|
|
317
|
+
if (mod10 === 1 && mod100 !== 11) return 'скил';
|
|
318
|
+
if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'скила';
|
|
319
|
+
return 'скилов';
|
|
299
320
|
}
|
|
300
321
|
|
|
301
322
|
async function removeObsoleteCodexFile(dst, skillName) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gian-tiaga/eda",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.1",
|
|
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": {
|