メインコンテンツへ移動
AIチュートリアル

VibeClaudeチュートリアル:Claude CodeのイベントをIntifaceデバイスに接続する

VibeClaudeのインストールと設定方法、Claude CodeとIntiface Centralおよび振動対応デバイスの接続方法、イベントパターンの理解、強度の調整、デーモンコマンドの使用方法、ハードウェアなしで統合をテストする方法を解説します。

VibeClaudeチュートリアル:Claude CodeのイベントをIntifaceデバイスに接続

VibeClaudeの機能

VibeClaudeは、Intiface Centralとbuttplug.ioを通じて、コーディング活動をデバイスのフィードバックに変換するClaude Codeプラグインです。Claude Codeのイベントはローカルデーモンに送信されます。デーモンはWebSocket経由でIntiface Centralと通信し、ペアリングされた振動対応デバイスを制御します。

Claude Code — hooks module — HTTP — daemon — WebSocket — Intiface Central — BLE — device

このプラグインは、ストリーミング中のモデル出力、ツール呼び出し、権限プロンプト、完了したTodo、サブエージェント、中断、ターンやセッションのライフサイクルイベントに応答します。個人的で快適な環境での使用を想定しています。互換性のあるハードウェアを責任を持って使用してください。

要件

  • function-hooksプラグインに対応したClaude Code。VibeClaudeは、この開発初期段階のAPIのバージョン2.1.291を対象に構築されています。
  • PATH上でnodeとして利用できるNode.js 22以降。
  • WebSocketサーバーを実行しているIntiface Central。デフォルトのアドレスはws://127.0.0.1:12345です。
  • Intiface Centralでペアリングされた振動対応コントローラー。
  • 接続したデバイスの使用に適したプライベートな環境。

VibeClaudeのインストール

リポジトリをClaudeの設定ディレクトリにクローンし、依存関係をインストールします。

git clone https://github.com/transkatgirl/vibeclaude.git ~/.claude/vibeclaude
cd ~/.claude/vibeclaude && npm install

1回のClaude Codeセッションでプラグインを読み込むには、次を実行します。

claude --plugin-dir ~/.claude/vibeclaude

または、Claude Code内から恒久的にインストールできます。

/plugin marketplace add ~/.claude/vibeclaude
/plugin install vibeclaude@vibeclaude-local

インストール後にClaude Codeを再起動してください。プラグインは新しいセッションの開始時に読み込まれます。

依存関係の場所を確認する

デーモンは、Claude Codeがプラグインの読み込みに使用するディレクトリから実行され、その場所にnode_modulesディレクトリが必要です。マーケットプレイスからインストールしたプラグインは、元のクローンにインストールされた依存関係を含まない場所にコピーされる場合があります。

Claude Codeにbuttplug npmパッケージが見つからないというメッセージが表示された場合は、メッセージに示されたディレクトリでnpm installを実行してください。

デバイスを接続する

  1. Intiface Centralを起動し、サーバーの開始ボタンを押します。
  2. Claude Codeで/intifaceを実行します。
  3. 接続とスキャンが完了するまで待ちます。
  4. 結果から振動対応デバイスを選択します。
  5. デバイスが接続され、使用環境に適していることを確認してから、Claude Codeの使用を開始します。

/intifaceコマンドを実行すると、接続とスキャンの状態を示すダイアログが開きます。矢印キーまたはTabキーでデバイス間を移動し、Enterキーを押すかクリックして選択します。Escapeキーでダイアログを閉じます。

デバイスを選択するまで、デバイスには何も送信されません。VibeClaudeが同時に操作するデバイスは、選択した1台だけです。後からClaude Codeのセッションを開始すると、プラグインはIntiface Centralへの再接続を試み、利用可能であれば以前に選択したデバイスを復元します。

プラグインコマンド

  • /intiface:Intifaceに接続し、デバイスをスキャンして選択します。
  • /intiface-connect:設定済みのIntifaceサーバーに接続し、利用可能であれば以前に選択したデバイスを復元します。
  • /intiface-disconnect:切断し、すべてのデバイス出力を停止します。
  • /intiface-intensity [0.0-1.0]:全体の強度倍率を設定します。数値を指定しない場合は現在の値を表示します。

