PocketCoder-A1: как я заставил своего Claude работать в три смены

PocketCoder-A1: как я заставил своего Claude работать в три смены

ИИ не заменяет людей, люди просто больше работают. Так давайте хотя бы ночью пусть работает ИИ.

Я плачу 100 евро в месяц за подписку на Claude Code. Солидная сумма, которая моментально растворяется, когда аккаунт превращается в полигон для 10+ проектов — 7–8 моих, 2–3 — жены.

Шеринг подписки — занятие затратное, но мне не жалко. Я попал в зависимость от создания проектов с Claude. Мне постоянно хочется что-то запустить, хотя на работе нагрузка далеко не низкая.

Лёгкость реализации задач на Opus 4.6 и высокая стоимость подписки провоцируют меня грузить ИИ 24/7. Доходит до абсурда: перед сном я готовлю задачи на завтра, чтобы Claude потратил максимум токенов на анализ и изучение проекта — то, чего днём я избегаю из-за ограничений по использованию.

Во время одной из таких «планерок» я подумал: было бы здорово настроить Claude так, чтобы он не просто планировал задачи, а выполнял их за ночь — и сам проверял результат.

Так родился PocketCoder-A1 — автономный coding agent с системой верификации, веб-дашбордом и поддержкой нескольких провайдеров. 7086 строк Python, 15 модулей, без единого фреймворка.

1. Зачем это нужно

Идея появилась не сразу, но первые наброски я начал в тот же вечер.

Часто я занят одним проектом, а в голове крутятся мысли о другом: «надо добавить провайдер DeepSeek», «переписать конфиг», «написать тесты». Задачи я записываю, но руки до них доходят только через неделю. А подписка тем временем «тикает».

Я пробовал OpenClaw — не сработало. Даже с хорошей моделью. Ни один проект, включая простой парсер сайта, у меня не заработал. Возможно, я что-то настроил неправильно, но результат — нулевой.

Тогда я решил написать своё решение. Идея простая: выписать задачи, уйти спать или гулять, вернуться — и получить готовый результат.

Агент работает сессиями, сохраняет состояние, берёт следующую задачу автоматически. После каждой сессии запускается реальная проверка: pytest, py_compile, проверка файлов на диске. Веб-дашборд показывает всё в реальном времени.

Основной провайдер — Claude Max. Также поддерживаются Claude API и Ollama — пока в экспериментальном режиме.

Создано для себя. Я уже этим пользуюсь. Но выложил в open source — вдруг кому-то пригодится.

2. Что такое PocketCoder-A1

Буква A — от Autonomous, то есть автономный. А 1 — как первая версия. Вдруг проект зайдёт, и понадобятся обновления.

Это CLI + веб-дашборд. Установка простая. Инициализируешь на любом проекте — и дашборд открывается на http://localhost:7331.

Добавляешь задачи, нажимаешь Start Agent — и агент работает автономно.

Отличие от PocketCoder v1: предыдущая версия — это CLI-агент для локальных моделей, работающий в интерактивном режиме. A1 — автономный менеджер задач и исполнитель. Нажал кнопку — и ушёл. Это совсем другой продукт. Возможно, в будущем я объединю их.

Кстати, скоро выйдет обновление и для обычного PocketCoder.

3. Архитектура

Проект состоит из 15 Python-модулей. Ни одного фреймворка. HTTP-сервер — на стандартном http.server, JSON — через встроенный модуль, файлы — через pathlib.

Единственные внешние зависимости: playwright для E2E-тестов и, опционально, anthropic/ollama для альтернативных провайдеров.

3.1 Общая схема

От pca start до завершения:

  • Агент запускается, делает baseline (снимок состояния до начала работы).
  • Собирает промпт, запускает Claude CLI как subprocess.
  • Парсит результат в реальном времени.
  • Запускает верификацию.
  • Если всё ок — принимает результат. Если нет — инжектит ошибки в следующую сессию и пробует снова.

3.2 Claude CLI как subprocess

Ядро системы — запуск Claude CLI как subprocess. Звучит просто, но скрывало коварные проблемы.

Финальный вариант запуска включает ключи:

  • --dangerously-skip-permissions — обход проверок прав.
  • --no-session-persistence — не засорять историю сессий.
  • --max-turns 25 — защита от бесконечной работы.
  • --output-format stream-json — NDJSON-поток вместо буферизации.

Переменная CLAUDECODE=1 в окружении ломает вложенный запуск, поэтому она удаляется.

С stream-json Claude выдаёт по одному JSON-объекту на строку. Парсер классифицирует события: tool_use, bash, thinking — и отправляет в дашборд. Всего 8 типов иконок.

3.3 Верификация: «Не верим на слово»

Самая важная часть. Раньше агент писал «completed» слишком рано — после 1–2 запросов. Объяснение простое: в веб-интерфейсе Claude может использовать встроенные навыки и автоматически завершать задачу.

Когда агент говорит «COMPLETED» — мы не верим. Запускается трёхуровневая проверка.

Уровень 1, BLOCKING: если провалена хоть одна проверка — сессия не принимается. Включает:

  • py_compile для всех .py-файлов,
  • pytest,
  • проверку, что файлы реально созданы на диске,
  • проверку success_criteria из задачи.

Уровень 2, WARNING: результат только логируется — ruff, build, git diff.

Уровень 3, ANTI-LOOP: защита от бесконечного цикла. Перед первой сессией делается baseline — снимок текущих проблем. Старые баги не учитываются.

