Takumi's Daily LogEN

Claude Codeでマルチエージェントアーキテクチャを組んだ話

背景

複数のWebアプリケーションを1つのプラットフォームとして開発している。リポジトリは機能ごとに分かれていて、認証サーバー、共通UIライブラリ、各アプリケーション、ドキュメントなどで構成されている。

1人でこれを回すにあたって、Claude Codeをただのチャットツールではなく「開発チームの一員」として機能させるアーキテクチャを設計した。

全体構成

ワークスペース(親)
├── アプリA/          # Git Submodule
├── アプリB/          # Git Submodule
├── アプリC/          # Git Submodule
├── 認証サーバー/      # Git Submodule
├── 共通UIライブラリ/  # Git Submodule
├── CLAUDE.md         # オーケストレーション設計
├── Makefile          # 一括操作
└── .claudeignore     # サブモジュール除外

ポイントは親ワークスペースでは設計とオーケストレーションだけ行い、実装は全て子Agentに委譲するという原則。

設計判断

1. コンテキスト分離

.claudeignore でサブモジュールを除外している。これにより:

なぜこうするのか: Claude Codeのコンテキストウィンドウは有限。6つのアプリのコードが全部入ると、肝心の設計判断に使える領域が圧迫される。

2. カスタムAgent定義

各サブモジュールに .claude/agents/ ディレクトリを用意し、カスタムAgentを定義している。子Agentは対象リポのCLAUDE.mdを読み、そのリポ内だけで作業する。

Agentツール:
  subagent_type: "app-a"
  prompt: "認証フローのバグを調査して修正して"

3. 並列実行パターン

同じ変更を複数リポに横展開するとき、Agentを並列で起動する。

Agent 1: subagent_type: "app-a" → "User型にteamIdフィールドを追加して"
Agent 2: subagent_type: "app-b" → "User型にteamIdフィールドを追加して"
Agent 3: subagent_type: "app-c" → "User型にteamIdフィールドを追加して"

3つ同時に走る。人間がやったら30分かかる横展開が、2-3分で終わる。

4. commit/pushは親から

子Agentには権限制約がある場合があるので、実装は子Agent、commit/pushは親から直接Bashで実行するルールにしている。これは設計上の判断でもある。コミットの粒度やメッセージは人間(またはオーケストレーターの親)がコントロールすべき。

カスタムコマンド

よく使うワークフローはカスタムコマンドとして定義している。

| コマンド | 用途 | |----------|------| | /commit | コンベンショナルコミット | | /pr | PR作成 | | /push-safe | セキュリティチェック付きpush | | /review | AIコードレビュー | | /fix-ci | CI失敗自動修正 | | /overnight | 夜間自律実行 | | /impl | 機能実装 | | /explore-code | コードベース横断調査 |

特に /overnight は、寝てる間にAgentにタスクを任せるコマンド。朝起きたらPRが上がっている状態を作れる。

CLAUDE.mdの設計

CLAUDE.mdはAgentへの「業務マニュアル」。以下を書いている:

これを書くか書かないかで、Agentの出力品質が全く違う。

実感している効果

まだ課題なこと

まとめ

Claude Codeは「便利なチャットツール」ではなく「プログラマブルな開発チーム」として扱える。そのためにはオーケストレーション設計が必要で、CLAUDE.md、カスタムAgent、.claudeignore によるコンテキスト分離がその基盤になる。

1人開発でも、この構成を組めば5-6人分の作業をこなせる実感がある。