【Claude Code 連載 第68回】セッションの管理 — 名前を付け、再開し、分岐する

スポンサーリンク
【Claude Code 連載 第68回】セッションの管理 — 名前を付け、再開し、分岐する 用語解説
【Claude Code 連載 第68回】セッションの管理 — 名前を付け、再開し、分岐する
この記事は約15分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

スポンサーリンク

背景

この連載では、Claude Codeの公式ドキュメントを1ページずつ読み解いていきます。公式ドキュメントは情報が網羅されている分、「結局どの機能を、どんな場面で使えばいいのか」は自分で考える必要があり、読むのに意外と時間がかかります。そこで、私が実務で使うために読み込んだ内容を「使う場面→実例コード」の順に整理して残していくことにしました。専門家の解説というより、一次情報を読んだ記録です。推測や動作を確認していない部分には、その都度そう書きます。

1. 一言でいうと何か

このページは、Claude Code の会話を「保存された作業単位」として扱うための機能一式——命名・再開・分岐・エクスポート・保存場所——の解説です。

定義は1行です。セッションはプロジェクトディレクトリに紐付けられた保存済みの会話です。そしてClaude Code はローカルに保存されるため、中断したところから再開したり、別のアプローチを試すために分岐したり、タスク間を切り替えたりできます。

第63回(worktree)、第65回(エージェントビュー)、第67回(動的ワークフロー)で claude --resume <name> が繰り返し出てきました。その正体がここです。

範囲の限定を先に置きます。****デスクトップアプリ、Web 上の Claude Code、および VS Code 拡張機能はそれぞれ独自のセッション履歴を保持しています。このページでは CLI について説明します。——4つのサーフェスでセッション履歴は別物であり、行き来はしません。ここは誤解しやすい点です。

機能は大きく4つに分かれます。再開する/名前を付ける/分岐させる/コンテキストを管理する。そこにエクスポートと保存場所が付きます。

2. どういう場面で役立つか

シーン1:昨日の続きから始める

一番素朴な用途です。セッションは作業中にローカルトランスクリプトファイルに継続的に保存されるため、終了後または /clear を実行した後に再開できます。

/clear しても消えていない、というのが地味に重要です。後述のとおり、/clear は「新たに始める」であって「捨てる」ではありません。

シーン2:複数タスクを並行して抱えている

命名の節が、この用途を名指ししています。セッションに説明的な名前を付けて、セッションピッカーで見つけやすく、名前で再開できるようにします。これは複数のタスクを並行して処理している場合に最も重要です。

第65回のエージェントビューで複数セッションを回すなら、名前は事実上必須です。

シーン3:別のアプローチを試したいが、今の道も捨てたくない

これが /branch の用途です。分岐は、これまでの会話のコピーを作成し、それに切り替え、元のセッションはそのままにしておきます。別のアプローチを試す際に、進めていたパスを失わないようにするために使用します。

シーン4:会話の内容をスクリプトで処理したい

/export と、構造化データ向けの4つのインターフェースが用意されています(後述)。

不要・向かないケース

  • デスクトップアプリや Web の履歴を CLI から探したい。前述のとおりそれぞれ独自のセッション履歴なので見えません。
  • **claude -p や Agent SDK で作ったセッションをピッカーから探したい。****セッションピッカーに表示されません。**セッション ID を直接渡す必要があります。
  • 別ディレクトリで作ったセッションを ID で再開したい。****セッション ID ルックアップは現在のプロジェクトディレクトリとその git worktrees にスコープされているため、No conversation found with session ID: <session-id> と報告されます。
  • 自動で付く既定名で再開したい。これはできません。後述しますがデフォルト名は再開ハンドルではありません。
  • **トランスクリプトの JSONL を自前でパースしたい。**原文が明確に止めています。エントリ形式は Claude Code の内部形式であり、バージョン間で変更されるため、これらのファイルを直接解析するスクリプトはリリースごとに破損する可能性があります。
  • **2つのターミナルで同じセッションを開いて並行作業したい。**分岐せずに同じセッションを再開すると、両方からのメッセージが1つのトランスクリプトにインターリーブされます。

3. コマンドの実例と解説

このページはfenced ブロックが3本しかありません。中身の大半はコマンド表と挙動の説明です。3本はすべて原文どおり引用し、表はすべて保持します。

