AI・機械学習
永続的なClaude Codeループを管理する方法:Spool
How I manage persistent Claude Code loops: Spool (github.com)
要約
Spoolは、永続的なClaude Codeループを作成、管理、対話するためのツールです。このツールにより、ループに作業を指示し、それらが連携する様子をチャットで確認しながら、継続的な対話に参加できます。Spoolは、ループの実行、通信、およびリソース使用量の監視を容易にし、開発者はより効率的にAIエージェントを活用できます。
全文翻訳
Claude Codeループを連携させ、対話を継続させる方法:Spool
Spoolを使えば、永続的なClaude Codeループの作成、管理、対話が容易になります。作業を指示し、それらが連携する様子をチャットで確認しながら、対話に参加し続けましょう。
Spoolが容易にすること
作業を継続させる。
スケジュールされた起動と再開可能なセッションを備え、永続的なループを1か所で作成・管理できます。
関与し続ける。
ターミナルセッションに張り付くことなく、Webコントロールルーム、Telegram、またはSlackでループと対話できます。
作業を調整する。
ループがフリートチャネル内で直接通信できるようにすることで、すべての質問、結果、または引き継ぎを中継する必要がなくなります。
セッション間の切り替えやループ間のメッセージのやり取りが減ります。
ループに何をさせるか、そして何を生み出すかを決定する時間が増えます。
Spoolはv1.0未満であり、Claude Codeループのフリートとそのオペレーターによってオープンに開発されています。このリポジトリのissueとPRにある4つのループはSpool上で実行され、Spoolを構築しています。コミットは、それを作成したモデルと共同で作成され、すべての変更はCIによってゲートされ、レビュー担当者が読み取るプルリクエストを経て着地し、オペレーターがそれをマージします。問題を見つけましたか?CONTRIBUTING.mdに報告方法と回答者が記載されています。
クイックスタート
Linux、macOS、またはWSL2を実行しているWindowsで、Docker、git、Go 1.25+、Node 20.19+または22.12+、そしてClaudeサブスクリプション(トークン作成のためのみ)上のClaude Codeが必要です。
Spoolを取得してビルドします。
git clone https://github.com/enes-alatas/spool && cd spool
make build image
これにより、bin/spool、その中のコントロールルーム、そしてループが実行される2つのDockerイメージがビルドされます。
起動してサインインします。
./bin/spool を実行します。初回起動時に、ユーザーadmin用のワンタイムパスワードが表示されます。http://127.0.0.1:8080 を開き、そのパスワードでadminとしてサインインし、独自のパスワードに変更してください。パスワードを紛失しましたか?./bin/spool user reset admin で新しいパスワードが表示されます。
コントロールルームが開きます。
フリートを設定します:以下の順序で3つのカードが表示されます。それぞれが自己チェックを行い、自動的に完了状態になります。
Harness。
claude setup-token を実行し、カードで「Add token」を選択して、表示されたものを貼り付けます。ループはそれを通じてClaudeプランで実行されます。
Loops。
「New loop」を選択し、名前とミッションを与えます。最初の起動時にワークステーションが構築され、初回は1〜2分かかります。その起動の最初のターンが終了するとカードが完了します。
Chat surface。
「Attach a bot」を選択し、次に「Attach Telegram」または「Attach Slack」を選択します。Telegram:Telegramで@BotFatherに /newbot と送信し、表示されるトークンを貼り付けます。Slack:ダイアログの「Create app from manifest」に従い、アプリの2つのトークンを貼り付けます。docs/SLACK.mdに手順があります。次に「Get a link code」を選択し、そのコードをボットにダイレクトメッセージで送信し、尋ねられたらYESと返信します。これによりアカウントがリンクされ、あなたがループのオーナーになります。もう一度ボットにメッセージを送信してください。ループがそこで応答するとカードが完了します。チャットアプリがありませんか?代わりにコントロールルームのループのページで対話できます。HarnessとLoopsカードが完了したら、チャットサーフェスカードで「Skip for now」を選択して、チャットサーフェスなしでセットアップページを完了し、後でループのページでボットをアタッチできます。
その他の実行方法
リリースから(v0.5.1以降):ビルド済みのバイナリとイメージが含まれているため、Go、Node、makeは不要です。OPERATIONS.mdにダウンロード、チェックサム、イメージのプル方法が記載されています。サーバー上で、サービスとして、TLSとバックアップ付きで:OPERATIONS.mdを参照してください。Dockerなしで。./bin/spool --runtime bare は、各ループをあなたのユーザーアカウントの下でプレーンプロセスとして実行し、コンテナ化されません。make imageやステップ3は不要です。ループが何を含むかを読む前に、それを選択してください。
仕組み
プレーンなClaude CLIが基盤です。
ループはClaudeのサブプロセスであり、標準入力/標準出力を介してstream-jsonで通信します。通常のClaude Codeログイン、プラン、セッション制限が適用されます。APIキーやSDKはありません。
直接調整。
ループは、フリートチャネルまたはプライベート会話に明示的にアドレス指定されたメッセージを送信します。Telegram、Web、または別のループのメッセージからループを@メンションすると、Spoolが配信します。最終ターンの応答は、タイムラインのステータスノートとして残ります。ループ間のチェーンはストームガードされています。
起動、スリープ、ペース配分。
アイドル状態のループはコストがかかりません。プロセスは終了し、完全なコンテキストで後で再開されます。ループは、デフォルトで30分のティック間隔で起動するか、メッセージを受信したときにすぐに起動するか、[next-wake: 45m]トレーラー付きで要求したときに起動します。これは設定した境界内にクランプされます。一時停止されたループはメールをキューに入れます。
コントロールルーム。
デフォルトでhttp://localhost:8080にあるハブのWeb UIです。各ループの会話をトークンがストリーミングされるライブで表示し、そのスケジュールと各ターンおよび1日のコストを表示し、ループを一時停止、起動、またはキルします。
プランのガードレール。
フリートページには、プランの5時間および7日間のウィンドウの使用量が、ループ自身のストリームから読み取られ、1日の支出に対する各ループのシェアが表示されます。デフォルトでは、いずれかのウィンドウの90%を超えると、そのウィンドウがリセットされるまですべてのループがスリープ状態になります。メッセージは待機し、何も失われません。「Resume now」は早期に再開させ、「Settings → Plan guardrails」でしきい値を設定するかオフにできます。
セキュリティ概要
デフォルトでコンテナ化されています。
各ループは、エグレス許可リスト(Settings → Egress)を備えた独自のコンテナで実行され、ハブポートへのみルーティングされます。このポートはループのMCPエンドポイントのみを提供し、それ以外は何も提供しません。要求された場合のみコンテナ化されません。ループは、パーミッションプロンプトをバイパスして実行されます。Dockerなしの場合、Spoolはホストで実行する代わりに起動を拒否します。--runtime bare は、各ループをあなたのユーザーアカウントの下で、あなたのネットワークとファイルを使用して、コンテナ化されていないバッジ付きでサブプロセスとして実行します。
サインイン済み。
コントロールルームはユーザー名とパスワードを要求し、スクリプトはオペレーター・トークン(spool token)を使用します。localhostへのバインディングは、それ自体では境界ではありません。
シークレットの封印。
ボットトークン、接続シークレット、セットアップ・トークンは、データディレクトリ内のhub.keyの下に封印されています。spool.dbとは別にバックアップしてください。docs/CONTAINMENT.mdに、コンテナ化が何を行わないかを含む全体像が記載されています。SECURITY.mdに脆弱性の報告方法が記載されています。
チャットサーフェス
ループはコントロールルームのみで開始されます。TelegramまたはSlackからアクセスするにはボットをアタッチしてください。各ループは独自のボットまたはアプリであり、クイックスタートのステップ5で最初のボットをアタッチします。docs/TELEGRAM.mdはBotFather、グループ、リアクションをカバーし、docs/SLACK.mdはアプリマニフェスト、2つのトークン、リアクション、投票をカバーします。
誰があなたのループと話せるか
Spoolは送信者許可リストを保持しており、リストに載っている人だけがループに到達できます。それ以外の誰かがあなたのボットにメッセージを送信しても無視されます。メッセージはループに到達せず、グループをバインドできず、/spool_statusも応答しません。ステップ5でアカウントをリンクすると、あなたがリストに追加されます。他の誰かを招待するには、ユーザーとして追加し(spool user add、またはSettings → Users and access)、そのユーザーにSettings → Link TelegramまたはLink Slackの下でリンクさせます。Settings → Users and accessは各ユーザーのリンクをリストし、すべてのボットでユーザーをブロックできます。また、古いペアリングコードでユーザーなしで許可された人もブロックできます。ブロックされた送信者は一切応答を受け取りません。Slackアプリは、インストールしたワークスペースに既にプライベートであり、許可リストもそこで適用されます。ループ間のトラフィックは内部的であり、影響を受けません。
フラグ
フラグ デフォルト 設定内容
--listen 127.0.0.1:8080 コントロールルームとそのAPIが提供される場所
--data-dir ~/.spool データベース、hub.key、ループホーム、ワークツリー
--runtime auto デーモンが到達可能な場合はdocker、それ以外は起動を拒否。bareはループをコンテナ化せずに実行
--trusted-host none TLSプロキシの背後にあるハブが到達される名前。OPERATIONS.mdにsystemdユニットとCaddyレシピがあります
--mcp-listen hubによって選択される ループの単一ポート。docs/CONTAINMENT.mdに選択方法が記載されています
spool --help はすべてのフラグをリストします。spool token はオペレーター・トークンを再度表示します。
開発
make server # Goバイナリのみ(最後にビルドされたUIを使用)
make dev # :8080でバックエンドを実行
make ui-dev # /apiプロキシ付きvite開発サーバー
make test # レベル1:単体テスト+アーキテクチャテスト
make itest # レベル2:実際のバイナリ対fakeclaude(プロトコルフェイク)、約10分(Dockerデーモンなしで約7分。2つのファイルはスキップ)
make image # spool-workstationおよびspool-egressイメージをローカルでビルド
make lint # gofmt + vet(Li