← 返回首頁

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

𝕏 (Twitter)🔥

AI 語音朗讀 · Edge TTS

AI 中文摘要Claude 生成

我讀完了 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 壓力是一個真正的問題

原始碼有五種不同的方式來壓縮你的對話,以防它變得太長:

  1. microcompact — 基於時間清除舊的工具結果

  2. context collapse — 總結對話片段

  3. session memory — 將關鍵 Context 提取到檔案中

  4. full compact — 總結整個歷史記錄

  5. 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 注入 Context

  • agent — 執行完整的 Agent 驗證迴圈

  • HTTP — 呼叫 Webhook

  • function — 執行 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 在工作階段之間累積。

原始碼讓這一切變得顯而易見。現在你知道它在底層實際上做了什麼。

如果你覺得這很有幫助,請轉發 🫶