これらのコマンドはモデルのターンを開始したりトークンを消費したりせず、プラグイン内で実行されます。また、会話にコマンドの出力を残さず、ターンの実行中にも使用できます。

フィードバックパターンを理解する

VibeClaudeは各イベントを、一定の強度で一定時間続くパターンとして表現します。同じ会話内では、直近のイベントが前のイベントに置き換わります。全体の強度倍率は、イベントの選択後に適用されます。

  • ストリーミング中の思考とテキスト:1ピースにつき70ミリ秒のパルス。強度は平均出力速度に基づく0.35~0.8です。応答速度の計算は毎秒40文字で上限に達します。
  • 応答全体:ストリーミングなしで応答が届いた場合、強度0.4で150ミリ秒のパルス。
  • ツール呼び出し:モデルがツール呼び出しの書き込みを開始したとき、強度0.5で120ミリ秒のパルス。
  • 編集操作:Edit、Write、MultiEdit、またはNotebookEdit操作の書き込みと適用中、強度0.3で一定の振動を保持。
  • 成功したツール呼び出し:強度0.7で180ミリ秒のパルス。
  • 失敗、拒否、または却下されたツール呼び出し:強度1.0で280ミリ秒のパルス。
  • 完了したTodo項目:強度0.8のパルス。その直後にツール成功パターンへ置き換わります。
  • 権限プロンプト:強度0.85で90ミリ秒のパルスを3回発生させた後、一時停止し、プロンプトが解決されるまで繰り返します。
  • ターン完了:強度1.0で100ミリ秒のパルスを3回発生させます。
  • 中断または失敗したターン:現在の出力を停止し、ターン完了時に使用する3回のパルスを発生させます。
  • セッション終了:すべての出力を停止します。

複数のセッションとサブエージェント

開いている各Claude Codeセッションは、それぞれ独自のツール、プロンプト、Todo、サブエージェントを追跡します。複数のパターンがアクティブな場合は、最も強いパターンが使用されます。そのパターンが終了すると、デバイスは別のセッションでアクティブなパターンに戻ることがあります。

サブエージェントは、それを開始した会話に混在して表示されます。ストリーミング出力、ツール呼び出し、権限プロンプト、Todo、完了または失敗イベントは、それぞれ独立して表現されます。メインセッションを終了すると、そのすべてのサブエージェントも停止します。

強度を調整する

強度コマンドを使って、出力を弱めたり無効にしたりできます。

/intiface-intensity 0.5

デフォルトの倍率は1.0です。値を0にするとフィードバックが無効になり、0から1の間の値では、現在有効なすべてのパターンの強度が調整されます。変更は、すでに再生中のパターンを含めて直ちに適用され、再度変更するまで保存されます。

重要なイベントの制限

Claude Codeがプラグインに公開する情報には限りがあるため、一部の動作は必ずしも正確ではありません。

  • 思考: 思考は、Claude Codeがテキストとして表示する場合にのみ表現されます。たとえば、ヘッドレスなclaude -pの実行中は思考を取得できません。
  • 権限への応答: Claude Codeは、権限プロンプトに応答した正確な時点を報告しません。通常、関連するツールの処理が完了、失敗、または拒否された時点で、プロンプトのパターンが終了します。一部のターミナル実行時のバックグラウンド化ヒントによって、より早く停止する場合もあります。
  • ツール出力: プラグインはコマンド出力をストリーミング中に受け取らないため、ツール出力は印刷された各行ではなく、ツールの結果として表現されます。

プラグインを設定する

Claude Codeでは、プラグインを有効にするときにオプションを尋ねられます。後から/pluginとプラグイン管理インターフェースを使って変更できます。

  • wsAddress: Intiface CentralのWebSocketアドレス。デフォルトはws://127.0.0.1:12345です。

変更したWebSocketアドレスは、次回デーモンが起動するときに適用されます。セッションを終了するか、次のコマンドでデーモンを直接停止してください。

node daemon/daemon.mjs stop

VibeClaudeは、選択したデバイス、強度、daemon.logを~/.config/vibeclaudeに保存します。TCPポート12350がすでに使用されている場合は、別のポートを指定して~/.config/vibeclaude/config.jsonを作成してください。

{ "port": 12351 }

シェルからデーモンを使用する

