セッション管理の仕組み

Claude Codeの会話履歴はどこに保存される?

セッション管理の全貌

Claude Codeとの会話はすべてローカルのJSONLファイルに保存されています。
この仕組みを理解すれば、過去の会話を効率的に活用できます。

セッションファイルは宝の山!過去の知見を再活用しよう

セッションとは?

Claude Codeで claude コマンドを実行するたびに、新しいセッションが作成されます。セッションとは、1回の対話のまとまりです。

💡 セッション = 1つの会話の塊

LINEのチャット履歴のようなものです。
あなたとClaudeのやりとりがすべて記録されています。
ファイルの読み書き、コマンド実行、検索結果...全部です!

💬
claude 起動
新しいセッション開始
🤖
対話
やりとりを記録
💾
保存
JSONLファイルに書き込み
🔄
再開可能
いつでも再開できる

セッションファイルの保存場所

すべてのセッションデータは ~/.claude/ ディレクトリ配下に保存されています。

~/.claude/
├── CLAUDE.md ← グローバル指示ファイル
├── settings.json ← グローバル設定
├── credentials.json ← 認証情報
├── projects/ ← プロジェクト別データ
│ ├── -Users-you-myproject/ ← パスをハッシュ化
│ │ ├── sessions-index.json ← セッション一覧
│ │ ├── a1b2c3d4-e5f6-...jsonl ← セッション本体
│ │ ├── f7g8h9i0-j1k2-...jsonl ← 別のセッション
│ │ └── CLAUDE.md ← プロジェクト別メモリ
│ └── -Users-you-another-project/
│ └── ...
└── skills/ ← カスタムスキル

⚠️ プロジェクトディレクトリの命名規則

プロジェクトのパスのスラッシュ(/)がハイフン(-)に変換されます。
例:/Users/motoki/myproject-Users-motoki-myproject
この仕組みにより、プロジェクトごとにセッションが分離されています。

sessions-index.json の中身

セッションの一覧情報を管理するインデックスファイルです。--resume で表示されるセッション一覧の元データになっています。

// sessions-index.json の構造(イメージ)
{
  "sessions": [
    {
      "sessionId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "summary": "ログイン機能の実装",
      "messageCount": 24,
      "created": "2026-02-28T10:00:00Z",
      "modified": "2026-02-28T11:30:00Z",
      "gitBranch": "feature/login",
      "firstPrompt": "ログイン機能を追加して"
    }
  ]
}

JSONLファイルの中身

各セッションは JSONL(JSON Lines) 形式で保存されます。1行が1つのメッセージ/イベントを表し、追記のみ(append-only)で書き込まれます。

📝 JSONL = 1行1JSON

通常のJSONと違い、JSONLは1行ごとに独立したJSONオブジェクトが並びます。
これにより、セッション中のやりとりをリアルタイムで追記できます。

// セッションファイル(.jsonl)の各行のイメージ

// ユーザーのメッセージ
{"type":"human", "message":{"role":"user", "content":"ログイン機能を追加して"}, "timestamp":"2026-02-28T10:00:00Z"}

// Claudeの応答
{"type":"assistant", "message":{"role":"assistant", "content":"ログイン機能を実装します..."}, "timestamp":"2026-02-28T10:00:05Z"}

// ツールの使用(ファイル読み込みなど)
{"type":"tool_use", "tool_name":"Read", "tool_input":{"file_path":"/src/auth/login.ts"}, "timestamp":"2026-02-28T10:00:06Z"}

各レコードには共通のフィールドがあります:

フィールド 説明
typeメッセージの種類(human, assistant, tool_use, tool_result など)
uuidこのレコード固有のID
parentUuid親メッセージのID(会話の流れを追跡)
timestampタイムスタンプ
sessionId所属するセッションのID
cwdコマンド実行時の作業ディレクトリ
messageメッセージ本体(role + content)

--resume と --continue の違い

過去のセッションを再開するための2つのオプションがあります。似ていますが、使い方が全く違います

特徴 --resume (-r) --continue (-c)
目的 任意の過去セッションを再開 直前のセッションを即座に続行
セッション選択 一覧から選択 or IDで指定 自動で最新セッションを選択
ユースケース 数日前のセッションに戻りたい 直前の作業をすぐ継続したい
引数 オプションでセッションIDを渡せる 引数不要
内部動作 sessions-index.json から一覧表示 history.jsonl から最新を特定

claude --resume (-r) の使い方

# セッション一覧から選んで再開
claude --resume
claude -r

