Claude Media
Claude Codeのagent view — 複数セッションを束ねる常駐プロセス設計

Claude Codeのagent view — 複数セッションを束ねる常駐プロセス設計

Claude Code v2.1.139のagent viewは、複数のバックグラウンドセッションを1画面で運用するための仕組みです。状態表示、返信とアタッチの違い、worktreeと削除、停止時の挙動を実機の状態確認つきで解説します。

ターミナルを開き直さずに、並走セッションの状態を知る

Claude Codeを日常的に使うと、機能Aの実装、テストの追加、レビュー指摘の修正が、別々のターミナルで同時に動く状態になりがちです。困るのは「どれが今、自分の返事を待っているのか」が分からないことです。

v2.1.139(2026年5月11日)で入ったagent view(claude agents)は、この状況のための1画面です。動作中・入力待ち・完了のセッションを一覧にし、返信だけならその場で済ませられます。セッションを動かすのは、ユーザー単位のsupervisor(常駐プロセス)です。Claude Codeが「1つの対話を持つツール」から、複数の作業を並走させる基盤に寄る土台でもあります。

Research Previewなので、画面やキーバインドは今後変わる可能性があります。組織で止めたいときは、disableAgentView設定か環境変数CLAUDE_CODE_DISABLE_AGENT_VIEWを使います。管理者はmanaged settingsで強制できます。

実機で確かめたこと(v2.1.287)

作業用の空ディレクトリにHOMEとCLAUDE_CONFIG_DIRを向けた状態で、v2.1.287の状態確認コマンドだけを実行しました。モデルの呼び出しやログインは伴いません。

claude --version
claude agents --json
claude daemon status
2.1.287 (Claude Code)
[]
not running
 
bg sessions:
  sock dir:     /tmp/cc-daemon-<uid>/<hash>
  control.sock: unreachable (connect ENOENT /tmp/cc-daemon-<uid>/<hash>/control.sock)
  bg workers:   0 in roster.json (control unreachable)
  roster.json:  absent
  daemon.log:   absent

セッションが1つもない環境では、claude agents --jsonは空の配列[]を返して終了します。supervisorは起動しておらず、roster.jsonもdaemon.logもまだ存在しません。supervisorが立ち上がるのは、最初にセッションをバックグラウンドへ送るか、agent viewを開いたときです。

セッションを扱うサブコマンドの役割は次のとおりです。

コマンド役割
claude stop <id>役割セッションを止める。claude attach <id>か返信で続きから再開できる
claude respawn <id>/--all役割動作中でも停止中でもセッションを再起動する。--allは動作中の全セッションが対象
claude rm <id>役割セッションを削除する。作業ツリー(worktree)は、未コミットの変更などがなければ一緒に消える
claude attach <id>役割端末で開く。←でagent viewに戻り、Ctrl+Zでシェルに戻る。どちらでもセッションは動き続ける

claude agentsには、開いたagent viewから投げる新規セッションの既定値を決めるフラグがあります。--model、--effort、--permission-mode、--agent、--restricted(v2.1.248以降)です。--add-dir、--mcp-config、--plugin-dir、--settingsは、通常のclaudeと同じように設定を引き継ぎます。--cwdは一覧の絞り込み、--jsonと--allは一覧をスクリプトに渡すためのものです。

一覧の読み方 — 色は状態、形はプロセス

一覧には、全プロジェクト・全worktreeのバックグラウンドセッションが並びます。別の端末で開いている通常の対話セッションは、バックグラウンドに送るまで出ません。サブエージェントやagent teamsのチームメイトも、別の行にはなりません。特定のプロジェクトだけに絞るなら、claude agents --cwd <path>を使います。

各行の先頭アイコンは、色とアニメーションで状態を示します。

状態表示意味
Working表示アニメーション意味ツールの実行中か、応答を生成中
Needs input表示黄意味質問への回答、権限の判断、サンドボックスやMCPサーバーからの入力要求など、ユーザーにしか出せない答えを待っている
Idle表示薄色意味やることがなく、次のプロンプト待ち
Completed表示緑意味タスクが成功して終わった
Failed表示赤意味エラーで終わった
Stopped表示灰意味Ctrl+Xやclaude stopで止めた。外部からプロセスを終了された場合と、バックグラウンドサービスが止まっている間に終わった場合も含む

同じアイコンの形は、プロセスが生きているかを示します。✻とアニメーションの✽は生存中で即応します。∙はプロセス終了済みで、返信やアタッチをするとClaudeが続きから再開します。✢は/loopの待機中で、実行回数とカウントダウンが出ます。