前提:このページの記述はCLI 向け。既定名の自動付与はClaude Code v2.1.196 以降が必要です。

再開の入口は5つ

コマンド機能
claude --continue現在のディレクトリで最新のセッションを再開します
claude --resumeセッションピッカーを開きます
claude --resume <name>指定されたセッションを直接再開します
claude --from-pr <number>そのプルリクエストにリンクされたセッションを再開します
/resumeアクティブなセッション内から別の会話に切り替えます

**--from-pr は覚えておく価値があります。**PR 番号から、それを作ったセッションに戻れます。第65回で見たとおり、バックグラウンドセッションはドラフト PR を自分で開くので、その追跡手段になります。

claude -p / Agent SDK 由来のセッションについては前述のとおり、セッション ID を claude --resume <session-id> に渡すことで再開できます。セッションが開始されたディレクトリから実行してください。

ピッカーはどこを探すか

既定の探索範囲は思ったより狭いです。セッションピッカーは現在の worktree からのインタラクティブセッション、および /add-dir で現在のディレクトリを追加した他の場所で開始されたセッションを表示します。

広げる手段が2段階あります。Ctrl+W を使用してリポジトリのすべての worktree に拡張するか、Ctrl+A を使用してこのマシン上のすべてのプロジェクトに拡張します。

選んだ後の挙動も分かれます。同じリポジトリの別の worktree からセッションを選択すると、そこで再開されます。関連のないプロジェクトからセッションを選択すると、cd と再開コマンドがクリップボードにコピーされます。——**別プロジェクトのセッションは勝手には開かず、コマンドを渡してくる。**行儀の良い設計です。

/cd との関係も明記されています。v2.1.169 以降、/cd でセッションを移動すると、新しいディレクトリのプロジェクトストレージに再配置されるため、その後そのディレクトリのピッカーに表示されます。v2.1.196 以降、移動されたセッションはクラッシュまたは強制終了後も古いディレクトリのピッカーから除外されたままになります。(以前は古いパスにアンダースコアなどの特殊文字が含まれている場合、クリーンでない終了後に古いディレクトリのリストに再度表示される可能性がありました。

名前での解決は worktree をまたぎます。**現在のリポジトリとその worktree 全体で解決されます。どちらの形式も完全一致を探し、別の worktree に存在する場合でも直接再開します。**あいまいな場合の挙動だけ、2つの形式で違います。

コマンド完全一致あいまいな名前
claude --resume <name>直接再開しますセッションピッカーを開き、名前を検索用語として事前入力します
/resume <name>直接再開しますエラーを報告します。セッションピッカーを開くには、引数なしで /resume を実行します

**CLI 側は親切にピッカーを出し、スラッシュコマンド側はエラーで止まる。**セッション内での誤操作を避ける意図だと思います(この解釈は筆者のもので、原文は理由を書いていません)。

名前を付ける4つのタイミング

時期名前を設定する方法
起動時claude -n auth-refactor
セッション中/rename auth-refactor。名前はプロンプトバーにも表示されます
セッションピッカーからセッションをハイライトして Ctrl+R を押します
プラン受け入れ時Plan Mode でプランを受け入れると、既に設定していない限り、プランコンテンツからセッションに名前が付けられます

4つ目は自動です。プランを受け入れると勝手に名前が付く——第65回で「プラン承認で導出された名前が行に表示される」という話が出ていましたが、その出どころがこれです。

そして既定名と設定した名前の区別が、このページで最も間違えやすい箇所です。

名前を付けないインタラクティブセッションでも、起動時にデフォルトの表示名が自動的に付けられます。v2.1.196 以降)形は作業ディレクトリの名前と2文字のサフィックスで、例えば my-app-3f。用途はagent view や claude agents --json 出力などの実行中セッションのリストでセッションを識別することです。

しかし——

デフォルト名は再開ハンドルではありません。claude --resume <name>/resume <name>、およびセッションピッカーは、設定した名前のみと一致します。セッションに名前を付けるとデフォルト名が置き換わります。

**画面に名前が出ているからといって、それで再開できるとは限らない。**エージェントビューで my-app-3f を見て claude --resume my-app-3f を叩いても通りません。

セッションピッカーの操作

