Hub Claude Code 教學

核心篇 · 第 5 章

CLAUDE.md 與工作記憶

前面幾章你已經能叫它寫程式了。但你大概也發現一件事:每開一段新對話,它就「失憶」一次,你昨天交代過的事,今天得再講一遍。這一章就是來治這個毛病的。你會學到怎麼留一張「給它看的便利貼」,讓它每次開工都先讀過、記得你的專案規矩——有些是你自己寫的,有些它會自己記下來。從最快上手的 /init,到只在特定路徑才生效的規則、跨檔案匯入、記憶到底存在哪裡,再到它「不聽話」時怎麼排查,這一章會把整套地圖攤開給你看。

5.1 先建立觀念:它有兩種記憶

先講一個你一定會遇到的狀況:每次你開一段新對話,Claude 的腦袋都是「一張白紙」。上一段對話講過的事,它不會自動帶到下一段。這不是它故障,是它本來就這樣設計的。

那要怎麼讓它「跨對話」記得事情?靠兩個機制,而且這兩個機制每次對話一開始就會自動讀進去,不用你每次提醒:

  1. (你寫的):一張你親手寫下的便利貼,把專案的規矩、常用指令、你的偏好寫進去。它每次開工都先看一遍。
  2. (它自己寫的):Claude 一邊幫你做事,一邊把學到的東西自己記下來——像是這個專案怎麼跑測試、上次踩過什麼坑、你喜歡什麼程式風格。這個你完全不用動手,它自己來。

CLAUDE.md(你寫的便利貼)

一個放在專案資料夾裡的純文字檔,內容是你決定的。常用指令、專案規矩、「永遠要做」「絕對不要做」的事,都寫在這。它每次開新對話都會被讀進去。

自動記憶(它自己寫的筆記)

你不用寫,Claude 工作時自己記。例如你糾正它一次「測試要用 pnpm 不是 npm」,它會默默記起來,下次就不用你再講。記在一個叫 MEMORY.md 的檔裡。

這兩種記憶是「建議」,不是「鐵律」

很重要的觀念:CLAUDE.md 和自動記憶,都只是給 Claude 的「參考脈絡」——像你給新同事的工作筆記,他會參考,但不是百分之百照辦。如果你要的是「這個動作一定要發生,或一定禁止」(例如「絕對不准刪掉這個資料夾」「送出前一定要先跑測試」),那要用 Hook(第 8 章會教),那個才是會強制執行、擋下來的鐵則。記憶用來「提醒」,Hook 用來「強制」,別搞混。

想知道原理:它的自動記憶到底記在哪、會記多少?

自動記憶存在一個叫 MEMORY.md 的檔案裡。每次對話開始,它會把這個檔的「前段」載入——大約是前 200 行、或前 25KB 的內容(哪個先到算哪個)。所以這個筆記本不是無限大,太舊太雜的東西不一定每次都帶得到。這也是為什麼「保持簡短」這件事很重要,後面 5.4 會講。

它是相對後來才加入的功能,需要 Claude Code v2.1.59 以上的版本才有;如果你發現自己的 Claude 完全沒有自動記憶的跡象,先用 claude --version 檢查一下版本(實際門檻版本與介面細節,請以官方頁面或 claude --help 顯示的為準,這類數字更新得很快)。它實際存在硬碟的哪個位置、怎麼開關、換電腦會不會同步,5.6 節會有更完整的介紹。

5.2 最快上手:用 /init 生成你的第一份 CLAUDE.md

