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

Справочник по CLI

Каждая подкоманда emet, таблица гейтов и записей, коды завершения и переменные окружения. Термины соответствуют GLOSSARY.md. Назад к README. Каждая команда выводит справку по использованию с --help.

Подкоманды

Три слэш-команды оборачивают CLI внутри Claude Code: /emet:run (конвейер), /emet:init (emet init) и /emet:doctor (emet doctor .). Для emet в обычном терминале нужен install.sh; иначе выполняйте ! emet <subcommand> внутри сессии.

emet <command> [...args]. emet --version выводит версию.

Настройка и аудит

  • emet migrate [--dry-run]: переименовывает устаревший репозиторий под имена emet.
  • emet init [--tracker linear|github|local] [--force]: автоматически определяет менеджер пакетов, основную ветку и вид трекера и записывает emet.config.json и файлы docs/agents/*.md. --tracker local настраивает локальный трекер.
  • emet doctor [--all] [<path> ...]: аудит любого числа репозиториев за раз, только на чтение; по умолчанию текущий каталог.
  • emet preflight [--run <id>] [--post-dispatch]: подтверждает, что репозиторий готов к диспетчеризации.
  • emet skill-path <name>: выводит абсолютный путь SKILL.md навыка из mattpocock-skills. Завершается кодом 1, если навык не найден.
  • emet selftest: запускает собственные модульные тесты CLI. Только для установки из исходников; скомпилированный бинарный файл завершается кодом 1 и предлагает выполнить emet doctor.

В любом git-репозитории:

Terminal window
emet init # autodetects package manager, trunk branch, tracker kind
emet preflight # confirms the repo is dispatch-ready

emet init оставляет маркер TODO(emet): в сгенерированных файлах docs/agents/*.md для всего, что не может определить сам (общая блокировка тестовой базы данных, владелец схемы и так далее). Заполните их; пока остаётся хотя бы один, emet preflight отказывается запускать диспетчеризацию.

Затем, внутри Claude Code:

/emet:run <describe the feature> # interview → wave 1; later waves via --dispatch/autoChain
/emet:run --draft <describe the feature> # stop after tickets are created
/emet:run --dispatch <spec-id> # dispatch a --draft'd spec later

Проверка флота

emet doctor проверяет несколько репозиториев сразу, только на чтение:

Terminal window
emet doctor ~/code/*

Для каждого репозитория отчёт показывает: корректный emet.config.json, наличие всех четырёх файлов docs/agents/*.md, отсутствие оставшихся маркеров TODO(emet):, действительно ли разрешаются команды из commands.selfCheck, а также результаты проверки зависимостей, специфичных для трекера этого репозитория (gh, Linear; см. зависимости). Плагин mattpocock-skills и флаги внешних CLI (gh, claude --bg, claude agents --json, проверяются через --help) проверяются один раз на весь обход, а не для каждого репозитория.

Запуски, воркеры и слоты

  • emet claims --reserve <ticket> --run <id> --anchor <pid>: резервирует тикет за запуском. --release <ticket>, --list и --prune [--dry-run] снимают захват, выводят список захватов или удаляют устаревшие.
  • emet slots --acquire --run <id> --anchor <pid> --ticket <ticket>: берёт слот воркера из общего пула хоста в ~/.local/state/emet/slots. --release --run <id>, --release-index <index> и --list освобождают слоты или выводят их список.
  • emet cleanup [--run <id> | --all] [--dry-run] [--force]: без аргументов освобождает ресурсы закрытых или мёртвых запусков, чья работа приземлилась; --run очищает этот запуск; --all — обход веток по всему репозиторию. После слияния emet cleanup --run <runId> освобождает ветки волны, захваты тикетов и слоты воркеров.
  • emet lock-reason --run <id> --ticket <ticket> [--anchor <pid>]: выводит причину git worktree lock, которую воркер записывает при начальной настройке.
  • emet launch <spec-id> --wave <n>: запускает волну как сессию claude --bg и открывает её вкладку Orca согласно handoff.launcher. Выполняет запуск целиком (проверка дубликатов сессий, claude --bg, вкладка) и выводит { name, id, attach, orcaTab: { opened, reason } }. Используйте его, а не голый claude --bg, когда нужно вручную запустить волну в другой сессии.
  • emet status [--spec <id>]: Working / Checking / Ready / Needs-decision по каждой волне в виде JSON плюс итоговая строка. emet status --help описывает этот JSON.
  • emet usage [--session <id> | --file <path>] [--stalled [--minutes N]] [--project-dir <path>]: сообщает об использовании сессии; --stalled выводит застрявших воркеров.
  • emet handoff --check <path> | --render <path>: проверяет или отображает заметку воркера .emet/handoff-<ticket>.md.
  • emet metrics [--run <id>]: сообщает токены, стоимость в эквиваленте API и время выполнения по тикету, по волне и по запуску, считывая их из транскриптов сессий. Также сравнивает бюджет контекста, оценённый для каждого тикета, с фактически использованным каждым воркером. Его сводка помещается в конец итогового отчёта запуска.

Планирование, ревью и посадка

  • emet validate --spec <id> | --file <path>: проверка плана; см. Гейты и записи.
  • emet surfaces --check <file.json | ->: отклоняет пересекающиеся glob-шаблоны разрешённых поверхностей между тикетами волны.
  • emet approve --run <id>, emet materialize-log, emet results, emet verify, emet review-package, emet review, emet gate: см. Гейты и записи.
  • emet assess --base <ref> --head <ref>: классифицирует diff как passive, medium или high и выводит JSON с уровнем, причинами и рекомендуемой моделью и усилием ревьюера. См. Модели и усилие и review.
  • emet land --spec <s> --branch <integration> --tickets <id,...>: сливает интеграционную ветку в локальный trunk (landing.mode merge). commands.selfCheck заменяет CI, и ничего не отправляется.
  • emet spec-merge --spec <id>: после автоматического слияния волны вливает дельты требований ADDED/MODIFIED/REMOVED спецификации в docs/specs/<area>.md (specs.dir). Перед записью проверяет каждую область. Конфликт или требование, которое потеряло бы сценарий, завершается кодом 1 и оставляет все файлы нетронутыми.
  • emet map [--refresh]: записывает обзор существующей кодовой базы (стек, структура, соглашения, тестирование, горячие точки) в docs/agents/codebase.md (map.path) с отметкой SHA коммита, по которому он построен. Один и тот же коммит всегда даёт один и тот же файл. emet map --stale завершается кодом 1, когда HEAD ушёл дальше отметки, и в этом случае emet preflight предупреждает. emet map --for <globs> выводит только разделы, соответствующие поверхностям правок тикета; этот вывод — единственная часть карты, входящая в задание воркера.
  • emet tracker create-spec|create-ticket|read|frontier|set-state|comment|close: локальный трекер поверх .scratch/, JSON в stdout. См. Локальный трекер.
  • emet guard: хук PreToolUse Claude Code; читает JSON хука из stdin. install.sh подключает его в ~/.claude/settings.json. Блокирует несколько известных причин сбоев при запусках без присмотра (см. emet/src/guard.ts).

Локальный трекер

При tracker.kind: "local" спецификации и тикеты — это markdown-файлы в .scratch/ основного worktree (не под версионным контролем): .scratch/<slug>/spec.md и .scratch/<slug>/issues/<NN>-<slug>.md, каждый со строками Status: и Blocked by: и комментариями под ## Comments. Координатор читает и записывает их через emet tracker (create-spec, create-ticket, read, frontier, set-state, comment, close). emet init --tracker local настраивает это. См. ADR-0011.

landing.mode — это "pr" (по умолчанию) или "merge", независимо от трекера. В режиме merge волна приземляется как одно локальное слияние в trunk командой emet land, при этом вместо CI выступает commands.selfCheck, а push не выполняется. gh нужен только если трекер — github или посадка выполняется через pr. См. ADR-0010 и landing.

PR посадки и цепочки волн

Одна волна — один PR. В его тексте для каждого тикета есть Closes #N (закрывающее ключевое слово трекера), а координатор переводит тикеты в in-review, когда открывает PR. Затем PR сливается согласно pr.autoMerge или остаётся открытым, если волна была помечена, autoMerge равен false или исправления CI закончились (тогда PR получает метку human-decision). Последующие волны выполняются в собственных сессиях, никогда не в той, что выполняла волну 1. Разделы pr и handoff управляют тем, что происходит дальше; см. pr и handoff.

Гейты и записи

Фазы сами не решают, когда тикет готов, пригоден к слиянию или заслуживает повторной попытки. Они вызывают команду CLI, которая читает запись на диске и выводит решение. Записи запусков хранятся в .emet/runs/<run-id>/, а журнал ревью — в .emet/review/, в основном чекауте, а не в worktree воркера.

Шаг Команда Что обеспечивает
Перед одобрением emet validate --file <plan.json> Каждый S# покрыт хотя бы одним тикетом и имеет сценарий приёмки. Каждый тикет покрывает хотя бы один S#. Поверхности правок внутри волны не пересекаются. Нет циклов зависимостей. emet preflight запускает проверку повторно на одобренном плане.
Одобрение emet approve --run <id> --spec <file> Записывает approval.json с хешами спецификации и списка тикетов. Диспетчеризация отклоняется, если что-либо из этого позже изменилось (--check).
Создание тикетов emet materialize-log --run <id> --record/--lookup Сохраняет ID каждого созданного тикета, как только он появился, поэтому прерванный запуск никогда не создаёт дубликатов.
Воркер завершил emet results --run <id> --write/--read <ticket> Воркеры записывают локальный файл результата (DONE, DONE_WITH_CONCERNS, BLOCKED или NEEDS_CONTEXT, плюс строка Risk:). В трекер пишет только координатор.
После каждого воркера emet verify <ticket> --run <id> Проверяет, что есть коммиты сверх базы диспетчеризации, каждый изменённый путь лежит внутри поверхностей правок тикета, заметка передачи проходит handoff --check, а commands.workerScopedSuite проходит. Ревью и слияние отказываются работать с тикетом без записи об успехе.
Вход ревью emet review-package <base> <head> --out <file> Собирает diff для ревьюера, который получает его как путь к файлу. Завершается кодом 3, если диапазон пуст или не является потомком base.
Ревью emet review --ticket <t> --findings <file> Ведёт журнал замечаний и обеспечивает порядок триажа (intent_gap → bad_plan → patch → defer) и предел раундов. --escalate переходит на следующий уровень модели. --rule/--rulings записывают и выводят «Rulings I made» для отчёта и текста PR.
Слияние или цепочка emet gate <ticket> --tier … --ci … --integration … Выводит merge, hold, chain, stop или defer в виде JSON с причинами. Читает запись verify, открытые замечания, уровень риска, CI, интеграционный набор тестов и бюджеты.

После того как ветки волны слиты вместе, commands.fullSuite один раз запускается на интеграционной ветке. Красный результат блокирует PR и autoChain. Гейт получает результат как --integration. О бюджетах, которые читает гейт, см. budgets.

Коды завершения

Коды завершения имеют одинаковый смысл во всех подкомандах.

Код Значение
0 Чисто.
1 Есть замечания, требующие действий.
2 Ошибка конфигурации или использования; инструмент на самом деле не запускался. Также неизвестная команда.
3 Внутренняя ошибка.

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

Переменные для пользователей. Заданная переменная переопределяет соответствующее значение конфигурации.

Переменная Действие
EMET_SKIP_DEPENDENCY_CHECKS EMET_SKIP_DEPENDENCY_CHECKS=1 emet preflight понижает блокировку по зависимостям до предупреждения для этого одного запуска. Задавайте её в собственной оболочке, а не в том, что координатор запускает без присмотра.
EMET_MAX_LIVE_WORKERS Переопределяет concurrency.maxLiveWorkers; принимает положительное целое или auto.
EMET_RUN_IDLE_THRESHOLD_MS Переопределяет concurrency.runIdleThresholdMs, в миллисекундах.
EMET_STATE_DIR Общий каталог состояния хоста, в котором хранится пул слотов воркеров. Порядок определения: $EMET_STATE_DIR, затем $XDG_STATE_HOME/emet, затем ~/.local/state/emet.
EMET_MEM_RESERVE_GIB Запас памяти в GiB, который должен оставаться свободным; захват слота отклоняется, если доступной памяти меньше. По умолчанию 8. Также влияет на предел воркеров auto.
EMET_MEM_PER_WORKER_GIB Память в GiB, принимаемая на одного воркера, когда maxLiveWorkers равен auto. По умолчанию 2. Увеличьте для более тяжёлого стека на воркера, например E2E-набора с браузером на каждый worktree.
EMET_CPU_OVERSUBSCRIBE Множитель CPU для предела воркеров auto. По умолчанию 1.

Предел auto равен clamp(min(cpuCount × EMET_CPU_OVERSUBSCRIBE, floor((memTotal − EMET_MEM_RESERVE_GIB) / EMET_MEM_PER_WORKER_GIB)), min, max). Устаревшие имена FORGE_* по-прежнему читаются; при наличии обоих приоритет у EMET_*.