Roo CodeをIPCで外部から操作する

Roo CodeのIPCシステムについて

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

Roo Code Evals
Quantitative evals of LLM coding skills.

このIPCシステムは、ホストマシン上のRoo Code拡張がUnixドメインソケットを使用してIPCサーバーを起動し、クライアント側の外部プログラムがNode.jsのnode-ipcライブラリを使用してサーバーに接続する構成となっています。通信方式はEventEmitterベースの双方向非同期メッセージングを採用しており、すべてのデータはzodで構造化されたJSON形式でコマンドとイベントのやり取りが行われます。

メッセージングプロトコルはシンプルで、チャットに送信するテキストとRoo Codeの設定情報(LLMの指定など)のみになります。この機能は基本的にRoo Code開発用ですが、パブリッシュされたバージョンでもバンドルされており、自動化での活用の他にもセキュリティのために存在を理解しておくことをお勧めします。

Roo-Code/packages/evals/ARCHITECTURE.md at main · RooCodeInc/Roo-Code
Roo Code (prev. Roo Cline) gives you a whole dev team of AI agents in your code editor. - RooCodeInc/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を指定した場合は、タスクが新しいタブではなく、現在のタブで開かれます。

Subscribe to laiso

Sign up now to get access to the library of members-only issues.
Jamie Larson
Subscribe