この記事についてClaude(Anthropic)との共同編集により作成されました。
要約
- Claude Code の自動メモリ(auto memory)は、デフォルトでは
~/.claude/projects/<project>/memory/に保存される。<project>は作業ディレクトリのフルパスから機械的に作られる名前なので、Mac を買い替えてユーザー名やパスが変わると、同じリポジトリでも別物として扱われ、メモリが引き継がれない.claude/settings.jsonにautoMemoryDirectoryを書いて、保存先をリポジトリ内の.claude/memory/にした。メモリごと git に入るので、新しい Mac では clone するだけで Claude が前と同じことを覚えている状態で始められる- 副産物として、メモリが見える場所に来る。デフォルトの隠しディレクトリに溜め込む運用だと、何を覚えているのか見返さないまま雑多に増えていく。リポジトリ内なら
git diffで「今日のセッションで何を覚えたか」が分かり、古いものを消すのも簡単になる- 値は絶対パスか
~/始まりのみ。相対パスは書けないので、clone する場所は固定する前提になる。permissions.blockReadsOutsideWorkingDirectoriesを有効にすると、プロジェクト設定で指定したメモリは黙って読み書きされなくなる点にも注意
Mac を買い替えて、ブログ用のリポジトリを clone して Claude Code を立ち上げたら、前の Mac で積み上げていた「この人はこういう書き方を嫌う」「この作業はこの手順で」といったメモリが全部消えている。
これを避けるために、引越し前に autoMemoryDirectory という設定を入れておいた。結果、新しい Mac で最初に起動したセッションから、前と同じメモリが読み込まれた状態で作業を始められた。設定自体は1行で、やってみると「最初からこうしておけばよかった」と思う類のものだったので、おすすめ設定のひとつとして書いておく。
なぜ引き継がれないのか:保存先がパスから決まる
Claude Code の自動メモリは、セッション中に Claude が学んだこと(ユーザーの好み、修正指示、進行中の作業、外部リソースの場所など)を Claude 自身が Markdown で書き残し、次回以降に引き継ぐ仕組みだ1。CLAUDE.md が「人が書く指示」なのに対し、こちらは「Claude が自分で書くノート」にあたる。
問題は保存場所で、デフォルトでは次のようになっている1。
~/.claude/projects/<project>/memory/├── MEMORY.md # 索引。毎セッション起動時に読み込まれる├── user_role.md # 個別メモリ├── feedback_xxx.md└── ...この <project> は、git リポジトリならリポジトリのルートのパスから導出される1。導出のしかたは「パスの英数字以外を - に置き換える」で2、たとえば /Users/taro/ws/blog_workspace なら -Users-taro-ws-blog-workspace になる。
つまり、旧 Mac のユーザー名が yamada、新 Mac が taro だと、同じリポジトリでも <project> の名前が変わる。
旧: ~/.claude/projects/-Users-yamada-ws-blog-workspace/memory/新: ~/.claude/projects/-Users-taro-ws-blog-workspace/memory/新しい Mac の Claude Code は後者を見に行くので、そこには何もない。~/.claude をまるごとコピーしても、ディレクトリ名が旧パス由来のままなので拾われない。メモリファイルはマシンをまたいで共有されず、クラウド環境とも同期されない1ので、何もしなければここで途切れる。
もちろん ~/.claude/projects/ の中でディレクトリ名を手でリネームすれば繋がる。ただ、この長いディレクトリ名を引越しのたびに気にするのは嫌だし、そもそも「Claude が覚えていること」がリポジトリの外の隠しディレクトリにある状態が、あまり気持ちよくなかった。
設定:autoMemoryDirectory でリポジトリ内を指す
autoMemoryDirectory は、自動メモリの保存先を任意のディレクトリに変える設定で、Claude Code v2.1.74 で追加された3。ユーザー設定・プロジェクト設定・ローカル設定のどこにでも書ける4。
自分はプロジェクトの .claude/settings.json に書いた。
{ "autoMemoryDirectory": "~/ws/blog_workspace/.claude/memory"}手順は次の通り。
- 旧 Mac で、
~/.claude/projects/<project>/memory/の中身をリポジトリの.claude/memory/にコピーする .claude/settings.jsonに上の1行を足す.claude/memory/と.claude/settings.jsonを git に入れてコミット・push する- 新 Mac で同じパス(
~/ws/blog_workspace)に clone して Claude Code を起動する
これだけで、新 Mac の最初のセッションで前と同じメモリが読み込まれた。起動直後に “Recalled N memories” と出れば、指定したディレクトリを読みに行っている1。/memory で「オートメモリフォルダを開く」を選ぶと、実際にどこを見ているかも確認できる1。
手順1のコピーは自分でやる必要がある。公式ドキュメントには保存先を変えたときに既存メモリを移行する話が書かれていないので、切り替え前に手でコピーしておくのが安全だ。
clone する場所を固定する前提になる
ひとつ引っかかるのが、値は絶対パスか ~/ 始まりでなければならないという制約だ14。./.claude/memory のような相対パスは受け付けない。
なので「リポジトリ内に置く」と言いつつ、実際には「~/ws/blog_workspace に clone したときのリポジトリ内」を指している。別の場所に clone したら .claude/settings.json のパスを直す必要がある。自分はワークスペースの置き場所を ~/ws/ で固定しているので困らないが、置き場所が毎回変わる人には向かない。
~/ 始まりにしておけば、少なくともユーザー名が変わっても壊れない。今回の引越しで効いたのはここで、/Users/yamada/... の絶対パスで書いていたら新 Mac で死んでいた。
もうひとつの効果:メモリが見える場所に来る
やってみて、引越し以外にも良かったのがこれだ。
デフォルトの保存先は ~/.claude/projects/ の下で、ディレクトリ名は前述の通り長い。自分の環境だと、Google Drive 上のディレクトリで起動したぶんはこんな名前になっていた。
-Users-taro-Library-CloudStorage-GoogleDrive-taro-example-gmail-com--------researchここを自分から開きに行くことは、まずない。結果として、メモリは Claude が書いた順に溜まっていくだけになる。user / feedback / project / reference の4種類1が1つのディレクトリに混ざり、もう終わった作業の project メモリや、当時は正しかったが今は違う feedback メモリが残り続ける。セッションの transcript は cleanupPeriodDays で自動的に消えるが、メモリディレクトリはその対象外で、自分か Claude が消すまで残る1。
リポジトリ内に置くと、これがそのまま git の管理下に入る。
- セッションが終わったあと
git statusを見れば、今日 Claude が何を覚えたかが分かる。「そんなこと覚えてほしくない」というものがあれば、その場で消すか直せる MEMORY.md(索引)は先頭 200 行 / 25KB までしか読み込まれない1。索引が見える場所にあれば、上限に近づいているかも自然と目に入る- メモリの変更もコミットログに残るので、「いつからこの指示を覚えているのか」を追える
CLAUDE.md を git で管理するのは当たり前にやっているのに、Claude 側のノートは隠しディレクトリに放置していた、というのが実態だった。同じ場所に並べてしまえば、両方まとめて面倒を見られる。
パスが2通りあるとメモリが分裂する
もうひとつ、これは git 管理外のディレクトリで起きる話だが、<project> がパスから決まるということは、同じディレクトリに別のパスでアクセスするとメモリが分かれることでもある。上の Google Drive のディレクトリは ~/ws/gdrive/research というシンボリックリンク経由でも開けるが、リンク経由で起動すると -Users-taro-ws-gdrive-research という別の <project> になる(公式にリンクを解決するとは書かれていないので推定)。autoMemoryDirectory で明示的に1か所を指しておけば、どちらから起動しても同じメモリになる。
注意点
プロジェクト設定から保存先を指定できるということは、clone したリポジトリが Claude に任意のディレクトリを読み書きさせる経路になりうる、ということでもある。そのため制約が2つある14。
プロジェクト設定・ローカル設定の autoMemoryDirectory は、hooks と同じワークスペース信頼ルールで扱われる。 自分のリポジトリで自分が書く分には気にしなくていいが、他人のリポジトリを clone したときに .claude/settings.json に何が書いてあるかは、hooks と同じ感覚で一度見ておいた方がいい。
permissions.blockReadsOutsideWorkingDirectories を有効にすると、リポジトリ由来の設定で指定した autoMemoryDirectory からは一切読み書きされなくなる。 ディレクトリが作業ディレクトリの中にあっても同様で、エラーは出ない。今回の設定はリポジトリ内を指しているので直感的には問題なさそうに見えるが、この設定を入れた途端に黙ってメモリが止まる。「メモリが保存されなくなった」と感じたら、まずここを疑う。
もうひとつ、これは仕様ではなく運用の話だが、メモリには「この人はこういう指摘の仕方を嫌う」のような個人的なメモが入る。公開リポジトリに置くなら、中身を一度読んでからにした方がいい。自分の場合はワークスペース用のプライベートリポジトリなので、そのまま入れている。
別の選択肢
保存先ではなくディレクトリ名の方を固定する手もある。CLAUDE_CONFIG_DIR と CLAUDE_CODE_PROJECT_DIR_NAME を環境変数で設定すると、projects/ 配下のディレクトリ名を自分で決められる(v2.1.234 以降)25。こちらは transcript も同じ名前で管理されるので、会話履歴ごと引き継ぎたいときはこちらが向く。ただし CLAUDE_CONFIG_DIR が未設定だと無視されるので、~/.claude 全体の置き場所も一緒に決めることになる。
メモリだけをリポジトリと一緒に運びたい、という今回の用途なら autoMemoryDirectory の1行で足りる。
まとめ
- Claude Code の自動メモリは
~/.claude/projects/<project>/memory/に保存され、<project>は作業ディレクトリのパスから作られる。Mac を買い替えてパスが変わると、同じリポジトリでも引き継がれない .claude/settings.jsonに"autoMemoryDirectory": "~/ws/blog_workspace/.claude/memory"を書き、既存メモリをコピーして git に入れておけば、新 Mac では clone するだけで元に戻る- メモリが見える場所に来るので、何を覚えているかを
git diffで確認でき、要らないものを消せる。CLAUDE.md と同じ場所で面倒を見られる - 値は絶対パスか
~/始まりのみ。clone 先を固定する前提で、~/で書く。blockReadsOutsideWorkingDirectoriesを有効にするとリポジトリ由来の指定は黙って無効になる
引越しのために入れた設定だったが、引越しが終わったあとも残す設定になった。
参考文献
- How Claude remembers your project(Claude Code 公式ドキュメント) https://code.claude.com/docs/en/memory
- Manage sessions(Claude Code 公式ドキュメント) https://code.claude.com/docs/en/sessions
- anthropics/claude-code CHANGELOG.md https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md
- Settings reference(Claude Code 公式ドキュメント) https://code.claude.com/docs/en/settings-reference
- Environment variables(Claude Code 公式ドキュメント) https://code.claude.com/docs/en/env-vars