🔄

どのデバイスからでもClaude Codeのスレッドを再開できるようにする(Win/Mac 間を例に)

に公開

やりたいこと

Claude Code は便利だが、MacとWindowsなど、デバイスが変わると同じスレッドから再開することはできない。これは困る。

よって、本記事ではClaude Code (CC) のセッションを、Windows と Mac のどちらからでも --resume (/resume) で再開できるようにする。

本記事は、Google Driveを使用しているが、その他のクラウドでも可能である。ただし、他のエンジニアの方々が口を揃えて仰る通り、OneDriveはいかなる環境下でもお勧めしない。

前提知識: CC のセッション保存先

CC はセッションデータ(JSONL + memory/)を以下に保存する。

~/.claude/projects/<encoded-cwd>/

<encoded-cwd> は cwd のパス区切りを - に置換した文字列。OS ごとに異なる。

Win: C--Users-username-My-Drive-[YOUR_Dir]
Mac: -Users-username-Library-CloudStorage-GoogleDrive-email-My-Drive-[YOUR_Dir]

~/.claude/ はホームディレクトリ直下にあり、Google Drive の同期対象外。つまり Win で作ったセッションは Mac から見えないし、逆も同様。

失敗した方法: Drive 内にジャンクションを張る

最初に試したのは、Google Drive 内(My Drive/[YOUR_Dir]/)に NTFS ジャンクションを作り、~/.claude/projects/<encoded-cwd> を参照させる方法。

My Drive/.cc_projects  ──junction──→  ~/.claude/projects/<encoded-cwd>

OS レベルではジャンクション先のファイルが見える。しかし Google Drive Desktop はジャンクションポイントを type=kOther として扱い、CreateFileWPERMISSION_DENIED を返して同期を拒否する。

Drive Desktop のログ:

GetLocalItem Checksumming ..\.cc_projects failed with
PERMISSION_DENIED: CreateFileW failed during OpenHandleForPath

10 秒ごとにリトライした末に GENERIC_UPLOAD_FAILURE で放棄。ジャンクション先の中身は走査しない。

結論: Drive Desktop (Mirror) は NTFS ジャンクションをフォローしない。

成功した方法: ジャンクションの向きを逆にする

発想を逆転させる。

  • 実体を Drive 内に置く(通常ディレクトリ → Drive が普通に同期)
  • ~/.claude/projects/<encoded-cwd> からジャンクション / シンボリックリンクで参照(Drive は関知しない)
【実体】My Drive/[YOUR_Dir]/.cc_projects/
    ├── *.jsonl
    ├── memory/
    └── <uuid>/

【Win】~\.claude\projects\<win-encoded-cwd>\  ──junction──→  実体
【Mac】~/.claude/projects/<mac-encoded-cwd>/  ──symlink───→  実体

Drive が触るのは My Drive 内の通常ディレクトリだけ。ジャンクションは ~/.claude/ 内にあり Drive の管理外。CC は OS レベルのリンク解決で透過的に読み書きする。

セットアップ

1. encoded-cwd を確認

Win:

ls "$env:USERPROFILE\.claude\projects\"

Mac(CC を一度起動して生成させる):

cd ~/My\ Drive/[YOUR_Dir] && claude
# 何か送信して /exit
ls ~/.claude/projects/

Mac の CC は ~/My Drive(シンボリックリンク)を実パスに解決してから encode するため、名前が長くなる。@ .- に置換される。

2. Win 側(先に実行)

CC をすべて終了してから:

$src = "$env:USERPROFILE\.claude\projects\<win-encoded-cwd>"
$dst = "$env:USERPROFILE\My Drive\[YOUR_Dir]\.cc_projects"

robocopy $src $dst /MIR /R:1 /W:1      # 実体を Drive 内にコピー
Rename-Item $src "${src}.bak"            # 元を退避
cmd /c mklink /J "$src" "$dst"           # ジャンクション作成

確認:

Get-Item $src | Select-Object LinkType   # → Junction

CC を起動して /resume でセッション一覧が見えれば成功。Drive Web で .cc_projects が表示されることも確認する。

3. Mac 側(Drive Web に .cc_projects が表示されてから)

CC をすべて終了してから:

mac_dir="$HOME/.claude/projects/<mac-encoded-cwd>"

cp "${mac_dir}"/*.jsonl "$HOME/My Drive/[YOUR_Dir]/.cc_projects/" 2>/dev/null
mv "$mac_dir" "${mac_dir}.bak"
ln -s "$HOME/My Drive/[YOUR_Dir]/.cc_projects" "$mac_dir"

確認:

ls -la "$mac_dir"   # → ... -> .cc_projects

CC を起動して /resume で Win のセッションが見えれば成功。初回は Stream モードのダウンロードで数十秒かかる。

4. クリーンアップ

動作確認後、.bak を削除。

復旧

問題があればジャンクション / シンボリックリンクを消して .bak を戻すだけ。

Win:

cmd /c rmdir "$src"               # ジャンクション削除(実体は残る)
Rename-Item "${src}.bak" $src     # 退避を復元

Mac:

rm "$mac_dir"
mv "${mac_dir}.bak" "$mac_dir"

注意点

同時アクセス禁止 — 両 OS で同じセッションを同時に --resume しない。JSONL の書き込みが競合すると Drive が競合コピーを生成してセッションが壊れる。

同期待ち — OS を切り替えた直後は Drive の同期完了を待つ。大きい JSONL は同期に数分かかる。

CC アップデート時 — CC のバージョンアップで ~/.claude/projects/<encoded-cwd>/ が再作成され、ジャンクション / シンボリックリンクが通常ディレクトリに置き換わることがある。アップデート後にリンクが生きているか確認する。

cwd を間違えると見えない — CC は cwd ごとにセッションを管理する。/resume で "No conversations found" が出たら、起動ディレクトリが正しいか確認する。

まとめ

  • CC のセッション保存先(~/.claude/projects/)は Drive 管理外
  • Drive 内にジャンクションを張っても Drive は reparse point を同期しない
  • 逆方向(実体を Drive 内、~/.claude/ からリンク)なら動く
  • Win はジャンクション、Mac はシンボリックリンクで参照
  • 実測値を含めてセットアップは 10 分程度で完了する

Discussion