Claude Code の --resume でセッションを復元する——クラッシュ後のリカバリと複数セッション管理の実践

Claude Code の --resume でセッションを復元する——クラッシュ後のリカバリと複数セッション管理の実践

Claude Code の --resume フラグと会話履歴管理を徹底解説。クラッシュ後のセッション再開、セッションIDの特定方法、CLAUDE.md を使った状態の永続化、複数セッション並列管理まで実装例付きで解説。

エンジニアのゆとです。

Claude Codeで2〜3時間作業していると、ある日突然ターミナルが落ちる。ラップトップのバッテリーが切れたか、ネットワークが切断されたか、あるいは普通に Ctrl+C を押してしまったか。

会話履歴が全部消えた状態からのリカバリ——「また最初から背景説明するの?」という絶望感は、CCをガチで使っている人なら一度は経験しているはずだ。

--resume という フラグがある。これを知っているかどうかで、長時間セッションの体験がまるで変わる。


—resume の基本

Claude Code のセッションは、会話を開始した時点から内部でセッションIDが割り振られている。このIDを使って過去のセッションを復元できるのが --resume だ。

# 前回のセッションを再開
claude --resume

# 特定のセッションIDを指定して再開
claude --resume <session-id>

--resume だけで引数なしの場合、最後に使ったセッションを再開しようとする。


セッションIDの確認方法

セッションIDはいくつかの方法で確認できる。

方法1: コマンド実行中に表示される

セッション開始時、Claude Codeはターミナルにセッション情報を出力することがある。ただし、バージョンによって表示の有無が変わるので安定していない。

方法2: ログファイルから取得する

Claude Codeの会話履歴はローカルに保存されている。保存先:

# macOS / Linux
ls ~/.claude/projects/

プロジェクトごとにディレクトリが作られ、その中にJSONLファイルで会話ログが蓄積される。ファイル名がそのままセッションIDに対応している。

# 最近更新されたセッションを確認
ls -lt ~/.claude/projects/-Users-username-MyProject/ | head -10

出力例:

-rw-r--r--  1 user staff  842394  Apr 24 23:15 abc123def456.jsonl
-rw-r--r--  1 user staff  124882  Apr 24 18:42 xyz789uvw012.jsonl

ファイル名(拡張子を除いた部分)がセッションIDだ。

方法3: /sessions コマンド

CC内で /sessions コマンドを使うと、現在のプロジェクトに紐づいたセッション一覧が表示される(v2.x以降)。

/sessions

開始日時・最終更新・メッセージ数が一覧で確認できる。そこからIDをコピーして --resume に渡せる。


クラッシュ後のリカバリ手順

実際にセッションがクラッシュした時の手順を整理する。

ステップ1: どこで止まったかを確認

まずセッションログを確認する。

