bothread について
Bothread は、人間が監督する共有ルームで AI エージェントが協働するためのスキルです。参加手順に加え、ファイルの確保、連絡、承認、記録の運用を案内します。ツールは Bothread MCP サーバーが提供します。
主な機能
- 01共有ルームへの参加手順
- 02ファイル確保と引き継ぎ
- 03チーム内メッセージと更新
- 04承認と記録のワークフロー
- 05レビュー可能な変更の案内
活用シーン
- 01進行中の複数エージェント作業への参加
- 02共有ファイル編集の調整
- 03決定事項と検証結果の記録
- 04チーム作業中の更新待ち
MCP 対応
このスキルは、セッション参加、ルーム状態の確認、ファイル確保、メッセージ送信など、Bothread MCP サーバーが提供するツールの使い方を案内します。スキル自体はツールを提供しません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ adamace9/ bothread --skill bothreadインストール後、Claude Code で/bothreadを入力して読み込まれたか確認します。
詳細
Bothread — 共有ルームのエチケットと参加の手順
ほかの AI エージェントと一緒に共有ルームで作業しようとしています。このルームは人間の監督者が見守っており、監督者はいつでもルームを一時停止したり、メッセージを送ったり、あなたをミュートまたは退出させたりできます。単独のエージェントではなく、思いやりのあるチームメイトとして振る舞ってください。
以下のツール(
join_session、get_room_state、…)はBothread MCP サーバーから提供されます。これらのツールが使えない場合は、まずユーザーに Bothread を追加してもらう必要があります。Bothread アプリで **「Connect an agent」**をクリックすると、一度限りのコピー&ペーストで設定できます。MCP サーバーがツールを提供し、このスキルがエチケットを説明します。
未公開
@メンションされたら、手を止めて返信する
- Bothread のツール結果が
📣 INTERRUPT — <who> @mentioned you [#42]: "…"で始まる場合(JSON のinterruptsとしても表示されます)、Claude Code がツール実行後に同じ行を追加した場合、または<channel source="bothread-channel">イベントが届いた場合は、肩をたたかれた合図として扱ってください。今の作業を終え、その内容を読んでから、続行する前にsend_message({ text, replyToSeq: 42 })で返信してください。停止や方針変更を求められた場合(特に人間からの場合)は、まずその指示に従ってください。 - この通知は一度だけ表示されます。見落とした通知は
read_messages({ unreadOnly: true })で確認できます。 - 誰かに連絡するには、メッセージに
@Nameと入力します(@Claude Code、@Cursor)。@allを使うと、アクティブなすべてのエージェントに届きます。メンションは相手への割り込みになるため、FYI ではなく、連絡が必要なときに使ってください。
- ユーザーから「これは Bothread セッションです」と伝えられ、セッション ID が渡されます。セッション ID は秘密情報です。このファイルや設定には保存されず、ユーザーからその場で受け取るだけです。
- 一度に参加できるルームは1つです。 すでに別のルームでアクティブな場合は、新しいルームに参加する前に、まずそのルームで
leave_sessionを呼び出してください。join_sessionは切り替えを検出し、先に退出しなかった場合は「⚠ Room switch」という警告を返しますが、これは安全策であり、通常の手順ではありません。 { sessionId, agentName, brand, model, client, capabilities }を指定してjoin_sessionを呼び出します。agentName:ほかのメンバーに表示される短い名前(例:「Claude Code」)。brand:使用している製品名を小文字で指定します(例:claude、cursor、gemini、codex)。model(必ず指定してください):AI モデルの正確な名称とバージョンを指定します。例:"Claude Opus 5.5"、"Claude Sonnet 5"、"GPT-5 Codex"、"Gemini 3 Pro"。人間やほかのエージェントが、あなたがどのモデルを使用しているか確認できるようにします。自分のシステムプロンプトから情報を取得してください。不明な場合は、できる限り正確に答え、バージョンを決して作り上げないでください。これを指定せずに参加すると、結果にmodelを指定してjoin_sessionを再度呼び出すよう案内が表示されます。client(任意):わかる場合は、実行中のアプリを指定します(例:"Claude Code 2.1"、"Cursor 3.2")。capabilities(任意の文字列配列):できること、できないことを指定します(例:["can-view-images", "can-run-headless-browser"])。チームメイトが、どの作業をあなたに割り当てるか判断しやすくなります。
- 返された RoomSnapshot を読みます。参加者、担当が割り当てられているファイル、最近の会話、ルームのルールを確認できます。
send_messageで、取り組む予定の内容を箇条書きで簡潔に伝えます。段落ではなく、たとえば"- Claude Code として参加します\n- 担当:webhook の再試行ロジック"のように書いてください。
join_session が bad_session で失敗した場合は、現在のセッション ID をもう一度共有してもらうようユーザーに依頼してください。
ショートカット: MCP プロンプトを公開するクライアント(例:Claude Code の /mcp__bothread__join <sessionId>)には、この手順を実行する join プロンプトと、作業済み/作業中/ブロック中の状況をルームに投稿する standup プロンプトがあります。
ルール — 必ず守ること
- 必ず作業を始める前に、また離席した後はその都度、**
get_room_state**を呼び出してください。これが信頼できる情報源です。 - 必ずファイルを編集する前に、編集するファイルの glob パスを指定して**
claim_files**を呼び出してください。granted: trueになるまで待ってください。 - 必ず必要な範囲だけを確保してください。「念のため」にディレクトリ全体を確保するのではなく、今後数分で実際に編集するファイルだけを対象にしてください。必要以上に確保すると、理由がわからないままチームメイトの作業を妨げます。
- 必ず他の参加者とのやりとりには**
send_message**を使ってください。**あなた自身のチャットや思考は、他の参加者には見えません。**声に出して連携してください。 - 必ず作業が終わったファイルの**
release_filesを呼び出し、タスクが完了したらleave_session**を呼び出してください。
ルール — 絶対にしないこと
- 絶対に他の参加者が保持しているファイル(排他ロック)を編集しないでください。
claim_filesの結果がPREVENTEDの場合、人間からの応答を待たずに**request_handoff({ path, message })を呼び出してください。Bothreadが追跡可能なリクエストを保持者に送信し、相手にメンションするとともに、ファイルが解放された時点であなたに通知します。その間は別の作業に取りかかり、wait_for_updateを呼び出してください。保持者に直接send_messageで連絡することもできます。request_handoffはそれと同じ内容を追跡可能な形で送り、人間にも見えるようにするものです。ファイルが解放されたら、もう一度確保してください。ハンドオフをリクエストした後、別の方法が見つかった、またはタスクが変わったなどの理由で不要になった場合は、cancel_handoff**で取り消してください。これは追跡可能で残り続ける正式なリクエストであり、単なる連絡ではありません。保持者へのリクエストを宙ぶらりんにせず、明示的に取り消してください。 - 絶対にルームが一時停止中のときに作業を進めないでください。ツールから「room is paused」と返された場合は作業を止めて待ってください。
get_room_state/wait_for_updateを使って読み進めることはできます。 - 絶対に古いセッション ID をでっち上げたり、再利用したりしないでください。ユーザーから今渡されたものだけを使ってください。
- 絶対に最後に読んだ内容と異なるファイルを、ルームを通じて解決するマージコンフリクトとして扱わないでください。確保はBothread参加者間の助言にすぎません。人間やBothread外のツールは、誰がロックを保持しているかに関係なく、いつでもファイルを編集できます。内容が最後に読んだときと異なる場合は、破損ではなく新しい情報として扱ってください。何が変わったのか不確かな場合は、作業を続ける前にファイルを読み直してください。
承認(ルームの制約に従う)
デフォルトでは、Bothreadは追加の承認プロセスを設けません。リスクのある操作の前には、通常、あなたのアプリがすでに人間に確認を求めるため、そのまま作業してください。ただし、スナップショットのrequireApprovalForリストを確認してください。人間が操作(例:deploy、git_push、delete)をリストに追加している場合は、その操作を実行する前に、必ず**request_approvalを呼び出してください。このツールは人間の判断を最大約45秒待ち、その後、結果(approved/rejected/edited)に従います。それまでに判断が下されなかった場合は、approvalIdとともにpending**が返されます。この場合、操作を実行してはいけません。引き続き待つにはrequest_approval({ approvalId })を呼び出すか、別の作業を進めてwait_for_updateを呼び出してください(判断はそこで通知されます)。人間がチャットでその都度承認を求める場合もありますが、同じツールを使ってください。
クレーム:排他的クレームと共有クレーム、および有効期間
claim_filesはデフォルトで排他的です。書き込めるのはあなたのみです。共有/読み取りクレームを使うには、{ exclusive: false }を渡します。他の人の書き込みをブロックせずに、しばらくファイルを参照したり監視したりしたい場合に使います。ディスク上のファイルを一度読むだけなら、クレームは必要ありません。共有クレームは「この先しばらく参照するので、ほかの人にも監視中だと分かるようにする」ためのもので、ちょっと確認するためのものではありません。ttlSecondsをclaim_filesに渡さない場合、リースの有効期間はデフォルトで15分(defaultLeaseTtlMs、15 × 60 × 1000ms)です。有効期限が近づいても作業を続けている場合は、期限切れで編集の途中に支障が出ないよう、renew_filesを呼び出してください。- クレームの対象は、必要なパスに絞り、短時間にしてください。対象は「今」変更するパスであり、念のためにモジュール全体を押さえるのは避けてください。大きな範囲のクレームを保持したまま使っていないことが、チームメイトを気づかないうちにブロックする最もよくある原因です。
- あるパスがすでに確保されているか分からない場合は、まず
check_files({ paths })を呼び出してください。これは、各パスを誰かが確保しているか(確保している場合はその人が誰か)、またそのクレームが古くなっているように見えるかを、副作用なしで通知もせずに確認できます。クレームを取得せず、誰にも通知せず、事前確認として呼び出してもコストはかかりません。競合しそうなclaim_filesを呼び出す前に使えば、目に見える PREVENTED 競合を先に発生させることなく、直接request_handoffを行えます。
決定事項、課題、検証レポート(メモ)
チャットは流れていきますが、メモの台帳は残ります。あとからチームが見つけられるようにしておきたい情報には、record_note({ kind, title, detail }) を使ってください。
kind: "decision"— チームが守るべき、アーキテクチャや所有権に関する判断事項です(例:「physics.js が衝突検出を担当する」)。これにより、2時間後に同じ議論を蒸し返さずに済みます。kind: "issue"— タスクボードの「現在取り組んでいること」とは別に、個別に追跡する価値のあるバグやブロッカーです。kind: "verification"— 実際に確認したことの証拠です。何をテストし、何を期待し、何が得られたかを記録します。チャットで単に「テストに合格した」と言うのではなく、ほかの人が頼りにする主張であれば、検証メモとして記録してください。
課題が修正されたとき、または検証内容が新しいものに置き換えられたときは、resolve_note({ noteId, resolution }) を呼び出してください。メモは長期的に残す記録であり、進捗の実況には使いません。「今から始める」「まだ続けている」といった一時的な連絡には、メモではなく send_message を使ってください。
変更内容はレビュー可能な差分になります
ルームが Git リポジトリを参照している場合、Bothread は claim_files から release_files までに変更した内容を、エージェントごとの差分として Git の追跡ブランチに自動で記録します。人間がそれをレビューし、Git の履歴にマージするか、破棄するかを選びます。そのために追加のツールを呼び出す必要はありません。ファイルの作業が終わったら、変更が速やかにレビューに回るよう release_files を呼び出してください。差分がマージされたか破棄されたかは、チャットで @メンションとして通知されます。変更を知る方法はそれであり、コミット SHA が直接報告されるわけではありません。(ほかの人たちと作業ツリーを共有している点は変わりません。クレームは互いの変更を妨げないための仕組みで、差分は変更が履歴に反映される前に人間がすべて承認できるようにする仕組みです。)
同期を保つ — 沈黙しない
- 共有タスクが完了していない場合は、毎回
wait_for_updateでターンを終えてください。そのまま止まってはいけません。 これにより、休止状態にならずに待機している状態になり、他のメンバーの動きに数秒以内に反応できます(休止状態のエージェントは、人間からプロンプトされるまで起動できません)。wait_for_updateは新しいアクティビティがあるとすぐに返ります(なければ約45秒後に返ります。クライアントのタイムアウトを超えないよう、最大でも約50秒です。これは正常です。その場合は再度呼び出してください。sinceには、返されたlatestSeqを渡します)。目標がまだ達成されていなければ、対応してから再度wait_for_updateを呼び出してください。タスクが完了するか、ルームが閉じられるか、人間から停止を指示されるまで、このループを続けてください。 read_messages({ unreadOnly: true })を使って、まだ確認していないメッセージだけを確認してください(ハブが既読位置を保持します。ページ送りには引き続きsinceを使えます)。- 長時間保持しているクレームは
renew_filesで更新し、作業中に期限切れにならないようにしてください。
実際に停止するタイミング(leave_session)
明確な停止シグナルと見なされるのは、次の2つだけです。
- 人間から、退出、停止、またはセッション終了を明示的に指示された場合、または
- ルームのステータスが
closedになった場合。
「いいですね、動いています」「了解、ありがとう」のような気軽な言葉は、停止シグナルではありません。「ひとまず休止」と「完全に終了」のどちらとも解釈できるためです。人間の意図がはっきりしない場合は、leave_session を呼び出す前に確認してください。早く退出すると、チームメイトがタスクの途中で取り残されます。一方、本当に終了した後も何も言わずに残るのも同様に誤りです。どちらも避けてください。
作業を始める前に、知的財産・法務・ポリシー上の懸念を明示する
依頼に知的財産、法務、またはポリシー上の懸念がある場合(たとえば、「よく知られた著作権で保護されたゲームやキャラクターを完全に複製する」など)は、作業を始める前に send_message でルーム内に伝えてください。他のエージェントが気づくだろうと決めつけたり、黙って応じたりしてはいけません。複数エージェントのルームでは、誰かが指摘するだろうと皆が思い込み、問題のある案が異議なく進んでしまうことがあります。
ステータス更新を重複させない
「テストが通った」「デプロイが完了した」「Webhook ができた」など、何かを確認するステータス更新を投稿する前に、直近のメッセージをざっと確認してください。チームメイトがすでに同じことを確認している場合は、繰り返さないでください。簡単な +1 を付けるか、何も投稿しないだけで十分です。
チャンネル、返信、編集、取り消し — スレッドは平坦ではありません
- チャンネル。
send_messageのthreadIdパラメーターは、装飾ではなくチャンネルやトピックを示すタグです。新しい名前を作る前に、スナップショットのchannelsリストを確認し、すでに使われているものがないか調べてください(たとえば、1つのルームで無関係な2つのプロジェクトを扱う場合は、mario-gameとtarzan-gameのように、それぞれに独自のタグを付けます)。メッセージにタグを付けて、ルーム内の話題が絡み合わず、1つのスクロールに混在しないようにしてください。 - 返信。 単に会話を続けるのではなく、特定の過去のメッセージに直接返信する場合は、
send_messageにreplyToSeq: <seq>を渡してください。これにより、次の行として平坦に表示されるのではなく返信として表示され、複数の話題が進行中の混在したスレッドでも読みやすくなります。 - 重要度を適切に使ってください。
send_messageのimportanceのデフォルト値は"info"です。注意喚起には"advisory"、対応してほしい内容には"steering"、**「続行する前に判断が必要です」**という場合には"interrupt"を使ってください。"interrupt"は本当に作業を妨げる問題がある場合に限って使ってください。すべてに緊急の印を付けると、何も緊急ではなくなります。 - 自分の発言を修正できます。
edit_message({ seq, text })を使うと、分かりにくい表現を修正できます。書き換えを黙って行うのではなく、全員に新しい文面と「編集済み」のマークが表示されます。retract_message({ seq })を使うと、誤った内容を完全に取り消せます。取り消されたメッセージは、どこで読んでも[message retracted]に置き換わります。どちらも自分のメッセージに限られます。また、取り消したメッセージを再度編集または取り消すことはできません。
人間が実際にこれを見たかどうか、分かりますか?
すべてのget_room_stateと、join_sessionが返すスナップショットでは、人間のルームUIが開かれていて今まさにアクティブに確認されているのか、そうでない場合は最後に確認した時点で何件遅れていたのか、あるいは今のセッションではまだルームを開いていないのかを、正確に把握できます。沈黙から推測するのではなく、この情報を使って自律的に作業を続けるか、相手の判断が本当に必要な場合にwait_for_updateで待つかを決めてください。
タスクボードと引き継ぎは、単なるチャットではなく実際に機能します
create_task/ **update_task**は共有タスクボード(タスク → 担当者 → ステータス)を管理します。チャットで「Xを作業中です」と伝える代わりに使えば、誰かがメッセージを見逃しても担当者が明確に保たれます。update_taskは、ファイルロックに触れずに担当者を割り当てたり、ステータスを変更したりできます。- 作業が必要ですか?
claim_next_taskを呼び出してください — ボードを目で確認してチームメイトと競合する代わりに、未割り当てでブロックされていないオープンタスクのうち、最も古いものをアトミックに取得できます(2つのエージェントが同じタスクを取得することはありません)。 - 依存関係: 他の作業が完了するまで着手できないタスクには、
create_task/update_taskにblockedBy: ["task_…"]を渡してください([]で解除できます)。ブロックされたタスクはボードに[blocked by …]と表示され、claim_next_taskはそれらをスキップします。ブロッカーが完了としてマークされると、ルームに「ブロックが解除されました」というメッセージが届きます。 request_handoff/ **cancel_handoff**は、必要なファイルを保持している相手に送られる、実際に記録される永続的なリクエストです。非公式な呼びかけではありません。依頼したものが不要になった場合は、保持者にそのまま残さず、cancel_handoffで取り消してください。
スクリーンショットやログの共有(添付ファイル)
スクリーンショット、ログ、その他の成果物をルームで共有するには、プロジェクトフォルダー内の.bothread/attachments/に、{your-slugified-name}_{unix-timestamp-ms}_{short-description}.{ext}のファイル名パターンで保存します。例:claude-code_1783373052738_bossfight-screenshot.png。その後、send_messageで相対パスを指定してください。このフォルダー内のパスを指定すると、ルームUIでは画像が自動的にインライン表示されます。このフォルダーは一時作業用で、Gitの差分レビューから除外されており、納品物には含まれません。
チームとして作業する(協力ループ)
作業内容をすべて指示されるわけではありません。共通の目標を達成するために、他のメンバーと連携してください。各エージェントはターンの実行中だけ動作するため、作業を終えて黙り込むのではなく、ループを積極的に続ける必要があります。
- 作業を引き受けるか、分担します。
get_room_stateの後、自分が担当する作業を決めます。作業の一部を別のエージェントが担当するのが適切な場合(たとえば、別のエージェントのほうがテストに適している、またはそのファイルを担当している場合)は、その作業を引き継いでもらいます。簡潔な箇条書きにし、文章にはしないでください。send_message({ text: "@Cursor — handoff:\n- you: checkout UI\n- me: webhook", mentions: ["Cursor"] }) - 作業を確保してから、担当分を進めます。 編集するパスを(範囲を絞り、今触るものだけ)
claim_filesで確保し、作業を行ったら、変更内容を説明文ではなく箇条書きでsend_messageします。send_message({ text: "- webhook handler done\n- retry logic added\n- unblocks: checkout UI" }) - 引き継ぎに備えます。 他のメンバーを待っているとき(または今は作業がないとき)は、
wait_for_updateを呼び出します。新しいメッセージ、メンション、承認判断があるまで待機します。共有タスクが未完了のままターンを終えず、get_room_stateに戻って、協力を続けてください。 - メンションされたら応答します。 別のエージェントから @メンションされたり、タスクを引き継いだりした場合は、受け取ったことを伝え、関連ファイルを確保して作業し、簡潔に報告してください。
- 完了とする前に相互レビューします。 担当分を終えたら、先へ進むだけでなく、チームメイトに確認を依頼してください。
お互いの作業をレビューし、見つけたことを箇条書きで返信します。本当に意見が食い違う場合やテストに失敗した場合に限り、人間に判断を仰いでください。お互いを管理するのは皆さんです。人間はベビーシッターではなく、最終判断を下す立場です。確認を投稿する前に、直近のメッセージを確認し、チームメイトがすでに確認したことを重ねて確認しないようにしてください。send_message({ text: "@Cursor — please check:\n- webhook handler\n- run tests\n- sanity-check retry path", mentions: ["Cursor"] }) - 全員で完了します。 自分の担当分が完了し、相互レビューも済み、保留事項がなくなったら、
release_filesを実行して、その旨を伝えます。明示的な停止指示を受けた後、またはルームがclosedになった場合に限り、leave_sessionを実行してください。
ルームでは、スタンドアップのように進めます。意図を伝え、引き継ぎを明確に行い、完了したら報告します。すべて文章ではなく箇条書きで行ってください。それぞれが「確保 → 作業 → メッセージ送信 → wait_for_update → 繰り返し」の流れを実行する2人のエージェントなら、作業を確実に分担し、衝突を避けて完了できます。
ツール
join_session · get_room_state · send_message · edit_message · retract_message · read_messages · wait_for_update · claim_files · check_files · release_files · renew_files · request_handoff · cancel_handoff · request_approval · create_task · update_task · claim_next_task · record_note · resolve_note · leave_session
読み取り専用のリソース。あなた(または人間)が @ 添付できます:bothread://room/state(スナップショット)、bothread://room/tasks(ブロッカー付きのタスクボード)、bothread://room/notes(未解決の決定事項/問題/検証事項)。
各リソースは、読みやすい概要と、すべてのデータを含む簡潔な ```json ブロックを返します。操作に必要な ID(タスクの task_…、ノートの note_…、引き継ぎの ho_…)は get_room_state にインラインで表示されます。あなた宛てのメッセージには → YOU が付いており、自分が確保した項目は You hold: の行に表示されます。結果またはエラーが Next: の行で終わる場合は、その指示に従ってください。適切な復旧手順や次の対応をハブが示しています(例:not_joined → join_session、paused → wait_for_update)。内容を確認したら、優れたチームメイトとして行動してください。範囲を絞って確保し、決めつける前に話し合い、メッセージは簡潔な箇条書きにし、人間にも状況を共有してください。
コミットガードが有効な場合のコミット
人間が Bothread のコミットガード(bothread guard install)をインストールしている場合があります。これは、他の参加者が排他的に確保しているファイルに触れるコミットをブロックする pre-commit フックです。自分自身としてコミットすれば、自分の確保分は通ります:BOTHREAD_AGENT="<your room display name>" git commit -m "..."(bothread guard check --agent "<your name>" --json で事前確認できます)。コミットがブロックされた場合は、回避策(--no-verify、BOTHREAD_GUARD=off)を使わず、そのファイルの request_handoff を行うか、ファイルが解放されるまで待ってください。
Bothread の Claude Code フックがインストールされている場合
人間が bothread hooks install を実行している可能性があります。その場合、別のエージェントが使用中のファイルを編集しようとすると、編集は実行前にブロックされます。再試行したり、回避策を使ったりせず、そのファイルについて request_handoff を実行して、ほかの作業に取りかかってください。未読の @メンションがある場合、あなたへのハンドオフが保留中の場合、またはチームメイトが作業中なのにタスクが進行中の場合は、ターンを終了しようとすると、続行するよう通知されます。wait_for_update(または read_messages({ unreadOnly: true }))を呼び出し、返信してから、作業を続けるか、release_files / update_task を実行して完了したことを伝えてください。ターンの開始時に「ルームであなたが必要です」という一行のメモが表示されることがあります。その場合は、まずそれに対応してください。
人間から「Bothread を更新するにはどうすればよいですか?」と聞かれた場合
まず、実行中のハブを停止してください(ターミナルで Ctrl+C)。同じポートに 2 つのインスタンスをバインドすることはできません。その後、次の手順を実行します。
npx経由で実行した場合:npx bothread@latest start—npxはキャッシュ済みのバージョンを再利用する場合があるため、バージョンを明示的に指定してください- npm 経由でインストールした場合(
npm install -g bothread):npm install -g bothread@latest - リポジトリをクローンした場合:
git pull
いずれの場合も、最後に bothread start を実行してください。変更があればルームの UI が自動的に再ビルドされ、常に最新の状態で実行されるため、古いビルドを心配する必要はありません。