Claude Media
Claude Codeのセッションエクスポートとトランスクリプトの保存場所

Claude Codeのセッションエクスポートとトランスクリプトの保存場所

/exportでの書き出しと、スクリプトから会話データを読む4つの経路、トランスクリプトの保存先パス・保持期間の設定をまとめます。

このTipsでできること

Claude Codeの会話はローカルに保存され続けています。人が読む形で書き出すなら/export、スクリプトから会話データを扱うならもう4通りの経路があります。どちらも同じ保存済みデータを違う形で取り出しているだけですが、目的が違うと選ぶべきインターフェースも変わります。保存先の実ファイルパスと、保持期間を変える設定キーも扱います。

人が読む形でエクスポートする — /export

セッション内で/exportを実行するとメニューが開き、会話をクリップボードにコピーするか、プレーンテキストのファイルとして保存するかを選べます。メッセージとツールの出力は読みやすい形に整形され、生のJSONLをそのまま見せられるよりずっと理解しやすい状態になります。

/export

ファイル名を引数に渡すと、メニューを経由せずそのファイルへ直接書き込みます。人に読ませる議事録や作業ログとして残したいだけなら、/exportだけで完結します。

書き出されるテキストには、Claudeの発言だけでなくツール呼び出しの結果も含まれます。実行したコマンドの出力やファイルの差分も読める形で並ぶので、Claude Codeを使っていない同僚にレビュー依頼を送るときや、作業の経緯をそのままissueに貼りたいときにも使えます。JSONLの生データを見せるより、読み手の負担がずっと小さくなります。

スクリプトから会話データにアクセスする4つの経路

/exportが作るのは人間向けの整形済みテキストです。スクリプトが解釈できる構造化データが欲しい場合は、目的別に4つの経路があります。

目的使う経路出力の形
1回実行した結果をJSONで受け取りたい使う経路claude -p --output-format json(またはstream-json)出力の形実行結果・セッションID・使用量・コストのJSON
既存セッションに追加の質問を送りたい使う経路claude -p --resume <session-id>出力の形構造化された応答
セッションのイベントに反応したい使う経路hooksやstatus lineコマンドが受け取るtranscript_path出力の形トランスクリプトファイルへのパス
TypeScript/PythonアプリにClaudeを組み込みたい使う経路Agent SDK出力の形メッセージ単位のプログラム的な受け取り

1回実行して結果を受け取る

非対話モードのclaude -p--output-format json--output-format stream-jsonを付けると、実行結果・セッションID・トークン使用量・コストが構造化JSONとして返ります。CIやバッチ処理から1回だけ実行して結果を拾いたいときに向いています。

既存セッションに追加の質問を送る

セッションIDが分かっているなら、claude -p --resume <session-id>でそのセッションに続けてプロンプトを送り、構造化された応答を受け取れます。次のコマンドは、既存セッションに「何を変更したか要約して」と送り、jqで結果だけを取り出す例です。

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

イベントに反応する

hooksとstatus lineコマンドは、入力としてtranscript_pathフィールドを受け取ります。SessionEndフックと組み合わせれば、セッションが終了したタイミングでトランスクリプトを別の場所へアーカイブするといった処理を書けます。既定の30日保持期間より長く記録を残したい場合や、社内の監査要件でセッションログを一元管理したい場合に向いた経路です。フック自体はシェルスクリプトでもよく、transcript_pathが指すファイルを読み、社内ストレージへコピーするだけの単純な処理でも成立します。

プログラムに組み込む

TypeScriptやPythonのアプリケーションにClaudeを組み込むなら、Agent SDKを使うとメッセージ1件ごとにプログラムから受け取れます。CLIの出力を後からパースする必要がありません。

4つの経路は上の表の「目的」で選びます。共通しているのは、いずれも/exportと同じ保存済みの会話データを読み出しているだけという点です。取り出し方が違うだけで、元になっているデータソースは1つです。

スクリプトから既存セッションを扱うときの識別子は、名前ではなくセッションIDです。claude -p --resumeにもAgent SDKにも、名前ではなくIDを渡します。名前は付けていても、スクリプトからはまずIDを調べる必要があります。インタラクティブにclaude --resume <name>を一度実行してIDを確認するか、claude agents --jsonの出力から名前とIDの対応を確認します。セッションに名前を付けておけば、IDを調べ直す手間そのものが省けて、この対応確認も不要になります。プロジェクトを並行して進めているときほど効きます。名前は起動時の-nオプションでも、セッション中の/renameでも設定できます。claude agents --jsonの使い方はclaude agents --jsonでバックグラウンドセッションを操作するにまとめています。

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

ファイルパスの規則

既定では、トランスクリプトはJSONL形式で~/.claude/projects/<project>/<session-id>.jsonlに保存されます。<project>は作業ディレクトリのパスから、英数字以外の文字をすべて-に置き換えたものです。変換後のディレクトリ名が200文字を超える場合は、200文字に切り詰めたうえで元のパスのハッシュ値が付加され、ファイルシステムの制限内に収まるようにしています。

各行は1件のメッセージ・ツール呼び出し・メタデータエントリに対応するJSONオブジェクトです。

JSONLの中身を直接パースしない理由

