Справочник по 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-репозитории:
emet init # autodetects package manager, trunk branch, tracker kindemet preflight # confirms the repo is dispatch-readyemet 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 проверяет несколько репозиториев сразу, только на чтение:
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.modemerge).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: хукPreToolUseClaude 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_*.