<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Codex on Блог Сергея Клюкина</title><link>https://sklukin.ru/tags/codex/</link><description>Recent content in Codex on Блог Сергея Клюкина</description><generator>Hugo</generator><language>ru-RU</language><lastBuildDate>Mon, 21 Sep 2026 12:40:44 +0000</lastBuildDate><atom:link href="https://sklukin.ru/tags/codex/index.xml" rel="self" type="application/rss+xml"/><item><title>agent-bus: как я связал Claude Code и Codex для совместной разработки</title><link>https://sklukin.ru/posts/agent-bus-claude-code-codex/</link><pubDate>Mon, 21 Sep 2026 17:36:43 +0500</pubDate><guid>https://sklukin.ru/posts/agent-bus-claude-code-codex/</guid><description>Как устроен agent-bus: локальный канал между Claude Code и Codex, который добавляет быстрое агентное ревью прямо в процесс разработки.</description><content:encoded><![CDATA[<p>Последнее время для ревью кода я использовал revmux. Он хорошо решает конкретную задачу: разработка завершена, изменение собрано в понятный результат, после чего несколько агентов независимо проверяют код.</p>
<p>Со временем мне стало интересно, что произойдёт, если добавить общение между агентами раньше. Архитектурные решения, спорные допущения и неудачные направления появляются непосредственно во время разработки. В этот момент второе мнение приносит больше пользы, потому что изменить подход ещё легко.</p>
<p>Так появился <strong>agent-bus</strong>.</p>
<h2 id="канал-между-двумя-рабочими-сессиями">Канал между двумя рабочими сессиями</h2>
<p>agent-bus связывает Claude Code с уже открытым чатом Codex на той же машине. Claude отправляет вопрос, Codex получает его в контексте проекта, отвечает, и Claude продолжает работу с учётом обсуждения.</p>
<p>Переписка остаётся в обычном окне Codex. Я вижу обе стороны разговора и могу подключиться в любой момент: уточнить вводные, остановить неверное направление или ответить вместо агента.</p>
<p>У транспорта нет встроенных ролей. Роль определяется договорённостью внутри конкретной задачи. Claude может писать код, а Codex проводить ревью. В другой ситуации они могут вместе обсуждать архитектуру или поменяться местами.</p>
<p>В комплекте есть несколько готовых режимов:</p>
<ul>
<li><code>author-reviewer</code>, когда первый агент реализует изменение, а второй проверяет готовый результат;</li>
<li><code>reviewer-author</code>, зеркальный сценарий;</li>
<li><code>discuss</code>, свободное обсуждение без фиксированных ролей.</li>
</ul>
<p>Можно передать и собственное соглашение: кто за что отвечает, какой контекст должен попасть в handoff, что считается блокирующим замечанием и сколько раундов обсуждения допустимо.</p>
<h2 id="какой-рабочий-процесс-получился-у-меня">Какой рабочий процесс получился у меня</h2>
<p>Первый агент начинает выполнять задачу и вносить изменения.</p>
<p>Как только у него появляется результат, который уже можно показать второму агенту, он отправляет сообщение с описанием изменений, контекстом и вопросами.</p>
<p>После этого первый агент продолжает работу. Ждать ответа не требуется, поэтому проверка идёт параллельно с разработкой.</p>
<p>Второй агент изучает изменения и присылает результат, когда заканчивает проверку. Это может быть <code>APPROVE</code> или <code>REQUEST_CHANGES</code> с конкретными замечаниями.</p>
<p>Получив ответ, первый агент приостанавливает текущую активность и разбирает ревью. Если замечание справедливое, он исправляет причину и отправляет обновлённый результат. Если агент не согласен, он отвечает аргументированно и прикладывает подтверждения.</p>
<p>Таких раундов может быть несколько. Агенты сами понимают, когда нужен ещё один проход, а когда решение уже можно считать согласованным.</p>
<p>В итоге ревью идёт небольшими порциями параллельно с разработкой. Ошибочное направление обнаруживается раньше, а контекст не приходится восстанавливать после завершения всей задачи.</p>
<h2 id="опыт-использования">Опыт использования</h2>
<p>Объективно оценить эффект пока сложно. У меня нет достаточного количества одинаковых задач, которые можно было бы выполнить с agent-bus и без него, а затем сравнить по понятным метрикам.</p>
<p>Субъективно качество получается выше.</p>
<p>Главная причина в скорости обратной связи. Один агент успевает показать промежуточное решение второму ещё до того, как вокруг него вырастет много нового кода. Замечания приходят, пока исходные решения остаются в контексте и их легко изменить.</p>
<p>По ощущениям это похоже на парное программирование. Один участник двигает реализацию вперёд, второй периодически смотрит на решение со стороны, задаёт вопросы и замечает риски. Здесь роль пары выполняют два агента, а человек наблюдает за процессом и подключается там, где требуется решение.</p>
<p>Есть ещё один эффект. Первый агент знает, что результат скоро увидит второй. Поэтому ему приходится лучше формулировать причины изменений, собирать доказательства и явно обозначать места, в которых он сомневается. Сам handoff становится дополнительной проверкой собственного решения.</p>
<p>При этом разработка не блокируется на каждом сообщении. Первый агент продолжает работу, пока второй занят проверкой. Обратная связь остаётся быстрой, но ожидание не превращается в простой.</p>
<h2 id="что-внутри">Что внутри</h2>
<p>agent-bus состоит из одного Node.js-скрипта и файлового mailbox в:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">~/.local/state/agent-bus
</span></span></code></pre></div><p>Сервер и сетевой транспорт не используются. Сообщения записываются в локальные файлы, а операции выполняются через атомарное переименование.</p>
<p>Каталог mailbox создаётся с правами <code>0700</code>. CLI отказывается работать с каталогом, который принадлежит другому пользователю или имеет небезопасные разрешения.</p>
<p>Если подходящего чата Codex нет, можно запустить фоновый read-only процесс. Основным сценарием всё равно остаётся открытый чат: он сохраняет прозрачность и позволяет человеку войти в разговор.</p>
<h2 id="установка">Установка</h2>
<p>Сначала подключаем marketplace и устанавливаем плагин в Claude Code:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/plugin marketplace add Educentr/claude
</span></span><span class="line"><span class="cl">/plugin install agent-bus@educentr-marketplace
</span></span></code></pre></div><p>Затем устанавливаем часть для Codex:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/agent-bus:install
</span></span></code></pre></div><p>После перезапуска Codex открываем чат в каталоге проекта, отправляем в него любое первое сообщение и подключаемся из Claude Code:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/agent-bus:connect
</span></span><span class="line"><span class="cl">/agent-bus:mode author-reviewer
</span></span></code></pre></div><p>Дальше можно формулировать запросы обычным языком:</p>
<ul>
<li>«спроси Codex»;</li>
<li>«обсуди с Codex архитектуру»;</li>
<li>«отдай изменение на ревью».</li>
</ul>
<p>Сейчас инструмент разработан и проверен на macOS. Для работы нужны Node.js, Codex CLI, <code>lsof</code> и <code>ps</code>. Поддержку Linux я пока не заявляю.</p>
<h2 id="почему-я-сделал-свой-инструмент">Почему я сделал свой инструмент</h2>
<p>Вполне возможно, что похожее решение уже существует.</p>
<p>Раньше я бы начал с поиска: собрал список инструментов, прочитал документацию, сравнил архитектуру, установил несколько кандидатов и попытался понять, совпадают ли они с моим сценарием.</p>
<p>В агентской разработке экономика этого решения изменилась.</p>
<p>Иногда быстрее сразу описать нужное поведение и собрать узкий рабочий инструмент. За то же время поиск готового решения только приводит к этапу, где его ещё предстоит изучить, настроить и адаптировать под свой процесс.</p>
<p>В случае agent-bus я довольно точно представлял результат:</p>
<ul>
<li>Claude Code должен писать в уже открытый чат Codex;</li>
<li>вся переписка должна оставаться перед глазами;</li>
<li>человек может подключиться в любой момент;</li>
<li>роли определяются внутри разговора;</li>
<li>транспорт работает локально и обходится без отдельного сервиса.</li>
</ul>
<p>При таких вводных собственная реализация оказалась самым коротким путём от идеи до работающего инструмента.</p>
<p>Конечно, у этого подхода есть цена. Свой код придётся поддерживать, проверять после обновлений Claude Code и Codex, документировать и развивать. Поэтому он особенно хорошо работает для небольших инструментов с чёткими границами.</p>
<p>Но сам сдвиг мне кажется интересным. Раньше выбор часто выглядел как «найти готовое решение или потратить много времени на разработку». Теперь стоимость первой рабочей версии стала заметно ниже.</p>
<p>Иногда проще сначала собрать именно то, что хочется получить, проверить идею на реальной задаче и уже потом изучать существующие решения.</p>
<p>Код постепенно становится самой дешёвой частью эксперимента. Гораздо важнее точно сформулировать желаемое поведение и понять, работает ли оно в реальном процессе.</p>
<p>Дивный мир.</p>
<h2 id="зачем-мне-это-понадобилось">Зачем мне это понадобилось</h2>
<p>Мне хотелось сохранить сильные стороны независимого агентного ревью и добавить обратную связь в тот момент, когда код ещё формируется.</p>
<p>agent-bus даёт агентам общий канал, а человеку оставляет наблюдаемость и контроль. Ревью становится частью разработки, архитектурные сомнения обсуждаются раньше, а история решений остаётся перед глазами.</p>
<p>Код, инструкция и описание протокола:</p>
<p><a href="https://github.com/Educentr/claude/tree/main/plugins/agent-bus" target="_blank" rel="noopener noreferrer">github.com/Educentr/claude/tree/main/plugins/agent-bus</a></p>
<p>Если попробуете agent-bus на своих задачах, расскажите, какие схемы взаимодействия между агентами у вас получились.</p>
]]></content:encoded></item></channel></rss>