@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Миграция на eda 1.0
2
2
 
3
- Версия 1.0 переводит `eda` с набора файлов-скилов на пакет с каноническими скилами и специализированными агентами для Claude Code и Codex CLI. Начиная с `1.0.1`, установщик обновляет управляемые компоненты и автоматически переводит существующий `docs/settings.yaml` версии 1 в актуальный формат версии 2.
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` ищет проекты на глубине до двух уровней, обновляет только уже найденные среды Claude/Codex и не создаёт отсутствующий `docs/settings.yaml`. Если конфиг существует с `version: 1`, команда автоматически мигрирует его на v2.
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`. Команды `eda init`, `eda update` и `eda update-all` распознают `version: 1`, переносят поддерживаемые значения, добавляют новые настройки с defaults и атомарно заменяют файл. Повторных интерактивных вопросов при миграции нет.
60
+ Версия 1.0 поддерживает только формат настроек `version: 2`. При `eda update` ответь на полный набор вопросов: команда соберёт новый профиль и атомарно заменит прежний файл независимо от его версии. `eda update-all` задаст эти вопросы только один раз и применит ответы ко всем проектам.
61
61
 
62
- Существующий v2 сохраняется без изменений. Файл без версии или с неизвестной версией установщик не переписывает, чтобы не повредить неподдерживаемый формат. Поля вне документированной схемы v1 в новый файл не переносятся.
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` установщик добавляет автоматически из сбалансированных defaults. Полный актуальный пример приведён в [README](README.md).
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. Команда обновляет только найденные среды, не создаёт отсутствующий `docs/settings.yaml`, но автоматически переводит найденный конфиг с `version: 1` на `version: 2`.
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` и `eda update` создают `docs/settings.yaml`, только если файла ещё нет. Существующий v2 сохраняется без изменений, а v1 автоматически и атомарно переписывается в v2 с переносом поддерживаемых значений. Файл неизвестной версии установщик не меняет. `eda update-all` не создаёт отсутствующие настройки, но также мигрирует найденный v1.
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 # обновить скилы и агенты, создать docs/settings.yaml, если его ещё нет
426
- eda update-all [dir] # обновить пакет во всех найденных проектах внутри dir на глубине 2
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]` делает то же самое для каждого найденного проекта, не создаёт отсутствующий `docs/settings.yaml`, но переводит найденный v1 в v2. Старые Codex-файлы `.codex/skills/<skill>.md` также удаляются при миграции.
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] — обновить пакет во всех найденных проектах внутри 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 ensureSettings(cwd, { input, output });
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 migrateSettingsIfNeeded(projectDir, { output, reportExisting: false });
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(`Нет интерактивного терминала — создаю ${SETTINGS_RELATIVE_PATH} с настройками по умолчанию.\n`);
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 fs.mkdir(path.dirname(settingsPath), { recursive: true });
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gian-tiaga/eda",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Пакет скилов и специализированных агентов eda-* для Claude Code и Codex CLI",
5
5
  "type": "module",
6
6
  "bin": {