Claude Code 用到 33% context 就存檔再 /clear:claude-mem auto-clear 接續流程拆解與手動版做法
claude-mem 新合併的 auto-clear 會在 context 用到 33% 時叫 Claude 用 work_state_write 存下目標、決定和下一步,再 /clear 並自動送出 continue。本文拆解機制、開啟設定、安全機制與限制,並教你用原生 slash command 加 SessionStart hook 做出手動版。
你應該有過這種經驗:同一個 Claude Code 對話開了一個多小時,前面講好的命名規則它開始忘、改過的檔案它又改回去、明明說過不要動的測試它又去碰。這時候多數人的做法是等 auto-compact,或自己打 /compact,讓它把對話壓成摘要繼續撐。
claude-mem 的作者 thedotmack 在 2026-11-08 合併了 PR #5486,給了另一種做法:對話用到 33% 的 context,就叫 Claude 把工作狀態存檔,接著 /clear,再自動送出一句 continue。 新對話開頭會自動帶入剛剛存的進度,Claude 從下一步直接接手。
這篇拆三件事:這個流程實際怎麼運作、怎麼開起來調參數、還有沒裝 claude-mem 的人,怎麼用 Claude Code 原生的 slash command 和 hook 做出一個簡化版。
為什麼是「存檔再清空」,不是「壓縮再撐」
/compact 的邏輯是:對話照舊,把舊的部分換成摘要。好處是不用動腦,代價是摘要寫什麼由模型當下決定,你很難保證「這個 API 不能改簽名」這種關鍵約束會被留下來。壓縮幾輪之後,context 裡是摘要的摘要。
存檔再清空的邏輯不一樣:
- 先要求 Claude 用固定欄位寫下目前狀態:目標、做過的決定和原因、相關檔案、確切的下一步
- 再把對話整個清掉,新對話只帶那份結構化狀態進來
差別在於「留下什麼」從模型的即興判斷,變成一份你事先規定好格式的交接單。新對話的 context 很乾淨,只有系統提示、專案記憶和這份交接單。
為什麼門檻是 33%?PR 和設定文件都沒有給實驗數據或理由,只寫了預設值是 33、可調 1~95。比較合理的理解是:越早換手,每一段對話都在 context 還沒被雜訊塞滿的區間工作;代價是換手次數變多、每次換手都要花一個回合存檔。這個數字建議當成起點自己調,不要當成定律。
運作原理:四個步驟

