Claude Media
Claude Codeの/exportコマンドで会話をテキスト保存する

Claude Codeの/exportコマンドで会話をテキスト保存する

/exportはClaude Codeの会話をプレーンテキストで書き出すコマンドです。ファイル名指定の有無で挙動が変わり、スクリプトから読みたいときは別の手段を使います。

Claude Codeのセッション内で /export と打つと、その会話がプレーンテキストとして書き出されます。ファイル名を付けずに実行するとクリップボードコピーかファイル保存を選ぶメニューが開き、ファイル名を付けるとメニューを飛ばして指定したファイルへ直接書き込みます。

書き出したいのが今の会話なのか過去の会話なのか、人が読むのかスクリプトが読むのかで、使う手段が変わります。この記事は /export での書き出しと、過去の会話を開き直してから書き出す手順が中心です。トランスクリプトの保存場所や読み出し経路の全体像はClaude Codeのセッションエクスポートとトランスクリプトの保存場所にあります。

今の会話を書き出す: ファイル名の有無で変わること

/export は現在の会話を、メッセージとツール出力を読める形に整形したプレーンテキストにします。バグ報告の添付、レビュー依頼、社内wikiへの貼り付けのように、会話を人に見せる場面向けです。

/export
/export today-debug-session.txt
くらべる

/export の2つの呼び出し方

引数なし

/export

メニューが開き、クリップボードへのコピーかファイル保存を選びます。会話の書き出し先をその場で決めたいとき、貼り付けるだけで済むときに向きます。

ファイル名つき

/export <filename>

メニューを介さず、指定したファイルへ直接書き込みます。保存先が決まっている運用や、手順書に組み込みたいときに向きます。

ファイル名には絶対パスや ~ も指定でき、拡張子も指定どおり保たれます。日付やセッション名をファイル名に含めておくと、後から探しやすくなります。

ファイルへ保存すると、成功メッセージにはファイル名だけでなくフルパスが表示されます。保存先を後から探す必要がありません。書き出したテキストに載るモデル名も、既定のモデルではなく、その会話で実際に使ったモデルです。メニューが開いている間に Ctrl+C か Ctrl+D を2回押すと、メニューが閉じます。Claude Code自体は終了しません。

VS Code拡張でも、Export conversationとして会話をコピーまたは保存できます。チャット欄に /export と打つ形でも呼び出せます。

過去の会話を書き出す: 先に再開してから/exportする

/export の対象は今アクティブなセッションだけです。別の日に作業した会話を書き出すなら、そのセッションを開き直してから実行します。

手順

過去のセッションを書き出す流れ

  1. 1

    セッションを探す

    claude --resume でセッションピッカーを開きます。名前を付けていないセッションは、AI生成のタイトルや要約、最初のプロンプトで表示されます。Space で中身をプレビューでき、Ctrl+A を押すとこのマシン上の全プロジェクトまで探せます。

  2. 2

    再開時のダイアログに注意する

    Pro・Maxプランで、約1時間を超えて使っていない10万トークン超のセッションを再開すると、続け方を選ぶダイアログが出ます。「Resume from summary」は /compact を走らせて履歴を要約に置き換えます。書き出しが目的なら「Resume full session as-is」を選びます。

  3. 3

    /exportを実行する

    再開したセッションで /export を実行します。

セッションの探し方は、手がかりによって入口が変わります。

手がかりコマンド
今のディレクトリで最後に作業した会話コマンドclaude --continue
名前を付けたセッションコマンドclaude --resume <name>
セッションIDコマンドclaude --resume <session-id>
.jsonl のトランスクリプトの絶対パスコマンドclaude --resume <transcript-path>
紐づくPull Requestの番号コマンドclaude --from-pr <number>
セッション内から別の会話へコマンド/resume

--resume <name> は完全一致する名前があれば直接再開し、同名が複数あるとピッカーを検索語つきで開きます。セッション内の /resume <name> は、同名が複数あるとエラーを返すので、引数なしの /resume で選びます。

claude --resume <session-id> はどのディレクトリからでも実行でき、まず現在のプロジェクトとgit worktreeを探し、なければ他の全プロジェクトを探します。他プロジェクトに該当するトランスクリプトが1つに絞れたときだけ解決します。手動でコピーした重複ファイルがあっても別セッションを開くことはありません。見つからないと No conversation found with session ID: <session-id> と表示されます。

claude -p やAgent SDKで作ったセッションは、ピッカーにも claude --continue にも出てきません。そうしたセッションを書き出したいときは、セッションIDを控えておいて claude --resume <session-id> で開きます。ピッカーには、最初のプロンプトが /loop のセッションも出ません。

後から書き出す予定の会話には、先に名前を付けておくと探す手間が減ります。起動時は claude -n auth-refactor、セッション中は /rename auth-refactor で付けられ、ピッカーでは行を選んで Ctrl+R でも変えられます。

同じセッションを2つのターミナルで再開すると、両方のメッセージが1本のトランスクリプトに混ざります。別の進め方を試すなら、/branch で会話を複製してから進めます。

