@gian-tiaga/eda 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +5 -5
- package/README.md +5 -5
- package/bin/cli.js +2 -2
- package/lib/install.js +26 -6
- package/package.json +1 -1
package/MIGRATION.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Миграция на eda 1.0
|
|
2
2
|
|
|
3
|
-
Версия 1.0 переводит `eda` с набора файлов-скилов на пакет с каноническими скилами и специализированными агентами для Claude Code и Codex CLI. Начиная с `1.0.
|
|
3
|
+
Версия 1.0 переводит `eda` с набора файлов-скилов на пакет с каноническими скилами и специализированными агентами для Claude Code и Codex CLI. Начиная с `1.0.2`, `eda update` заново спрашивает полный профиль настроек и записывает актуальный `docs/settings.yaml` версии 2 перед обновлением компонентов.
|
|
4
4
|
|
|
5
5
|
## Короткий путь
|
|
6
6
|
|
|
@@ -26,7 +26,7 @@ eda update
|
|
|
26
26
|
eda update-all /path/to/projects
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
`update-all` ищет проекты на глубине до двух уровней,
|
|
29
|
+
`update-all` ищет проекты на глубине до двух уровней, один раз спрашивает полный профиль настроек и записывает одинаковый `docs/settings.yaml` версии 2 во все найденные проекты. В non-TTY запуске вопросы не задаются: во все проекты записывается один профиль defaults.
|
|
30
30
|
|
|
31
31
|
После обновления перезапусти Claude Code или Codex CLI, чтобы среда перечитала установленные скилы и агентов.
|
|
32
32
|
|
|
@@ -57,9 +57,9 @@ eda update-all /path/to/projects
|
|
|
57
57
|
|
|
58
58
|
## Миграция `docs/settings.yaml`
|
|
59
59
|
|
|
60
|
-
Версия 1.0 поддерживает только формат настроек `version: 2`.
|
|
60
|
+
Версия 1.0 поддерживает только формат настроек `version: 2`. При `eda update` ответь на полный набор вопросов: команда соберёт новый профиль и атомарно заменит прежний файл независимо от его версии. `eda update-all` задаст эти вопросы только один раз и применит ответы ко всем проектам.
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
`eda init` ведёт себя осторожнее: если конфиг уже существует, v2 и неизвестные версии сохраняются, а v1 автоматически мигрируется с переносом поддерживаемых значений. При update-командах прежний файл заменяется выбранным полным профилем, поэтому перед запуском сохрани нестандартные поля отдельно.
|
|
63
63
|
|
|
64
64
|
Основное соответствие полей:
|
|
65
65
|
|
|
@@ -99,7 +99,7 @@ discover-automations:
|
|
|
99
99
|
include_plans: false
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
-
Новые разделы `orhestra`, `aim`, `review.agents` и `send-review`
|
|
102
|
+
Новые разделы `orhestra`, `aim`, `review.agents` и `send-review` заполняются ответами на вопросы; в non-TTY запуске используются сбалансированные defaults. Полный актуальный пример приведён в [README](README.md).
|
|
103
103
|
|
|
104
104
|
## Проверка после миграции
|
|
105
105
|
|
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ eda init
|
|
|
29
29
|
eda update-all ~/Code
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
`eda update-all` ищет проекты в указанной директории, её прямых подпапках и подпапках второго уровня. Проект считается найденным, если в нём уже есть установленный скил, агент или manifest `eda` для Claude/Codex.
|
|
32
|
+
`eda update-all` ищет проекты в указанной директории, её прямых подпапках и подпапках второго уровня. Проект считается найденным, если в нём уже есть установленный скил, агент или manifest `eda` для Claude/Codex. Перед обновлением команда один раз спрашивает полный профиль настроек и записывает одинаковый `docs/settings.yaml` во все найденные проекты. В неинтерактивном запуске во все проекты записывается один профиль по умолчанию.
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -347,7 +347,7 @@ discover-automations:
|
|
|
347
347
|
|
|
348
348
|
Поддерживается только `version: 2`. Для старого v2 без `review.agents` новый review использует сбалансированные defaults и предупреждает, что устаревшие `review.strict`, `review.include_code_quality` и `review-check` игнорируются. Установщик существующий файл не переписывает.
|
|
349
349
|
|
|
350
|
-
`eda init`
|
|
350
|
+
`eda init` создаёт `docs/settings.yaml`, только если файла ещё нет; существующий v1 автоматически мигрируется в v2, а v2 и неизвестные версии сохраняются. `eda update` всегда заново задаёт все вопросы конфигурации и атомарно перезаписывает файл полным v2-профилем. `eda update-all` задаёт тот же набор вопросов один раз и записывает получившийся общий конфиг во все найденные проекты. Без TTY обе update-команды используют defaults.
|
|
351
351
|
|
|
352
352
|
---
|
|
353
353
|
|
|
@@ -422,8 +422,8 @@ discover-automations может запускаться от review, fix-by-revie
|
|
|
422
422
|
|
|
423
423
|
```bash
|
|
424
424
|
eda init # выбрать Claude Code / Codex / обе среды и установить пакет
|
|
425
|
-
eda update #
|
|
426
|
-
eda update-all [dir] #
|
|
425
|
+
eda update # заново настроить конфиг и обновить скилы и агенты
|
|
426
|
+
eda update-all [dir] # один раз настроить конфиг и обновить все найденные проекты на глубине 2
|
|
427
427
|
eda --version # показать версию установленного пакета
|
|
428
428
|
eda --help # справка
|
|
429
429
|
```
|
|
@@ -456,7 +456,7 @@ eda update-all ~/Code
|
|
|
456
456
|
| Агент | `.claude/agents/<agent>.md` | `.codex/agents/<agent>.toml` |
|
|
457
457
|
| Manifest владения | `.claude/eda-manifest.json` | `.codex/eda-manifest.json` |
|
|
458
458
|
|
|
459
|
-
`eda update` идемпотентно синхронизирует обе группы компонентов и отдельно показывает реально изменившиеся скилы и агенты. Manifest хранит только идентификаторы компонентов, которыми владеет `eda`: благодаря этому retired-компоненты удаляются, а чужие скилы и агенты остаются нетронутыми. `eda update-all [dir]`
|
|
459
|
+
`eda update` заново собирает полный v2-конфиг, затем идемпотентно синхронизирует обе группы компонентов и отдельно показывает реально изменившиеся скилы и агенты. Manifest хранит только идентификаторы компонентов, которыми владеет `eda`: благодаря этому retired-компоненты удаляются, а чужие скилы и агенты остаются нетронутыми. `eda update-all [dir]` один раз собирает общий конфиг, записывает его во все найденные проекты и синхронизирует компоненты каждого проекта. Старые Codex-файлы `.codex/skills/<skill>.md` также удаляются при миграции.
|
|
460
460
|
|
|
461
461
|
Установленные копии не являются источником правды. Локальные изменения внутри `.claude/skills/eda-*`, `.codex/skills/eda-*`, `.claude/agents/eda-*` или `.codex/agents/eda-*` будут заменены следующим обновлением.
|
|
462
462
|
|
package/bin/cli.js
CHANGED
|
@@ -10,8 +10,8 @@ const HELP = `eda — установка и обновление скилов и
|
|
|
10
10
|
|
|
11
11
|
Использование:
|
|
12
12
|
eda init — выбрать целевые среды (Claude / Codex / обе) и установить пакет
|
|
13
|
-
eda update —
|
|
14
|
-
eda update-all [dir] —
|
|
13
|
+
eda update — заново настроить конфиг и обновить текущий проект
|
|
14
|
+
eda update-all [dir] — один раз настроить конфиг и обновить все проекты внутри dir
|
|
15
15
|
eda --version — показать версию
|
|
16
16
|
eda --help — показать эту справку
|
|
17
17
|
`;
|
package/lib/install.js
CHANGED
|
@@ -371,12 +371,13 @@ export async function update({ cwd, input = process.stdin, output = process.stdo
|
|
|
371
371
|
return;
|
|
372
372
|
}
|
|
373
373
|
output.write(`Найдены установленные среды: ${targets.join(', ')}\n`);
|
|
374
|
-
await
|
|
374
|
+
await configureSettings(cwd, { input, output });
|
|
375
375
|
await syncPackage(cwd, targets, output, { action: 'update' });
|
|
376
376
|
}
|
|
377
377
|
|
|
378
378
|
export async function updateAll({
|
|
379
379
|
root = process.cwd(),
|
|
380
|
+
input = process.stdin,
|
|
380
381
|
output = process.stdout,
|
|
381
382
|
maxDepth = UPDATE_ALL_MAX_DEPTH
|
|
382
383
|
} = {}) {
|
|
@@ -406,6 +407,9 @@ export async function updateAll({
|
|
|
406
407
|
}
|
|
407
408
|
|
|
408
409
|
output.write(`Найдено ${formatProjectCount(projects.length)}: ${projects.map(project => formatProjectPath(rootDir, project)).join(', ')}\n`);
|
|
410
|
+
output.write('Настройки будут запрошены один раз и записаны одинаково во все найденные проекты.\n');
|
|
411
|
+
const sharedSettings = await askSettings({ input, output });
|
|
412
|
+
const sharedSettingsContent = formatSettings(sharedSettings);
|
|
409
413
|
|
|
410
414
|
const updatedProjects = [];
|
|
411
415
|
const skippedProjects = [];
|
|
@@ -424,7 +428,8 @@ export async function updateAll({
|
|
|
424
428
|
}
|
|
425
429
|
|
|
426
430
|
output.write(`Найдены установленные среды: ${targets.join(', ')}\n`);
|
|
427
|
-
await
|
|
431
|
+
await writeSettingsContent(projectDir, sharedSettingsContent);
|
|
432
|
+
output.write(`Записан общий файл настроек: ${SETTINGS_RELATIVE_PATH}\n`);
|
|
428
433
|
const result = await syncPackage(projectDir, targets, output, {
|
|
429
434
|
action: 'update',
|
|
430
435
|
writeDone: false
|
|
@@ -481,7 +486,7 @@ export async function askTargets({ input = process.stdin, output = process.stdou
|
|
|
481
486
|
|
|
482
487
|
export async function askSettings({ input = process.stdin, output = process.stdout } = {}) {
|
|
483
488
|
if (!input.isTTY || !output.isTTY) {
|
|
484
|
-
output.write(`Нет интерактивного терминала —
|
|
489
|
+
output.write(`Нет интерактивного терминала — использую настройки ${SETTINGS_RELATIVE_PATH} по умолчанию.\n`);
|
|
485
490
|
return structuredClone(DEFAULT_SETTINGS);
|
|
486
491
|
}
|
|
487
492
|
|
|
@@ -786,16 +791,31 @@ async function findInstalledProjects(rootDir, maxDepth) {
|
|
|
786
791
|
}
|
|
787
792
|
|
|
788
793
|
async function ensureSettings(cwd, { input = process.stdin, output = process.stdout } = {}) {
|
|
789
|
-
const settingsPath = path.join(cwd, SETTINGS_RELATIVE_PATH);
|
|
790
794
|
const existing = await migrateSettingsIfNeeded(cwd, { output });
|
|
791
795
|
if (existing.exists) return;
|
|
792
796
|
|
|
793
797
|
const settings = await askSettings({ input, output });
|
|
794
|
-
await
|
|
795
|
-
await fs.writeFile(settingsPath, formatSettings(settings));
|
|
798
|
+
await writeSettingsContent(cwd, formatSettings(settings));
|
|
796
799
|
output.write(`Создан файл настроек: ${SETTINGS_RELATIVE_PATH}\n`);
|
|
797
800
|
}
|
|
798
801
|
|
|
802
|
+
async function configureSettings(cwd, { input = process.stdin, output = process.stdout } = {}) {
|
|
803
|
+
output.write(`Настраиваю ${SETTINGS_RELATIVE_PATH} заново.\n`);
|
|
804
|
+
const settings = await askSettings({ input, output });
|
|
805
|
+
await writeSettingsContent(cwd, formatSettings(settings));
|
|
806
|
+
output.write(`Записан файл настроек: ${SETTINGS_RELATIVE_PATH}\n`);
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
async function writeSettingsContent(cwd, content) {
|
|
810
|
+
const settingsPath = path.join(cwd, SETTINGS_RELATIVE_PATH);
|
|
811
|
+
await fs.mkdir(path.dirname(settingsPath), { recursive: true });
|
|
812
|
+
if (await fileExists(settingsPath)) {
|
|
813
|
+
await writeFileAtomically(settingsPath, content);
|
|
814
|
+
return;
|
|
815
|
+
}
|
|
816
|
+
await fs.writeFile(settingsPath, content);
|
|
817
|
+
}
|
|
818
|
+
|
|
799
819
|
async function migrateSettingsIfNeeded(cwd, {
|
|
800
820
|
output = process.stdout,
|
|
801
821
|
reportExisting = true
|