emahiro/b.log

日々の勉強の記録とか育児の記録とか。

Claude Code のメモリをユーザースコープで管理する

Overview

ずっと素の状態で Claude Code を使っていたのですが、公式のドキュメント によると自分の使用履歴兼カスタマイズの集合とも言えるメモリ機能をユーザースコープの設定で管理できることを今更知ったので、扱い方も含めて備忘録として残します。

公式のドキュメントは以下

code.claude.com

code.claude.com

Motivation

このエントリを書こうと思ったモチベは単に PCの交換タイミングで今までの Agent の記憶(メモリ)ってどうやって移植すればいいんだ? っていうのがわからなくなって調べたからです。
そのほとんどは上記のドキュメントを読むことで解決しましたが、ユーザースコープのメモリ機能1つで簡単に Claude Code をカスタマイズできるってのはポータビリティ性高いなと思いました。

Claude Code におけるユーザースコープのメモリ

ドキュメントによると、ユーザースコープのメモリは $HOME/.claude/CLAUDE.md で管理できます。
自分の環境でのみ動作させたいメモリの機能があればここに全て集約しておけば、例えば PC 交換などがあっても .claude ごと持ってくれば今まで通りの使い味で動かすことができ、Claude がリセットされるようなことはありません。

自分用のメモリ管理

自分は settings.json 始め以下のファイルを git で管理することにしました。

.claude/
├── memory/
│   └── plans/**.md
├── rules/**.md
├── CLAUDE.md
├── settings.template.json
├── mcp.template.json
├── statusline.sh
└── Makefile

それぞれ以下を管理しています。

  • CLAUDE.md : Claude Code の動かし方。思想。哲学。
  • rules : 自分用のルール。コーディングルールやワークフローを定義。ほとんどの Claude Code の制御はここでやる。
  • (settings|mcp).template.json : settings.jsonmcp.json を吐き出す元。ここに自分流のカスタマイズ設定を入れている。
  • statusline.sh : npx ccusage@latest を実行する。Claude Code の利用量等を ccusagewatch してるが、settings.jsonnpx ccusage を書くと重たいらしく、Bash で起動するのが公式でも紹介されているプラクティスとのことなので shell ファイルに起こしておく。
  • Makefile : settings.jsonmcp.json を生成する。

自分は今回これらのユーザースコープの .claude を github にし push して remote でコピーできるようにしました。

自分用の hooks

実は hooks も管理しています。
利用してる hooks は Coding 時の postToolUsesessionStart で Tool の利用後、コーディングの完了後に各種 linter の発火をさせること、及び repository 内での最初の Claude Code の起動時に必要なセットアップを行うために利用しています。
特に自分は serena を愛用していて、最近 plugin 版の serena に移行したところ、各種 repository で serena の activate が必要になってので、repository における最初の Claude Code の発火時に serena の activate が完了している(= .serena がある)かどうかをチェックさせて、なければ tool 使用や各種プロセスの実行前に activation を完了させるという hooks を用意しました。

具体的には以下のような hooks の設定をしています。

{
  "hooks": {
    "PostToolUse": [
      {
        "hooks": [
          {
            "command": "file_path=$(cat | jq -r '.tool_input.file_path // empty' 2>/dev/null); if [ -n \"$file_path\" ] && echo \"$file_path\" | grep -q '\\.go$'; then gofmt -w \"$file_path\" 2>/dev/null && echo \"gofmt applied: $file_path\"; fi; exit 0",
            "type": "command"
          }
        ],
        "matcher": "Edit|Write"
      }
    ],
    "SessionStart": [
      {
        "hooks": [
          {
            "command": "echo '[Serena自動実行指示] セッション開始時に以下を自動実行してください: 1. mcp__plugin_serena_serena__activate_project で現在のディレクトリ ('\"$PWD\"') をアクティブ化 2. mcp__plugin_serena_serena__check_onboarding_performed でオンボーディング状態を確認 3. 未実施の場合は mcp__plugin_serena_serena__onboarding を実行'",
            "type": "command"
          },
          {
            "command": "echo '[LSP状態確認] gopls: '$(command -v gopls >/dev/null 2>&1 && echo '有効' || echo '無効'); echo 'typescript-language-server: '$(command -v typescript-language-server >/dev/null 2>&1 && echo '有効' || echo '無効')",
            "type": "command"
          }
        ]
      }
    ]
  },
}

自分用の skills

./claude/skills 配下に置こうと思っています。
ただ、新しく出た skills は今自分用の便利 skill を検討、実装中です。出来上がったらまたブログに載せます。

まとめ

PC 交換する機会があり、そういえば Claude Code などの Agent のメモリの移行ってどうするんだ?っていうのが疑問で色々調べるうちに自分でもわからないくらい便利な仕様になっていたことを知りました。
Coding Agent は個人的には素の状態で使うのが好きですが、とはいえ生産性アップのあれこれの工夫のあとがゼロになってしまうと、一時的な生産性のダウンは避けられないので、今回調べてみて良かったです。