ショートカットアクション
/ セッション間をナビゲートします
/ グループ化されたセッションを展開または折りたたみます
Enterハイライトされたセッションを再開します
Spaceセッションコンテンツをプレビューします。ターミナルが貼り付けとしてキャプチャしない場合は Ctrl+V も機能します
Ctrl+Rハイライトされたセッションの名前を変更します
/ またはスペース以外の任意の印字可能文字検索モードに入り、セッションをフィルタリングします。GitHub、GitHub Enterprise、GitLab、または Bitbucket のプルまたはマージリクエスト URL を貼り付けて、それを作成したセッションを見つけます
Ctrl+Aこのマシン上のすべてのプロジェクトからセッションを表示します。もう一度押すと現在のリポジトリに戻ります
Ctrl+W現在のリポジトリのすべての worktree からセッションを表示します。もう一度押すと現在の worktree に戻ります。マルチ worktree リポジトリでのみ表示されます
Ctrl+B現在の git ブランチからのセッションにフィルタリングします。もう一度押すとすべてのブランチを表示します
Escセッションピッカーまたは検索モードを終了します

検索欄に PR/MR の URL を貼れるのは実用的です。GitHub だけでなくGitHub Enterprise、GitLab、Bitbucketにも対応しています。

行の表示内容も定義されています。各行は、セッション名が設定されている場合はそれを表示し、そうでない場合は会話の概要または最初のプロンプト、最後のアクティビティからの経過時間、メッセージ数、および git ブランチを表示します。Ctrl+A で全プロジェクトに広げるとプロジェクトパスが表示されます。

そして**/branch/rewind、または --fork-session で作成されたフォークされたセッションはルートセッションの下にグループ化されます。グループを展開するには を押します。**——分岐は木構造で見えます。

分岐する

セッション内から。

/branch try-streaming-approach

名前を省略した場合、Claude Code は会話の最初のプロンプトに基づいて新しいブランチに名前を付けます。v2.1.198 以降では、これはコンパクション後にも適用されます。(それ以前はリテラル名 Branched conversation にフォールバックしていました。)

コマンドラインからなら、--fork-session を組み合わせます。

claude --continue --fork-session

分岐後の後始末について、注意点が3つ並んでいます。

  • 元のセッションは変更されず、セッションピッカーで利用可能なままです。/branch2つのセッション ID を出力します。現在いる新しいブランチと元のセッションです。
  • 「このセッションで許可」で承認したアクセス許可は新しいブランチに引き継がれません。——**権限は分岐で持ち越されない。**安全側ですが、承認をやり直すことになります。
  • 2つのターミナルで分岐せずに同じセッションを再開すると、両方からのメッセージが1つのトランスクリプトにインターリーブされます。——**分岐せずに二重に開くと混ざる。**並行したいなら分岐する、が正解です。

なお単一セッション内のチェックポイントベースの巻き戻しについては、チェックポイントを参照とあり、/branch/rewind は別機能として整理されています。

セッション内でコンテキストを管理する

これらのコマンドは、セッションを離れることなくコンテキストウィンドウ内の内容を制御します。

  • /clear空のコンテキストで新たに開始します。以前の会話は保存され、/resume で再開可能です。または同じ Claude Code プロセス内では、rewind メニューの前のセッションエントリから再開できます。
  • /compact [instructions]履歴を概要に置き換え、オプションで指定した内容に焦点を当てます。
  • /context現在コンテキストを消費しているものを表示します。

/clear が破壊的でないことは、改めて強調しておく価値があります。消えるのは「今のコンテキスト」だけで、会話そのものは残ります。

エクスポートする

/export を実行して、現在の会話をクリップボードにコピーするか、プレーンテキストファイルとして保存するメニューを開きます。メッセージとツール出力は読みやすいテキストとしてレンダリングされます。ファイル名を渡して、メニューをスキップしてそのファイルに直接書き込みます。

スクリプトから会話を扱う4つの入口

