Claude Code との会話は、その場限りで消えているわけではありません。やり取りもツール実行もすべて、ローカルの ~/.claude 配下に JSONL 形式で残っています。どこに何が記録されるのかを、自分の環境を実際にのぞいて確認しました。

transcript の保存場所

会話ログ(transcript)は、プロジェクトごとに分かれて保存されます。

~/.claude/projects/<プロジェクトパスをエンコードした名前>/<セッションUUID>.jsonl

ディレクトリ名は、プロジェクトの絶対パスの /- に置き換えたものです。たとえば /Users/me/blog なら -Users-me-blog になります。その中に、セッション 1 回ぶんが <UUID>.jsonl ファイル 1 つとして積み上がっていきます。

1 行 1 イベントの構造

JSONL は「1 行 = 1 つの JSON」という形式です。transcript では 1 行が会話の 1 イベントに対応し、type フィールドで種類が分かれます。

type 中身
user ユーザー発話 / ツール結果 / 注入されたスキル本文
assistant モデルの応答 / ツール呼び出し
attachment ハーネスが差し込むメタ情報(権限・スキル一覧など)
file-history-snapshot 編集前ファイルの退避
system API エラーなどの記録

各メッセージの本文は message.content に入り、timestamp も付きます。python3jq で読めば、時刻つきで会話の流れをそのまま再生できます。

スキルや権限の適用も追える

おもしろいのは、裏側の挙動まで記録に残ることです。スキルを /skill-name で起動すると、transcript には 3 段階が刻まれます。

  1. どのスキルを起動したか(ツール呼び出し)
  2. Launching skill: <名前> という起動確認
  3. その直後に SKILL.md の全文がコンテキストへ注入される

つまり「起動した → 何が読み込まれた → その後どう動いたか」が一本の時系列でたどれます。同様に、利用可能なツールの許可(command_permissions)や、セッションに見えていたスキル一覧(skill_listing)も attachment として残ります。スキルを 1 つ自作した直後に一覧の件数が増える、といった変化まで観測できました。

まとめ

  • transcript は ~/.claude/projects/<proj>/<UUID>.jsonl に JSONL で全保存される。
  • ユーザー発話・モデル応答・ツール呼び出し/結果が時刻つきで時系列に並ぶ。
  • スキルの注入や権限付与など、裏側の適用も記録から追える。
  • 平文で残るため、機密を含むセッションの扱いには注意が要ります。