你可能會想:「便利貼聽起來要寫好多字,我又不知道該寫什麼。」別擔心,有一個指令能幫你生出第一版——你只要在 Claude 裡打 /init,它會自己看一遍你的專案,幫你寫好一份起始的 CLAUDE.md。你之後再慢慢補就好。下面手把手帶你做一次。

  1. 動手做

    先進到 Claude 裡

    在你的專案資料夾裡打開終端機,輸入 claude 按 Enter,進到 Claude 的對話畫面(這個第 3 章學過)。

    claude
  2. 動手做

    輸入 /init 按 Enter

    在對話框裡直接打下面這個指令,按 Enter。注意開頭那條斜線不要漏掉。

    /init
  3. 動手做

    看它產生 CLAUDE.md

    它會花一點時間讀你的專案,然後在資料夾根目錄產生一個 CLAUDE.md 檔。產生過程中,它通常會把整理出來的內容顯示給你看。如果這個資料夾「已經有」CLAUDE.md,/init 不會直接覆蓋掉它,而是改成「建議你可以補哪些東西」,原本寫好的內容不會被洗掉。

    預期會看到
    # 它會在你的資料夾裡建立這個檔,並大致回報:
    Created CLAUDE.md
  4. 打開來看看,再慢慢補

    用你習慣的編輯器打開那個 CLAUDE.md,看它幫你寫了什麼。這只是「起始版本」——哪裡寫得不夠、或它漏掉的規矩,你隨時可以自己加。怎麼寫得好,下一節 5.3 給你範本。

/init 只是幫你開頭,不是寫完

/init 產生的是一份「草稿」。它看得到你的程式,但看不到你腦袋裡的規矩(例如「這個資料夾碰不得」「我們都用 pnpm」)。所以把它當起點,邊用邊補,這份檔才會越來越懂你的專案。

有個好用的小知識:如果你的專案原本就留有其他工具寫的規矩檔——像 AGENTS.md、.cursorrules.devin/rules/.windsurfrules 這些——/init 執行時會自動偵測到,把裡面的內容一併讀進去、整合進它幫你寫的 CLAUDE.md 草稿。換句話說,從別的工具搬過來的專案,舊規矩不會平白消失。

想要更慎重的起手式?試試互動式 /init

如果專案比較大、不想讓 /init 太快下筆,官方文件揭露了一個環境變數,能把它換成「先探索、先追問缺口、給你一份可審閱的提案,你點頭之後才真的落筆」的多階段流程:CLAUDE_CODE_NEW_INIT=1 claude,接著在對話裡照樣打 /init。這是相對新的行為,是否仍需要這個環境變數、介面長怎樣,請以你版本的官方文件為準。

5.3 一份好的 CLAUDE.md 該寫什麼

知道怎麼生出檔案了,那到底該往裡面寫什麼?給你一個超好用的判斷標準:

凡是「你每次都得重新跟它解釋一遍」的東西,就寫進去。換個更生活化的說法——如果一個新來的同事,要看了才會知道,那就值得寫。

照這個標準,最該寫的通常是這幾類:常用指令(怎麼安裝、怎麼跑測試、怎麼啟動)、程式風格(縮排幾格、命名規則)、專案結構(哪個資料夾放什麼)、「永遠要做 X」的規則,還有同樣重要的——「不要做的事」。

下面是一份簡單的範本,你可以直接照抄改成自己的。看不懂裡面每一行也沒關係,重點是感受一下「大概長這樣、分這幾段」。

# 專案說明
這是一個線上書店的後端服務。

## 常用指令
- 安裝套件:npm install
- 跑測試:npm test
- 本機啟動:npm run dev

## 程式風格
- 用 2 個空格縮排
- 變數用駝峰式命名(camelCase)

## 不要做的事(Don't)
- 不要直接改 migrations 資料夾
- 不要把密碼或金鑰寫死在程式碼裡

為什麼「不要做的事」要單獨寫一段?

你會發現範本最後特地留了一段「不要做的事」。這不是多此一舉——告訴它「該做什麼」很重要,但告訴它「絕對別碰什麼」往往更能幫你避免麻煩。例如「不要把密碼寫死在程式碼裡」這種,寫一行進去,就省得你每次提心吊膽。(再提醒一次:這是「強烈建議」等級;真要「鐵了心禁止」,得用第 8 章的 Hook。)

只給人看、不佔額度的小技巧

