Пятиперсонный Claude Code dev squad.
DevSwarm это FastMCP-сервер, который оркеструет пять постоянных сессий персон Claude Code (Architect, Researcher, Frontend, Backend, Reviewer-Deployer), чтобы превратить один промпт в один pull request. Fire-and-forget: запустите его одним MCP-вызовом, закройте ноутбук, проснитесь к PR. Без Docker, без демона, без порта; только файлы на диске и stdio MCP. Собрано end-to-end на сервере Fedora за один полудень.
Идея в 23:00. Pull request утром.
Одна сессия Claude Code это уже способный инженер. Но она работает по одной вещи за раз (прочитать, спланировать, написать код, проверить) в одном контекстном окне, с одними приоритетами, на тех же часах, что и человек, который печатает перед ней. DevSwarm это маленький эксперимент по тому, как разделить эту работу между постоянными специализированными агентами, которые передают результат через файлы на диске, работают в своих сессиях и не нуждаются в том, чтобы за ними кто-то следил.
Финальное состояние, которое я хотел: у вас есть идея поздно ночью, вы говорите её один раз и просыпаетесь к pull request, который можно прочитать, принять или отправить обратно. Без бэбиситтинга. Без «рой застрял через три шага». Оркестратор отделяется от вызывающего; статус живёт в JSON-файле на диске; можно закрыть терминал и вернуться на следующее утро.
Чистые файлы на диске плюс stdio MCP.
MCP-сервер это один Python-файл. Каждая персона это реальная сессия claude, прикреплённая к UUID и продолжаемая через subprocess. Runner это отделённый процесс (start_new_session=True), который проходит пять стадий, сериализуя состояние в .swarm_state.json после каждой. Frontend и Backend работают в параллельных потоках. Без демона, без порта, без контейнера.
Вы (терминал, очки, везде где есть Claude Code)
↓ MCP-вызов: devswarm.start_project(idea, repo_url)
┌────────────────────────────────────┐
│ devswarm_mcp.py (FastMCP, stdio) │ ← запущен по требованию
└─────────────┬──────────────────────┘
↓ subprocess.Popen(start_new_session=True)
┌────────────────────────────────────┐
│ runner.py (detached, PPID=1) │ ← переживёт смерть MCP
└─────────────┬──────────────────────┘
↓ для каждой стадии: claude --resume <uuid> -p ...
┌──────┴──────┬──────────┬──────────┬──────────────┐
↓ ↓ ↓ ↓ ↓
Architect Researcher Frontend Backend Reviewer-
→ PLAN.md → RESEARCH → код → код Deployer
.md в fe/ в be/ → REVIEW.md
→ gh pr create
↓
состояние живёт в workspace/<id>/.swarm_state.json
проверять в любой момент через get_project_status(id) Пять сессий, пять наборов инструментов.
Каждая персона это отдельная сессия Claude Code, живущая в собственной рабочей директории с собственным системным промптом CLAUDE.md и собственным allow-листом инструментов settings.json. Изоляция инструментов жёстко проводится в слое настроек, не просто обещается в промпте.
devswarm/<id>, делает commit, push и открывает PR через gh pr create. Единственная персона с правом записи в GitHub.4 минуты 42 секунды, один промпт в один PR.
Первый end-to-end live-тест, без правок руками: одностраничный CV с переключателем тёмной темы, fade-in при прокрутке и уважением к prefers-reduced-motion. Каждая стадия удалась с первой попытки.
Ниже: точный index.html, который написал рой, отрисованный вживую. Попробуйте переключатель темы в правом верхнем углу рамки, прокрутите, чтобы увидеть, как срабатывает fade-in в каждой секции.
/projects/cv-onepager-artifact.html, дословно из выходной директории роя. Смотреть PR ↗
Честно о том, что в коробке.
- Язык
- Python 3.14, FastMCP-сервер написан вручную в ~260 строк (
devswarm_mcp.py) плюс runner (runner.py) плюс общие хелперы состояния (swarm_state.py). - Модель агента
claude-opus-4-7на всех пяти персонах. Сессии сохраняются как JSONL в~/.claude/projects/<encoded>/<uuid>.jsonl, продолжаются черезclaude --resume <uuid> -p ....- Изоляция инструментов
- По
.claude/settings.jsonна персону с явными allow/deny паттернами. Frontend/Backend жёстко заблокированы отgit push,gh pr, всех записывающихmcp__github__*. Записи в Notion запрещены для каждой персоны. - Конкурентность
- Python
threadingдля параллельной стадии Frontend + Backend. Записи состояния используют уникальные tmp-имена + общепроцессный lock, чтобы read-modify-write внутриupdate_stageне терял обновления. - Деплой
- Reviewer-Deployer использует CLI
ghс существующей аутентификацией пользователя. URL PR пишется в.pr_urlв рабочей директории; runner подхватывает его и отдаёт черезget_project_status. - Источник
- Ещё не в публичном репозитории; держится локально, пока API стабилизируется. Скорее всего, появится на
github.com/tomscholtes93-collab/devswarm, когда несколько следующих capstone'ов пройдут чисто.