このエントリ形式はClaude Code内部の実装であり、バージョンごとに変わります。JSONLファイルを直接パースするスクリプトは、どのリリースでも壊れる可能性があります。セッションのデータをもとに何かを組み立てるなら、ここまでに挙げた/exportかスクリプト向けの4つの経路を使うのが安全です。

典型的な使い方

CIのパイプラインに組み込む例なら、テストが失敗したステップでclaude -p --output-format json "このテストの失敗原因を調べて"を実行し、返ってきたJSONのresultフィールドをPRコメントに転記する、という構成が作れます。transcript_pathを受け取るSessionEndフックを設定しておけば、セッションが終わるたびにトランスクリプトを社内のログ基盤へ自動でアップロードできます。Agent SDKを使えば、Claudeとのやり取りを自社のチャットUIにメッセージ単位でストリーミング表示するような組み込みも可能です。

日常的な使い方としては、作業の区切りに/exportでファイル保存し、社内Wikiやissueに貼り付けて経緯を残すという運用が手軽です。クリップボードへのコピーはSlackへの共有向き、ファイル保存は監査ログや後日の参照向きと、用途で使い分けます。どちらも同じ会話データを違う形に整形しているだけなので、迷ったら手数の少ない方を選んで構いません。

セッションIDが分かっている状態で作業を再開したい場合は、claude -p --resume <session-id>が有効です。前日に途中まで進めたセッションに対して「昨日の続きから、残タスクを列挙して」のように投げれば、そのセッションの文脈を踏まえた応答が構造化データとして返ってきます。対話的に--resumeで開き直すのではなく、スクリプトから状態確認だけしたいときに向いた使い方です。

保存にまつわる落とし穴

スクリプト側でパスを決め打ちで組み立てるのは避けたほうが安全です。記号を含むディレクトリ名や200文字を超える長いパスでは変換ルールの適用結果を目算しづらく、安全なのはclaude agents --jsonのようなインターフェース経由でセッションの情報を取得し、そこからパスを辿ることです。

ls ~/.claude/projects/

このディレクトリ名の一覧を見れば、どのプロジェクトのトランスクリプトが溜まっているかは分かります。ただし中身の.jsonlをパースする前提のスクリプトを書くのではなく、あくまで「このプロジェクトにセッションが何件あるか」を数える程度の使い方にとどめます。

保持期間にも注意が必要です。cleanupPeriodDaysの既定値は30日で、この期間を過ぎたセッションファイルは起動時に削除されます。数か月単位でしか開かないプロジェクトのセッションを後から参照したい場合、30日の間に/exportで書き出すか、SessionEndフックで別の場所へアーカイブしておく必要があります。削除されてからでは、/resumeはもちろんスクリプト経由のアクセスもできません。

削除は「起動時」に走る点も見落としやすいところです。しばらくclaudeを起動していないプロジェクトでは、保持期間を過ぎたセッションがすぐには消えず、次にclaudeを起動した瞬間にまとめて削除されます。長期間触っていないプロジェクトを久しぶりに開く前に、過去のセッションを残しておきたいなら先にバックアップを取ります。逆に言えば、日常的に開くプロジェクトほど、意識しないうちに古いセッションが定期的に整理されていく計算になります。

久しぶりに開くプロジェクトで過去のセッションを確実に残したいなら、claudeを起動する前に該当ディレクトリを丸ごとコピーしておくのが確実です。起動してから慌てて/exportしようとしても、削除は起動直後に走るため間に合わない場合があります。バックアップの要否は、次にそのプロジェクトを開く予定がいつになるか分からない時点で判断しておくのが安全です。

保存場所・保持期間を変更する設定

やりたいこと設定するもの場所
保存先を~/.claude以外に移す設定するものCLAUDE_CONFIG_DIR場所環境変数
30日間の保持期間を変える設定するものcleanupPeriodDays(既定30日、最小1日)場所settings.json
どのモードでもトランスクリプトの書き込みを止める設定するものCLAUDE_CODE_SKIP_PROMPT_HISTORY場所環境変数
1回の非対話実行だけ書き込みを止める設定するもの--no-session-persistence場所claude -pのCLIフラグ

CLAUDE_CODE_SKIP_PROMPT_HISTORYを設定して起動したセッションは、--resume--continue、上矢印キーによる履歴のどれにも出てきません。使い捨てのスクリプト実行で会話を一切残したくないときに向いています。CLAUDE_CONFIG_DIRを切り替えれば、複数アカウントを並行運用するときにセッション履歴・設定・プラグインをアカウントごとに分離できます。個人アカウントと業務アカウントを同じマシンで使い分けているケースでは、この分離がそのままセッション一覧の混在防止にもなります。

まとめ

会話を人が読む形で残すなら/export、スクリプトから扱うなら実行結果・追加質問・イベント反応・SDK組み込みの4経路を目的別に選びます。JSONLファイルを直接パースするのは避け、公開されたインターフェース経由でアクセスするのが安全です。保存先や保持期間を変えたい場合はCLAUDE_CONFIG_DIRcleanupPeriodDaysを調整します。会話を分岐させて複数の方針を試す方法はClaude Codeのセッションをブランチして複数の方針を同時に試すで扱っています。目的別に経路を選ぶ習慣をつけておけば、あとから「どこにデータが残っているか分からない」という事態は避けられます。

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