# 直近のセッションログを最後の30行だけ見る
tail -30 ~/.claude/projects/$(ls -t ~/.claude/projects/ | head -1)/*.jsonl | \
  python3 -c "
import sys, json
for line in sys.stdin:
    try:
        obj = json.loads(line)
        if obj.get('type') == 'assistant':
            content = obj.get('message', {}).get('content', '')
            if isinstance(content, list):
                for c in content:
                    if c.get('type') == 'text':
                        print(c['text'][:200])
            elif isinstance(content, str):
                print(content[:200])
    except:
        pass
"

Claudeが最後に何を言っていたかを確認できる。「〇〇ファイルを編集した」「次は△△をやる予定」という情報があれば、どこまで進んでいたかを把握できる。

ステップ2: —resume で再開

claude --resume

セッションが復元されると、以前の会話コンテキストが引き継がれた状態でプロンプトに入れる。

「どこまで進んでいたか確認して」と伝えるだけで、Claudeは自分の直前のメッセージを参照して状況把握してくれる。

ステップ3: 作業再開の宣言

前回のセッションから再開。
直前にやっていた作業を確認して、次のアクションを教えて。
途中になっているファイルや、未完了のタスクがあれば最初に整理して。

このプロンプト一発で、Claudeは会話履歴を読み返して現在地を報告してくれる。手動で「あれどこまでやったっけ」と遡るより確実に速い。


—resume と —continue の違い

混同しやすい2つのフラグの違いを整理しておく。

フラグ動作
--resume過去のセッションを再開。会話履歴を完全に引き継ぐ
--continue最後のセッションを継続(引数なしの —resume と同じ動作をするバージョンもある)

バージョンによって挙動が微妙に異なるので、claude --help で手元のバージョンを確認しておくのが確実だ。


セッション履歴の保存期間

デフォルトでは、Claude Codeのセッション履歴は cleanupPeriodDays の設定値(デフォルト: 30日)を過ぎると自動削除される。

settings.json でこの値を変更できる:

{
  "cleanupPeriodDays": 90
}

長期プロジェクトで「先月のセッションを復元したい」というニーズがある場合は、この値を伸ばしておく。ただしログファイルは積み重なるのでディスクを消費する。

# ログのディスク使用量を確認
du -sh ~/.claude/projects/

自分の環境では3ヶ月分で約800MBだった。年単位で溜め込む場合は定期的な整理が必要になる。


複数セッションの並列管理

Claude Code を複数のプロジェクトで同時に使う場合、セッションIDを意識した管理が重要になってくる。

プロジェクトディレクトリと紐づけ

Claude Codeはコマンドを実行したディレクトリをプロジェクトとして識別する。

# プロジェクトAで作業
cd ~/Projects/app-frontend
claude

# プロジェクトBで作業(別ターミナル)
cd ~/Projects/api-backend
claude

このように別ディレクトリから起動すると、セッション履歴も別プロジェクトとして分離して管理される。

問題が起きるのはプロジェクトルートを間違えて起動した場合だ。~/Projects から直接 claude を起動すると、app-frontend のログと api-backend のログが混在してしまう。常にプロジェクトルートから起動する習慣をつけておく。

セッションIDをメモしておく

長期作業の場合、重要なセッションIDをどこかにメモしておくのは有効だ。

# 現在のセッションIDを確認(最新のJSONLファイル名から取得)
ls -t ~/.claude/projects/$(pwd | sed 's|/|-|g' | sed 's|^-||')/ 2>/dev/null | head -1 | sed 's|\.jsonl||'

これで現在アクティブなセッションのIDが取得できる。重要なセッションはIDをCLAUDE.mdやメモに記録しておくと、後から claude --resume <id> で正確に再開できる。


CLAUDE.md でセッション状態を永続化する

--resume はセッション会話を復元するが、Claudeの理解している「文脈」は揮発するという点を理解しておく必要がある。

どういうことかというと、セッション復元後のClaudeは「会話ログを読んでいる状態」であって、「最初から一緒に作業した状態」ではない。大量の会話ログがある場合、後半の情報を参照しやすく、前半の重要な決定事項を見落とすことがある。

これを防ぐのが CLAUDE.md への状態書き出しだ。

作業状態のスナップショットを取る

重要な節目(機能の実装完了、設計の決定など)で、その時点の状態をCLAUDE.mdに書き出す。

## 現在の作業状態(2026-04-25更新)

### 完了済み
- 認証モジュールのリファクタリング(auth/session.ts)
- テストカバレッジ: 87%(目標85%達成)

### 進行中
- APIレートリミットの実装(src/middleware/rateLimit.ts)
  - Redis接続は完了
  - ウィンドウアルゴリズムの実装が途中(sliding window を採用予定)

### 次のアクション
1. sliding window の実装完了
2. 負荷テスト(1000req/s で検証)
3. 本番環境へのデプロイ準備

このスナップショットがあると、セッション再開後に「CLAUDE.mdの現在の作業状態を読んで、続きから始めて」という一行で完全にコンテキストが戻ってくる。

--resume + CLAUDE.mdスナップショット の組み合わせが、長期作業でのリカバリを最強にする構成だ。


--print フラグを使うと、Claude Codeを非インタラクティブモードで実行できる。CI/CDや定時実行スクリプトでよく使う。

# 1回だけ実行して終了
claude --print "テストを実行してその結果を教えて"

--print モードでも --resume と組み合わせることができる:

# 特定セッションを非インタラクティブで継続
claude --resume <session-id> --print "さっき止まった作業の続き。次のステップを実行して"

ただし --print モードでは対話ができないので、「確認が必要な操作」は自動スキップされる。事前に settings.json で必要なコマンドを allow しておく必要がある。


セッションのエクスポートと検索

会話ログはJSONL形式なので、grep や jq を使って過去のやりとりを検索できる。

# 「PostgreSQL」に言及したセッションを探す
grep -r "PostgreSQL" ~/.claude/projects/ -l

# 特定のセッションの会話を可読形式で出力
cat ~/.claude/projects/プロジェクト名/セッションID.jsonl | \
  python3 -c "
import sys, json
for line in sys.stdin:
    try:
        obj = json.loads(line)
        role = obj.get('message', {}).get('role', '')
        content = obj.get('message', {}).get('content', '')
        if role and content:
            if isinstance(content, list):
                text = ' '.join(c.get('text','') for c in content if c.get('type')=='text')
            else:
                text = str(content)
            print(f'[{role}] {text[:300]}')
            print()
    except:
        pass
"

「先週のセッションで決定した設計の根拠」を探したいとき、会話ログを直接検索できるのは意外と便利だ。


セッション再開時のよくある失敗

失敗1: —resume 後にコンテキストが乖離する

長いセッションを再開すると、Claudeが「最新の状態」を把握しきれずに古い情報で作業することがある。

対策:再開直後に現在のファイル状態を読ませる。

--resume後の最初のプロンプト:
「src/middleware/rateLimit.ts の現在の内容を読んで、どこまで実装されているか教えて」

「前のセッションでこうなっているはず」という思い込みではなく、実際のファイルを確認させる。これで乖離を防げる。

失敗2: 別プロジェクトのセッションを間違えて再開

セッションIDを指定しないで --resume すると、直前に使ったセッションが再開される。プロジェクトAの作業後にプロジェクトBで --resume すると、プロジェクトAのセッションが開いてしまう。

対策:cd でプロジェクトルートに移動してから --resume。または明示的にセッションIDを指定する。

失敗3: 削除されたセッションを指定する

cleanupPeriodDays を過ぎたセッションは削除される。存在しないIDを指定すると、単に新規セッションが始まる(エラーにならない)ので気づきにくい。

対策:事前に ls ~/.claude/projects/... でセッションファイルの存在を確認してから再開。


実際の運用パターン

自分がやっている運用を正直に書く。

作業開始前にセッションID確認を習慣にしている。作業ディレクトリで ls -t ~/.claude/projects/... を実行して、前回のセッションIDを確認してから --resume で入る。新規作業か継続作業かを意識してセッションを選択する。

CLAUDE.mdへの状態書き出しは作業時間1時間ごとを目安にしている。「次のセッションで再開できるだけの情報」をCLAUDE.mdに書く。この習慣があると、クラッシュしても「CLAUDE.mdを読んで現状把握して」の一言で作業を引き継げる。

長期プロジェクト(1ヶ月以上)では重要セッションIDをメモしている。「あの設計方針を決めたセッション」を後から検索・再参照できる。コードレビューで「なぜこの実装にしたか」という議論になったとき、会話ログを引っ張り出して経緯を説明できる。


まとめ

  • --resume で過去セッションを復元できる。引数なしで最後のセッション、IDを指定して任意のセッション
  • セッションIDは ~/.claude/projects/ のJSONLファイル名から確認できる
  • クラッシュ後は --resume + 直近ログ確認 + 現在ファイル状態の読み込みで確実にリカバリできる
  • CLAUDE.md への状態スナップショットと組み合わせると、コンテキスト乖離を防げる
  • cleanupPeriodDays で保存期間を延長可能。長期プロジェクトは早めに設定する
  • 複数プロジェクトでは必ずプロジェクトルートから起動してセッションを分離させる

長時間作業でクラッシュが怖くてCC使いを躊躇していた場合、--resume の仕組みを理解してから使うと精神的な負荷がだいぶ下がる。

関連記事

記事が見つかりません:

記事が見つかりません:

記事が見つかりません:

記事が見つかりません:

← 記事一覧に戻る