Перейти к содержимому

Справочник по конфигурации

Каждый ключ emet.config.json со значением по умолчанию и смыслом. Источник истины — emet/schema/emet.config.schema.json. Термины соответствуют GLOSSARY.md. Назад к README.

emet init записывает файл. emet preflight и emet doctor проверяют его. Ключ с пометкой prose-only читают промпты /emet, а не CLI. Ключ с пометкой deprecated по-прежнему принимается. Схема также допускает свободный текстовый ключ "//" для заметок (его не читает ни один инструмент) и "version", который всегда равен 1.

pr

Как сливается PR волны.

{ "pr": { "autoMerge": true, "mergeMethod": "squash", "maxCiFixAttempts": 2 } }
  • autoMerge (по умолчанию true): дождаться проверок PR и слить; если проверок нет, слить сразу. Упавшая проверка исправляется и отправляется, до maxCiFixAttempts раз, после чего PR остаётся открытым для человека. Волна с чем-либо помеченным никогда не сливается автоматически.
  • mergeMethod (по умолчанию squash): squash, merge или rebase, передаётся в gh pr merge.
  • maxCiFixAttempts (по умолчанию 2, минимум 0): сколько раз координатор может попытаться исправить упавшую проверку, прежде чем оставить PR открытым для человека.

handoff

Что происходит после закрытия волны, и ограничения размера заметки передачи воркера. Проверяется emet preflight.

{
"handoff": {
"autoChain": false,
"launcher": "auto",
"permissionMode": "bypassPermissions"
}
}
  • maxLines (по умолчанию 60): наибольшее число строк в заметке .emet/handoff-<ticket>.md, после которого emet handoff --check её отклоняет.

  • maxChars (по умолчанию 8000, около 2k токенов): наибольшее число символов в заметке передачи.

  • autoChain (по умолчанию false): после чистой, слитой волны, если остались ещё волны, запустить следующую через claude --bg вместо вывода /emet:run --dispatch <spec-id>. Посмотреть её можно через claude agents или claude attach emet-<spec-id>-w<n>. Требования:

    1. claude в PATH с поддержкой --bg.
    2. Доверенное рабочее пространство. --bg работает неинтерактивно, поэтому диалог доверия не показывается; один раз откройте claude интерактивно в репозитории и подтвердите его.
    3. Предупреждение об обходе, один раз принятое в интерактивной сессии (skipDangerousModePermissionPrompt), поскольку следующая волна выполняется в handoff.permissionMode, а не в режиме запускающей сессии.

    Запуск происходит, только если PR слит и ничего не помечено, и пропускается, если сессия emet-<spec-id>-* уже активна (claude agents --json). Если запуск не удался, выводится /emet:run --dispatch <spec-id>.

  • launcher (по умолчанию auto, одно из auto, orca, bg): дополнительно открыть волну во вкладке Orca, выполняющей claude attach. auto опрашивает среду выполнения Orca (orca status), поэтому работает и из сессий claude --bg, у которых нет TERM_PROGRAM; orca пробует всегда; bg — никогда. В любом случае волна работает в фоне, а вкладка, которую не удалось открыть, никогда не останавливает цепочку. emet launch <spec-id> --wave <n> выполняет запуск целиком; см. emet launch.

  • permissionMode (по умолчанию bypassPermissions, одно из bypassPermissions, auto, acceptEdits): режим разрешений цепочечной сессии. Он не наследуется от запускающей сессии, потому что классификатор режима auto может отклонить шаг вроде gh pr merge и оставить волну недоделанной. Ваши правила permissions.deny по-прежнему действуют, но предупреждение об обходе нужно один раз принять интерактивно (skipDangerousModePermissionPrompt).

budgets

Все необязательны.

{ "budgets": { "workerAttempts": 2, "reviewRounds": 2, "stallNudgeCap": 6 } }
  • workerAttempts (по умолчанию 2, минимум 1): сколько раз тикет может провалить verify, прежде чем гейт ответит defer. Тикет получает метку deferred, а остальная часть волны продолжается. Сбой окружения, например выход тестовой команды с кодом 126/127 или сбой провайдера, приостанавливает запуск, не расходуя попытку.
  • reviewRounds (по умолчанию 2, минимум 1): сколько раундов ревью и исправлений получает тикет до одной эскалации на следующий уровень модели. Всё, что остаётся открытым после этого, получает решение.
  • stallNudgeCap (по умолчанию 6, минимум 1): сколько раз застрявшего воркера подталкивают. Счётчик никогда не сбрасывается.

models

Модель и усилие для каждой роли. Каждый ключ необязателен; если раздел опущен, остаются воркер sonnet/medium и ревьюер opus/medium. Усилие — одно из low, medium, high, xhigh, max.

