Roo CodeをIPCで外部から操作する
Roo CodeのIPCシステムについて
Roo CodeのIPCシステムは、VS Code拡張機能と外部プログラム間でリアルタイム通信を実現するクライアント・サーバーアーキテクチャです。外部プログラムからRoo Codeを自動制御し、エージェントレベルの評価システムやテスト自動化などに活用できます。Roo Code開発チームはこのIPCシステムを活用して、エージェントレベルのEvals(評価)システムを構築しています。

このIPCシステムは、ホストマシン上のRoo Code拡張がUnixドメインソケットを使用してIPCサーバーを起動し、クライアント側の外部プログラムがNode.jsのnode-ipcライブラリを使用してサーバーに接続する構成となっています。通信方式はEventEmitterベースの双方向非同期メッセージングを採用しており、すべてのデータはzodで構造化されたJSON形式でコマンドとイベントのやり取りが行われます。
メッセージングプロトコルはシンプルで、チャットに送信するテキストとRoo Codeの設定情報(LLMの指定など)のみになります。この機能は基本的にRoo Code開発用ですが、パブリッシュされたバージョンでもバンドルされており、自動化での活用の他にもセキュリティのために存在を理解しておくことをお勧めします。
IPCサーバーの起動
Roo Codeは環境変数ROO_CODE_IPC_SOCKET_PATHで指定されたソケットファイルを使用してIPCサーバーを起動します。これはVS Codeを以下のように起動することで有効にできます。
ROO_CODE_IPC_SOCKET_PATH=/tmp/roo-code-ipc.sock code -r .
起動に成功すると、Roo Codeのコンソールの以下のようなログが表示されます。
[API] ipc server started: socketPath=/tmp/roo-code-ipc.sock, pid=95582, ppid=95570

IPCクライアントのセットアップ
クライアントはRoo Codeの実装を使います。
curl -O 'https://raw.githubusercontent.com/RooCodeInc/Roo-Code/refs/heads/main/packages/ipc/src/ipc-client.ts'
IpcClientを使い、メッセージを送受信するためのクライアントを作成します。以下のコードは、IPCサーバーに接続し、タスクを開始する例です。これをindex.ts
というファイルに保存して実行します。接続されるとACKでメッセージが返されるので、その後にsendCommandが呼びせます。
import { IpcClient } from './ipc-client.js';
// ROO_CODE_IPC_SOCKET_PATH
const client = new IpcClient('/tmp/roo-code-ipc.sock');
client.on(IpcMessageType.Ack, (message) => {
const { clientId, pid, ppid } = message;
console.log(`Connected to IPC server. clientId: ${clientId}, pid: ${pid}, ppid: ${ppid}`);
client.sendCommand({
commandName: TaskCommandName.StartNewTask,
data: {
configuration: {},
text: 'How are you?',
newTab: true,
},
});
});
client.on(IpcMessageType.TaskEvent, (message) => {
const { eventName, payload } = message;
console.log(`Received task event: ${eventName}`, payload);
});
依存関係をインストールします。
bun init
bun add node-ipc
bun add @roo-code/types
bun add zod
通信が成功すると、以下のようなログが表示されます。
> bun run index.ts
Connected to IPC server. clientId: 4da5a57fbee8, pid: 95582, ppid: 95570
Received task event: taskCreated [ "bd3591b0-fd70-4983-a278-eacd6b51a061" ]
Received task event: message [
{
taskId: "bd3591b0-fd70-4983-a278-eacd6b51a061",
action: "created",
message: {
ts: 1751107507415,
type: "say",
say: "text",
text: "How are you?",
},
}
]
Received task event: taskTokenUsageUpdated [ "bd3591b0-fd70-4983-a278-eacd6b51a061",
{
totalTokensIn: 0,
totalTokensOut: 0,
totalCost: 0,
contextTokens: 0,
}
]
IPCサーバーを有効にしたRoo Codeに自動で上記のメッセージが送信されていることが確認できます。newTab: false
を指定した場合は、タスクが新しいタブではなく、現在のタブで開かれます。