ローカルのバックグラウンドセッションが入力を求めたとき、完了したとき、失敗したときは、設定した端末の通知経路にも通知が届きます。Notificationフックにはagent_needs_inputかagent_completedのタイプで渡されます。

行の右端に出る#1234(GitLabなら!1234)は、状態アイコンとは別のPRへのリンクです。番号の色がPRの状態を表します。

番号の色PRの状態
黄PRの状態チェックかレビュー待ち、またはチェック失敗
緑PRの状態チェック通過で、レビューのブロックなし
紫PRの状態マージ済み
灰PRの状態ドラフトまたはクローズ

複数のPRに紐づくセッションは3 PRsのように件数表示になり、色は最も対応が要るオープンなPRのものです。リンクの対象は、Claudeがghで操作したPRや、チェックアウト・pushしたブランチのオープンなPRから検出されます。gh pr mergeは対話端末にしか結果を出さないため、これだけではリンクされません。

並びはPinned、Ready for review、Needs input、Working、Completedの順です。Ready for reviewは、オープンなPRを持つセッションが移るグループで、状態名とは1対1に対応しません。Completedには完了・失敗・停止のセッションがまとまります。

絞り込みは、入力欄を次の接頭辞で始めます。

接頭辞絞り込み対象
a:<name>絞り込み対象指定したエージェントのセッション
s:<state>絞り込み対象状態やグループ。s:blockedで自分待ちを全部出せる
n:<text>絞り込み対象名前か最初のプロンプトに文字列を含む。v2.1.287以降
o:<text>絞り込み対象結果に文字列を含む。o:だけなら結果を報告済みのもの全部
#1234やPRのURL絞り込み対象そのPRを扱うセッション

a:・s:・n:・o:は空白区切りで重ねられ、すべてに合う行だけが残ります。

操作キーは、一覧では出てこない挙動を持つものだけ挙げます。

  • Alt+1〜Alt+9:選択中のセッションと同じディレクトリのN番目へアタッチする
  • Shift+Enter:改行を入れる。ディスパッチとアタッチを同時に行うのはCtrl+Enterで、?のオーバーレイに表示される端末に限る
  • Ctrl+X:停止し、2秒以内にもう一度押すと削除する。グループ見出しで押すと、確認のうえグループ全体を削除する
  • Ctrl+S・Ctrl+T:keybindings.jsonでagents:switchView・agents:togglePinとして割り当てを変えられる。Ctrl+G(外部エディタ)はchat:externalEditorで変更できる。3キーとも変更できるのはv2.1.257以降で、表のそれ以外のキーは変更できない

返信だけで済む場面と、アタッチが要る場面

行でSpaceを押すとpeekパネルが開きます。切れていた1文に加え、入力待ちなら質問そのもの、完了なら結果、作業中ならステータスの全文が出ます。ここから返信を打てます。

くらべる

peekから答えられるものと、アタッチが要るもの

返信が通る

peekで済む

選択肢つきの質問は、入力が空のとき番号キーで選べます。選択肢のない質問は文字で答えます。空の入力欄に返信候補が出ていればTabで取り込めます。先頭に!を付けるとBashコマンドとして送ります。

返信が待ち行列に残る

アタッチが要る

権限の確認ダイアログや、サンドボックス・MCPサーバーの入力要求は、peekから返信しても答えになりません。返信はキューに入ったままで、→でアタッチしてダイアログに答えます。

作業中のセッションへの返信は、割り込まずにメッセージキューに入ります。例外は/stopだけの返信で、作業中でも入力待ちでも即座に止まります。バックグラウンドサービスに届かなかった返信は保存され、次にプロセスが起動したときの最初のプロンプトになります。ただし!始まりの返信は、通常のプロンプトとして届いてしまうため保存されません。

アタッチ中のセッションは、tui設定にかかわらず常にフルスクリーン表示になります。スクロールバックがないためで、端末側のスクロールではビューポート分しか見えません。Ctrl+Oでトランスクリプトモードに入れます。detachは←(空のプロンプトで)・/exit・Ctrl+Z・Ctrl+Cの2連打のいずれでも、セッションは止まりません。終わらせるのは/stopです。通常の前面セッションでCtrl+Zを押したのにシェルへ戻れない報告は、Ctrl+Zの切り分けの記事にまとめています。