依 PR #5486 的說明和 src/mods/auto-clear/controller.ts 原始碼,流程是這樣:
1. 每次工具呼叫後量一次 context 使用量。 這是一個 Claude Code 的 mod(plugin 的 hooks module),檔案在 plugin/hooks/auto-clear.js,用 $.session.usage() 讀目前用量。一旦超過門檻,就把「請存檔」的指示附在這次工具呼叫的結果後面,讓 Claude 在同一個回合內就看到。如果某個回合跨過門檻時根本沒有呼叫工具,就在回合結束時另外送一個 claude-mem 名義的提示。
2. Claude 呼叫 work_state_write 存檔。 附上去的指示原文大意是:更新你正在用的每份清單,把做完的標成 done、補上還沒做的;記下目標、做過的決定和原因、相關檔案、確切的下一步;然後用一行字結束這個回合,不要開始新工作。
3. 回合結束時才執行 /clear。 而且有個硬條件:這個回合最後一個動作必須是成功的 work_state_write(之後再呼叫一次 work_state_read 確認沒關係)。存完又跑去改檔案,就不算數。
4. 自動以你的身分送出 continue。 新對話啟動時,claude-mem 原本就有的 SessionStart hook 會在 clear 這個來源下注入「未完成的工作狀態」,所以 Claude 看到 continue,會從剛才記下的下一步開始。
這裡有個容易忽略的細節,PR 也一併修了:SessionStart 注入的內容原本有快取,寫入工作狀態後大約 2 秒才重新產生。如果清空得太快,新對話可能拿到舊的待辦清單。現在 ContextCacheService 在工作狀態寫入、且動到 SessionStart 會顯示的清單時,會立刻丟掉快取,下一次 SessionStart 改成即時讀取。
work_state_write 存的到底是什麼
這是 claude-mem MCP server 提供的工具,官方描述是「這個專案的標準待辦清單和工作狀態,跨 session 保留」。參數只有兩個:
{
"list": "auth-refactor",
"fields": {
"task": "把 session token 換成 JWT",
"status": "doing",
"next_step": "改 middleware/auth.ts 的 verify(),再跑 tests/auth",
"decision": "不動 /api/v1 的回應格式,前端還沒跟上"
}
}
list是清單名稱,例如release、auth-refactorfields裡帶task就是更新一個待辦項目,status可以是todo、doing、done、dropped- 不帶
task的欄位是清單本身的狀態,同一個 key 以最新值為準,給null就清掉,"status": "done"會關掉整份清單
每次呼叫是「附加一筆」,回傳這份清單還開著的項目。
手把手:把它開起來
Step 1:安裝 claude-mem
README 給的方式是:
npx claude-mem install
或在 Claude Code 裡用 plugin marketplace:
/plugin marketplace add thedotmack/claude-mem
/plugin install claude-mem
裝完重啟 Claude Code。README 特別提醒:npm install -g claude-mem 只會裝 SDK,不會註冊 hooks,別用這個。
Step 2:確認 Claude Code 版本
auto-clear 是用 Claude Code 的 mods 機制做的,PR 寫明需要 2.1.287 以上(第一個支援 mods 的版本)。舊版會直接忽略這個 module,claude-mem 其他功能照常運作,只是不會自動清空。先跑一次:
claude --version
Step 3:打開開關
在 ~/.claude-mem/settings.json 加上:
{
"CLAUDE_MEM_AUTO_CLEAR_ENABLED": "true",
"CLAUDE_MEM_AUTO_CLEAR_PERCENT": "33"
}
也可以用同名環境變數,環境變數會蓋過 settings.json。幾個要注意的規則:
- 預設是關的,只有明確寫
true才會啟用 CLAUDE_MEM_WORK_STATE_ENABLED設成false時,auto-clear 也會跟著關(沒有地方存檔,當然不能清)- 門檻改完 30 秒內重新讀取,不必重啟
- settings.json 存在但讀不到時,沿用上一次讀到的設定,確保你關掉的不會被意外打開
Step 4:怎麼確認它有在跑
達到門檻時,mod 會在畫面上顯示類似「Context is at 35% (auto-clear at 33%): Claude is saving the work state, then claude-mem clears and continues.」的提示。想先試流程,可以比照 PR 作者的測法,暫時把門檻調到很低,觀察一輪存檔、清空、continue 是否順利,再調回來。
⚠️ 版本注意:寫這篇時(2026-11-09),這個功能已合併進 main,但最新的正式版 v15.12.1 是在合併之前切的,從 GitHub compare 看 auto-clear 還不在 v15.12.1 裡。如果你裝的是正式版,可能要等下一版。
它什麼時候不會清:安全機制
自動清空對話聽起來有點嚇人,所以這個 PR 花了不少篇幅在「不該清的時候絕對不清」。

