我讀完了 Claude Code 的原始碼,幫你省下研究時間

@mal_shaik
英語4 個月前 · 2026年3月31日
1.7M
2.3K
334
54
6.0K

TL;DR

本文深度解析 Anthropic Claude Code CLI 的內部架構,揭示如何優化 CLAUDE.md、免費使用平行 Agent,以及利用自訂 Hook 自動化工作流程。

大多數人打開 Claude Code,輸入提示詞,等回應,再輸入下一個提示詞。

這就像買了一台法拉利,卻只開一檔。

我想搞懂為什麼有些人用 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. 子 Agent 共享提示詞快取(平行處理基本上零成本)

這是最讓我震驚的事。

當 Claude Code 分支出一個子 Agent 時,它會創建一個與父上下文位元組完全相同的副本。API 會快取這個副本。所以,生成 5 個 Agent 來同時處理你程式碼庫的不同部分,成本幾乎只比一個 Agent 順序執行多一點點。

再讀一次這句話。

5 個 Agent。成本等同於 1 個。因為它們都命中同一個提示詞快取。

大多數人把 Claude Code 當成單一工人來用。一次做一件事。等它完成。再給下一個任務。

原始碼中清楚顯示子 Agent 有三種執行模型:

  • fork — 繼承父上下文,快取最優化
  • teammate — 在 tmux 或 iTerm 中開啟獨立面板,透過基於檔案的郵件信箱溝通
  • worktree — 擁有自己的 git worktree,每個 Agent 有獨立分支

你可以讓 Claude Code 同時啟動 5 個 Agent:一個做安全稽核,一個重構認證模組,一個寫測試,一個更新文件,一個修 bug。全部同時進行。全部共享快取。

這個架構就是為了這個目的打造的。只用單執行緒來跑它簡直是暴殄天物。

3. 權限系統的設計目的是「設定好」,而不是「逐一點擊」

每次 Claude Code 問「允許這個動作?」然後你按「是」,這不是功能,而是設定失敗。

原始碼揭示了一個 5 層級的設定串聯:

text
1policy > flag > local > project > user

在 ~/.claude/settings.json 中,你可以設定全域比對模式來定義總是允許的動作:

json
1{
2 "permissions": {
3 "allow": [
4 "Bash(npm *)",
5 "Bash(git *)",
6 "Edit(src/**)",
7 "Write(src/**)"
8 ]
9 }
10}

有三種權限模式:

  • bypass — 完全不做權限檢查(危險但快速)
  • allowEdits — 自動允許在你的工作目錄中編輯檔案
  • auto(這是新的)— 對每個動作執行 LLM 分類器。這是甜蜜點。

auto 模式有它自己可設定的允許/拒絕清單。原始碼顯示它會平行執行多個解析器:用戶點擊、鉤子分類器、橋接器,哪個先回應就用哪個。

每次你停下來點擊「允許」都是在浪費時間。設定一次,從此不用再點。

4. 有五種壓縮策略。上下文壓力是真實存在的問題

原始碼有五種不同的方法來壓縮當對話變得過長時的內容:

  1. microcompact — 基於時間清除舊的工具結果
  2. context collapse — 摘要對話段落
  3. session memory — 將關鍵上下文提取到檔案中
  4. full compact — 摘要整個歷史紀錄
  5. PTL truncation — 丟棄最舊的訊息群組

這告訴你一個重要訊息:上下文溢出是工程師花費大量時間處理的核心問題。

這對你的意義是:

  • 主動使用 /compact。不要等到系統自動壓縮,然後失去你在意的上下文。
  • 預設視窗是 200K tokens。但你可以透過使用 [1m] 模型後綴來選擇 1M tokens。對於跨越多個檔案的大型重構,這點很重要。
  • 長時間的會話會累積「session memory(會話記憶)」——包含任務規格、檔案列表、工作流程狀態、錯誤和學習心得等結構化摘要。這就是為什麼恢復會話比重新開始更好。
  • 大型工具結果會儲存到磁碟,只傳送 8KB 的預覽給模型。如果你貼上一個巨大的檔案,模型可能只會看到一小部分。保持輸入專注。

那些最善用 Claude Code 的人,把 /compact 當成電玩遊戲裡的手動存檔點。保留重要的,清除無關的,繼續前進。

5. 鉤子系統才是真正的擴充 API(超過 25 個生命週期事件)

這是幾乎沒人知道的達人級功能。

原始碼揭示了超過 25 個你可以掛鉤的生命週期事件:

  • PreToolUse — 在任何工具執行前觸發
  • PostToolUse — 在任何工具執行後觸發
  • UserPromptSubmit — 在你發送訊息時觸發
  • SessionStart / SessionEnd — 會話生命週期
  • 以及其他 20 多個

搭配 5 種類型的鉤子:

  • command — 執行 shell 命令
  • prompt — 透過 LLM 注入上下文
  • agent — 執行完整的 Agent 驗證迴圈
  • HTTP — 呼叫網頁鉤子
  • function — 執行 JavaScript

實際應用範例:

  • 每次檔案寫入前自動執行 linting
  • 每次編輯後自動執行測試
  • 自動將相關文件注入每個提示詞
  • 任務完成時發送 Slack 通知
  • 在程式碼發布前驗證安全模式是否遵循

UserPromptSubmit 鉤子尤其驚人。你可以將 additionalContext 注入到你發送的「每一條」訊息中。想像一下,自動將測試輸出、最近的 git diff 或專案狀態附加到每個提示詞,而完全不需要手動輸入。