セッションを増やす入口は4つある

入口

新しいバックグラウンドセッションの作り方

  • agent viewの入力欄

    プロンプトを書いてEnter。最初の単語がカスタムサブエージェント名なら、そのサブエージェントが主エージェントになります。@<名前>は文中のどこでも使えます。@<repo>はリポジトリ、/<コマンド>はskillやコマンドの候補で、! <コマンド>はシェルのジョブです。

  • /background(/bg)

    いまの会話をそのままバックグラウンドへ送ります。←(空のプロンプト)でも同じです。実行中のバックグラウンドシェルコマンド・サブエージェント・/loopのスケジュールは引き継がれ、モニターは止まります。

  • /fork

    会話のコピーを新しいセッションにして、元のセッションは動かし続けます。コピーは元の会話と独立し、モデル・権限モード・effortも引き継ぎます。v2.1.212以降の挙動で、v2.1.161〜v2.1.211では「フォークしたサブエージェント」でした(現在は/subtask)。

  • claude --bg

    シェルから直接投げます。claude --bg --name flaky-test-fix "..."のように名前も付けられます。-pとの併用は拒否されます。--execを付けるとClaudeではなくシェルコマンドをジョブとして走らせ、モデルは呼ばれません。

@<名前>がサブエージェントと隣接リポジトリの両方に一致したら、サブエージェントが優先されます。たまたま文頭の単語がサブエージェント名と同じ場合もそちらに振られるので、意図しないときは別の語で始めるか@形式で明示します。4文字未満のプロンプトはToo shortで拒否されます。

/bgの代わりになる←の動作は、foregroundのセッションではleftArrowOpensAgentsをfalseにして切れます。この設定は~/.claude.json(グローバル設定)だけで有効で、settings.jsonに書いても無視されます。

claude --bgでバイパス権限を使うには、事前に対話セッションでclaude --dangerously-skip-permissionsを一度実行し、免責事項に同意しておく必要があります。agent viewの--permission-modeや--modelは、そのagent viewから投げる全セッションの既定になります。