# 特定のセッションIDを指定して再開
claude --resume a1b2c3d4-e5f6-7890-abcd-ef1234567890

--resume をID指定なしで実行すると、直近50件のセッション一覧が表示されます。セッションの要約やメッセージ数が表示されるので、目的のセッションを見つけやすいです。

claude --continue (-c) の使い方

# 直前のセッションをすぐ再開
claude --continue
claude -c

# 再開と同時に指示も渡せる
claude -c "さっきの続きで、バリデーションも追加して"

# --resume と --continue の組み合わせ
claude -r -c "前回のセッションの続き"

🚀 便利な使い分け

  • -c:「さっきの続き!」→ 最速で直前セッション再開
  • -r:「あの時のやつ」→ 過去のセッションを探して再開
  • -r -c "指示":再開と同時に新しい指示も

コンテキストウィンドウと圧縮

Claude Codeのセッションが長くなると、コンテキストウィンドウ(Claudeが一度に認識できる情報量)の上限に近づきます。そのとき、自動圧縮が発動します。

💡 コンテキストウィンドウとは?

Claudeが「今覚えている」情報の量です。
Claude Opus 4.6は最大1Mトークン(約100万トークン)のコンテキストウィンドウを持ちます。
それでも長い作業をしていると上限に達することがあります。

自動圧縮の仕組み

  • コンテキストの約95%に達すると自動的に圧縮が発動
  • 古いメッセージのやりとりが要約テキストに置き換えられる
  • 重要な情報(ファイルパス、決定事項、コード変更)は保持される
  • 圧縮後も作業は途切れずに続行可能

/compact コマンド

手動でコンテキストを圧縮することもできます。

# 手動で圧縮
> /compact

# カスタム指示を添えて圧縮
> /compact フロントエンドの変更に焦点を当てて

⚠️ 圧縮で失われる情報もある

圧縮は要約であるため、細かいニュアンスや文脈が失われることがあります。
重要な決定事項や規約は CLAUDE.md に記録しておくのがベストです。
Hooksの SessionStart + compact マッチャーを使えば、圧縮後に自動でコンテキストを再注入することも可能です。

セッションの実践的な活用法

1. 名前をつけてセッションを管理する

# セッションに名前をつける
> /rename ログイン機能の実装

# --resume で名前つきセッションが表示される
claude -r

2. セッション履歴を外部ツールで閲覧する

JSONLファイルは標準的なテキストフォーマットなので、様々なツールで読めます。

# セッションファイルを直接確認
ls ~/.claude/projects/-Users-you-your-project/

# 特定のセッションの内容を見る(jqで整形)
cat ~/.claude/projects/-path-to-project/session-id.jsonl | jq .

# ユーザーメッセージだけ抽出
cat session.jsonl | jq 'select(.type == "human") | .message.content'

3. /cost でコストを確認

# 現在のセッションのトークン使用量・コストを確認
> /cost

4. /clear でリセット

セッションの会話コンテキストをクリアして新鮮な状態から始められます。

# 会話コンテキストをクリア(セッション自体は残る)
> /clear

💡 セッション管理のベストプラクティス

  • タスクごとにセッションを分ける(1セッション = 1タスク)
  • 重要なセッションには /rename で名前をつける
  • 長時間作業する前に /compact でコンテキストを整理
  • セッション横断で覚えておきたいことは CLAUDE.md に記録

セッション関連のCLIオプション一覧

オプション 短縮 説明
--resume [id] -r 過去のセッションを再開(ID省略で一覧表示)
--continue -c 直前のセッションを即座に続行
--print -p 非対話モード(1回の応答のみ)
--output-format 出力形式(text / json / stream-json)
--model 使用するモデルを指定
--worktree -w 隔離されたgit worktreeで起動
--verbose 詳細な出力を表示
--debug デバッグ情報の表示

セッション内スラッシュコマンド

コマンド 説明
/clear会話コンテキストをクリア
/compact [指示]コンテキストを圧縮・要約
/costトークン使用量とコストを表示
/rename [名前]セッションに名前をつける
/memoryCLAUDE.mdメモリファイルを編集
/context現在のコンテキスト使用量を表示
/model使用モデルを切り替え
/resumeセッション内から過去セッションを選択して切り替え

まとめ

💾

💾 保存場所

~/.claude/projects/ 配下にJSONL形式で保存

🔄 再開方法

-c で直前を即再開、-r で過去セッションを選択

📦 圧縮

/compact で手動圧縮、上限近くで自動圧縮

💾📁🔄

Your sessions, always saved!