
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 install1回の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を実行してください。
デバイスを接続する
- Intiface Centralを起動し、サーバーの開始ボタンを押します。
- Claude Codeで
/intifaceを実行します。 - 接続とスキャンが完了するまで待ちます。
- 結果から振動対応デバイスを選択します。
- デバイスが接続され、使用環境に適していることを確認してから、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 stopVibeClaudeは、選択したデバイス、強度、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の商標です。