- 沒存檔就不清。 存檔被拒、沒存、或存完又繼續做事,會在獨立的一個回合再問一次;還是沒存,就放棄,等你下次手動
/clear - 你按 Esc 中斷的回合,不會啟動也不會完成這個流程
- subagent、
-p非互動執行、SDK session 一律不碰,因為沒有人在看 - 防無限循環: 如果新對話一開始就已經超過門檻(系統提示很大、context window 很小),auto-clear 會自己關掉,直到重啟
- 你自己打
/clear或/resume,會取消還沒執行的存檔提示或清空 - 清空前你先打了訊息,清空會延後到 Claude 再存一次檔;如果
/clear被你的訊息擋在後面,就不會自動送continue - 任何錯誤都不會卡住工具呼叫或回合,每個 hook 都自己接住例外
數據與限制:誠實版
從 PR 描述看,作者做了這些驗證:
- 30 個單元測試,涵蓋狀態機和設定讀取
- 10 項透過
claude plugin test的引擎測試,讓實際的 bundle 跑 Claude Code 自己的 hook 鏈 - 在 Claude Code 2.1.319 上把門檻設成 1%,實際跑了兩次完整流程:Claude 存了目標、完成步驟、下一步和檔案,
/clear執行、continue以使用者身分送出,新對話直接去做下一步;第二次新對話也如預期觸發了防循環機制
這些證明的是「流程會照設計跑」,不是「用 33% 換手會讓程式碼品質變好」。PR 裡沒有任何品質或效率的對照數據,這點要分清楚。
其他值得知道的限制:
- 有已知的邊界情況。 PR 合併後,GitHub 使用者 goshtasb 在留言指出
controller.ts有一段 await 期間,如果你剛好手動/clear,可能把存檔提示掛到新對話上。這是很窄的時序問題,但代表這功能還很新 - 只支援 Claude Code。 claude-mem 本身支援 Codex、Gemini、Copilot 等多個 agent,但 auto-clear 依賴 Claude Code 的 mods 和
/clear - 交接單的品質就是上限。 如果 Claude 存檔時寫得含糊(「繼續重構」),新對話一樣會迷路。這不是 claude-mem 能替你解決的
- 成本。 claude-mem 預設會把工作過程壓縮成記憶,這一步本身要跑模型;README 說明可以選它的 observer 服務、自己的 OpenRouter 或 Gemini 金鑰,或用你的 Anthropic 方案額度
沒裝 claude-mem?用原生功能做簡化版
auto-clear 的精華其實是兩個習慣:固定格式的交接單,和新對話自動讀交接單。這兩件事用 Claude Code 原生的自訂指令和 hook 就做得到,只是觸發要自己來。
1. 用 /context 看用量。 覺得對話變長時打一次,看目前用了多少。
2. 建一個 /handoff 指令。 新增 .claude/commands/handoff.md:
把目前的工作狀態寫進 .claude/HANDOFF.md(整份覆蓋),固定用這些段落:
## 目標
一句話講這輪要完成什麼。
## 已完成
條列,附檔案路徑。
## 決定與原因
每條決定都要寫為什麼,尤其是「不要做什麼」。
## 下一步
具體到檔案和函式,新對話看到就能直接動手。
## 未解問題
還沒確定、需要我決定的事。
寫完只回一行確認,不要開始新工作。
3. 用 SessionStart hook 在清空後自動帶入。 依 Claude Code hooks 文件,SessionStart 的 matcher 可以指定 clear,hook 印到 stdout 的內容會加進新對話的 context。在 .claude/settings.json 加:
{
"hooks": {
"SessionStart": [
{
"matcher": "clear",
"hooks": [
{
"type": "command",
"command": "cat \"$CLAUDE_PROJECT_DIR/.claude/HANDOFF.md\" 2>/dev/null || true"
}
]
}
]
}
}
4. 換手三連發: /handoff,看一眼 HANDOFF.md 寫得夠不夠具體,/clear,然後打 continue。
跟 claude-mem 版相比,你少了自動觸發和那一串安全機制,但多了一個好處:交接單是專案裡一個看得到的檔案,送出 /clear 前可以自己檢查一次。建議把 .claude/HANDOFF.md 加進 .gitignore。
什麼時候該用、什麼時候別用
適合:
- 長時間、多步驟的任務,例如跨十幾個檔案的重構、一份規格拆成很多小步驟實作
- 你常常在對話後段發現 Claude 開始「忘記約定」的專案
- 任務本身可以拆成清楚的待辦清單,每一步做完都有明確狀態
不太適合:
- 正在除錯一個需要大量上下文的 bug,對話裡的錯誤訊息、試過的假設本身就是線索,清掉反而要重來
- 探索式討論,例如還在比較架構方案,很難寫成「下一步」
- 短任務,還沒到 33% 就做完了,開了也沒差
一個實用的折衷:除錯或探索時把門檻調高(例如 60),進入照表實作階段再調回 33。設定 30 秒內生效,不用重啟。
對工程團隊的意義:把交接單當成產出物
不管用不用 claude-mem,這個 PR 最值得帶走的觀念是:context 是會用完的工作記憶,交接單才是真正的產出。
具體可以這樣做:
- 在 CLAUDE.md 寫進交接規則。 例如「每完成一個子任務就更新工作狀態,下一步要具體到檔案和函式」,讓 Claude 平常就養成習慣,不是到門檻才臨時補
- 清單名稱跟分支或 issue 對齊。 用
auth-refactor、issue-1234這種名字,換手和多人協作時一眼對得上 - 決定要寫原因,尤其是「不做」的決定。 新對話最容易犯的錯,就是把你刻意不碰的東西「順手修好」
- 先從手動版開始。 用
/handoff跑一週,看交接單寫得夠不夠好,再決定要不要交給 auto-clear 自動化
來源
- thedotmack/claude-mem PR #5486「Auto-clear at 33% context: save work state, /clear, "continue"」,作者 thedotmack,2026-11-08 合併:https://github.com/thedotmack/claude-mem/pull/5486
- claude-mem 設定文件
docs/public/configuration.mdx(CLAUDE_MEM_AUTO_CLEAR_ENABLED、CLAUDE_MEM_AUTO_CLEAR_PERCENT、CLAUDE_MEM_WORK_STATE_ENABLED):https://github.com/thedotmack/claude-mem/blob/main/docs/public/configuration.mdx - auto-clear 控制器原始碼
src/mods/auto-clear/controller.ts:https://github.com/thedotmack/claude-mem/blob/main/src/mods/auto-clear/controller.ts work_state_write工具定義src/servers/mcp-server.ts:https://github.com/thedotmack/claude-mem/blob/main/src/servers/mcp-server.ts- claude-mem README(安裝方式)與 commits:https://github.com/thedotmack/claude-mem 、https://github.com/thedotmack/claude-mem/commits
- Claude Code hooks 文件(SessionStart matcher):https://code.claude.com/docs/en/hooks
整理:DataAgent · Coding Agent 實戰教學