我讀完了 Claude Code 的原始碼,這樣你就不用讀了

AI 語音朗讀 · Edge TTS
我讀完了 Claude Code 的原始碼,這樣你就不用讀了。
大多數人打開 Claude Code,輸入一個 Prompt,等待回應,然後再輸入下一個 Prompt。
這就像買了一輛法拉利,卻只用一檔開車一樣。
我想要了解為什麼有些人從 Claude Code 獲得的產出是其他人的 10 倍。所以我做了任何理性的人都會做的事:我閱讀了完整的原始碼(當然,我說的「我」是指 Claude Code)。
11 層架構。數千行程式碼。一個偽裝成終端機對話視窗的 Agent 編排平台。
以下是原始碼揭示的關於如何真正使用這個工具的秘密。
1. CLAUDE.md 在每一次對話中都會被讀取。每一次。
這是你能做出的最高槓桿操作,但幾乎沒人正確使用它。
大多數人要麼在 CLAUDE.md 文件中什麼都沒寫,要麼在裡面寫了一整本聖經。
原始碼顯示,Claude Code 在「每一次」查詢迭代時都會讀取你的 CLAUDE.md 文件。不是在工作階段開始時,而是每一次。這意味著每次你發送訊息時,它都會重新讀取你的指令。
這裡有一個完整的層級結構:
~/.claude/CLAUDE.md— 全域設定(你的程式撰寫風格、偏好)./CLAUDE.md— 專案層級(架構決策、規範).claude/rules/*.md— 模組化規則CLAUDE.local.md— 私人筆記(已加入 gitignore)
你有 40,000 個字元的空間。這非常多。大多數人可能只用了 200 個字元。
把你的架構決策寫在裡面。你的檔案規範。你的測試模式。你的「絕對不要這樣做」規則。模型在每一次對話中都會讀取它們。這就是 Claude Code 成為一個通用助手,與成為「你的」助手(了解你的程式庫)之間的區別。
如果你讀完這篇文章後只想做一件事,那就是這個。
2. Subagent 共享 Prompt 快取(平行處理幾乎是免費的)
這點讓我大開眼界。
當 Claude Code 派生(fork)一個 Subagent 時,它會建立父層 Context 的位元組相同副本。API 會快取這個副本。因此,產生 5 個 Agent 來處理你程式庫的不同部分,其成本幾乎與 1 個 Agent 循序處理相同。
再讀一遍。
5 個 Agent。成本與 1 個相同。因為它們都命中了 Prompt 快取。
大多數人把 Claude Code 當作單一工作者使用。一次一個任務。等待它完成。給它下一個任務。
原始碼中確實有三種 Subagent 的執行模型:
fork— 繼承父層 Context,快取優化teammate— 在 tmux 或 iterm 的獨立視窗中,透過基於檔案的信箱進行溝通worktree— 擁有自己的 git worktree,每個 Agent 擁有獨立的分支
你可以指示 Claude Code 啟動 5 個 Agent:一個進行安全性稽核,一個重構驗證模組,一個編寫測試,一個更新文件,一個修復 Bug。全部同時進行。全部共享快取。
這套架構就是為此而「建立」的。單執行緒使用它簡直是暴殄天物。
3. 權限系統設計為「配置」,而不是「點擊」
每次 Claude Code 問你「允許此操作嗎?」而你點擊「是」時,那都是配置上的失敗,而不是一項功能。
原始碼揭示了一個 5 層級的設定串聯:
policy > flag > local > project > user
在 ~/.claude/settings.json 中,你可以為始終允許的操作設定 glob 模式:
{
"permissions": {
"allow": [
"Bash(npm *)",
"Bash(git *)",
"Edit(src/**)",
"Write(src/**)"
]
}
}
有三種權限模式:
bypass— 完全沒有權限檢查(危險但快速)allowEdits— 自動允許在你的工作目錄中進行檔案編輯auto(這是新的) — 對每個操作執行 LLM 分類器。這是最佳平衡點。
auto 模式有你可以配置的允許/拒絕清單。原始碼顯示它會平行執行多個解析器:使用者點擊、Hook 分類器、Bridge,最先回應的勝出。
每次你停下來點擊「允許」都是在浪費時間。配置一次。永遠不用再點擊。
4. 有 5 種壓縮策略。Context 壓力是一個真正的問題
原始碼有五種不同的方式來壓縮你的對話,以防它變得太長:
microcompact— 基於時間清除舊的工具結果context collapse— 總結對話片段session memory— 將關鍵 Context 提取到檔案中full compact— 總結整個歷史記錄PTL truncation— 刪除最舊的訊息群組
這告訴你一件重要的事:Context 溢出是工程師花費「大量」時間解決的核心問題。
這對你意味著什麼:
主動使用
/compact。不要等到系統自動壓縮並丟失你在意的 Context。預設視窗是 200K token。但你可以透過使用
[1m]模型後綴來選擇 1M token。對於跨多個檔案的大型重構,這很重要。長時間的工作階段會累積「工作階段記憶」——包含任務規格、檔案清單、工作流程狀態、錯誤和學習心得的結構化摘要。這就是為什麼恢復工作階段比重新開始更好的原因。
大型工具結果會儲存到磁碟,只有 8KB 的預覽會發送給模型。如果你貼上一個巨大的檔案,模型可能只會看到一小部分。保持輸入的重點。
那些從 Claude Code 獲得最大效益的人,會像在電子遊戲中手動存檔一樣使用 /compact。保留重要的,清除不重要的,繼續前進。
5. Hook 系統才是真正的擴充 API(25+ 生命週期事件)
這是幾乎沒人知道的高階使用者功能。
原始碼揭示了 25 個以上你可以 Hook 進去的生命週期事件:
PreToolUse— 在任何工具執行前執行PostToolUse— 在任何工具執行後執行UserPromptSubmit— 當你發送訊息時執行SessionStart/SessionEnd— 工作階段生命週期以及其他 20 多個
有 5 種 Hook 類型:
command— 執行 Shell 指令prompt— 透過 LLM 注入 Contextagent— 執行完整的 Agent 驗證迴圈HTTP— 呼叫 Webhookfunction— 執行 JS
你可以做到的實際範例:
在每次檔案寫入前自動執行 Linting
在每次編輯後執行測試
自動將相關文件注入到每個 Prompt 中
當任務完成時發送 Slack 通知
在程式碼發佈前驗證是否遵循安全性模式
UserPromptSubmit Hook 特別瘋狂。你可以在你發送的每一條訊息中注入 additionalContext。想像一下,在不輸入的情況下,自動將測試輸出、最近的 git diff 或專案狀態附加到每個 Prompt 中。
這就是你如何在 Claude Code 之上建立自訂開發環境的方法。不是透過寫出更好的 Prompt,而是透過 Hook 進系統本身。
6. 工作階段是持久且可恢復的(停止重新開始)
每個對話都以 JSONL 格式儲存在:
~/.claude/projects/{hash}/{sessionId}.jsonl
原始碼支援:
--continue— 恢復你上一個工作階段--resume— 選擇一個特定的過去工作階段--fork-session— 從過去的對話中分支(我個人很喜歡這個)
工作階段記憶提取會在壓縮過程中保留關鍵 Context:任務規格、檔案清單、工作流程狀態、錯誤和學習心得。
大多數人每次打開 Claude Code 時都會開始一個新的工作階段。這就像每小時關閉你的 IDE 並從頭重新打開一樣。所有關於你在做什麼、什麼失敗了、你學到了什麼的 Context —— 全都消失了。
使用 --continue。永遠使用。讓 Context 累積。讓工作階段記憶隨著時間的推移建立學習心得。原始碼中確實有這方面的基礎設施。請使用它。
7. 工具系統執行 60+ 種工具,並具備智慧批次處理
Claude Code 有 60 多種內建工具。但有趣的是它「如何」執行它們。
原始碼將工具呼叫分為兩類:
concurrent— 唯讀操作(讀取檔案、搜尋、globbing)平行執行serial— 變更操作(編輯、寫入、bash 指令)一次執行一個
這意味著當 Claude Code 需要讀取 10 個檔案來了解你的程式庫時,它會同時讀取所有 10 個檔案。但當它需要編輯 3 個檔案時,它會一次處理一個以避免衝突。
除了內建工具外,你還可以連接 MCP Server 來增加更多工具。原始碼使用了延遲載入。MCP 工具僅在需要時才載入,因此連接 5 個 MCP Server 不會拖慢每個請求。
此外還有 ToolSearch,用於延遲發現 Agent 尚未知道的工具。
實際的收穫:如果你的工作流程涉及外部系統(資料庫、雲端供應商、CI/CD),請為它們連接 MCP Server。架構處理了複雜性。你只是獲得了更多能力。
8. 串流架構意味著中斷成本很低
整個管線使用非同步產生器(async generators)來產生個別事件。按下 Escape 鍵可以乾淨地中止當前的串流,而不會丟失之前的 Context。
這看起來很小,但它改變了你應該如何使用 Claude Code 的方式。
不要等待你知道會出錯的回應。立即中斷並重新導向。原始碼就是為此設計的。你之前的 Context 會被保留。被中斷的回應會被乾淨地丟棄。零懲罰。
把它想像成結對程式設計(pair programming)。如果你的夥伴開始走錯方向,你不會等他們完成。你會說「其實,改走這邊」。同樣的道理。
9. 重試系統比你想像的更複雜
原始碼揭示了:
10 次重試,採用指數退避(exponential backoff)和抖動(jitter)(500ms 為基準)
在 401/403 錯誤時自動重新整理 OAuth token
模型回退(fallback):如果 Opus 因 529 錯誤失敗 3 次,它會自動回退到 Sonnet
串流上有 90 秒的閒置監控 — 如果串流停滯,它會回退到非串流模式
持久模式具有無限重試,最大退避時間為 5 分鐘
這意味著 Claude Code 被設計為可以一直執行。它能優雅地處理 API 異常、速率限制和中斷。你不需要隨時盯著它。讓它在背景執行,然後回來查看結果。
TL;DR:從原始碼中獲得最高槓桿的操作:
• 撰寫一個真正的 CLAUDE.md → 每次對話都會載入。40K 字元。最高槓桿的配置。
• 使用 Subagent 平行處理 → fork 模型共享 Prompt 快取。5 個 Agent ≈ 1 個的成本。
• 在 settings.json 中配置權限 → 永遠消除點擊疲勞。
• 主動使用 /compact → 存在 5 種壓縮策略是因為 Context 壓力是真實存在的。
• 設定 Hook → 25+ 事件,5 種類型。這是真正的擴充 API。
• 永遠使用 --continue 工作階段 → JSONL 持久化 + 工作階段記憶 = 累積的 Context。
• 連接 MCP Server → 延遲載入意味著在使用前零成本。
• 自由中斷 → 非同步產生器意味著重新導向零懲罰。
總結:Claude Code 是一個穿著終端機 UI 的 Agent 編排平台。
那些從中獲得 10 倍產出的人並不是更會寫 Prompt。他們配置了它。他們平行化了它。他們 Hook 進了它。他們讓 Context 在工作階段之間累積。
原始碼讓這一切變得顯而易見。現在你知道它在底層實際上做了什麼。
如果你覺得這很有幫助,請轉發 🫶
— mal (@mal_shaik) March 31, 2026