{
"models": {
"worker": { "model": "sonnet", "effort": "medium" },
"reviewer": {
"medium": { "model": "opus", "effort": "medium" },
"high": { "model": "opus", "effort": "medium" }
},
"triage": "haiku"
}
}
  • worker.model (по умолчанию sonnet), worker.effort (по умолчанию medium): воркер. Строка Model: тикета переопределяет worker только для этого воркера.
  • reviewer.medium и reviewer.high (по умолчанию у каждого opus, medium): ревьюер для каждого уровня риска, возвращаемого emet assess. Повысьте reviewer.high.effort (например, до high), чтобы усилить проверку рискованных волн.
  • triage (по умолчанию haiku): недорогая модель для триажа логов CI и ревью уровня passive. Упавшая проверка передаётся агенту на этой модели, который возвращает не более примерно 2k токенов с указателями file:line.
  • escalation (по умолчанию { "sonnet": "opus" }): следующий уровень модели для каждого имени модели, используется, когда тикет достигает предела исправлений.

review

{ "review": { "highRiskPaths": [] } }
  • highRiskPaths (по умолчанию []): дополнительные подстроки путей без учёта регистра, которые принудительно задают уровень ревью high в emet assess сверх встроенного набора (аутентификация, безопасность, платежи, вебхуки, CI, установщик, lock-файлы, миграции и опасные sink, такие как сырой SQL или pipe-to-shell).

landing

  • mode (по умолчанию pr): pr открывает pull request (требуется gh). merge сливает интеграционную ветку в локальный trunk командой emet land и никогда не отправляет изменения, при этом вместо CI выступает commands.selfCheck. Не зависит от трекера. См. ADR-0010.

tracker

С каким трекером задач работает /emet. CLI читает kind, чтобы решить, какие проверки зависимостей применимы; остальное описывает адаптер, которому следует команда /emet (см. docs/agents/issue-tracker.md).

  • kind (обязателен): linear, github или local. Для local см. Локальный трекер и ADR-0011.
  • transitions.onStart, transitions.onPrOpen, transitions.onPrMerge: кто записывает каждый переход состояния тикета: worker, coordinator или automatic (это делает интеграция трекера, например интеграция Linear с GitHub при открытии или слиянии PR). Координатор никогда не записывает переход с пометкой automatic.
  • github.priorityLabels: сопоставляет уровень приоритета ("1" = P0 наивысший до "4" = P3) с именем метки GitHub, например {"1":"P0","2":"P1"}. Если ничего не объявлено, тикеты упорядочиваются по createdAt по возрастанию, и emet doctor сообщает об этом.
  • github.stateLabels: сопоставляет состояние рабочего процесса (todo, in-progress, in-review) с именем метки GitHub, например {"todo":"status:todo"}. done и canceled выводятся из закрытого состояния задачи и state_reason.
  • linear: настройки, специфичные для Linear (ключ команды, имена состояний рабочего процесса). Читаются только моделью, следующей docs/agents/issue-tracker.md, но не CLI.
  • local.idPrefix (deprecated): идентификаторы локальных тикетов теперь имеют вид <feature-slug>-<NN>.
  • readyLabel, triageLabels, prReference (deprecated): шаблоны меток и ссылок на PR, например Closes #{number} (github) или Refs: {id} (linear).

preflight

  • requiredFiles (по умолчанию нет): файлы, которые emet preflight требует в корне репозитория перед диспетчеризацией волны, каждый в виде { "path", "why" }; why показывается в сообщении об ошибке. Пустое значение означает, что проверка не выполняется.
  • requiredCommands (по умолчанию нет): бинарные файлы, которые должны разрешаться в PATH до диспетчеризации. emet preflight завершается кодом 1 с перечислением неразрешённых, а emet doctor сообщает о них. Это собственный список репозитория, отдельный от проверок зависимостей, определяемых трекером; для gh уже есть отдельная проверка, так что включать его необязательно. Частые дополнения: rg и sg.

specs

  • dir (по умолчанию docs/specs): каталог живых спецификаций относительно репозитория, в который пишет emet spec-merge.

map

  • path (по умолчанию docs/agents/codebase.md): путь относительно репозитория к карте, которую генерирует emet map.