Если агент не может починить проблему за 5 попыток — задача помечается как BLOCKED, агент переходит к следующей. При повторной попытке в промпт добавляется сообщение: “VERIFICATION FAILED, attempt 2/5, BLOCKING: tests 2 failed”.

3.4 Провайдеры

  • claude-max: CLI subprocess, stream-json, все нативные инструменты. Требует подписку на Claude Max.
  • claude-api: через Anthropic SDK, 6 инструментов, текстовый стриминг, без tool calling.
  • Ollama: локальный запуск, экспериментальный.

Claude Max — основной провайдер. Остальные пока в сыром состоянии. Если проект заинтересовал — помогите привести их в порядок. Я не уверен, что справлюсь сам.

3.5 Real-time поток данных

Claude CLI выдаёт NDJSON. Парсер в loop.py кладёт события в AGENT_LOG_BUFFER. AJAX-запросы к /api/log забирают лог каждые 2 секунды. Браузер рисует в реальном времени.

Метрики обновляются параллельно: rate_limit_event влияет на sessionmetrics, /api/status отдаёт данные каждые 3 секунды в 6 карточек. Таймер в интерфейсе тикает каждую секунду через JavaScript.

3.6 Жизненный цикл задачи

Три способа создать задачу:

  • Через CLI: pca task add.
  • Через форму Quick Add на дашборде.
  • Через AI Transform: вводишь сырой текст, ИИ разбивает его на структурированные задачи с приоритетами и критериями успеха.

Приоритеты меняются drag-and-drop. Состояния задач: PENDING, IN PROGRESS, DONE, BLOCKED.

4. Кейс: epotos-templates

Реальный пример. epotos-templates — проект для компании: обработка документов и генерация шаблонов. Нужно было добавить переключение провайдеров — с Ollama на DeepSeek. Я записал мысли в свободной форме и запустил A1.

Шаг 1: Пустая страница, 5 задач за 30 секунд

Открываю дашборд. Страница Tasks пустая. Вместо ручного ввода использую AI Transform.

Пишу: «хочу клонировать epotos-templates, посмотреть как настроены провайдеры, добавить блок переключения с llama на deepseek…»

Нажимаю Transform. Через несколько секунд — 5 структурированных задач с описаниями и критериями успеха. Добавляю их с приоритетами #1–#5.

Шаг 2: Запуск

На дашборде: 0/5 задач, статус — IDLE. Нажимаю Start Agent.

Выбираю провайдер claude-api, ввожу API-ключ.

Шаг 3: Агент работает

В логе появляются события в реальном времени: THINK, BASH, READ.

В деталях задачи — 11 вызовов инструментов, лог заполняется.

Шаг 4: Первый результат

1/5 задач выполнено. Зелёная галочка. Агент автоматически переходит к следующей.

Он анализирует код, читает ollama.ts, ai-client.ts, ищет localhost:11434.

Шаг 5: Прогресс

2/5 задач выполнены. Задача task_016 в работе. Агент проектирует архитектуру провайдеров.

Шаг 6: Сообщение агенту

Пока агент работает, я пишу в форму Message to Agent: «напиши документацию».

Сообщение попадает в очередь. Агент прочитает его в следующей сессии.

Шаг 7: Всё готово

5/5 задач выполнено! Агент ещё работает — обрабатывает моё сообщение.

Верификация пройдена. Агент пишет документацию, обновляет CLAUDE.md, создаёт MEMORY.md.

Статус: COMPLETED. 5 задач, 12 сессий, 23 изменённых файла.

Светлая тема

Дашборд поддерживает тёмную и светлую темы.

5. Dashboard

3491 строка чистого Python. Без React, Vue или Flask. Используется http.server и string.Template. Весь CSS, JavaScript и HTML — в одном файле.

Возможности:

  • 6 карточек метрик, кнопки Start/Stop, live-лог, Quick Add.
  • Список задач с drag-and-drop, массовым добавлением и AI Transform.
  • Детали задачи: полный лог, метрики, управление.
  • История сессий с метриками.
  • Activity Log — хронология действий.
  • Настройки провайдера, API-ключ, параметры.
  • Git-история с иконками типов действий.
  • Страница /transform — из сырого текста в задачи.

6 карточек метрик

  • 2/5 done + прогресс-бар.
  • Приоритет #3 + статус (WORKING/IDLE/COMPLETED).
  • 12.4K in / 3.2K out + прогресс контекста.
  • $0.08 за сессию.
  • 48s (live-таймер, обновляется каждую секунду).
  • 3 modified.

Лог стилизован под macOS Terminal: тёмный фон, моноширинный шрифт, 8 типов иконок (read/edit/write/bash/thinking/text/metric/verify). Обновляется через AJAX каждые 2 секунды.

Полный REST API — 24 эндпоинта. Можно мониторить из скриптов.

6. Выводы и что дальше

PocketCoder-A1 работает. 5 задач на реальном проекте — за 13 минут, полностью автономно. С верификацией, live-логом, возможностью отправить сообщение агенту во время работы.

Автономные сессии — реальность: нажал Start, ушёл, вернулся — и получил результат. Верификация ловит «врущего» агента на трёх уровнях: blocking, warning, anti-loop. Дашборд показывает всё в реальном времени. Через Queue Message можно писать агенту, пока он работает.

В планах: auto-checkpoint при 70% заполненности контекста, интеграция с Git (ветки + atomic commits), релиз через PyPI и uv.

PocketCoder-A1 — это open source.

Читать оригинал