當我開始使用 Claude Code 時,我把它當作一個聊天工具來用。
我會提出需求,它會回應,然後就這樣結束。
雖然這樣也能用,但隨著時間推移,我開始發現我並沒有完全發揮它的潛力。
我不斷重複相同的提示詞,執行同樣的指令。我並不確定該如何充分利用它。
所以我停了下來,問了自己一個問題:
Claude Code 內部到底是怎麼運作的?
我開始閱讀文件、進行實驗和測試。
而我發現的是:
它並不是靠魔法。它是由一個個具體的元件建構而成,每個元件都有明確的角色。當你理解了它們,其他一切就都說得通了。
→ 如果你總是在重複相同的指令,就把它們變成一個技能。
→ 如果它在處理長時間任務時迷失方向,就委派給一個子 Agent。
→ 如果有你重複操作的手動步驟,就用鉤子來自動化它們。
理解基本元件,你才會知道該用什麼、何時用、以及為什麼用。
現在,我擁有超過 100 個技能、能自動化過去耗費我數小時的流程,還有能執行程式碼審查和研究我感興趣主題的 agent。
我寫這篇文章是為了與你分享我所學到的一切。
讓我們開始吧。
Agent 迴圈:Claude Code 的核心
Claude Code 是一個 agent。
你給它一個目標,它會持續運作直到達成目標。
它與聊天不同。在聊天中,你問 「如何為我的應用程式加入身分驗證?」,它會解釋步驟。
但你必須自己前往專案、修改程式碼,並測試是否可行。
工作由你來做。
有了 Claude Code,你告訴它 「為我的應用程式加入身分驗證」,它就會處理一切。
它會讀取程式碼、選擇函式庫、撰寫變更,並在完成時通知你。
它有一個目標:加入身分驗證。
它會持續運作直到達成目標。
但它是如何知道每一步之後要做什麼?它如何知道某件事是否成功?它需要某個東西來協調這些決策。
那就是迴圈。