CLAUDE.md 也是給「未來的你」或接手同事看的文件,有時你會想留一句「為什麼這樣規定」的備註,卻不想讓每次對話都得多讀這幾行。這時候可以用 HTML 註解 <!-- 這樣寫是因為... -->:Claude Code 送出 context 前,會把這種獨立成行的區塊註解整段剝掉,你在編輯器打開檔案還是看得到,但它不會被送進 Claude 的 context,等於零成本的「只寫給人看」備註。要注意這招只對這種 HTML 註解有效——如果註解寫在範例的程式碼區塊裡(例如 # 這是註解),那是程式碼的一部分,一樣會照常被讀進去。

5.4 黃金守則:邊用邊補,而且保持簡短

CLAUDE.md 不是寫一次就收工的東西,它會跟著你和專案一起長大。這裡有兩條 Claude Code 團隊自己在用的守則,記住就好:

第一條,邊用邊補。每次它做錯、你糾正了它,就順手把「這次學到的規矩」補一條進 CLAUDE.md。下次它就不會再犯同樣的錯。日積月累,這份檔會變成你專案的「累積知識庫」——越用越聰明。

第二條,保持簡短。這份檔每次對話都會被「整份」讀進去。如果它太長太雜,會把 Claude 的記憶空間吃掉一大半,正事都還沒開始,腦容量就先滿了。一個好抓的標準是:盡量控制在 200 行以內。

大份文件用「引用」拆開

別把長篇文件整個塞進 CLAUDE.md。改成寫一句話:「處理付款相關功能時,先去讀 docs/payment-architecture.md。」這樣它只在「真的需要時」才去翻那份文件,平常不佔記憶。

太局部的規矩,別放這裡

只跟某一小塊程式有關的規則、或一長串多步驟流程,不適合放 CLAUDE.md(會拖長它,每次對話都要重讀一次)。這類東西有個更精準的家:「只在你動到那個路徑才生效」的規則檔——下一節 5.5 就會教你怎麼設定。

一個好記的目標:200 行以內

不必精準數行數,抓個感覺就好:CLAUDE.md 大約 200 行以內最理想。如果你發現它越寫越長、開始塞進整篇說明文件,那就是該「拆檔」的信號——把長內容搬到別的檔,CLAUDE.md 裡只留一句「需要時去讀那個檔」。

想知道原理:為什麼「太長」會吃掉它的記憶空間?

Claude 每次對話能「同時記在腦中」的資訊量是有上限的(這個上限叫 context,後面章節會碰到)。CLAUDE.md 每次都整份載入,等於先從這個額度裡扣掉一塊。檔越長,扣得越多,留給「真正在做的工作」的空間就越少。所以「拆檔 + 用引用指路」之所以聰明,是因為它讓 CLAUDE.md 只放最常用的,把不常用的長文件留在外面,要用才讀,額度花在刀口上。

5.5 進階筆記本:路徑限定規則與跨檔案匯入

上一節提到,太籠統或太局部的東西都不該硬塞進 CLAUDE.md。這裡把「精準拆檔」這件事再往下教兩招:一招讓某份規矩只在你真的碰到相關檔案時才登場,另一招把好幾份檔案正式串在一起當成一份用。兩招聽起來有點像,行為卻完全不同,分清楚能少走不少冤枉路。

只在你踩進那個資料夾才生效:.claude/rules/

在專案裡建一個 .claude/rules/ 資料夾,裡面每份 .md 檔都是一條獨立的規則,Claude Code 會遞迴掃描整個資料夾(含子資料夾)。這些規則檔分成兩種行為,差別就在檔案開頭有沒有寫 paths:

沒寫 paths: → 開場就無條件載入

.claude/CLAUDE.md 同一個優先權,等於把根目錄那份 CLAUDE.md 拆成好幾個主題檔,方便維護,但行為上跟寫在同一份檔案裡沒有差別。

寫了 paths: → 隨選載入

只有 Claude 真的用 Read 工具讀到「符合這個路徑」的檔案,這份規則才會被拉進 context;平常完全不佔額度,跟子目錄 CLAUDE.md 的行為(5.7 節會講)是同一套邏輯。

比如你只想讓某份規則在動到 API 程式碼時才出現:

---
paths:
  - "src/api/**/*.ts"
---

# API 開發規則
- 每支 API 端點都要做輸入驗證
- 統一用專案的錯誤回應格式
- 補上 OpenAPI 文件註解

paths: 底下可以放好幾條規則,也支援大括號同時比對多種副檔名:

paths:
  - "src/**/*.{ts,tsx}"
  - "lib/**/*.ts"
  - "tests/**/*.test.ts"

glob 寫錯,不會跳出任何錯誤訊息

paths: 底下是一段 YAML 清單,語法寫錯(例如帶大括號的寫法忘記加引號)很容易「靜默失效」——這條規則從此沒被觸發過,畫面上也不會有任何提醒。想確認某條規則到底有沒有被讀到,最直接的方法是打 /memory,它會列出這個 session 目前實際載入的所有 CLAUDE.md、CLAUDE.local.md 與 rules 檔案;你要的那份如果沒出現在清單裡,通常就是 glob 寫錯或路徑對不上。

跟 CLAUDE.md 一樣,.claude/rules/ 也有個人層版本:放在 ~/.claude/rules/ 底下的規則會套用到你所有專案,載入順序排在專案層規則之前(衝突時專案層優先)。這個資料夾也支援 symlink,可以把同一套規則庫串連進好幾個專案,不用每個 repo 都複製貼上一份——就算不小心接成循環 symlink,系統也會自動偵測、不會卡死。

把好幾份檔案正式串成一份:@ 匯入語法

另一招是 @ 匯入語法——在 CLAUDE.md(或任何會被讀進 context 的檔案)裡寫 @路徑,Claude Code 就會把那個路徑指到的檔案整個接進來,當成同一份文件的延伸:

See @README.md for project overview and @package.json for available npm commands.

# Additional Instructions
- Git workflow: @docs/git-instructions.md
- Personal overrides: @~/.claude/my-project-instructions.md

有個容易搞混的地方:@ 後面的相對路徑,是相對「寫這行 @ 的那個檔案」去解析,不是相對你目前的工作目錄。它也支援遞迴——被匯入進來的檔案裡如果自己又寫了 @,會繼續往下展開,官方頁面目前明載的上限是4 層(網路上另有資料寫 5 層,實際以官方頁面為準,這類數字版本間可能會調整)。如果你只是想在句子裡「提到」某個檔名、不想觸發匯入,用反引號包起來就好,像 `@README`——匯入解析本來就會跳過反引號與程式碼區塊裡的內容。

@ 匯入不是省 token 的招

很容易誤會的一點:@ 匯入不會幫你省 context 額度。上一節(5.4)教的「寫一句話指路」,是 Claude 自己判斷需要才去讀那份檔,平常不佔位置;但 @ 匯入的檔案,在對話一開始就會整份展開、全部讀進去,跟直接把內容貼進 CLAUDE.md 裡幾乎沒有兩樣。@ 語法真正的用途是幫你把好幾份檔案有條理地組織、維護在一起,不是延後載入、省成本——那件事是 5.4 的指路句子和這一節的 .claude/rules/ 在做的。

第一次在專案裡遇到匯入專案資料夾以外的檔案(例如上面 @~/.claude/my-project-instructions.md 這種指向個人目錄的路徑),Claude Code 會跳出一個核准對話框,列出它打算匯入哪些檔案讓你確認。

選了「拒絕」,之後也不會再問

這個核准對話框只會問你一次。當下選擇拒絕,那幾行 @ 匯入會被永久停用,之後也不會再跳出來問——很容易在專案剛跑起來、隨手點掉一個看不懂的提示之後,過了很久還在納悶「明明寫了 @ 匯入,內容怎麼從來沒出現過」。如果你懷疑自己踩過這個雷,回頭檢查一下當初有沒有誤按拒絕。

@ 匯入還有一個很實用的場景:橋接既有的 AGENTS.md。Claude Code 本身只讀 CLAUDE.md,不會主動去讀 AGENTS.md——如果專案已經有一份給其他 agent 工具用的 AGENTS.md,不想整份複製貼上再維護兩次,可以讓 CLAUDE.md 直接匯入它:

@AGENTS.md

## Claude Code
Use plan mode for changes under `src/billing/`.

這樣主要內容維持單一來源,下面再補幾行 Claude Code 專屬的細節就好。另一個做法是直接建 symlink:ln -s AGENTS.md CLAUDE.md,讓兩個檔名指向同一份內容——不過 Windows 建立 symlink 需要系統管理員權限或開啟開發者模式,官方建議 Windows 環境還是改用上面的 @ 匯入寫法比較省事。(Codex CLI 的 AGENTS.md 怎麼寫,本章最後的對照連結會帶你去看。)

5.6 它自己也會記:自動記憶怎麼存、怎麼開關

講完「你寫的」便利貼,換講「它自己記的」筆記。這部分最舒服的地方是:你什麼都不用寫。

Claude 一邊幫你工作,會一邊把學到的東西自己存起來——存在一個叫 的檔案裡,每次對話開始時自動帶前段內容進來。你也可以隨時開啟或關掉這個功能。

那它記了什麼、記得對不對,你想看看怎麼辦?打一個指令就能查、也能改:

建議執行:查看 / 編輯它記了什麼

/memory

/memory,它會把目前記下的內容攤開給你看,你可以一條一條檢查,覺得記錯了、或不想讓它記某件事,當場改掉就行。

還有一招更直接:你可以直接命令它記。例如打一句「記住:我們這個專案用 pnpm,不是 npm。」它就會把這條存進筆記,以後不用你再三叮嚀。

一句話就能教它記住

不用等它自己學。只要你發現有件事「以後每次都希望它照辦」,直接跟它說「記住:……」最快。例如「記住:這個專案的測試一律用 pnpm test」「記住:commit 訊息要用中文」。它記下後,下次開新對話也帶得到。

互動模式下還有個更快的手勢:打單獨一個 # 開頭,把想記的一句話接在後面,就能快速把它存進記憶(存的位置是專案層或個人層的 CLAUDE.md,這是你手動觸發的動作,跟自動記憶「它自己判斷該記什麼」不一樣)。

這個捷徑曾在特定版本/平台上失靈過

# 快速記憶這招,曾經在特定平台與版本組合上出現過失效的狀況——打了 # 只印出一個普通的井字號,完全沒跳出存記憶的提示。如果你試了沒反應,別懷疑自己打錯,先用 /memory 或直接打一句「記住:……」代替,兩者效果一樣,只是慢一步。

再來是「它存在哪」跟「怎麼關掉」。自動記憶實際放在你電腦裡的 ~/.claude/projects/<專案代號>/memory/ 資料夾,這個「專案代號」是依你的 git repo 推算出來的——同一個 repo 底下不管你開幾個 worktree、切到哪個子目錄,用的都是同一份自動記憶;如果這個資料夾根本不在 git repo 裡,就改用專案的根目錄本身當代號。它是純本機的東西,不會幫你同步到別台電腦,換一台機器工作,記憶要重新累積。

自動記憶預設是開著的。想關掉,最直覺的方式是在 /memory 介面裡切換;想要更持久或更自動化的關法,還有兩個選項:

寫進 settings.json 永久關掉

"autoMemoryEnabled": false,第 8 章教過這個設定檔怎麼分層;只想單次啟動時關、不想改檔案,改用環境變數 CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 也行。

用 autoMemoryDirectory 換個地方存

想讓自動記憶存到別的資料夾,設定值要給絕對路徑或 ~/ 開頭的路徑;在專案層這樣設定,第一次生效前還要先過一個資料夾信任確認的對話框,跟 Hooks 是同一道關卡。

這一整套「記憶」的概念其實不只主執行緒有——如果你之後接觸到自訂子代理(subagent),會發現它也能擁有自己專屬、獨立於主執行緒之外的記憶資料夾(在設定檔裡寫 memory: userproject),讓它每次被叫出來做同一類工作時越做越上手。這部分等你到第 12 章「自建代理人」會更有感覺,這裡先知道有這條路就好。

5.7 記憶的層級:從組織到你的子目錄

把鏡頭拉遠一點:同樣是「給 Claude 看的規矩」,CLAUDE.md 可以放在好幾個不同的地方,差別在「這條規矩管到多大範圍、誰看得到」。官方文件把它分成四層範疇,依載入順序由廣到窄

層級 放在哪 適用範圍
組織層
(Managed)
🍎 macOS:/Library/Application Support/ClaudeCode/CLAUDE.md Linux/WSL:/etc/claude-code/CLAUDE.md 🪟 Windows:C:\Program Files\ClaudeCode\CLAUDE.md 由公司/組織 IT 統一部署,對全組織生效,優先權最高。一般新手用不到,由公司的人設定。
個人層
(User)
🍎 Mac/Linux:~/.claude/CLAUDE.md 🪟 Windows:%USERPROFILE%\.claude\CLAUDE.md 你「所有」專案都會自動套用,而且只有你自己看得到。適合放你個人的偏好(例如「回我中文」)。
專案層
(Project)
專案根目錄的 CLAUDE.md(或 .claude/CLAUDE.md 只對「這一個專案」生效。把它 commit 進 Git,整個團隊就能共用同一份規矩。
本機層
(Local)
專案根目錄的 CLAUDE.local.md 只對「這一個專案」生效,而且只屬於你自己——放本機路徑、私人測試資料這類不該讓全隊看到的東西。建議加進 .gitignore,不要 commit。

一句話幫你記:組織層=公司規定,最大最優先;個人層=你自己的習慣,跟著你走到每個專案;專案層=這個專案的規矩,跟團隊共用;本機層=專案裡只屬於你的私房筆記,不進版控。剛開始,你只要會用「專案層」那一份 CLAUDE.md,就足以應付絕大多數情況——之後想把個人偏好跟團隊規矩分開,才需要用到本機層。

想更深:大師篇的分層講法跟這裡不太一樣,是我看錯了嗎?

沒看錯,是兩種講法並存。這裡教的「組織/個人/專案/本機」四層,是官方文件的分法;到大師篇(14 章)你會看到一套從 Boris Cherny(Claude Code 的創造者)實務做法整理轉述而來的「全域/專案/私密/模組」四層 cascade,額外把「子目錄專屬知識」獨立成一層。名字對不太起來,但「個人層=全域」「本機層=私密」,骨幹概念是同一件事,屆時對照著看就懂,不用重新學一次。

同一層不只一份:路徑上的檔案會全部疊加

這四層裡,專案層最容易「不只一份」——尤其是在巢狀資料夾裡工作時(例如 monorepo,根目錄有一份 CLAUDE.md,你實際在裡面某個子套件資料夾啟動 Claude)。這種情況下,Claude Code 會從你目前的工作目錄往上一路找到檔案系統根目錄,把沿路遇到的每一份 CLAUDE.md/CLAUDE.local.md全部串接進 context——不是「後面的蓋掉前面的」,是全部疊加,順序由根目錄排到你的工作目錄,越靠近你啟動位置的檔案排越後面;同一層裡如果 CLAUDE.md 和 CLAUDE.local.md 都有,CLAUDE.local.md 排在後面。

檔案本身都在,不會互相刪除彼此的內容;但如果兩條規則講的是互相矛盾的事,通常越靠近你專案、越晚讀到的那條權重會比較高。這也是為什麼團隊共用規矩盡量放根目錄那份,個人覆寫或例外情況才放到離你實際工作位置比較近的地方。

如果你在很大的 monorepo 裡,常被別的團隊寫的祖先層 CLAUDE.md 干擾(跟你完全無關的規矩,卻每次都跟著載進來),可以用 claudeMdExcludes 設定把它排除掉。這個設定接受一份 glob 清單,比對絕對路徑,可以放在個人層、專案層、本機層任一層的 settings.json:

{
  "claudeMdExcludes": [
    "**/monorepo/other-team/CLAUDE.md"
  ]
}

通常建議寫在你自己的 .claude/settings.local.json,只影響你自己,不動到團隊共用設定。有一點要注意:組織層(Managed)的 CLAUDE.md 沒辦法被排除,不管在哪一層設定 claudeMdExcludes 都一樣——這是刻意設計,組織規定不該讓個別開發者自己關掉。

子目錄的 CLAUDE.md:寫了不代表馬上生效

剛剛講的是「祖先」方向(往上找)。那「子目錄」方向(往下)呢?直覺可能會覺得跟根目錄一樣,一開場就通通讀進去——但不是,這是新手最容易誤踩的一個地雷。

祖先路徑上的 CLAUDE.md

開場就載入,全部疊加進 context——上面剛教的行為。

你工作目錄底下、子資料夾裡的 CLAUDE.md

開場不會載入。要等 Claude 真的用 Read 工具去讀那個子目錄底下的某個檔案,才會「隨選」把那份 CLAUDE.md 一併帶進來。單純用 Write/Edit 在那個資料夾建立新檔案,並不會觸發載入。

最容易誤踩的地雷:以為建了檔案就生效

如果你在 src/payment/ 放了一份專屬 CLAUDE.md,指望它「一開場」就管住 Claude 對這個資料夾的行為——不會發生,也不是 bug。它必須等到 Claude 真的用 Read 工具去讀那個資料夾裡的某支檔案,這份規矩才會被拉進來。發現某條子目錄規矩「感覺沒被遵守」時,先確認 Claude 有沒有真的碰過那個資料夾,而不是急著懷疑規矩寫得不夠清楚。

想更精確追蹤「哪個指示檔案什麼時候被載入、為什麼」,有個專門的 hook 事件叫 ,能即時記下來,特別適合排查這種「按理說該載入卻還沒觸發」的情境——這屬於第 19 章 Hooks 自動化的範圍,這裡先知道有這個工具存在就好。另外,如果你是用 --add-dir 額外掛載了工作目錄以外的資料夾,Claude Code 預設也不會自動讀那個資料夾的 CLAUDE.md;要一併讀,得加環境變數 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1

5.8 /compact 之後,它還記得多少

工作到一半,對話拉得很長,你可能會跑 /compact 讓 Claude 把歷史記錄摘要精簡一下(這個指令第 14 章會更完整地講)。這裡只回答一個很實際的問題:跟 CLAUDE.md、記憶有關的東西,/compact 之後還在不在?答案是「看情況」,整理成一張表方便查:

機制 /compact 之後
專案根目錄 CLAUDE.md、沒有 paths: 的 rules、自動記憶 會從硬碟重新讀一次、自動補回來,通常不會察覺任何差異。
paths: 的 rules、子目錄裡的巢狀 CLAUDE.md 會不見,要等下次 Claude 真的讀到對應路徑的檔案,才會重新登場。
已經被呼叫過的 skill 內容 會重新注入,但有上限:每個 skill 最多 5,000 token、全部加起來最多 25,000 token,超過的部分先丟最舊的,被截斷時保留檔案「開頭」那段。
system prompt、輸出風格(output style) 完全不受影響,本來就不算在對話歷史裡。
Hooks 完全不受影響,用程式碼形式執行,不佔用 context 額度,沒有「記不記得」這回事。

會不見的剛好都是「隨選才載入」的那幾種,這跟它們原本「按需局部生效」的設計互相呼應。如果有件事無論如何都不能在 compact 之後消失、不能有任何遺漏的空窗,那已經超出 CLAUDE.md/記憶這套機制的守備範圍——回到本章一開始 5.1 提過的:這時候該用的是 Hook,不是往記憶裡加字。

5.9 它不聽話怎麼辦:排查與眉角

萬一你已經照這章的方法寫好 CLAUDE.md,Claude 卻還是一犯再犯同一個錯——先別急著懷疑自己「是不是寫得不夠兇」。這一節帶你照順序排查,順便說幾個連老手都會踩到的眉角。

  1. 先確認它真的有被載入。/memory,看看你以為寫好的那份 CLAUDE.md、或某條 path-scoped 規則,有沒有出現在清單裡。沒出現,通常是路徑寫錯、或這條規則根本沒被觸發,回頭檢查前面幾節教的載入條件。
  2. 有載入但還是不聽,多半是措辭問題,或規則互相打架。檢查這條規則寫得夠不夠具體,還有沒有跟別份 CLAUDE.md(例如上一節提到的祖先路徑疊加)講的東西互相矛盾。矛盾時,越靠近你專案的那層通常權重比較高,但這只是「通常」,不是保證。
  3. 還是搞不定,做一次完全乾淨的隔離測試。有兩個辦法:一是用 claude --safe-mode(v2.1.169 之後的版本才有這個旗標,實際版本門檻以 claude --help 為準),開機時直接關掉所有客製化——CLAUDE.md、skills、plugins、hooks、MCP、自訂指令與 agent 全部關掉,只留登入、模型、內建工具、權限系統正常運作;二是把環境變數 CLAUDE_CONFIG_DIR 指到一個空資料夾,開一個完全不受任何既有設定干擾的全新 session。兩種都能幫你排除「是不是某個設定互相打架」,再一項一項加回來,抓出兇手。

建議執行:完全乾淨、不受任何既有設定干擾的測試

# 指到一個空資料夾,等於全新的 Claude Code 環境
CLAUDE_CONFIG_DIR=/tmp/claude-clean claude

內建的 Explore/Plan 子代理,其實不讀 CLAUDE.md

還有一個排查時很容易忽略的角落:Claude Code 內建的 ExplorePlan 這兩個子代理(用來做唯讀研究、規劃用),為了讓自己輕量,是刻意跳過載入 CLAUDE.md 與專案記憶的。如果你發現某條你以為全域生效的專案慣例,派給 Explore 或 Plan 做研究時完全沒被遵守,不是它們壞掉了,是設計上如此。想讓這類派工也照規矩來,得在你下達的指示裡把那條規則重新講一次,不能只靠它們自己去讀 CLAUDE.md。

「先停下來確認」這類流程規則,特別容易被動能帶著跑

有個真實的落差值得先打預防針:像「動工前先出計畫」「改超過三個檔案要先問過我」這類流程/關卡型規則,就算寫得再清楚,Claude 也能完整覆述出來,實際執行時卻常常「做著做著」就把這一步跳過了——這正好呼應本章一開始 5.1 提醒過的:CLAUDE.md 是以一般文字訊息的形式送進去的參考脈絡,不是系統層的強制規定,沒有「保證遵守」這回事。格式類、技術類的規則(像「用 2 個空格縮排」)通常最穩;「請先停下來確認」這種流程閘門類規則最容易被動能蓋過去。真的要它每次都停、不能有例外,這正是 Hook 存在的原因(第 8、19 章)——CLAUDE.md 負責「提醒」,Hook 負責「攔截」。

最後補一個進階備註:上面「CLAUDE.md 只是建議」這件事,在 headless/CI 這種每次呼叫都是全新、彼此獨立的場景裡格外明顯——沒有連續的 session,也就沒有「它讀過 CLAUDE.md」這回事可以依賴。這種情境下有個更直接的工具叫 --append-system-prompt,效果接近把你的指示直接寫進 system prompt 裡(保證等級比 CLAUDE.md 高),代價是每次呼叫都要重新帶上這個參數,比較適合寫進自動化腳本。這是第 20 章 Headless 與 CI 的範圍,這裡你只要知道有這條路就好。

這一章你學會了讓它「記得你」——也認得出它記不住的地方

從最基本的 CLAUDE.md、/init 快速上手,到路徑限定規則、@ 匯入、記憶的四層範疇與載入眉角,再到 /compact 存活狀況與排查三招——你現在該有能力判斷「這件事要不要讓它每次都記得」,也知道記憶機制的邊界在哪、什麼時候該換 Hook 上場。下一章我們換個主題:用 Git 幫你的進度「存檔」,做錯了也能隨時回到上一步。