再開したセッションには、ツール呼び出しと結果を含む会話の履歴が復元されます。一方、--mcp-config、--settings、--plugin-dir、--fallback-model、--add-dir で渡した設定は自動では戻りません。再開後に会話の続きをさせるつもりなら、元の起動オプションを付け直します。

/exportの出力をスクリプトで読まない理由

/export が作るのは人間が読むための整形済みテキストで、パースする前提の形式ではありません。スクリプトから扱う経路(claude -p のJSON出力、hookの transcript_path、Agent SDK)の比較は、姉妹記事にあります。ここでは、/export を使う運用と組み合わせるときの要点だけを書きます。

セッションIDは、最初の実行結果のJSONから拾えます。公式のヘッドレス実行の例は、次のようにIDを変数に取ってから続きを実行します。

session_id=$(claude -p "Start a review" --output-format json | jq -r '.session_id')
claude -p "Continue that review" --resume "$session_id"

transcript_path の指すファイルは非同期に書き込まれるため、フックが発火した時点では直前のターンの最後のメッセージまで入っていないことがあります。ターン最後の応答テキストが要るときは、Stop と SubagentStop のフックに渡される last_assistant_message を使います。--output-format json によるCI連携の具体例はClaude CodeをGitHub Actionsに組み込むにあります。

元のJSONLを自作スクリプトで直接パースしない

会話は自動的にJSONL形式でローカルに保存されます。保存先は既定で ~/.claude/projects/<project>/<session-id>.jsonl です。<project> は作業ディレクトリのパスの英数字以外をハイフンに置き換えた名前で、200字を超えると200字に切り詰めてフルパスのハッシュが付きます。1行がメッセージ・ツール使用・メタデータのいずれかのJSONオブジェクトです。

JSONLの隣には、サブエージェントの会話が <session>/subagents/ に、大きなツール出力が <session>/tool-results/ に別ファイルで置かれます。サブエージェントの会話は親のトランスクリプトと一緒に、大きなツール出力も同じ保持期間で削除されます。

このエントリの形式はClaude Code内部の実装で、バージョン間で変わります。直接パースするスクリプトはどのリリースでも壊れることがあるので、会話データを扱うなら /export か前節の入口を使います。

保存先と保持期間を変える

トランスクリプトを残す場所と期間は、目的別の設定で調整できます。

したいこと設定する項目場所
/export で書き出せる期限(既定30日)を変える設定する項目cleanupPeriodDays場所settings.json
保存先を ~/.claude 以外に移す設定する項目CLAUDE_CONFIG_DIR場所環境変数
全モードでトランスクリプトの書き込みを抑止する設定する項目CLAUDE_CODE_SKIP_PROMPT_HISTORY場所環境変数
1回の非対話実行だけ書き込みを抑止する設定する項目--no-session-persistence場所claude -p のCLIフラグ

cleanupPeriodDays の削除は、セッション開始後にバックグラウンドで走り、メッセージなしでトランスクリプトを消します。保持期間を過ぎた会話は /resume のピッカーにも出ず、/export の対象にもなりません。既定は30日、最小は1で、0 を指定すると検証エラーになります。長期保存したい会話は、期限前に /export で書き出すか、cleanupPeriodDays を延ばします。

--no-session-persistence はv2.1.285の claude --help で次のように表示されます。--print 専用なので、対話セッションで残したくないときは環境変数の方を使います。

claude --help | grep -A3 no-session-persistence
  --no-session-persistence              Disable session persistence - sessions
                                        will not be saved to disk and cannot be
                                        resumed (only works with --print)

projects/ 直下のディレクトリ名を自分で決めたいときは、CLAUDE_CONFIG_DIR と一緒に CLAUDE_CODE_PROJECT_DIR_NAME を環境変数で渡します(v2.1.234以降)。単体では無視されます。ClaudeデスクトップやCoworkのトランスクリプトの保持期間は、別の設定 desktopSessionCleanupPeriodDays です。

選び分けは目的次第です。複数マシンで共有ドライブへ集約したいなら CLAUDE_CONFIG_DIR、監査で一定期間だけ残したいなら cleanupPeriodDays が向きます。CIで一時的に実行するだけの場合は、環境変数を毎回設定するより、そのジョブの起動オプションに閉じた --no-session-persistence の方が扱いやすくなります。

保存済みの会話をまとめて消したいときは、claude project purge があります。v2.1.285で --dry-run を付けると、消さずに対象だけ確認できます。状態を持たないディレクトリで試すと、次のように出力されます。

mkdir demo && claude project purge --dry-run ./demo
No Claude Code project state found for /path/to/demo under ~/.claude.

claude project purge は、対象プロジェクトのトランスクリプトと自動メモリ、タスクやファイル履歴を削除するコマンドです。history.jsonl の該当行と、~/.claude.json にあるそのプロジェクトのエントリも消えます。--all で全プロジェクト、-i で1件ずつ確認、-y で確認省略になります。実行前に --dry-run で見るのが安全です。社外秘のコードを扱うセッションでの運用の勘所は、Claude Codeのセッションを快適に保つ5つの習慣にもあります。

まとめ

会話は既定で30日を過ぎると消え、消えたものは /export でも書き出せません。残したい会話には名前を付けておき、期限の前に書き出しておくと安心です。

この記事を共有:XはてブLinkedIn