一個不斷重複的循環。
Claude Code 執行一個動作、觀察結果、決定下一步要做什麼,然後重新開始。它會一直持續直到目標達成。
如果某件事失敗了,它會回頭、修正,然後繼續。
這個迴圈有 3 個階段:
收集上下文 → 了解它必須做什麼。讀取檔案、分析程式碼、探索專案結構。
採取行動 → 執行變更。編輯檔案、執行指令、安裝依賴項。
驗證結果 → 檢查它做的事是否有效。執行測試、檢查錯誤、如果出錯則修正。
這個迴圈會根據你的要求而調整。
一個簡單的問題可能只需要收集上下文。修復一個錯誤可能需要完整經歷所有三個階段好幾次。
Claude Code 會根據從上一步學到的資訊,來決定每一步需要什麼。而你也是這個迴圈的一部分。
你可以隨時中斷它來重新引導方向、補充上下文,或要求它嘗試另一種方法。
這就是 Claude Code 的核心。
接下來的一切,都是為了讓這個迴圈更強大。
工具:Claude Code 如何在世界中行動
一個大型語言模型(LLM),就設計上來說,只能處理文字。
它接收文字並產生文字。它無法存取你的檔案系統,不能執行指令,也不知道你的專案裡有什麼。
它是孤立的。
那麼,Claude Code 要如何開啟或修改一個檔案?
它使用工具。
工具是 Claude Code 可以呼叫的函式,用來與真實世界互動。
你可以把它想像成手機應用程式。手機本身什麼都不能做:是應用程式賦予它特定能力:拍照、傳送訊息、導航。
工具對 Claude Code 來說也是一樣的。
每次它使用一個工具,就會向系統發送一個包含其需求的請求。系統會執行它並回傳結果。
Claude Code 使用那個結果來決定下一步要做什麼。
1你的請求2 ↓3Claude Code 決定使用哪個工具4 ↓5┌─────────────────────────────────┐6│ 讀取 · 編輯 · 寫入 · Bash │7│ Grep · Glob · WebFetch · WebSearch │8└─────────────────────────────────┘9 ↓10系統執行該工具11 ↓12結果回傳給 Claude Code13 ↓14完成了嗎? → 否 → 使用另一個工具15 是 → 回應
Claude Code 內建了針對最常見操作的原生工具:
讀取 / 編輯 / 寫入 → 讀取、修改和建立檔案。最常用的工具。每次 Claude Code 「理解你的程式碼」或「做出變更」時,都是在使用這三個工具。
Bash → 完整存取終端機。如果你能從命令列做的,Claude Code 也能做:安裝依賴項、執行測試、提交程式碼。
Grep 和 Glob → 在專案內搜尋。Glob 依名稱或模式尋找檔案。Grep 在檔案中搜尋特定內容。
WebFetch 和 WebSearch → 網際網路存取。查閱文件、讀取 API、調查它從未見過的錯誤。
回到登入按鈕錯誤的例子。
當 Claude Code 處理那個問題時,它會同時使用多個工具:
→ 它使用 Glob 來尋找元件檔案
→ 它使用 Read 來讀取程式碼並了解發生什麼事
→ 它使用 Edit 來修正錯誤
→ 它使用 Bash 來執行測試並驗證修正成功
這一切都不需要你介入。這就是聊天與 agent 的差別。
上下文與記憶:Claude Code 記住什麼
Claude Code 運作、執行動作、取得結果,並決定下一步。
但是,它要如何知道自己在進程中做過什麼?
這都要歸功於上下文。
上下文是 Claude Code 在當下可用的資訊。每次它執行動作,結果都會累積在上下文中。
不只是你最初的提示詞,還包括它發現的一切:它開啟過的檔案、它在程式碼中發現的東西、它執行的動作以及它們的結果。
這就是為什麼它可以串聯步驟、自我修正,並獨自完成任務。
這個上下文有 2 個問題。
1. 容量有限。 如果會話時間很長,上下文會被填滿,Claude Code 就會開始忘記之前發生的事。稍後你會看到 SubAgent 如何解決這個問題。
2. 每次開啟新的對話就會被清空。 Claude Code 不知道你在哪個專案中、你的團隊如何運作,或是你們已經做過哪些決定。如果你不告訴它,它會推測或詢問你。
記憶體解決了第二個問題。
它是一個 Markdown 檔案系統,你可以在其中儲存 Claude Code 需要知道的一切:你的技術棧、團隊慣例、專案的結構方式。
Claude Code 在每次會話開始時讀取這些檔案,並在你輸入第一行文字之前,將這些資訊注入到上下文中。
沒有記憶:你告訴它「新增一個建立使用者的端點」,Claude Code 會問你:「你用什麼框架?你設定好資料庫了嗎?路由是怎麼結構的?」
有記憶:你告訴它同樣的事,它已經知道你使用 Express 搭配 Prisma,路由放在 /src/routes 下,錯誤由一個集中的中介軟體處理。它會直接開始工作,無需提問。
Claude Code 有 2 個記憶系統:
→ CLAUDE.md - 你撰寫的 Markdown 檔案,包含 Claude Code 需要知道的一切。它們可以存在於不同層級:
→ ~/.claude/CLAUDE.md - 適用於你所有的專案。你個人的偏好放在這裡:你希望它如何撰寫程式碼、你總是使用的慣例。指令必須具體:「使用 2 個空格縮排」比「格式化程式碼」更清楚。
→ /your-project/CLAUDE.md - 專屬於該儲存庫。架構、團隊慣例和重要指令放在這裡。當你開始一個新專案時,執行 /init,Claude Code 會自動產生它。保持在 200 行以內:如果變得太長,Claude Code 會開始忽略指令。而且如果你把它提交到儲存庫,整個團隊就能共享相同的上下文。
→ .claude/rules/ - 模組化規則,會根據檔案類型啟用。當專案成長且你不想把所有東西都放在單一檔案中時很有用。
自動記憶 - Claude Code 自行建立的記憶。當你工作時,它會自己記下筆記:它偵測到的模式、你做的修正、你們一起做的決定。它會儲存在
~/.claude/projects/<project>/memory/ 中,並在每次會話開始時載入。