用途の切り分けが明快です。**/export は人が読むためのレンダリングされたトランスクリプトを生成します。**構造化データが欲しいなら別の4つを使います。スクリプトをトリガーするものによって選択してください。

  • Claude を1回実行して結果をキャプチャする--output-format json または stream-jsonclaude -p を呼び出して、非インタラクティブ実行の結果、セッション ID、使用状況、およびコストを構造化 JSON としてキャプチャします。
  • 既存のセッションに質問するclaude -p --resume にセッション ID を渡して、フォローアップ プロンプト(要約リクエストなど)を送信し、構造化された応答をキャプチャします。
  • セッションイベントに反応するhooks と status line commands が入力として受け取る transcript_path フィールドを読みます。SessionEnd hook はセッションが終了したときにトランスクリプトをアーカイブできます。
  • TypeScript または Python アプリに Claude を埋め込むAgent SDK を使用して、各メッセージをプログラムで受け取ります。

2番目の具体例が原文にあります。

claude -p --resume <session-id> --output-format json "summarize what we changed" | jq -r '.result'

**終わったセッションに後から質問を投げて、答えだけ取り出す。**CI やレポート生成に直結する使い方です。

トランスクリプトの保存場所

デフォルトでは、トランスクリプトは ~/.claude/projects/<project>/<session-id>.jsonl に JSONL として保存されます。ここで <project> は作業ディレクトリパスで、英数字以外の文字が - に置き換えられています。各行はメッセージ、ツール使用、またはメタデータエントリの JSON オブジェクトです。

そして前述の警告。エントリ形式は Claude Code の内部形式であり、バージョン間で変更されるため、これらのファイルを直接解析するスクリプトはリリースごとに破損する可能性があります。セッションデータを構築するには、代わりに /export またはスクリプトインターフェースを使用してください。

調整できる項目は4つです。

目的設定場所
~/.claude からストレージを移動するCLAUDE_CONFIG_DIR環境変数
30日間の保持期間を変更するcleanupPeriodDayssettings.json
すべてのモードでトランスクリプト書き込みを抑制するCLAUDE_CODE_SKIP_PROMPT_HISTORY環境変数
1つの非インタラクティブ実行の書き込みを抑制する--no-session-persistenceclaude -p を使用した CLI フラグ

既定の保持期間は30日です。第66回でエージェントチームのタスクリストが同じ cleanupPeriodDays に従うと書かれていましたが、大元はここです。

4. まとめ + 次回予告

  • セッションはプロジェクトディレクトリに紐付いた、ローカル保存の会話。
  • **CLI・デスクトップアプリ・Web・VS Code 拡張はそれぞれ独立したセッション履歴を持つ。**このページは CLI の話。
  • 再開の入口は5つ——--continue(最新)/--resume(ピッカー)/--resume <name>--from-pr <number>/セッション内の /resume
  • **claude -p と Agent SDK のセッションはピッカーに出ない。**ID で再開でき、そのディレクトリから実行する必要がある。
  • ピッカーの既定範囲は現在の worktree + /add-dir で追加した場所。Ctrl+W でリポジトリ全 worktree、Ctrl+A でマシン全体に拡張。別プロジェクトを選ぶと、開かずに cd と再開コマンドをクリップボードに渡してくる。
  • 命名は4経路——claude -n/rename / ピッカーで Ctrl+R / プラン受け入れ時に自動。
  • 既定名(my-app-3f 形式)は再開ハンドルではない。再開に使えるのは自分で設定した名前だけ。
  • PR/MR の URL をピッカーの検索に貼れる(GitHub / GitHub Enterprise / GitLab / Bitbucket)。
  • 分岐は /branch [name]--fork-session元は無傷で残り、ピッカーではルートの下に木としてグループ化される。ただし「このセッションで許可」した権限は引き継がれない。
  • 分岐せずに2つのターミナルで同じセッションを開くと、トランスクリプトが混ざる。
  • **/clear は破壊的ではない。**会話は保存され /resume で戻れる。
  • スクリプト連携は**/export(人間向け)4つの構造化インターフェース(claude -p --output-format jsonclaude -p --resume / hooks・statusline の transcript_path / Agent SDK)**を使い分ける。
  • **トランスクリプトの JSONL を直接パースしてはいけない。**内部形式でバージョン間で変わる。
  • 保存先は ~/.claude/projects/<project>/<session-id>.jsonl、既定の保持期間は30日cleanupPeriodDays)。

次回予告(暫定):今回 /branch と対で登場した**チェックポイント(checkpointing)**を取り上げ、/rewind によるコードと会話の巻き戻し、クリア済み会話を越えた復元を扱う予定です。


よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました