Автоматический цикл кодинга в OpenCode без плагинов
Peng Qian с блога Data Leads Future реализовал полностью автоматизированный цикл кодинга внутри OpenCode — без единого плагина, только через Markdown-файлы агентов и команд. Вся обвязка работает на DeepSeek-V4-Pro и DeepSeek-V4-Flash, а результаты впечатляют: от генерации скрипта Фибоначчи до полноценной шахматной веб-игры с Python-бэкендом. Разбираем архитектуру.
Что такое Loop Engineering
Andrew Ng описал три петли разработки продукта с AI:
- Петля реализации — coding-агент получает спек и измеримую цель, пишет код, запускает тесты, итерирует пока требования не выполнены.
- Петля обратной связи инженера — инженер тестирует результат, сравнивает со своим видением и, если что-то не так, пишет новый спек.
- Петля внешней обратной связи — продукт попадает к пользователям, их фидбек собирается и возвращается в петлю №2.
В Claude Code и Codex этим петлям соответствуют две команды: /goal для петель 1-2 и /loop для петли 3.
Архитектура цикла в OpenCode
Автор реализовал усиленную версию /goal. Вместо того чтобы пользователь вручную прописывал метод верификации и лимит итераций, агент делает это сам. Пользователь просто говорит, что ему нужно.
Два агента
goal-orch (оркестратор, модель deepseek-v4-pro):
- Общается с пользователем, уточняет требования
- Разбивает задачу на атомарные пункты и сохраняет в
reqs-manifest.md - Строит DAG зависимостей и запускает параллельное исполнение
- Принимает ответы от воркера на технические вопросы
- Проверяет завершённость работы: unit-тесты, покрытие, E2E-тесты через
browser use
goal-worker (исполнитель, модель deepseek-v4-flash):
- Получает одно требование от оркестратора
- Пишет план реализации (стек, изменения, тесты) и отправляет на ревью оркестратору
- После одобрения — кодит, добавляет обработку граничных случаев, пишет тесты
- При возникновении технического вопроса не спрашивает пользователя, а возвращает вопрос оркестратору через
task_id
Ключевые механики
Сохранение контекста через task_id. OpenCode позволяет отправлять сообщения субагенту через инструмент task. Первый вызов создаёт новую сессию и возвращает task_id. Если воркеру нужна помощь, он возвращает вопрос оркестратору, а тот передаёт ответ вместе с task_id обратно — сессия продолжается без потери контекста.
DAG-параллелизм. После утверждения списка требований оркестратор строит граф зависимостей. Требования без взаимных зависимостей выполняются параллельно несколькими экземплярами goal-worker.
Документирование каждого шага. Воркер не только обновляет статус в reqs-manifest.md, но и генерирует заметку по каждому завершённому требованию. Когда цикл длится часами, контекст сессии раздувается и агент начинает терять нить — документация позволяет оркестратору восстановить картину.
E2E-тестирование. Если задача включает фронтенд, на финальном этапе оркестратор запускает E2E-тесты через @playwright-mcp или agent-browser и делает скриншоты как доказательство работы.
Почему без плагинов
OpenCode позволяет определять команды и агентов через Markdown-файлы в директории .opencode/. Плагины ломаются при обновлениях, а Markdown-файлы — нет. Команда /goal описывается в .opencode/commands/goal.md с указанием агента goal-orch в frontmatter и плейсхолдером $ARGUMENTS для задачи пользователя.
Результаты тестирования
Скрипт Фибоначчи
Промпт: /goal Write a Fibonacci calculation script with the best possible performance.
DeepSeek выбрал алгоритм fast doubling — оптимальный для задачи.
Игра «Ханойская башня»
Промпт: /goal Build a playable Tower of Hanoi web game.
Агент построил игру со встроенным AI-солвером.
Шахматная веб-игра
Промпт: /goal Build a playable chess web game. Include easy, medium, and hard difficulty levels. No online multiplayer needed. Use a Python backend as the AI engine.
OpenCode сначала уточнил требования, предложил варианты, затем вошёл в автономный режим: спроектировал архитектуру, реализовал модули, прогнал unit-тесты, edge case-тесты и E2E-тесты, и вернул результат только когда всё прошло.
Клавиатурный тренажёр
Пример с развёрнутым описанием механик — падающие буквы, позиции пальцев, градиентная зона попадания, комбо-эффекты. Агент справился и с этим.
Выбор моделей
Peng Qian обнаружил интересную особенность DeepSeek: deepseek-v4-flash точнее pro в задачах вызова функций (function calling) и загрузки навыков (skill loading), при этом значительно дешевле. Поэтому goal-orch (оркестрация, рассуждения) работает на pro, а goal-worker (исполнение) — на flash.
Для чтения изображений (скриншоты E2E-тестов) используется @observer-агент.
TODO-менеджер и современные пакетные менеджеры
Воркеру явно предписано использовать uv вместо pip и pnpm вместо npm — это сохраняет чистоту окружения при длительной работе цикла.
Цикл против OpenSpec
Автор подчёркивает, что цикл кодинга не заменяет SDD-фреймворки вроде OpenSpec. Они решают разные задачи:
- Цикл кодинга — быстрое прототипирование MVP менеджером продукта или тимлидом. Приоритет — скорость и автономность.
- OpenSpec / SDD — production-разработка с высокими требованиями к качеству кода, где у инженера есть детальный спек.
Цикл кодинга — это первая петля из трёх. Для серьёзного продукта нужно прогнать все три.
Как использовать
Исходный код доступен в GitHub-репозитории автора (доступен подписчикам). Для установки достаточно скопировать agents/ и commands/ из .opencode/ репозитория в ~/.config/opencode/ и перезапустить OpenCode. Или скопировать всю папку .opencode/ в корень конкретного проекта.
После этого команда /goal <задача> запускает цикл. Можно описать задачу подробно или одной фразой — оркестратор уточнит детали в диалоге.