經常檢閱它:Claude Code 可能在你不注意時儲存了不良的實作方式。
提示:你可以執行 /memory 來查看和編輯 Claude Code 記住的所有內容。
鉤子與技能:掌握控制權
1. 鉤子
Claude Code 可以自主運作。
它執行動作、做出決定、向前推進。
但這種自主性有一個比較少被提及的面向:Claude Code 會執行它在每一步認為正確的事情。
如果出了問題,或是它做了你不希望發生的事,事情就已經發生了。
你要如何控制它?使用鉤子。
一個鉤子是一個指令,會在循環中的特定時間點自動執行。在 Claude Code 使用工具之前、在它使用工具之後、當會話結束時。
你可以定義在每個時刻發生什麼事。
關鍵在於鉤子是確定性的。
它們不依賴 Claude Code 「記得」去做某件事。它們總是被執行,沒有例外。
四個主要的鉤子是:
PreToolUse - 在 Claude Code 使用工具之前執行。這是唯一可以阻止動作的鉤子。範例:封鎖任何試圖修改 .env 檔案的指令。
PostToolUse - 在 Claude Code 使用工具之後執行。範例:每次 Claude Code 編輯檔案時自動執行 Prettier。
Notification - 當 Claude Code 需要你的注意時執行。範例:當 Claude Code 完成一個長時間任務時,在你的 Mac 上收到通知。
Stop - 當 Claude Code 完成回應時執行。範例:當 agent 完成工作時自動推送到 staging 環境。
它們在 .claude/settings.json 中設定:
1{2 "hooks": {3 "PostToolUse": [4 {5 "matcher": "Edit|Write",6 "hooks": [7 {8 "type": "command",9 "command": "npx prettier --write $file_path"10 }11 ]12 }13 ]14 }15}
這個鉤子會在每次 Claude Code 編輯或建立檔案時自動執行 Prettier。
不需要你要求。不需要 Claude Code 記得去做。
沒有鉤子:Claude Code 編輯一個檔案,程式碼保持未格式化狀態,你在下一次提交時才發現。
有鉤子:Claude Code 編輯一個檔案,PostToolUse 自動觸發,Prettier 格式化該檔案,程式碼永遠保持整潔。
鉤子讓你能夠在 agent 的循環中增加保證會發生的行為。不是建議,不是模型可以忽略的指令。而是始終會被執行的規則。
2. 技能
還有另一個問題:一致性。
你要求它做同樣的任務兩次,卻得到不同的結果。每次開啟新的對話,Claude Code 都是從頭開始,不知道你上次是怎麼做的。
要如何解決?使用技能。
一個技能是一個 Markdown 檔案,你可以在其中向 Claude Code 解釋一個任務的確切流程:要檢查什麼、按什麼順序、使用什麼格式、要忽略什麼。
每次那個任務出現時,Claude Code 就會遵循那些指令。
沒有技能:你要求它記錄一個 API,它會產生一些內容,但每次格式都不同。有時包含範例,有時沒有。
有技能:你要求它記錄一個 API,它會遵循你定義的確切流程。永遠有相同的步驟、相同的格式、相同的標準。每次都是一樣的。
要建立一個技能,你需要定義一個具有以下結構的資料夾:
1my-skill/2├── SKILL.md # 主要指令(必要)3├── template.md # Claude 會完成的模板4├── examples/5│ └── sample.md # 預期輸出的範例6└── scripts/7 └── validate.sh # Claude 可以執行的腳本
唯一必要的檔案是 SKILL.md。其餘的都是選用的,你可以根據任務需求來添加。
SKILL.md 有 2 個部分:
Frontmatter - 一個包含名稱和說明的 YAML 區塊。名稱是用來手動呼叫它的指令。說明是 Claude Code 用來決定何時自動啟用它的依據。
主體 - 以 Markdown 撰寫的指令。工作流程、標準、輸出格式。
1---2name: api-docs3description: 記錄 API 端點。當使用者要求記錄 API4 或提及 "swagger" 或 "端點" 時使用。5---67## 流程81. 識別所有端點92. 針對每個端點:方法、路徑、參數、預期回應103. 包含一個請求和回應範例114. 以摘要表格結尾
一旦建立完成,你可以用兩種方式呼叫它。
直接在聊天中輸入 /api-docs,或者直接用自然語言要求 Claude Code。
如果描述符合你的要求,它會自行啟用。
你可以為任何你重複執行且有明確流程的任務建立技能:API 文件、更新日誌、會議摘要、程式碼遷移。
SubAgent:當問題擴大時進行委派
我們已經看到上下文容量有限。
會話時間越長,它就會被填得越滿。當它被填滿時,Claude Code 就會開始遺失關於之前發生過的資訊。
想像你要求它審查整個專案的安全性問題。它讀取數十個檔案、分析程式碼、產生一份詳細報告。
這一切會迅速填滿上下文。
而在它執行這個任務的同時,你的主要對話是被封鎖的。
要如何解決? 使用 SubAgent。
一個 SubAgent 是 Claude Code 的一個獨立實例,它有自己的上下文。
主要 agent 將一個任務委派給它,SubAgent 獨立執行,完成時會回傳一份包含結果的摘要。
主要 agent 的上下文不會被整個過程填滿,只會包含結論。
1主要 Agent2 ↓3"審查專案的安全性問題"4 ↓5┌─────────────────────────────┐6│ SubAgent:security-reviewer │7│ │8│ 讀取專案檔案 │9│ 分析程式碼 │10│ 偵測漏洞 │11│ 產生報告 │12└─────────────────────────────┘13 ↓14將摘要回傳給主要 agent15 ↓16主要 agent 繼續執行迴圈
不僅如此。
SubAgent 還可以並行執行。
無需依序分析程式碼的三個部分,Claude Code 可以同時將這三個任務都委派出去。
過去需要幾分鐘的事情,現在可能只需要幾秒鐘。
1主要 Agent2 ↓3將工作分割成獨立的任務4 ↓5┌──────────────┐ ┌──────────────┐ ┌──────────────┐6│ SubAgent 1 │ │ SubAgent 2 │ │ SubAgent 3 │7│ │ │ │ │ │8│ 審查驗證 │ │ 審查資料庫 │ │ 審查外部 │9│ │ │ │ │ API │10└──────────────┘ └──────────────┘ └──────────────┘11 ↓ ↓ ↓12 主要 agent 收到三個摘要13 ↓14 繼續執行迴圈
Claude Code 有 3 個會自動使用的原生 SubAgent:
→ 探索 - 一個快速、唯讀的 agent,專門用於搜尋和分析專案。結果會留在 SubAgent 的上下文中,而不是你的。
→ 計畫 - 在規劃模式中啟用。在向你呈現計畫之前,Claude Code 會將專案調查委派給這個 agent。
→ 通用型 - 用於需要同時進行探索和修改的複雜任務。
你也可以建立自己的 SubAgent。
SubAgent 以帶有 YAML frontmatter 的 Markdown 檔案定義,並儲存在 .claude/agents/ 中。
1---2name: security-reviewer3description: 審查程式碼是否有安全漏洞。4 當使用者要求進行安全審查時使用。5tools: Read, Grep, Glob6---78你是一位安全專家。分析程式碼以找出:9- SQL 注入10- 敏感資料暴露11- 驗證漏洞1213最後以一份按嚴重程度排序的發現摘要結尾。
請注意,在 frontmatter 中,我們將工具限制為 Read、Grep 和 Glob。
這個 agent 可以分析,但絕不能修改任何東西。
當你需要精細控制每個 agent 能做的事時,這種工具限制是關鍵。
一旦建立完成,Claude Code 會透過描述自動偵測它,並在任務相符時呼叫它。或者你也可以明確地呼叫它:「使用 security-reviewer agent 來審查這個 PR。」
何時該使用 SubAgent,何時不該?
在任務很長且會產生大量輸出時、當你可以將工作分割成可以並行執行的獨立部分時,或者當你需要一個具有有限工具集的專業 agent 時,使用 SubAgent 是合理的。
對於不會填滿上下文的短任務來說,則不值得這麼做。 協調 SubAgent 會增加複雜性,如果主要 agent 能在兩分鐘內解決任務,就沒有必要這樣做。
MCP:將 Agent 與外部世界連結
工具賦予 Claude Code 在你的機器上行動的能力。
但有一個限制:所有發生的事,都發生在機器內部。
它無法在 GitHub 上開啟 PR、查詢生產資料庫,或在 Jira 中建立工單。要做到這些,你以前必須離開 agent,然後手動完成。
要如何解決? 使用 MCP。
MCP(模型上下文協定) 是一個開放協定,定義了 Claude Code 如何與外部服務連線。
它採用客戶端-伺服器架構運作:Claude Code 是客戶端,而每個外部服務都有自己的 MCP 伺服器,該伺服器會公開它能做的事情。
當你連接一個 MCP 伺服器時,Claude Code 會收到一份可用工具的清單,包含其名稱和說明。
從那時起,它使用這些工具的方式就跟使用原生工具一模一樣。唯一的區別是,動作發生在外部服務中,而不是在你的機器上。
1Claude Code2 ↓3決定使用 GitHub MCP 伺服器的一個工具4 ↓5┌─────────────────────────────┐6│ GitHub MCP 伺服器 │7│ │8│ 開啟 PR │9│ 指派審查者 │10│ 回傳確認 │11└─────────────────────────────┘12 ↓13Claude Code 收到結果並繼續
沒有 MCP:你告訴它「我完成變更了,開啟 PR」,但 Claude Code 無法做到。你必須前往 GitHub、填寫表單、指派審查者,然後自己合併。
有 MCP:你告訴它同樣的事,Claude Code 就會開啟 PR、撰寫描述、指派審查者,並在準備好時通知你。這一切都不需要你離開 agent。
一些你今天可以連接的 MCP 伺服器:
→ GitHub - PR、審查、議題
→ Postgres / Supabase - 查詢和修改資料庫
→ Slack - 訊息和頻道
→ Jira - 工單和專案
針對本機環境的原生工具。針對外部世界的 MCP。
所有部分如何協同運作
Claude Code 是一個 agent:一個接收目標並在自主迴圈中運作直到達成目標的系統。
你在這篇文章中看到的每一個部分,都是為了讓那個迴圈更強大而存在。但理解它們的最佳方式是觀察它們如何相互互動。
案例 1:審查並合併一個 PR
你要求 Claude Code:「審查 PR #42,如果一切正常就合併它。」
→ 它使用 GitHub MCP 來讀取修改過的檔案並了解變更
→ 它將安全性分析委派給一個專門的 SubAgent,以免填滿主要上下文
→ 一個鉤子在本地執行測試並驗證所有測試都通過
→ 如果測試通過,它使用 GitHub MCP 執行合併,你無需碰觸介面
你只寫了一行。Claude Code 協調了四個系統。
案例 2:記錄一個 API 並通知團隊
你要求 Claude Code:「記錄新的端點並讓團隊知道。」
→ 它啟動一個文件技能,該技能定義了確切的格式:要包含什麼、如何組織結構、要加入哪些範例
→ 它使用工具來讀取程式碼並提取端點
→ 一個鉤子在儲存輸出前先格式化它
→ 它使用 Slack MCP 將摘要傳送到團隊頻道
每次你這麼做,結果都會一樣。沒有變化,不需要你解釋任何東西。
一切圍繞著迴圈運轉。
記憶讓每次會話開始時資訊充足。工具用於行動。鉤子用於控制。技能用於標準化。SubAgent 用於擴展。MCP 用於與外部世界連結。
當你理解了這一點,你就理解了 Claude Code。
而且不只是 Claude Code:Cursor、Copilot 以及你從現在開始使用的任何 agent,都建立在相同的基礎上。
名稱會變,介面會變,但迴圈是一樣的。
AI 正在快速進步。
每週都有新東西。但基礎不會那麼頻繁地改變。把這些基礎搞清楚,將能讓你更快地適應,並從未來的發展中獲得更多。
不要只是為了提問而使用 Claude Code。留意它底層發生的事。機會就在那裡。
一些今天就可以開始的起點:
→ 檢閱你的自動記憶,並改善 Claude Code 儲存的內容
→ 如果你的專案還沒有 CLAUDE.md,就建立一個
→ 連接 GitHub MCP
→ 為那些會填滿上下文的任務建立一個 SubAgent
→ 設定一個在每次變更後執行測試的鉤子
就這樣,明天見。
Marcus





