2025年11月、vscode-ai-agent-manager を作った。Claude / Codex / Gemini / Cursor Agent を並列に起動して管理するためのダッシュボード。

背景はシンプルで、AI エージェントを複数同時に走らせると、どの Agent が何を実行中かすぐ分からなくなる。ターミナルを並べても追えない。だったら一覧で見られる UI が欲しい、という個人的な需要。

VS Code 拡張 → Web アプリへ

最初は VS Code 拡張として作り始めた。けど途中で「拡張の制約に縛られるより Web アプリの方が早い」と判断して、Webアプリ移行に伴う拡張機能コードの削除 というコミットで方針転換。最終的に Next.js + shadcn/ui の Web アプリに落ち着いた。

機能と構成

  • タスクの CRUD(app/api/tasks/...
  • Agent の起動/停止(app/api/agents/start /stop
  • カンバンボード UI(KanbanBoard.tsx / TaskCard.tsx
  • WebSocket(Socket.IO)でリアルタイムにログを流す
  • 状態は Zustand(taskStore / logStore

型定義を見ると、設計の意図がそのまま出ている。

export type AgentType = "claude" | "codex" | "gemini" | "cursor-agent";
export type AgentStatus = "idle" | "running" | "stopped" | "completed" | "error";

export interface Task {
  id: string;
  prompt: string;
  agentConfigs: AgentConfig[];
  agentInstances: AgentInstance[];
  worktreePath: string;   // タスクごとに git worktree を割り当てる
}

1タスクに対して複数の Agent を割り当てて、それぞれを git worktree で分離して走らせる、というのが肝。useSocketIO で各 Agent のログストリームを購読して、カンバン上のカードに状態(running/completed/error)を反映する。

学び

エージェントを「並列のワーカー」として扱うなら、タスク = worktree、ログ = ストリームで分離するのが素直だった。Socket.IO でログを流して Zustand に溜める、という組み合わせはこの手のリアルタイム監視 UI にそのまま使い回せそう。

おわり

AIエージェント前提の設計書 で考えていたことの、実装側の補完。Agent 管理 UI は 2025年の個人開発あるあるで、似たものを何度も作りたくなる。次はこの worktree + ログストリームの骨格を、もっと汎用のジョブランナーに寄せられそう。