「昨日まで動いていた claude --resume が、今朝から急に何も復元しない」——これは大規模リポジトリで Claude Code を日常的に使っていると、意外と多く遭遇するトラブルです。タスクの途中で会話が消えると、コンテキストの再構築に時間が取られ、生産性が一気に落ちます。
私は普段、4 つのドメイン(claudelab・rorklab・gemilab・antigravitylab)を横断して claude --resume を多用しているのですが、これまでに何度か「セッションが取り出せなくなる」パターンに遭遇してきました。原因は大きく 4 つに分類できて、それぞれチェックする場所が違います。ここでは上から順番に試せばだいたい 5 〜 10 分で原因の切り分けが終わる手順としてまとめておきます。
なぜ claude --resume が復元しないのか — 4 つの原因パターン
Claude Code のセッション管理は、ローカルの JSONL ファイル(会話履歴)と設定ディレクトリ(~/.claude/)の組み合わせで動いています。復元に失敗する典型的な原因は次の 4 つに整理できます。
- セッションファイルが存在しない / 名前がずれている: 別ディレクトリで起動した、
/clearでセッション ID が変わった、外付けディスクをマウントし忘れた、など物理的に履歴を読めていないパターンです。 - 設定ファイルの破損や不整合:
~/.claude/settings.jsonなどが壊れている、または手動で編集したフックが空配列になっている時に発生します。 - バージョン違いによる JSONL スキーマの非互換:
npm i -g @anthropic-ai/claude-codeで大きく更新した直後、古い JSONL を新バージョンが読み込めないことがあります。 - マシン跨ぎ・WSL 跨ぎでパスが変わる: 自宅 Mac と会社 Windows、あるいは macOS ホストと WSL 内で同じセッションを共有しようとして、パスの差異で読み込みに失敗するケースです。
ここからは、それぞれを切り分けるためのコマンドと、優先順位の高い順に対処方法を紹介していきます。
ステップ 1: セッションファイルが残っているかを確認する
まず最初に、そもそも履歴ファイルがディスク上に残っているかをチェックします。Claude Code は ~/.claude/projects/{プロジェクトのハッシュ化パス}/ 配下に、セッション ID をファイル名にした JSONL を保存します。
# 直近 10 件のセッションファイルを更新時刻順に表示します
# Mac / Linux / WSL 共通で動くワンライナーです
ls -lat ~/.claude/projects/*/*.jsonl 2>/dev/null | head -10
# 期待する出力例:
# -rw-r--r-- 1 user group 12345 Apr 27 08:45 ~/.claude/projects/-Users-user-myrepo/01HA...jsonlファイルがまったく存在しない場合は、~/.claude/projects/ の下に作業中のプロジェクトに対応するディレクトリがあるか確認してください。Claude Code はカレントディレクトリ(pwd)を base に内部 ID を生成するため、起動したディレクトリが違うと別プロジェクト扱いになって履歴が引き出せません。「いつもと違う場所からターミナルを開いたかもしれない」と感じたら、過去に作業した場所で cd してから claude --resume を再実行してみてください。
JSONL の中身を覗いて、最後に書き込まれた行のタイムスタンプを確認すると、どのセッションが「途中で死んだ」のかも特定できます。
# 直近の JSONL の最後の行をパースして時刻を抽出します
LATEST=$(ls -t ~/.claude/projects/*/*.jsonl 2>/dev/null | head -1)
tail -1 "$LATEST" | python3 -c "import sys,json; d=json.loads(sys.stdin.read()); print(d.get('timestamp', d.get('created_at')))"ここでタイムスタンプが出力されれば、ファイル自体は健全です。ステップ 2 に進んで設定側の不整合を確認します。
ステップ 2: 設定ファイルと CWD のひも付けを確認する
履歴ファイルは存在するのに claude --resume のリストに出てこない場合、設定側の不整合を疑います。私が遭遇した中で多かったのは、以下の 2 ケースです。
第一に、~/.claude/settings.json の JSON が破損しているケース。フックを手で編集したり、エディタが BOM を付けて保存してしまったりすると、Claude Code は読み込みエラーで黙ってデフォルト動作にフォールバックすることがあります。次のコマンドで JSON の構文だけ素早く検査できます。
# 設定ファイルの JSON 構文を検証します(OK なら何も出ません)
python3 -m json.tool ~/.claude/settings.json > /dev/null && echo "OK"OK が表示されない場合は、エディタで開いて末尾のカンマや BOM を除去するか、思い切って一時的にリネーム(mv ~/.claude/settings.json ~/.claude/settings.json.bak)してデフォルト状態で動くか確認します。動けば設定の中身が原因です。
第二に、カレントディレクトリのリンク(シンボリックリンク/macOS の Firmlink)でパスがずれているケース。/Users/me/repo と /private/Users/me/repo のように、解決後のパスが違うと別プロジェクト扱いになります。
# 現在のディレクトリの実体パスを確認します
pwd -P
# 期待する出力例: /Users/me/repo (シンボリックリンクの場合は実体側のパス)pwd と pwd -P で結果が違っていたら、pwd -P の結果に cd してから claude --resume を試してみてください。これで戻ってくることが結構あります。さらに深い背景はメモリと設定の関係をまとめたCLAUDE.md と Memory の仕組みを使い倒す実践ガイドにも書きましたので、合わせて読むと理解が早いです。
ステップ 3: バージョン更新直後の JSONL 非互換を疑う
「先週は動いていたのに、npm i -g @anthropic-ai/claude-code で更新したら復元できなくなった」というケースは、JSONL の内部スキーマが変わった影響であることが多いです。Claude Code 2.x 以降、ツール呼び出しの記録形式が拡張されており、古い行を含むファイルは新バージョンで読み飛ばされる場合があります。
# 現在の Claude Code バージョンを確認します
claude --version
# 出力例: 2.4.1
# 直近 JSONL の先頭行と末尾行のスキーマバージョンを比較します
LATEST=$(ls -t ~/.claude/projects/*/*.jsonl 2>/dev/null | head -1)
head -1 "$LATEST" | python3 -c "import sys,json; print(json.loads(sys.stdin.read()).get('version','?'))"
tail -1 "$LATEST" | python3 -c "import sys,json; print(json.loads(sys.stdin.read()).get('version','?'))"先頭と末尾でバージョンが違う場合は、途中でアップデートが入った混在ファイルです。この場合は --resume 一覧には出るものの、復元時にツールコールの再生で詰まることがあります。対処は以下のいずれかです。
- 古い行を切り捨てて末尾だけ残す:
tail -200 file.jsonl > file.jsonl.new && mv file.jsonl.new file.jsonl(バックアップ必須) - 旧バージョンを
npm i -g @anthropic-ai/claude-code@2.3.xで一時的に戻して履歴を取り出し、要点だけメモして新バージョンで再開する --resumeを諦めてclaude --print "前回の続きをまとめて"で新規セッションを起こす
バージョン互換性そのものについてはClaude Code のセッション管理と --resume を実務で使い倒すで詳しく検証していますので、運用設計の参考にしてください。
ステップ 4: マシン跨ぎ・WSL 跨ぎの落とし穴
最後に、複数マシン間でセッションを移そうとして失敗するケースです。~/.claude/projects/ をクラウドストレージ(Dropbox / iCloud Drive)に置いて同期している方は、ハッシュ化されたディレクトリ名がパスに依存することを思い出してください。
/Users/alice/repo で作ったセッションを C:\Users\alice\repo で --resume してもヒットしません。同様に macOS から WSL に移ると /mnt/c/Users/alice/repo になって別物扱いです。回避策は次のとおりです。
- CLAUDE.md を git 管理する: セッション本体は移植せず、CLAUDE.md と要件メモを各リポジトリに置いておけば、別マシンでも同じコンテキストですぐに作業を再開できます
- 会話の要点だけテキストとしてエクスポートする:
cat ~/.claude/projects/.../latest.jsonl | jq -r '.message.content[0].text // empty' | tail -50のように本文だけ取り出して別マシンに送る方法が現実的です - どうしても復元したい場合は同じパス構造で作業ディレクトリを切る: シンボリックリンクで
/Users/alice/repoを WSL 側に作るなど、パスを揃える小細工が有効です
中断からの復帰自体はClaude Code でタスクが中断した時の復帰ガイドに手厚くまとめてありますので、本記事の手順で復元できなかった場合はそちらの「ゼロから再構築する手順」に進んでください。
それでも復元できない時に試したい安全策
ここまでで原因のほとんどはカバーできるはずですが、最後の手段として知っておくと安心な「安全策」を 3 つ紹介します。
# 1. プロジェクトディレクトリの全 JSONL から最新の "user" メッセージだけ抜き出します
# (要点を AI にまとめ直してもらう用のテキストとして使えます)
ls -t ~/.claude/projects/$(echo $PWD | sed 's|/|-|g')/*.jsonl 2>/dev/null | head -1 | \
xargs -I {} sh -c 'jq -r "select(.message.role == \"user\") | .message.content" {}' | tail -10
# 2. ~/.claude/projects/ を丸ごとバックアップしてから新規開始します
cp -r ~/.claude/projects ~/.claude/projects.bak.$(date +%Y%m%d) && \
echo "✅ Backup saved. Now safe to start fresh."ファイルさえバックアップしておけば、後から要点を抜き出すことは可能です。逆に言えば、復元できなくなる事態を防ぐ最大の予防策は、定期的なバックアップと CLAUDE.md による「コンテキストの外部化」です。
最後に一言。私の経験上、--resume のトラブルは「前回の作業に戻れない」というショックで焦ってしまい、設定ファイルを乱暴に書き換えて状況を悪化させるパターンが一番多いです。まずは深呼吸して、本記事の手順を上から順番に確認してみてください。それで解決しなければ、CLAUDE.md と数行のメモから新規セッションを起こすほうが、結果的に早く本来の作業に戻れることもあります。
claude --resume のトラブル切り分けは結局のところ「履歴が残っているか」「設定が壊れていないか」「バージョンが揃っているか」「パスがずれていないか」の 4 点です。次に困った時は、この 4 点だけ思い出していただければ十分です。