@gian-tiaga/eda 3.10.0 → 3.10.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 +2 -2
- package/README.md +7 -7
- package/agents/eda-commit-executor/prompt.md +3 -3
- package/lib/install.js +31 -19
- package/package.json +1 -1
- package/skills/eda-commit/SKILL.md +3 -2
package/MIGRATION.md
CHANGED
|
@@ -77,9 +77,9 @@ docs/
|
|
|
77
77
|
|
|
78
78
|
Версия npm-пакета и версия схемы настроек независимы: в eda 3.3 актуальным остаётся `docs/settings.yaml` с `version: 3`.
|
|
79
79
|
|
|
80
|
-
Установщик по-прежнему сохраняет полный валидный v3
|
|
80
|
+
Установщик по-прежнему сохраняет полный валидный v3 как есть — кроме двух случаев: если в файле остались устаревшие ключи или если текст файла отстал от шаблона пакета. Тогда он перезаписывает файл без вопросов, сохраняет значения и печатает, что сделал. Старый, неизвестный или неполный YAML нормализуется: известные валидные значения переносятся, а отсутствующие спрашиваются в TTY или получают defaults без TTY.
|
|
81
81
|
|
|
82
|
-
В `eda update-all` режим `configure` один раз спрашивает общий профиль v3 и записывает его во все проекты. Режим `skip` сохраняет полный v3, индивидуально переносит остальные конфиги и создаёт defaults только при отсутствии файла.
|
|
82
|
+
В `eda update-all` режим `configure` один раз спрашивает общий профиль v3 и записывает его во все проекты. Режим `skip` сохраняет актуальный полный v3, перерисовывает устаревший по шаблону, индивидуально переносит остальные конфиги и создаёт defaults только при отсутствии файла.
|
|
83
83
|
|
|
84
84
|
## Ревью и полировка
|
|
85
85
|
|
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ eda init
|
|
|
25
25
|
|
|
26
26
|
`eda update` сначала переносит старые рабочие каталоги из `docs/<тип>/` в `docs/artifacts/<тип>/`, затем обновляет настройки, скилы и агентов. Содержимое файлов при переносе не меняется. Если один относительный путь уже существует в новой структуре, новый файл сохраняется, а старый удаляется.
|
|
27
27
|
|
|
28
|
-
Полный валидный v3-конфиг
|
|
28
|
+
Полный валидный v3-конфиг сохраняется, пока совпадает с актуальным шаблоном; если в пакете появились новые значения или подсказки, файл молча перерисовывается с сохранением ваших значений. Старый, неизвестный или неполный файл разбирается как YAML: известные значения переносятся, в TTY спрашиваются только отсутствующие, затем профиль целиком атомарно записывается как v3. Без TTY используются перенесённые значения и defaults.
|
|
29
29
|
|
|
30
30
|
Если пакет уже стоит во многих проектах, можно обновить его одной командой:
|
|
31
31
|
|
|
@@ -33,7 +33,7 @@ eda init
|
|
|
33
33
|
eda update-all ~/Code
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
`eda update-all` ищет проекты в указанной директории, её прямых подпапках и подпапках второго уровня. Проект считается найденным, если в нём уже есть установленный скил, агент или manifest `eda` для Claude/Codex. В каждом проекте команда переносит рабочие артефакты, затем предлагает настроить один общий профиль для всех проектов или выбрать `skip`. В режиме `skip` полный v3 сохраняется, старые и неполные конфиги индивидуально переносятся, отсутствующие создаются с defaults. Без TTY автоматически используется `skip`. Ошибка одного проекта не останавливает остальные.
|
|
36
|
+
`eda update-all` ищет проекты в указанной директории, её прямых подпапках и подпапках второго уровня. Проект считается найденным, если в нём уже есть установленный скил, агент или manifest `eda` для Claude/Codex. В каждом проекте команда переносит рабочие артефакты, затем предлагает настроить один общий профиль для всех проектов или выбрать `skip`. В режиме `skip` актуальный полный v3 сохраняется, устаревший по шаблону перерисовывается, старые и неполные конфиги индивидуально переносятся, отсутствующие создаются с defaults. Без TTY автоматически используется `skip`. Ошибка одного проекта не останавливает остальные.
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
@@ -59,7 +59,7 @@ eda update-all ~/Code
|
|
|
59
59
|
| `eda-manual-test` | Делает ручную проверку после изменений. По умолчанию проверка полная: разбирает план или другой артефакт по разделам, дополняет его фактическим `git diff HEAD` и закрывает матрицу областей — API, база данных, консольные команды, интерфейс, алгоритмы, фон и интеграции, права и роли, конфигурация, логи, регрессии рядом. Область нельзя закрыть чтением кода или зелёными автотестами; незакрытая область даёт `blocked`. Быстрый smoke включается настройкой `manual-test.depth` или словом в запросе. Применимая business-карточка может добавить только относящийся к задаче инвариант или сценарий. Не правит код, не пишет автотесты и не коммитит | `docs/artifacts/manual-tests/` |
|
|
60
60
|
| `eda-polish` | Оркестрирует доводку изменений: запускает полное `eda-review`, затем `eda-fix-by-review` и повторяет цикл до `clean` и отсутствия находок либо до лимита 5 итераций. В `main` оба контракта выполняет основной агент без субагентов, в `subagents` каждый шаг получает отдельный изолированный контекст. Все находки исправляются, score остаётся справочным. Не коммитит | `docs/artifacts/reviews/`, `docs/artifacts/review-fixes/` |
|
|
61
61
|
| `eda-send-review` | На `sonnet` / `gpt-5.6-terra` отправляет ревью на GitHub PR через `gh` всегда в едином формате: общий комментарий-сводка плюс комментарии к строкам кода. Без явно указанного типа использует `comment`; `approve` и `request-changes` берёт только из контекста текущего вызова. По настройке может скрыть предыдущие сводки eda-send-review и зарезолвить их inline-треды. По умолчанию шлёт все пункты. Claude-модель закрепляется при установке; Codex-модель хранится как рекомендуемый будущий override | (комментарий в PR) |
|
|
62
|
-
| `eda-commit` | Работает как лёгкий оркестратор одного `sonnet` / `gpt-5.6-terra` агента: тот сам собирает git-контекст, делит выбранный состав на логические коммиты, пишет сообщения и тексты PR по исходному запросу и фактическому diff, точечно коммитит и выполняет явно заданные push/PR/merge-действия. Для PR использует шаблон репозитория, отражает все группы изменений и указывает только реально выполненные проверки. С явным контекстом охватывает указанный состав; без контекста
|
|
62
|
+
| `eda-commit` | Работает как лёгкий оркестратор одного `sonnet` / `gpt-5.6-terra` агента: тот сам собирает git-контекст, делит выбранный состав на логические коммиты, пишет сообщения и тексты PR по исходному запросу и фактическому diff, точечно коммитит и выполняет явно заданные push/PR/merge-действия. Для PR использует шаблон репозитория, отражает все группы изменений и указывает только реально выполненные проверки. С явным контекстом охватывает указанный состав; без контекста коммитит всё — все tracked-изменения и все untracked-файлы независимо от авторства и связи с текущей задачей, кроме очевидных кэшей и локальных служебных артефактов вроде `.DS_Store`. В Claude Code сам оркестратор закреплён за `sonnet`; в Codex остаётся на активной модели сессии из-за отсутствия per-skill override. При вероятном секрете агент блокируется до индексации затронутой группы. После любого push всегда возвращает ссылку — на существующий PR или на его создание — и спрашивает, создавать ли PR, если его нет. Если продолжение не задано, предлагает применимые варианты | (git, опционально GitHub PR) |
|
|
63
63
|
| `eda-worktree` | На `haiku` / `gpt-5.6-luna` создаёт через пакетного агента git worktree рядом с основным проектом в папке `{name}-work-{n}` и одноимённую ветку. Базу берёт из аргумента или спрашивает | соседняя папка `{name}-work-{n}` |
|
|
64
64
|
| `eda-merge-worktree` | На `haiku` / `gpt-5.6-luna` мержит через пакетного агента ветку из соседнего worktree в текущую ветку. Принимает номер `1`, короткое имя `work-1` или полное имя `{name}-work-1`. Worktree и ветку после merge не удаляет | (git) |
|
|
65
65
|
| `eda-prepare-ai` | Выполняет технический bootstrap нового или существующего проекта: проектирует архитектуру, строгие правила и профиль инструментов, проходит полный каталог автоматических проверок, подбирает применимые AI-скилы, роли и MCP, затем создаёт AI-документацию. Один факт хранит у одного владельца: `docs/rules.md` содержит рабочие действия, запреты и команды проверок, а `docs/arch.md` — топологию исходного кода, ownership, зависимости и потоки без рабочих инструкций. Подтверждённые требования, стек и архитектурные драйверы из `eda-new-project` принимает как обязательный вход и не переоткрывает без обнаруженного конфликта. Для пустого проекта не выдумывает reference-карточки и не выдаёт неустановленные инструменты за доступные | `docs/rules.md`, `docs/arch.md`, `docs/references.md`, `docs/references/`, `AGENTS.md`, `CLAUDE.md` |
|
|
@@ -414,9 +414,9 @@ discover-automations:
|
|
|
414
414
|
|
|
415
415
|
Каждый скилл читает только свой раздел. Для `eda-review` прямое указание в текущем запросе может разово включить или отключить проверку и заменить её модель, например: «без performance, включи business, architecture на opus».
|
|
416
416
|
|
|
417
|
-
Поддерживается только `version: 3`. Полный валидный v3 установщик сохраняет
|
|
417
|
+
Поддерживается только `version: 3`. Полный валидный v3 установщик сохраняет как есть, пока его текст совпадает с шаблоном пакета; когда шаблон меняется — например, у настройки появляется новое допустимое значение, — файл перерисовывается без вопросов: ваши значения переносятся, посторонние ключи и ручные комментарии не сохраняются. Старые, неизвестные и неполные файлы разбираются через YAML: валидные известные значения переносятся, в TTY спрашиваются только отсутствующие, затем профиль целиком атомарно нормализуется. Без TTY недостающие поля получают defaults. `plan.meta_review` переносится в `plan.review`, а `plan-polish.strict` удаляется.
|
|
418
418
|
|
|
419
|
-
`eda update-all configure` записывает один общий v3-профиль. `skip` сохраняет полный v3
|
|
419
|
+
`eda update-all configure` записывает один общий v3-профиль. `skip` сохраняет актуальный полный v3 и перерисовывает устаревший по шаблону, индивидуально переносит остальные конфиги и создаёт defaults при отсутствии файла. Подробности перехода приведены в [MIGRATION.md](MIGRATION.md)
|
|
420
420
|
|
|
421
421
|
---
|
|
422
422
|
|
|
@@ -471,7 +471,7 @@ discover-automations может запускаться от review, fix-by-revie
|
|
|
471
471
|
|
|
472
472
|
Использовать всю цепочку не обязательно — каждый скил самодостаточен. Для полного прохода одной задачи можно вызвать `eda-orhestra automatic <задача>` или `eda-orhestra manual <задача>`. Разовые варианты: `eda-orhestra main <задача>`, `eda-orhestra main_propagated <задача>`, `eda-orhestra automatic без полировки плана <задача>`, `eda-orhestra полировка кода 2 итерации <задача>`, `eda-orhestra без ручных тестов <задача>`. Постоянный режим исполнения задаётся в `orhestra.execution`, порядок и аргументы — в `orhestra.steps`. Для прямой задачи без отдельного процесса вызови `eda-just-do-it <задача>`: скил сам выберет необходимый контекст, выполнит работу и сохранит отчёт. Новый проект можно начать с `eda-new-project`; существующий — с `eda-prepare-ai`, `eda-roadmap`, `eda-explore`, или сразу с `eda-plan-execute` на готовом плане, или просто `eda-commit`, когда правки уже сделаны. Для параллельной работы есть `eda-worktree`, а для возврата ветки из worktree в текущую ветку — `eda-merge-worktree`.
|
|
473
473
|
|
|
474
|
-
Вызов `eda-commit` без контекста охватывает все незакоммиченные tracked-изменения и
|
|
474
|
+
Вызов `eda-commit` без контекста охватывает все незакоммиченные tracked-изменения и все untracked-файлы, в том числе чужие и не относящиеся к текущей задаче; очевидные кэши, временные и локальные служебные артефакты вроде `.DS_Store` остаются вне коммитов. Executor сам делит полный состав на необходимое число логически цельных коммитов — один, три или больше. Например, запрос `eda-commit сразу отправь ветку, создай PR и дай ссылку` использует тот же полный состав и выполняет всю указанную цепочку без отдельного вопроса после серии коммитов.
|
|
475
475
|
|
|
476
476
|
---
|
|
477
477
|
|
|
@@ -526,7 +526,7 @@ eda update-all ~/Code
|
|
|
526
526
|
| Агент | `.claude/agents/<agent>.md` | `.codex/agents/<agent>.toml` |
|
|
527
527
|
| Manifest владения | `.claude/eda-manifest.json` | `.codex/eda-manifest.json` |
|
|
528
528
|
|
|
529
|
-
`eda update` переносит известные старые каталоги артефактов, сохраняет полный v3-конфиг как есть, а старый или неполный умно переносит и целиком нормализует; затем идемпотентно синхронизирует обе группы компонентов и отдельно показывает реально изменившиеся скилы и агенты. Manifest хранит только идентификаторы компонентов, которыми владеет `eda`: retired-компоненты удаляются, а чужие скилы и агенты остаются нетронутыми. `eda update-all [dir]` выполняет тот же перенос артефактов в каждом проекте, затем либо записывает общий профиль, либо в `skip` сохраняет полный v3 и переносит остальные настройки. При миграции Codex установщик переносит актуальные скилы в `.agents/skills/` и удаляет принадлежащие `eda` старые копии `.codex/skills/<skill>/` и `.codex/skills/<skill>.md`, не затрагивая чужие компоненты.
|
|
529
|
+
`eda update` переносит известные старые каталоги артефактов, сохраняет актуальный полный v3-конфиг как есть, устаревший по шаблону перерисовывает с сохранением значений, а старый или неполный умно переносит и целиком нормализует; затем идемпотентно синхронизирует обе группы компонентов и отдельно показывает реально изменившиеся скилы и агенты. Manifest хранит только идентификаторы компонентов, которыми владеет `eda`: retired-компоненты удаляются, а чужие скилы и агенты остаются нетронутыми. `eda update-all [dir]` выполняет тот же перенос артефактов в каждом проекте, затем либо записывает общий профиль, либо в `skip` сохраняет актуальный полный v3, перерисовывает устаревший по шаблону и переносит остальные настройки. При миграции Codex установщик переносит актуальные скилы в `.agents/skills/` и удаляет принадлежащие `eda` старые копии `.codex/skills/<skill>/` и `.codex/skills/<skill>.md`, не затрагивая чужие компоненты.
|
|
530
530
|
|
|
531
531
|
Установленные копии не являются источником правды. Локальные изменения внутри `.claude/skills/eda-*`, `.agents/skills/eda-*`, `.claude/agents/eda-*` или `.codex/agents/eda-*` будут заменены следующим обновлением.
|
|
532
532
|
|
|
@@ -40,12 +40,12 @@
|
|
|
40
40
|
5. Проверяй существующий PR текущей ветки, когда `USER_REQUEST` или `REQUESTED_ACTIONS` упоминает PR или push. Если предстоит создание или обновление PR, найди применимый шаблон PR в репозитории и прочитай его целиком.
|
|
41
41
|
6. Определи состав коммита:
|
|
42
42
|
- если `COMMIT_SCOPE` непустой, выбери соответствующий ему логический набор и отдели несвязанные пользовательские изменения;
|
|
43
|
-
- если `COMMIT_SCOPE` пустой,
|
|
43
|
+
- если `COMMIT_SCOPE` пустой, коммить всё: все незакоммиченные tracked-изменения — staged, unstaged и удаления — и все untracked-файлы во всём репозитории, кроме исключений пункта 7. Авторство, происхождение и связь с текущей задачей значения не имеют: чужие, посторонние, старые, частичные и незавершённые изменения входят в состав наравне с остальными. Не отбрасывай изменение как «не наше», «не по задаче», «сделано не мной» или «непонятно зачем» и не спрашивай про него. Несколько задач или несвязанных изменений в этом режиме охватываются одной серией коммитов и не требуют вопроса;
|
|
44
44
|
- не считай `push`, PR, merge и другие действия после коммита ограничением его состава.
|
|
45
|
-
7. В полном дефолтном наборе не включай очевидные локальные артефакты: кэши зависимостей и
|
|
45
|
+
7. В полном дефолтном наборе не включай очевидные локальные артефакты: кэши зависимостей и инструментов (`node_modules/`, `__pycache__/`, `.venv/`, `.turbo/`, `coverage/`), временные и swap-файлы (`*.tmp`, `*.bak`, `*.orig`, `*.swp`, `*~`), runtime-логи (`*.log`), системный мусор (`.DS_Store`, `._*`, `Thumbs.db`, `desktop.ini`) и локальное состояние IDE (`.idea/`, `.vscode/`). Список — ориентир, а не полный перечень: такой же очевидный локальный артефакт вне списка тоже исключай. Сгенерированный build/coverage-файл исключай только когда он untracked и правила или структура проекта явно показывают, что это локальный артефакт. Изменение уже tracked-файла считай намеренным и включай, даже если путь похож на generated; вероятный секрет обрабатывай отдельно как блокер.
|
|
46
46
|
8. Проверь выбранные изменения на вероятные секреты, токены, `.env` и другие приватные локальные данные. В `remaining_changes` перечисли все исключённые служебные артефакты.
|
|
47
47
|
|
|
48
|
-
Если изменений нет, верни `empty`. При непустом `COMMIT_SCOPE` верни `blocked`, если состав нельзя определить безопасно. При пустом `COMMIT_SCOPE` не блокируйся из-за нескольких задач, большого diff или отсутствия общей логической связности: распредели весь дефолтный набор по коммитам самостоятельно. Найденный вероятный секрет, конфликт с правилами или реальная небезопасность по-прежнему требуют `blocked` с одним вопросом и 2–3 вариантами. Сделай это до индексации затронутой группы.
|
|
48
|
+
Если изменений нет, верни `empty`. При непустом `COMMIT_SCOPE` верни `blocked`, если состав нельзя определить безопасно. При пустом `COMMIT_SCOPE` не блокируйся из-за нескольких задач, чужого авторства, большого diff или отсутствия общей логической связности: распредели весь дефолтный набор по коммитам самостоятельно. Найденный вероятный секрет, конфликт с правилами или реальная небезопасность по-прежнему требуют `blocked` с одним вопросом и 2–3 вариантами. Сделай это до индексации затронутой группы.
|
|
49
49
|
|
|
50
50
|
## Разбить состав на коммиты
|
|
51
51
|
|
package/lib/install.js
CHANGED
|
@@ -607,21 +607,18 @@ export async function updateAll({
|
|
|
607
607
|
const projectSettingsPath = path.join(projectDir, SETTINGS_RELATIVE_PATH);
|
|
608
608
|
if (resolvedSettingsMode === 'skip' && await fileExists(projectSettingsPath)) {
|
|
609
609
|
const existingContent = await fs.readFile(projectSettingsPath, 'utf8');
|
|
610
|
-
const migrated =
|
|
611
|
-
if (
|
|
612
|
-
migrated.version === SETTINGS_VERSION
|
|
613
|
-
&& migrated.missingKeys.size === 0
|
|
614
|
-
&& migrated.retiredPaths.length === 0
|
|
615
|
-
&& migrated.normalizedPaths.length === 0
|
|
616
|
-
) {
|
|
610
|
+
const { migrated, needsMigration, rendered, formatChanged } = resolveSettingsUpdate(existingContent);
|
|
611
|
+
if (!needsMigration && migrated.retiredPaths.length === 0 && !formatChanged) {
|
|
617
612
|
output.write(`Полный файл настроек сохранён: ${SETTINGS_RELATIVE_PATH}\n`);
|
|
618
613
|
} else {
|
|
619
|
-
await writeSettingsContent(projectDir,
|
|
614
|
+
await writeSettingsContent(projectDir, rendered);
|
|
620
615
|
output.write(migrated.retiredPaths.length > 0
|
|
621
616
|
? `Из файла настроек убраны устаревшие ключи (${migrated.retiredPaths.join(', ')}): ${SETTINGS_RELATIVE_PATH}\n`
|
|
622
617
|
: migrated.normalizedPaths.length > 0
|
|
623
618
|
? `Переименованы значения настроек (${migrated.normalizedPaths.join(', ')}): ${SETTINGS_RELATIVE_PATH}\n`
|
|
624
|
-
:
|
|
619
|
+
: needsMigration
|
|
620
|
+
? `Старый или неполный файл настроек перенесён на version: ${SETTINGS_VERSION}: ${SETTINGS_RELATIVE_PATH}\n`
|
|
621
|
+
: `Файл настроек обновлён до актуального формата, значения сохранены: ${SETTINGS_RELATIVE_PATH}\n`);
|
|
625
622
|
}
|
|
626
623
|
} else {
|
|
627
624
|
await writeSettingsContent(projectDir, sharedSettingsContent);
|
|
@@ -1089,12 +1086,14 @@ async function ensureSettings(cwd, { input = process.stdin, output = process.std
|
|
|
1089
1086
|
return;
|
|
1090
1087
|
}
|
|
1091
1088
|
|
|
1092
|
-
const migrated =
|
|
1093
|
-
const needsMigration = migrated.version !== SETTINGS_VERSION
|
|
1094
|
-
|| migrated.missingKeys.size > 0
|
|
1095
|
-
|| migrated.normalizedPaths.length > 0;
|
|
1089
|
+
const { migrated, needsMigration, rendered, formatChanged } = resolveSettingsUpdate(existingContent);
|
|
1096
1090
|
if (!needsMigration && migrated.retiredPaths.length === 0) {
|
|
1097
|
-
|
|
1091
|
+
if (!formatChanged) {
|
|
1092
|
+
output.write(`Настройки уже есть: ${SETTINGS_RELATIVE_PATH}\n`);
|
|
1093
|
+
return;
|
|
1094
|
+
}
|
|
1095
|
+
await writeSettingsContent(cwd, rendered);
|
|
1096
|
+
output.write(`Обновил ${SETTINGS_RELATIVE_PATH} до актуального формата: значения сохранены.\n`);
|
|
1098
1097
|
return;
|
|
1099
1098
|
}
|
|
1100
1099
|
|
|
@@ -1125,12 +1124,14 @@ async function configureSettings(cwd, { input = process.stdin, output = process.
|
|
|
1125
1124
|
return;
|
|
1126
1125
|
}
|
|
1127
1126
|
|
|
1128
|
-
const migrated =
|
|
1129
|
-
const needsMigration = migrated.version !== SETTINGS_VERSION
|
|
1130
|
-
|| migrated.missingKeys.size > 0
|
|
1131
|
-
|| migrated.normalizedPaths.length > 0;
|
|
1127
|
+
const { migrated, needsMigration, rendered, formatChanged } = resolveSettingsUpdate(existingContent);
|
|
1132
1128
|
if (!needsMigration && migrated.retiredPaths.length === 0) {
|
|
1133
|
-
|
|
1129
|
+
if (!formatChanged) {
|
|
1130
|
+
output.write(`Настройки ${SETTINGS_RELATIVE_PATH} версии ${SETTINGS_VERSION} полные — вопросы не требуются.\n`);
|
|
1131
|
+
return;
|
|
1132
|
+
}
|
|
1133
|
+
await writeSettingsContent(cwd, rendered);
|
|
1134
|
+
output.write(`Обновил ${SETTINGS_RELATIVE_PATH} до актуального формата: значения сохранены, вопросы не требуются.\n`);
|
|
1134
1135
|
return;
|
|
1135
1136
|
}
|
|
1136
1137
|
|
|
@@ -1150,6 +1151,17 @@ async function configureSettings(cwd, { input = process.stdin, output = process.
|
|
|
1150
1151
|
output.write(`Переписан файл настроек: ${SETTINGS_RELATIVE_PATH} → version: ${SETTINGS_VERSION}.\n`);
|
|
1151
1152
|
}
|
|
1152
1153
|
|
|
1154
|
+
// Конфиг несёт подсказки и списки допустимых значений, поэтому при обновлении пакета
|
|
1155
|
+
// его форма пересобирается заново: значения пользователя переносятся, текст догоняет актуальный.
|
|
1156
|
+
function resolveSettingsUpdate(existingContent) {
|
|
1157
|
+
const migrated = migrateSettingsContent(existingContent);
|
|
1158
|
+
const needsMigration = migrated.version !== SETTINGS_VERSION
|
|
1159
|
+
|| migrated.missingKeys.size > 0
|
|
1160
|
+
|| migrated.normalizedPaths.length > 0;
|
|
1161
|
+
const rendered = formatSettings(migrated.settings);
|
|
1162
|
+
return { migrated, needsMigration, rendered, formatChanged: rendered !== existingContent };
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1153
1165
|
async function writeSettingsContent(cwd, content) {
|
|
1154
1166
|
const settingsPath = path.join(cwd, SETTINGS_RELATIVE_PATH);
|
|
1155
1167
|
await fs.mkdir(path.dirname(settingsPath), { recursive: true });
|
package/package.json
CHANGED
|
@@ -13,7 +13,7 @@ description: 'Коммитит выбранные или все незакомм
|
|
|
13
13
|
|
|
14
14
|
Извлеки `$REQUESTED_ACTIONS`: ограничения и цепочку действий после коммита — `push`, отправить ветку, создать или обновить PR, вернуть ссылку, merge, переключить или удалить ветку. Поздний общий вопрос не отменяет конкретную команду из более ранней части того же сообщения.
|
|
15
15
|
|
|
16
|
-
Извлеки `$COMMIT_SCOPE`: явно названные файлы, каталоги, задача или другое ограничение состава коммита. Само имя `eda-commit` и действия после коммита не задают scope. Если такого контекста нет, оставь `$COMMIT_SCOPE` пустым: это означает
|
|
16
|
+
Извлеки `$COMMIT_SCOPE`: явно названные файлы, каталоги, задача или другое ограничение состава коммита. Само имя `eda-commit` и действия после коммита не задают scope. Если такого контекста нет, оставь `$COMMIT_SCOPE` пустым: это означает закоммитить всё незакоммиченное независимо от авторства и связи с текущей задачей, а не вопрос о выборе файлов.
|
|
17
17
|
|
|
18
18
|
Пример: `eda-commit сразу отправь ветку и создай PR и дай ссылку` означает `commit → push → create-or-find PR → return URL`. После коммита не спрашивай, что делать дальше.
|
|
19
19
|
|
|
@@ -75,7 +75,7 @@ COMMIT_SCOPE:
|
|
|
75
75
|
Верни результат строго по YAML-контракту агента.
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
Агент сам собирает git-контекст, читает правила и историю, формирует сообщения коммитов и тексты PR по исходному запросу и фактическому diff, точечно коммитит и выполняет разрешённое продолжение. Форму этих текстов — язык, вид заголовка, префиксы, части тела — он берёт из `AGENTS.md`, `CLAUDE.md` и `docs/rules.md`, а если там о сообщениях ничего нет — из последних коммитов. Содержание берётся из фактического diff. При непустом `$COMMIT_SCOPE` он выбирает соответствующий состав. При пустом `$COMMIT_SCOPE` включает все tracked-изменения и
|
|
78
|
+
Агент сам собирает git-контекст, читает правила и историю, формирует сообщения коммитов и тексты PR по исходному запросу и фактическому diff, точечно коммитит и выполняет разрешённое продолжение. Форму этих текстов — язык, вид заголовка, префиксы, части тела — он берёт из `AGENTS.md`, `CLAUDE.md` и `docs/rules.md`, а если там о сообщениях ничего нет — из последних коммитов. Содержание берётся из фактического diff. При непустом `$COMMIT_SCOPE` он выбирает соответствующий состав. При пустом `$COMMIT_SCOPE` включает все tracked-изменения и все untracked-файлы, исключая только очевидные кэши, временные, системные и локальные служебные артефакты вроде `.DS_Store`, `Thumbs.db`, `node_modules/`, `.idea/` или `*.log`. Чужие, посторонние и не относящиеся к текущей задаче изменения он тоже коммитит и не спрашивает про них. Выбранный состав он сам делит на необходимое число логически цельных коммитов и создаёт их по порядку; несколько задач в полном дефолтном наборе не являются причиной для вопроса. При вероятном секрете или другой реальной небезопасности он обязан вернуть `blocked` до индексации затронутой группы.
|
|
79
79
|
|
|
80
80
|
Явная команда пользователя разрешает обычные ожидаемые действия и безопасные предпосылки в её рамках. Например, «создай PR» разрешает обычный push текущей ветки, если без него PR создать нельзя. Она не разрешает force-push, публикацию секретов или другое не названное рискованное действие.
|
|
81
81
|
|
|
@@ -124,6 +124,7 @@ COMMIT_SCOPE:
|
|
|
124
124
|
- Делить сбор контекста и коммит между разными агентами или выполнять повторный модельный проход без блокера.
|
|
125
125
|
- Пересказывать предыдущий результат вместо передачи полного YAML при продолжении.
|
|
126
126
|
- Терять начало `$USER_REQUEST` из-за последующего вопроса или ответа.
|
|
127
|
+
- Пропускать изменения при пустом `$COMMIT_SCOPE` из-за того, что они чужие, не по задаче или выглядят незаконченными.
|
|
127
128
|
- Спрашивать про push или PR, если пользователь уже явно приказал выполнить их.
|
|
128
129
|
- Заканчивать выполненный push без ссылки на PR или на его создание.
|
|
129
130
|
- Отключать hooks, использовать `--amend`, делать force-push в `main`/`master` или создавать дубликат PR.
|