concurrency

  • waveSize (по умолчанию 4, минимум 1): наибольшее число вызовов Agent, диспетчеризуемых вместе в одной волне.
  • maxLiveWorkers (по умолчанию auto): глобальный предел, общий для всех координаторов /emet, работающих на этом хосте, во всех репозиториях. Пул слотов находится в ~/.local/state/emet/slots, а не в каком-либо одном репозитории. auto выводит предел из числа процессоров и объёма ОЗУ хоста; положительное целое число фиксирует его. Отдельная проверка запаса памяти (EMET_MEM_RESERVE_GIB, по умолчанию 8 GiB) отклоняет захват слота, когда доступной памяти слишком мало, независимо от этого предела. Переменная окружения EMET_MAX_LIVE_WORKERS переопределяет это поле и тоже принимает auto.
  • runIdleThresholdMs (по умолчанию 5400000, 90 минут): как долго запуск без живого якоря всё ещё считается простаивающим, а не мёртвым, исходя только из свежести транскрипта. Переменная окружения EMET_RUN_IDLE_THRESHOLD_MS переопределяет его.

См. Переменные окружения.

ticket

  • idPattern: исходный текст якорного регулярного выражения, которому должен соответствовать идентификатор тикета, например ^PROJ-\d+$. Неверный шаблон — грубая ошибка конфигурации.
  • branchPrefix: префикс в нижнем регистре (^[a-z0-9-]+$) для локальной ветки воркера. Ветки имеют вид <branchPrefix>-<number>-<slug>, а cleanup обходит glob <branchPrefix>-*.
  • idExample (deprecated, prose-only): один пример идентификатора, соответствующий idPattern.
  • branchPattern (deprecated, prose-only): полный шаблон имени ветки.

commands

Все prose-only.

  • selfCheck: команды, которые воркер запускает, прежде чем считать изменение готовым, например ["npm run check"]. При landing.mode merge заменяет CI.
  • workerScopedSuite: команда, которой воркер тестирует только затронутую область. emet verify требует, чтобы она проходила.
  • fullSuite.run: команда для набора тестов всего репозитория, запускается один раз на интеграционной ветке после слияния веток волны. Красный результат блокирует PR и autoChain.
  • fullSuite.singleton: true, если набор тестов может запускать только один worktree одновременно.
  • fullSuite.runInBackground, fullSuite.reset (deprecated): флаг фонового запуска и команды сброса состояния.

worktree

  • lockReason: шаблон причины git worktree lock, которую воркер записывает при начальной настройке и которую заполняет emet lock-reason. По умолчанию это emet run={runId} ticket={ticket} anchor={anchorPid} slug={coordinatorSlug} at={iso}. Переопределяйте только для добавления полей: emet lock-reason отклоняет шаблон, в котором нет буквального токена emet, а также любого из run=, ticket=, anchor=, at= или slug=.
  • copyFromMain (prose-only): пути, копируемые из чекаута trunk в свежий worktree перед начальной настройкой, например неотслеживаемые env-файлы.
  • bootstrap (prose-only): shell-команды, выполняемые один раз в свежем worktree до старта воркера, например ["npm ci"]. Выполняются фазой 6 /emet, но не CLI.
  • stateDir (deprecated, prose-only): каталог для локальных логов запуска, например .emet.

usage

  • oversizedReadLines (по умолчанию 400, минимум 1): Read без offset и limit для файла длиннее этого числа строк считается чрезмерным в emet usage.
  • stalledMinutes (по умолчанию 10, минимум 1): порог --minutes по умолчанию для emet usage --stalled.

sizing

  • inlineMaxLines (по умолчанию 100, минимум 1): наибольший размер текста тикета в строках, остающегося встроенным в промпт воркера.

schema

Только prose-only. Принадлежность схем данных в этом репозитории, используется правилом избежания конфликтов фазы 3 при разбиении тикетов. Пустое значение или отсутствие пропускает правило.

  • ownedPaths: пути, определяющие общую схему, например ["prisma/schema.prisma"]. Затрагивать их может не более одного воркера на волну.
  • sharedDatabase (deprecated): true, если воркеры используют одну физическую базу данных.

commit

Только prose-only.

  • trailer: ключ git-трейлера, который воркер добавляет к коммитам со ссылкой на тикет, например Refs.
  • trailerPosition: body или footer.

repo

  • trunk: ветка, в которую сливаются изменения каждого воркера и которая служит базой любого git-сравнения в cleanup и preflight, например main.
  • remote (по умолчанию origin): git-удалённый репозиторий, на котором находится trunk.
  • integrationBranch (deprecated, prose-only): необязательная долгоживущая ветка, на которую волна интегрируется перед trunk.
  • commitTypes (deprecated, prose-only): допустимые типы Conventional Commit для коммитов воркеров.

design

Необязательно, prose-only. null или отсутствие пропускает шаг ревью дизайна и интерфейса.

  • canvasIndex (deprecated): путь к файлу дизайн-холста, который воркеры проверяют перед изменениями интерфейса.