11 KiB
codex-crew — дизайн
Одноразовая спека. Удалить после реализации.
Цель
Плагин Claude Code: Codex как полноценный сабагент-исполнитель без сандбоксов и
ограничений. Оркестратор общается с ним как с обычным Claude-сабагентом:
даёт задание, получает ответ, шлёт follow-up через SendMessage. Заменяет
плагин openai-codex (его выключаем).
Ключевые свойства:
- Никаких
-s/--dangerously-*флагов: голыйcodex execнаследует~/.codex/config.tomlюзера (danger-full-access, approval never, все MCP, gpt-5.5 high). - Асинхронность: сабагент не блокируется на codex, всегда отвечает оркестратору.
- Надёжная детекция завершения/зависания/ошибки — детерминированным скриптом, не LLM-угадыванием по выводу.
Структура
codex-crew/
.claude-plugin/plugin.json
agents/codex.md # сабагент-транспорт
skills/
codex-agent/SKILL.md # делегировать исполнение
codex-review/SKILL.md # ревью ветки/коммита/файлов
codex-consult/SKILL.md # второе мнение, итерации до консенсуса
scripts/codex-run.sh # watchdog-запускалка
docs/design.md # эта спека
Установка: локальная marketplace (/plugin marketplace add ~/Projects/codex-crew),
как caveman/ponytail. Плагин openai-codex отключить.
scripts/codex-run.sh
Детерминированная обвязка вокруг codex exec. Интерфейс:
codex-run.sh <job_dir> exec [codex-флаги...] <prompt>
codex-run.sh <job_dir> resume <thread_id> [codex-флаги...] <prompt>
codex-run.sh <job_dir> review [--base X | --commit Y | --uncommitted] [codex-флаги...] [instructions]
Codex-флаги (модель, sandbox, effort и т.д. — см. «Переопределяемые
параметры») пробрасываются в codex exec без интерпретации.
Поведение:
- Запускает
codex exec --json -o <job_dir>/last.md ... > <job_dir>/events.jsonl 2> <job_dir>/err.log. - Парсит
thread_idиз событияthread.started→ пишет<job_dir>/thread_id. - Watchdog: цикл ~30 c; если процесс жив, а mtime
events.jsonlстарше$CODEX_STALL_TIMEOUT(default 600 c) → kill. Сессия codex персистентна, kill безопасен — продолжается черезresume. - На выходе пишет
<job_dir>/status:ok— codex завершил turn нормально (есть turn.completed / exit 0)stalled— убит watchdog'ом по стагнацииerror: <короткая причина>— ненулевой exit, ошибка API и т.п.
- Exit code скрипта: 0 только при
ok.
Всё наблюдаемое состояние — файлы в job_dir. Никакого tmux: codex exec
не интерактивен, «nudge» = kill + resume <thread_id>.
agents/codex.md
Frontmatter: model: sonnet (не Fable — правило юзера), tools: Bash, Read.
Протокол (тело агента):
- Получил задание → создать
job_dirв scratchpad, запуститьcodex-run.sh <job_dir> exec ...через Bashrun_in_background. - Проснулся по завершении фоновой таски → читать
status:ok→ вернуть оркестратору содержимоеlast.md+ строкуthread_id: <uuid>(для последующих resume).stalled/error→ до 3 попытокcodex-run.sh <job_dir> resume <thread_id> "You were interrupted. Continue the task."; не помогло — честный отчёт об ошибке с хвостомerr.log.
- SendMessage от оркестратора (follow-up, ответ на вопрос codex, новая
реплика консультации) →
codex-run.sh <job_dir> resume <thread_id> <текст>→ вернуть ответ. - SendMessage «статус?» пока codex работает → прочитать хвост
events.jsonl, ответить, чем codex занят, не прерывая его. - Вопрос/блокер от codex приходит как обычный финальный текст turn'а — вернуть оркестратору как есть (оркестратор ответит через SendMessage).
Путь к скрипту — через ${CLAUDE_PLUGIN_ROOT}/scripts/codex-run.sh.
Транспортная преамбула: сабагент префиксует первое задание codex'у коротким блоком (зашит в agents/codex.md): «Работаешь неинтерактивно как исполнитель для другого агента. Блокер или нужно решение — заверши turn чётким вопросом, диалог продолжится через resume. Финальное сообщение = отчёт: что сделано, какие файлы тронуты, как проверено.» Особенности exec-режима — знание транспорта, оркестратор про них не думает.
Переопределяемые параметры codex
Дефолт — без флагов: наследуется ~/.codex/config.toml (yolo: danger-full-access,
approval never, gpt-5.5, reasoning high, все MCP). Любой параметр
переопределяется на запуск. Механизм сквозной: оркестратор передаёт сабагенту
опциональную строку codex options: <флаги>, сабагент пробрасывает её в
codex-run.sh, тот — в codex exec как есть.
Таблица частых переопределений (войдёт в agents/codex.md и скиллы):
| Что | Флаг |
|---|---|
| Модель | -m <model> (например -m o3) |
| Reasoning effort | -c model_reasoning_effort="minimal|low|medium|high|xhigh" |
| Права/sandbox | -s read-only / -s workspace-write / -s danger-full-access (default) |
| Рабочая директория | -C <dir> |
| Доп. write-директории | --add-dir <dir> |
| Картинки в промпт | -i <file> (повторяемый) |
| Структурированный ответ | --output-schema <schema.json> |
| Профиль конфига | -p <profile> ($CODEX_HOME/.config.toml) |
| Фичи вкл/выкл | --enable <feature> / --disable <feature> |
| Любой конфиг-ключ | -c key=value (dotted path, TOML-значение) |
Запрещён --ephemeral — ломает resume. Точные допустимые значения effort
сверить при имплементации.
Скиллы (тонкие, для оркестратора)
Все три: «спавни агента codex, промпт формируй так». Общее: передавать cwd
проекта, нужные файлы/пути, критерии готовности; thread_id из ответа
использовать для follow-up через SendMessage.
Каждый скилл содержит скелет промпта — не жёсткую форму, а список «что обязано быть» + пример:
-
codex-agent: задание, cwd, релевантные файлы, критерии приёмки, что вернуть.
-
codex-review: скоуп, формат находок
file:line — severity — проблема — фикс, без похвал и пересказа. -
codex-consult: роль «второе мнение, не исполнитель — не переписывай артефакт, дай находки и рекомендации», требования юзера, сам артефакт.
-
codex-agent — делегировать задачу (код, фикс, исследование). Триггеры: «отдай кодексу», «пусть codex сделает/напишет/починит». После завершения — оркестратор проверяет результат (diff, тесты).
-
codex-review — ревью. Триггеры: «ревью у кодекса», «пусть codex посмотрит ветку/коммит/файл». Скоуп:
--base/--commit/--uncommitted/ произвольные файлы обычным exec-промптом. Выход — список находок. -
codex-consult — второе мнение (спека, план, любой артефакт). Передать артефакт + требования юзера; итерировать через SendMessage до консенсуса, лимит ~5 итераций; финал — резюме: что согласовано, что осталось спорным. Это же — точка входа для superpowers-циклов (спека/план), без жёсткой привязки к ним.
Проверить при имплементации
- Доставляется ли результат сабагента родителю автоматически при re-invoke
фоновой таской. Если нет — fallback: скиллы велят оркестратору пинговать
SendMessage'ем; сабагент отвечает по файлам
job_dir. codex exec review: есть ли--json/-oи thread_id. Если нет — забирать stdout целиком; ревью-итерации черезresume --lastили обычный exec.
Вне скоупа
Глубокая интеграция с superpowers (кастомные ветки их воркфлоу), поддержка нескольких параллельных codex-сессий одним сабагентом (одна сессия = один сабагент; параллельность — спавном нескольких сабагентов).