権限モードの決まり方には履歴があります。v2.1.142でclaude agentsから新規に投げたセッションが、設定のpermissions.defaultMode(acceptEdits)を無視してautoで起動するという報告が出ました(Issue #59413)。報告ではv2.1.143で修正済みとされています。現在の優先順位は、/bgや←ならセッションのモードを保ち、シェルから開いたclaude agentsやclaude --bgなら通常のclaudeと同じ決まり方です。

claude agents --jsonでバックグラウンドセッションを操作するで扱うように、一覧のJSON取得や--execのジョブ化はCIからも使えます。起動時にclaudeを引数なしでagent viewにする設定は、起動時の既定を切り替える3キーにあります。

supervisorはセッションのプロセスをどう扱うか

各セッションは、supervisorの下で独立したClaude Codeプロセスとして動きます。プロセスの扱いは状態で変わります。

supervisor

状態ごとのプロセスの扱い

  • 動作中・ダイアログ待ち・アタッチ中

    プロセスは動き続けます。サブエージェント・ワークフロー・モニターの実行中も、動作中として数えられます。

  • 終了またはメッセージ待ちで約1時間アタッチなし

    リソース解放のためプロセスが止まります。会話はディスクに残り、次のアタッチか返信で続きから再開します。Ctrl+Tでピン留めすると止まりません。

  • 予期せず終了

    supervisorが再起動します。←か/backgroundで自分がバックグラウンドへ送ったセッションをkillで終わらせた場合は、再起動せず停止扱いになります。

  • 自動更新後

    supervisor自身が新しい版に再起動し、アイドルのセッションをバックグラウンドで移します。作業中・入力待ち・アタッチ中のセッションは中断されません。

プロセスが止まったり再起動したりしても、バックグラウンドのシェルコマンド・ワークフロー・サブエージェントは次のプロセスに引き継がれます。例外は、モニターと、サブエージェントが起動したシェルコマンドで、プロセスと一緒に止まります。セッションを削除すると、引き継いだものもすべて止まります。止まるプロセスと一緒に終わらせたいときは、環境変数CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFFを1にします。

状態は設定ディレクトリの下に保存されます。daemon/roster.jsonが起動中セッションの名簿、jobs/<id>/state.jsonがagent viewに出る状態、jobs/<id>/tmp/がセッション専用の作業領域です。CLAUDE_CONFIG_DIRを~/.claude以外に向けると、supervisorは独立したインスタンスとして別のセッション集合を持ちます。テスト用の環境を分けたいときに使えます。

state.jsonは安定したインタフェースではありません。外部から状態を読むにはclaude agents --jsonを使います。stateはworking・blocked・done・failed・stoppedの5種類で、待機中のセッションはblockedではなくdoneと読みます。blockedは「ユーザーの何かを待たないと進めない」を意味します。

更新後にclaude daemon statusが「supervisorと手元のclaudeのバージョンが違う」と警告したら、claude daemon stop --anyで止めます。すると次のclaude agentsが新しい版のsupervisorを起動します。OSのサービスとして導入している場合、警告が示すコマンドは--anyなしになります。supervisorを止めると、既定ではバックグラウンドセッションも終わります。残すなら--keep-workersを付けます。

worktreeの隔離と、削除で消えるもの

バックグラウンドセッションは、まず作業ディレクトリで始まり、ファイルを編集する前に.claude/worktrees/の下のgit worktreeへ移ります。並列セッションが同じチェックアウトを読めても、書き込みは各自のworktreeに分かれます。

worktreeに移らない条件は4つです。すでに別のworktreeの中にいる場合、編集対象ファイルがリンクされたworktreeの中にある場合、gitリポジトリではなくWorktreeCreateフックもない場合、作業ディレクトリの外へ書く場合です。git worktreeが使いにくいリポジトリでは、.claude/settings.jsonで隔離を切れます。

{
  "worktree": {
    "bgIsolation": "none"
  }
}

サブエージェントはセッションの作業ディレクトリを引き継ぐので、サブエージェントの編集もセッションのworktreeに入ります。サブエージェントだけ別のworktreeにしたいなら、frontmatterのisolation: worktreeを使います。

worktreeで変更したセッションに対しては、Claudeは終了前に作業を残すよう指示されます。確認なしでコミットし、リモートがあればブランチをpushし、必要ならドラフトPRを作ります。mainやmasterへのpush、force push、マージはしません。CLAUDE.mdやメモリーに「gitは自分で行う」とあれば、その指示が優先されます。

削除はここで事故が起きやすい操作です。agent viewでの削除とclaude rmは、worktreeの扱いが違います。

  • agent viewの削除は、コミットしていない変更ごとworktreeを消す
  • claude rmは、未コミットの変更があるとworktreeもセッションも残す
  • 別の実行中セッションが使用中・ロック中のworktreeは、どちらでも消さず、行にnot deletedと出る

push済みでないコミットがあるworktreeは、どちらの方法でも一度拒否されます。拒否のメッセージには、ブランチ名と未pushのコミット数が出ます。

手順

未pushのコミットがあるセッションを消すとき

  1. 1

    まず拒否される

    claude rm <id>を実行すると、セッションとworktreeは残り、拒否の理由が表示されます。リモートにあるコミットや、originの既定ブランチのローカルコピーに入っているコミット(そのブランチがメインのチェックアウトにある場合)は、拒否の対象になりません。

  2. 2

    残すか、捨てるかを選ぶ

    残すならpushするか既定ブランチにマージして、もう一度削除します。捨てるなら、そのままCtrl+Xを2回押すか、拒否が表示したclaude rm <id> --discard-unpushed <commit>@<worktree-id>を実行します。どちらもセッションとworktreeに加えてブランチも消え、未pushのコミットと未コミットの変更が失われます。

  3. 3

    捨てる範囲は拒否時点のもの

    破棄されるのは、拒否が示した状態までです。その後にコミットが増えていたら再び拒否され、更新された状態が表示されます。--discard-unpushedはv2.1.260以降で使えます。

gitやフックがworktreeを消せなかった場合は、--force-remove-worktree <worktree-id>(v2.1.268以降)でディレクトリだけ強制削除できます。ブランチはリポジトリに残ります。

削除してもトランスクリプトは手元に残り、claude --resumeで開けます。agent viewの入力欄に/resumeだけを打つと、過去のセッションの一覧から行を戻せます(v2.1.212以降)。.claude/worktrees/にディレクトリが溜まったら、git worktree listで確認してgit worktree remove <path>で消します。

スリープでは止まらず、シャットダウンで止まる

supervisorはローカルで動くので、PCをシャットダウンまたは再起動すると、動作中のセッションは止まります。スリープは別で、セッションは保たれ、復帰時にプロセスが再開してsupervisorが再接続します。スリープの時間差を「アイドル」と誤判定することもありません。

シャットダウン後に何が見えるかは、最後に進捗があってからの時間で決まります。

経過agent viewの表示戻し方
48時間以内agent viewの表示Failed戻し方アタッチか返信で、続きから再開
48時間超agent viewの表示Stopped(ended while the background service was off)戻し方行でEnterを2回押す。返信かclaude attachなら、確認なしで再開
入力待ちだったagent viewの表示Needs inputのまま戻し方そのまま答える

claude respawn --allは、シャットダウン後の一括復旧用ではありません。いま動いているセッションを再起動して、更新後のバイナリで動かし直すためのコマンドです。トランスクリプトの自動クリーンアップで保存済みの会話が消えたセッションは開けず、claude rm <id>で行を消すか、claude respawn <id>で元のプロンプトを最初から実行し直します。

「PCを閉じても動かし続けたい」要件は、agent viewの守備範囲を超えます。Anthropic管理のクラウドで動くClaude Code Routinesを組み合わせる領域です。

macOSでは、バックグラウンドのセッションホストが保護フォルダへのアクセスを端末とは別に要求します。~/Desktop・~/Documents・~/DownloadsでOperation not permittedが出たら、システム設定の「プライバシーとセキュリティ」>「ファイルとフォルダ」で許可します。ネイティブインストーラーなら、項目はClaude Codeとして現れ、許可は更新後も保たれます。Homebrewやnpmのときは項目名がバイナリのパスになり、更新後に付け直しが要ることがあります。macOS 15以降では、LAN内のホストへ接続するコマンドがconnect: no route to hostで失敗することもあります。初回の接続時に出るローカルネットワークの許可を一度与えると、通常の端末と同じように届きます。

usageと費用

バックグラウンドセッションは、通常のセッションと同じ契約のusageを消費します。10個を並列に回せば、1個のときの約10倍の速さで枠を使います。枠の減り方を見ながら並列数を調整します。

各行の1行サマリは、Haiku級のモデルが書きます。作業中の行は15秒ごとに更新されますが、この更新はセッション自身の出力を使うだけで、モデルへのリクエストを送りません。モデルがサマリを書くのは各ターンの終わりと、長いターンの途中で数分ごとの書き直しです。リクエストは通常のプロバイダー経由で、セッション本体と同じデータ利用条件で課金されます。サードパーティのプロバイダーやゲートウェイでHaiku級のモデルが未設定なら、セッションのメインモデルが使われます。ANTHROPIC_DEFAULT_HAIKU_MODELで選べます。

subagents・agent teams・/loopとの使い分け

仕組み動く場所コンテキスト主な用途
agent view動く場所セッションの外側コンテキスト各セッションが独立主な用途並列ジョブの一覧と返信
subagents動く場所1つのセッションの中コンテキスト親子で分離。結果が親へ返る主な用途専門領域への委譲
agent teams動く場所リード1本とチームメイトコンテキスト各チームメイトが別のコンテキストウィンドウ主な用途役割分担と相互連絡
/loop動く場所1つのセッションの中コンテキストセッションが持つ主な用途間隔を置いた繰り返し

agent teamsは実験的機能で、既定では無効です。CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1を設定すると使えます。チームメイトは、別々のClaude Codeインスタンスです。リードが調整しますが、チームメイトどうしも直接やり取りします。agent viewの一覧には、チームメイトもサブエージェントも別の行として出ません。組み合わせるなら、agent viewで複数の独立セッションを並べ、各セッションの中でサブエージェントに委譲する二階層になります。

「テスト・レビュー・リファクタを別々の作業として並走させたい」ならagent view、「このセッションの中でレビューだけ専任に渡したい」ならsubagents、「同じ確認を間隔を置いて繰り返したい」なら/loop、という分担です。個々のセッションに達成条件を渡して自走させる使い方は、/goalコマンドで扱っています。agent viewは、その自走するセッションを複数並べて見渡す側にあたります。

まとめ

決め手は、セッションをどこで動かし、誰が返事を拾うかです。手元で並走させたセッションの返事を1画面で拾うならagent view、PCを閉じても続けたいならRoutines、1つのセッションの中で専任に渡すならsubagentsになります。

参照した一次ソース

この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。

  1. code.claude.com/docs/en/agent-view
  2. code.claude.com/docs/en/changelog
  3. code.claude.com/docs/en/agent-teams
  4. github.com/anthropics/claude-code/issues/59413
この記事を共有:XはてブLinkedIn