デーモンは、Claude Codeのスラッシュコマンドとは独立して制御できます。以下のコマンドでは、デフォルトの設定ディレクトリとWebSocketアドレスが使用されます。

  • node daemon/daemon.mjs scan: 接続し、3秒間スキャンして、振動に対応したデバイスを一覧表示します。
  • node daemon/daemon.mjs select <index>: スキャン結果からデバイスを選択します。
  • node daemon/daemon.mjs connectおよびdisconnect: Intifaceに接続または切断します。
  • node daemon/daemon.mjs intensity [value]: 強度の倍率を設定または表示します。
  • node daemon/daemon.mjs start: デーモンが実行中であることを確認し、ポートを表示します。
  • node daemon/daemon.mjs status: デーモンが応答しているか確認します。
  • node daemon/daemon.mjs stop: すべての出力を停止してデーモンを終了します。
  • node daemon/daemon.mjs: デーモンをフォアグラウンドで実行します。

--home <dir>を使うと別の設定ディレクトリを選択でき、--ws <address>を使うと別のIntifaceアドレスを指定できます。すべてのイベントを到着時にログへ記録するには、デバッグ環境変数を設定します。

VIBECLAUDE_DEBUG=1 node daemon/daemon.mjs

ハードウェアなしでテストする

このリポジトリには、受信するはずだったモーターのレベルを表示するモックIntifaceサーバーが含まれています。ポート12345で起動します。

node test/mock-intiface.mjs 12345

次にテストスイートを実行します。

npm test

テストでは、モックに対してデーモンをエンドツーエンドで検証し、フックモジュールもテストします。物理コントローラーなしでインストールを確認できます。

アーキテクチャの仕組み

hooks/register.tsxはClaude Code内で実行されます。ストリーミング中のターンのステップ、ツール呼び出し、権限チェック、サブエージェントの作成、セッションやターンのライフサイクルの変更などのフックイベントを監視します。これらのイベントを、モデルのテキストではなくサイズや識別子を含む小さなメッセージに変換し、ループバックアドレス127.0.0.1:12350のデーモンへ順番に送信します。

フックモジュールはスラッシュコマンドも登録し、デバイス選択ダイアログを表示し、デーモンからの通知をトーストとして表示します。フックモジュールにはNode.jsへのアクセスがないため、Buttplugクライアントを実行したり、IntifaceのWebSocket接続を自身で維持したりすることはできません。

daemon/daemon.mjsは、公式のButtplugクライアント、Intiface接続、選択されたデバイス、振動エンジン、イベントハンドラーを処理します。デバイスの応答がモデルの出力より遅い場合があるため、デーモンは要求をキューに蓄積せず、最新の要求レベルを送信します。

デーモンは、最初のセッションで必要になった時点で起動し、最後のセッションが終了すると終了します。各セッションに関連付けられたClaude Codeプロセスを監視し、予期せず消えたセッションをクリーンアップできます。終了したプロセスを特定できない場合は、アクティビティがない状態で30分経過すると終了します。

プライバシーと自動シャットダウン

プラグインは、マシン上で設定されたIntifaceアドレスにのみデバイスコマンドを送信します。デーモンはループバックで待ち受け、127.0.0.1またはlocalhost宛てのJSONリクエストを受け付けます。ブラウザページ向けのネットワークサービスは公開しません。VibeClaudeにテレメトリはありません。

デバイスの切り替え、セッションの終了、切断、Intiface接続の喪失、またはデーモンの終了が発生すると、出力は自動的に停止します。デバイスがIntifaceから切断されると選択解除されます。再接続するには/intifaceを使用してください。一時的に見えなくなったデバイスは、戻ってきたときに再度選択できます。

まとめ

VibeClaudeは、Claude CodeのフックをローカルのNode.jsデーモン経由でIntiface Centralに接続し、コーディングイベントを設定可能なデバイスフィードバックに変換します。プラグインと依存関係をインストールしてIntiface Centralを起動し、/intifaceでデバイスを選択して、/intiface-intensityで体験を調整できます。トラブルシューティングや開発には、シェルデーモンコマンド、デバッグログ、付属のモックサーバーを使用してください。

このプロジェクトはMITライセンスの下で公開されています。ButtplugおよびIntifaceは、Nonpolynomial Labs, LLCの商標です。