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 も付きます。python3 や jq で読めば、時刻つきで会話の流れをそのまま再生できます。
スキルや権限の適用も追える
おもしろいのは、裏側の挙動まで記録に残ることです。スキルを /skill-name で起動すると、transcript には 3 段階が刻まれます。
- どのスキルを起動したか(ツール呼び出し)
Launching skill: <名前>という起動確認- その直後に SKILL.md の全文がコンテキストへ注入される
つまり「起動した → 何が読み込まれた → その後どう動いたか」が一本の時系列でたどれます。同様に、利用可能なツールの許可(command_permissions)や、セッションに見えていたスキル一覧(skill_listing)も attachment として残ります。スキルを 1 つ自作した直後に一覧の件数が増える、といった変化まで観測できました。
まとめ
- transcript は
~/.claude/projects/<proj>/<UUID>.jsonlに JSONL で全保存される。 - ユーザー発話・モデル応答・ツール呼び出し/結果が時刻つきで時系列に並ぶ。
- スキルの注入や権限付与など、裏側の適用も記録から追える。
- 平文で残るため、機密を含むセッションの扱いには注意が要ります。