這就是你在 Claude Code 之上建立自訂開發環境的方法。不是靠更好的提示詞技巧,而是透過掛鉤到系統本身。

6. 會話是持久且可恢復的(別再每次都重新開始)

每一次對話都會以 JSONL 格式儲存在

text
1~/.claude/projects/{hash}/{sessionId}.jsonl

原始碼支援:

  • --continue — 恢復你上一次的會話
  • --resume — 選擇一個特定的過去會話
  • --fork-session — 從過去的對話分支出來(我個人很喜歡這個)

會話記憶提取能在壓縮過程中保留關鍵上下文:任務規格、檔案列表、工作流程狀態、錯誤和學習心得。

大多數人每次打開 Claude Code 都開始一個新會話。這就像每小時關閉你的 IDE 再重新打開一樣。所有關於你在做什麼、哪裡失敗了、學到了什麼的上下文——全都沒了。

使用 --continue。永遠這麼做。讓上下文累積。讓會話記憶隨著時間累積學習心得。原始碼裡有完整的基礎設施支援這個功能,去用它。

7. 工具系統以智慧批次處理執行超過 60 種工具

Claude Code 有超過 60 種內建工具。但有趣的部分在於「如何」執行它們。

原始碼將工具呼叫分為兩類:

  • concurrent — 唯讀操作(讀取檔案、搜尋、glob 匹配)可以平行執行
  • serial — 會改變狀態的操作(編輯、寫入、bash 命令)一次只執行一個

這意味著當 Claude Code 需要讀取 10 個檔案來了解你的程式碼庫時,它會同時讀取全部 10 個檔案。但當它需要編輯 3 個檔案時,它會一個接一個地做,以避免衝突。

在內建工具之上,你可以連接 MCP 伺服器來添加更多工具。原始碼使用延遲載入。MCP 工具只在需要時才載入,所以連接 5 個 MCP 伺服器並不會拖慢每個請求的速度。

還有 ToolSearch 用於延遲發現 Agent 還不知道的工具。

實用的結論是:如果你的工作流程涉及外部系統(資料庫、雲端供應商、CI/CD),為它們連接 MCP 伺服器。這個架構會處理所有複雜性。你只會得到更多能力。

8. 串流架構讓中斷幾乎零成本

整個管線使用非同步生成器來產生個別事件。按下 Escape 鍵可以乾淨地中止當前的串流,而不會遺失先前的上下文。

這看起來很小,但它會改變你使用 Claude Code 的方式。

當你發現回應方向錯誤時,不要等它完成。立刻中斷並重新導向。原始碼就是為此設計的。你之前的上下文被保留下來。被中斷的回應被乾淨地丟棄。零成本。

把它想成是結對程式設計。如果你的夥伴開始往錯的方向走,你不會等他完成。你會說:「呃,我們還是往這邊走吧。」同樣的道理。

9. 重試系統比你想像的更精密

原始碼揭示了:

  • 10 次重試,採用指數退避和抖動(基準 500 毫秒)
  • 在遇到 401/403 錯誤時自動重新整理 OAuth Token
  • 模型備援:如果 Opus 連續 3 次因 529 錯誤失敗,會自動備援到 Sonnet
  • 串流有 90 秒閒置看門狗計時器——如果串流停滯,會備援到非串流模式
  • 持久模式有無限重試,最長退避時間為 5 分鐘

這意味著 Claude Code 被設計成可以讓它一直運行。它能優雅地處理 API 的小問題、速率限制和中斷。你不需要一直在旁邊看著。讓它在背景運行,然後回來看結果就好。

總結:從原始碼中得到的最高杠杆效應行動

• 寫一個真正的 CLAUDE.md → 每次迭代都讀取。40K 字元。杠杆效應最高的設定。

• 使用子 Agent 進行平行化 → fork 模型共享提示詞快取。5 個 Agent ≈ 1 個的成本。

• 在 settings.json 中設定好權限 → 永遠告別點擊疲勞。

• 主動使用 /compact → 有五種壓縮策略就說明了上下文壓力是真實的。

• 設定鉤子 → 超過 25 個事件、5 種類型。這才是真正的擴充 API。

• 永遠使用 --continue 恢復會話 → JSONL 持久化 + 會話記憶 = 累積的上下文。

• 連接 MCP 伺服器 → 延遲載入意味著使用前零成本。

• 自由地中斷 → 非同步生成器代表重新導向的懲罰為零。

重點是:Claude Code 是一個披著終端機 UI 外衣的 Agent 編排平台。

那些從中獲得 10 倍輸出的人,不是因為他們更會寫提示詞。他們設定好了它。他們讓它平行運作。他們掛鉤進去了。他們讓上下文跨會話累積。

原始碼讓這一點變得顯而易見。現在你知道了它實際上在底層是怎麼運作的。

覺得有幫助的話就按個轉發吧 🫶

二次創作

使用 YouMind 創作爆款文章

收集素材、拆解爆點、生成視覺資產、撰寫內容,並在一個 AI 工作空間裡完成分發。

了解 YouMind
寫給創作者

把你的 Markdown 變成乾淨的 𝕏 文章

圖片上傳、表格、程式碼區塊,往 𝕏 上手動重排太痛苦。YouMind 把整篇 Markdown 一鍵轉成乾淨、可直接發佈的 𝕏 文章草稿。

試試 Markdown 轉 𝕏

更多可拆解樣本

近期爆款文章

探索更多爆款文章