每次開新 session 都要重講一次「我們用 pnpm 不用 npm」、「commit 前要跑 lint」?寫進 CLAUDE.md,講一次就好。這篇把它的正確用法、常見誤用、跟新功能 auto memory 的分工一次講清楚。
這篇你會學到
- CLAUDE.md 該寫什麼、不該寫什麼(太長反而有害)
- 四個存放位置的差別:全域、個人、專案、個人專案
- auto memory:Claude 現在會自己記筆記,跟 CLAUDE.md 怎麼分工
- 指令不被遵守時的排查方法
兩套記憶系統,先分清楚
現在的 Claude Code 有兩套互補的記憶:
CLAUDE.md:你寫給它的規則——編碼規範、專案架構、工作流程。
Auto memory:它自己記的筆記——建置指令、debug 心得、你糾正過它的偏好。存在每個專案自己的記憶資料夾,預設開啟。
分工原則:你想「規定」的寫 CLAUDE.md;它自己「學到」的交給 auto memory。你說「記住以後都用 pnpm」,Claude 會存進 auto memory;要進 CLAUDE.md 得明講「把這條加到 CLAUDE.md」。
四個位置,從廣到窄
- ~/.claude/CLAUDE.md:你的個人偏好,所有專案都載入
- 專案根目錄 CLAUDE.md(或 .claude/CLAUDE.md):團隊共用,進版控
- CLAUDE.local.md:個人專案筆記,加進 .gitignore 不上傳
- 企業管理的全域檔案(IT 部署,個人用不到)
載入順序從廣到窄,越接近專案的越後讀。子目錄也可以放 CLAUDE.md,不會開始就載入,Claude 讀到那個目錄的檔案才觸發——monorepo 的好望友。
懶得從零寫?跑/init,Claude 會分析你的 codebase 自動產一份初稿。
寫法決定遵守率
CLAUDE.md 是 context,不是強制設定——寫法越具體,遵守率越高:
- ✍ 「縮排用兩格空白」勝過「程式碼要排版整齊」
- ✍ 「commit 前跑 npm test」勝過「記得測試」
- ✍ 「API handler 放 src/api/handlers/」勝過「檔案要歸位」
⚠️ 🔍 官方建議:單檔控制在 200 行以內。超過不只吃 context,遵守率還會下降。長出來的內容拆進 .claude/rules/ 目錄,可以用 paths 設定讓規則只在碰特定檔案時載入。
💡 如果一條規則必須「每次都執行」(例如 commit 前一定要 lint),不要靠 CLAUDE.md——用 hook。CLAUDE.md 是勸導,hook 是執法。
💡 已經有 AGENTS.md(給其他 AI 工具用)?在 CLAUDE.md 裡寫一行@AGENTS.md匯入它,兩邊共用同一份指令。@ 匯入語法也能拉其他檔案,最多四層。
💡 HTML 註解(<!-- 給維護者看的註記 -->)會在送進 context 前被拿掉,不花 token。給人看的註記儘量用這個。
指令不被遵守時的排查順序
- 跑
/memory確認檔案真的有被載入(沒列出來 = Claude 根本看不到) - 檢查有沒有互相矛盾的規則——兩條打架時 Claude 會隨便挑一條
- 把抽象指令改具體
- 還不行就升級成 hook
⚠️ 🔍 官方文件:/compact 壓縮後,專案根目錄的 CLAUDE.md 會自動重讀,但子目錄的不會——要等下次讀到那個目錄的檔案才回來。壓縮後感覺它「忘記」某條規則,多半是這個原因。
auto memory 的實用細節
記憶存在 ~/.claude/projects/專案/memory/,入口是 MEMORY.md(每次載入前 200 行),細節分散在主題檔案裡按需讀取。全部是純文字 markdown,跑 /memory 就能打開來看、改、刪。看到介面出現「Writing memory」就是它在記筆記。
不想要這功能?設定 autoMemoryEnabled 關掉就好。
收尾
判斷標準很簡單:同一句話你對 Claude 講第二次了,就該進 CLAUDE.md。其餘的交給 auto memory 自己累積。
官方文件:How Claude remembers your project。