Claude Code in Action 教的是如何讓 Claude Code 處理更長時間、較少人工盯場的工作:先用 Plan Mode 計劃模式界定範圍,再用 CLAUDE.md、Skill、Hooks、Routines 常規任務、headless 無頭模式、GitHub 整合和 Plugin 控制流程,最後以 diff、測試與獨立審查驗證;Routines 和 Code Review 的功能與限制仍可能依版本、平台和帳號方案變動。
前一篇 Claude Code 101 還在談 Explore → Plan → Code → Commit,這次打開 Claude Code in Action,問題變得更現實:當任務會跑幾個小時、要動十幾個檔案,或希望整個團隊都能用同一套規則時,怎麼讓 Claude 繼續往前走,又不必每一秒盯著?
格式說明:本文保留課程的英文課名與技術術語;英文原文取自 Claude Academy 官方英文版頁面。課名、術語和指令採英文在前、繁中翻譯在後;指令只在第一次講解時標示翻譯,後續不重複。
| 項目 | 內容 |
|---|---|
| 堂數 | 9 堂課 |
| 總時長 | 1 小時 |
| 測驗 | 1 個(約 3 分鐘;共 8 題) |
| 完成 | 有完成徽章 |
| 先決條件 | 熟悉命令列介面與終端機操作;對用 Git 做版本控制有基本了解;已經會用 Claude Code 下單次 prompt |
| 適合對象 | 已經用 Claude Code 下單次 prompt、想進階到「更長、更少人盯著、整個團隊一起用」工作流程的開發者;想為多個工作流程導入 AI 驅動 GitHub 整合的團隊 |
這堂課的四個 section 是 Steer the work、Configure Claude、Automate repeat work 和 Verify and share。它會重新碰到 CLAUDE.md、Skill 和 Hooks,但重點已經從「它們是什麼」移到「怎麼設計,才能讓長時間工作比較可靠」。
快速任務問一句、看一下結果就好。跨十幾個檔案的重構或新功能,可能跑上幾個小時;這時候,如果需要人一直介入,整個流程就會被拖慢。課程把做法濃縮成兩個習慣:開工前先界定範圍,執行中適時引導。
先用 Plan Mode 計劃模式讓 Claude 以唯讀方式研究 codebase,找出要改的地方,交一份計畫給人審。計畫拿到手之後要真的讀,遇到疑問就請 Claude 補上。反覆修計畫,通常比直接執行、祈禱順利、最後再收拾殘局有效。
執行中的兩個工具,分別處理 context 太長和方向走偏:
| 工具 | 做什麼 | 重點 |
|---|---|---|
| Compaction 壓縮 | 把對話總結成摘要,當成新的 context,移除舊訊息 | 不要單獨下 /compact(壓縮);後面加上指示,例如 /compact Focus on the --version flag implementation,這段文字會決定摘要要保留什麼 |
| Rewind 回溯 | 回到上一個檢查點 | 每個使用者 prompt 都會建立檢查點;在空白 prompt 上連按兩次 Escape 可以開啟選單 |
Rewind 選單有五個選項:
| 選項 | 效果 |
|---|---|
| Restore code and conversation 還原程式碼與對話 | 兩者一起回復 |
| Restore conversation 還原對話 | 只回復聊天內容 |
| Restore code 還原程式碼 | 只回復檔案 |
| Summarize from here 從此處開始總結 | 總結檢查點之後的所有內容;旁支對話太長、只想釋放空間時好用 |
| Summarize up to here 總結至此處 | 總結檢查點之前的所有內容;想壓縮很長的設定階段、保留實作部分完整時好用 |
如果已經知道「完成」長什麼樣子,可以用 /goal(目標)設定完成條件,讓 Claude 跨多個回合持續工作,直到快速評估器確認條件達成。例如:
/goal all tests in src/billing pass, and the type checker reports zero errors
Goal 的限制是評估器只能讀對話記錄(transcript),所以條件要能從 Claude 實際輸出的內容檢查,例如測試執行結果。取消 Goal 使用 /goal clear。
/loop(迴圈)則是用固定或自行調節的間隔重複執行 prompt,適合拉取 CI 或部署狀態,等狀態改變時採取行動;按 Escape 可以停止。
同一個 codebase 若同時跑多個 agent,應該使用 Worktrees 工作樹。每個 session 有自己的檔案樹,彼此不會互相覆蓋。官方的比喻很準:一輛車不要有兩個方向盤。.worktreeinclude 可以列出要複製到每個 worktree 的 git ignored 檔案,例如環境變數檔和本機設定。
CLAUDE.md 會越寫越大:每遇到一個問題就加一條規則,最後整份檔案開始和自己的內容競爭注意力。課程給的判斷方式是,先分清楚一條規則屬於「指引」還是「絕不能逾越的界線」。前者適合放在 CLAUDE.md,後者交給 Hook,才能真的在動作發生前阻止。
Claude 啟動時會疊加讀取不同層級的設定:
| 位置 | 說明 |
|---|---|
| Managed policy 受管理的政策 | 平台團隊控制的組織層級檔案,無法排除 |
| User 使用者 | 個人偏好,套用到自己在這台機器上的專案 |
| Project 專案 | 與團隊共用,納入版本庫 |
| Local 本機 | 被 git 忽略,只供自己在目前 repo 使用 |
大型檔案可以用 import 整理:
@.claude/conventions/code-style.md
@.claude/conventions/testing.md
@.claude/conventions/workflow.md
這裡的 import 會在 Claude 啟動時把內容就地展開,所以它改善的是組織方式,context 總量仍然會增加。規則要具體、可檢驗,並且寫出替代方案。例如與其寫「遵循 API 路由的最佳實踐」,不如寫「把新的 API 路由放在 src/api/handlers,每個檔案一個」。
Skill 很適合包住會重複發生的流程。這堂課建議優先建立的 Skill,是驗證自己的工作成果:要求 Claude 重構後,Skill 自動執行測試、閱讀 diff、檢查測試是否被刻意放寬,最後回報通過或失敗並附上證據。
只看到測試全過還不夠,因為測試可能被悄悄改得比較寬鬆。真正的完成,是每一道檢查都執行過、結果被觀察過,而且清楚說明發生了什麼。如果同一段多步驟指示已經輸入過兩次,就值得考慮把它包成 Skill。
CLAUDE.md、Skill 和 Hook 的分工可以這樣記:CLAUDE.md 是每次對話都會讀的常駐規則;Skill 是符合情境時才載入的工作流程;Hook 是需要確實執行的程式碼。
課程把日常模式整理成下面幾種:
| 模式 | 可自由執行 | 其他 |
|---|---|---|
| Manual 手動 | 僅能讀取,不提示詢問 | 其他所有操作先詢問 |
| Accept edits 接受編輯 | 讀取、檔案編輯、常見的檔案系統 Bash 指令 | 其他操作先詢問 |
| Plan 規劃 | 僅能用唯讀工具研究並提出計畫 | 不會實際編輯 |
| Auto 自動 | 接受所有操作 | 每個動作執行前由另一個分類模型審查 |
| Don't ask 不詢問 | 只允許預先核准的工具 | 清單外的操作自動拒絕 |
| Bypass permissions 略過權限 | 跳過所有檢查 | 只適合隔離的 container 或 VM |
Auto 自動模式的分類器把關的是動作意圖,不是程式碼正確性。它可能擋下正式環境部署、強制推送或把下載的程式碼直接導進 shell,也可能放行一段會出錯的身分驗證重構。因此,課程建議搭配 Stop hook:Auto 自動模式檢查 Claude「試圖做什麼」,Stop hook 在 Claude 結束時確認結果真的能運作。這份阻擋/放行清單仍會演進,實際使用時要以官方文件為準。
Don't ask 不詢問模式適合無人值守的 CI、排程或夜間批次,讓流程不會卡在沒人能核准的提示上。Bypass permissions 略過權限則只留給隔離的 container 或 VM。
在 CLAUDE.md 寫「每次編輯完都跑 Prettier」,Claude 大多會照做,長時間執行仍可能漏掉。Hook 是在代理迴圈固定時間點執行的確定性程式碼,讓規則從「通常會聽」變成「不能跳過」。
常見事件包括:
| 事件 | 何時觸發 | 用途 |
|---|---|---|
| PreToolUse | 工具呼叫之前 | 阻止危險工具呼叫 |
| PostToolUse | 工具呼叫成功之後 | 自動格式化、執行 lint |
| Stop | Claude 想結束這一輪時 | 條件未滿足時拒絕結束 |
| PreCompact / PostCompact | 壓縮前後 | 介入壓縮流程 |
| InstructionsLoaded | CLAUDE.md 或規則檔載入時 | 稽核實際進入 context 的內容 |
| SessionStart | session 開始 | 為環境做準備 |
如果要在壓縮後重新注入 context,要用帶 compact matcher 的 SessionStart;PostCompact 本身不會把輸出送回對話。
PreToolUse 會以 JSON 回傳決策,關鍵欄位是 permissionDecision:
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "...",
"updatedInput": {
"command": "..."
}
}
}
permissionDecision 可以是 allow、deny 或 ask。非互動式 -p(非互動模式)執行另有 defer,讓呼叫的程序暫停工具、稍後恢復。
不回傳 JSON 的 Hook 則依 exit code 判斷:
| 退出碼 | 意義 |
|---|---|
| 0 | 成功;事件會依類型處理 stdout |
| 2 | 阻斷性錯誤,stderr 會回饋給 Claude |
| 其他值 | 非阻斷;Claude 繼續執行 |
容易踩到的地方是 exit code 1:它不會阻止指令。要阻斷,請用 2。PostToolUse 已經晚了一步,無法阻止剛完成的工具呼叫,但仍能把檢查結果回饋給 Claude。
Hook 也能用 updatedInput 重寫呼叫,而不只是阻止。課程舉的例子是監看 Bash 指令,發現 sk_live_ 模式時先換成佔位符,讓指令繼續跑、機密卻不會被送出去。
當一項工作已經值得信任,下一步就是停止手動執行。這堂課把選項排成一條光譜:一端是跑在 Anthropic 託管基礎設施上的 Routines 常規任務,另一端是從自己的程式碼啟動的 headless 無頭模式 和 Agent SDK。
Routines 常規任務把一個 prompt、它作用的儲存庫和所需的 connectors 綁在一起,觸發後在雲端執行。觸發條件可以是 cron、對 API 端點發 HTTP POST,或 GitHub 事件。適合早晨依賴項稽核、新 PR 分類和每天掃描 Sentry 工單。
建立 Routines 有兩種方式:在 claude.ai/code/routines 的網頁介面設定,或在 Claude Code 內使用 /schedule(排程):
/schedule daily dependency audit at 9am
使用前要記住三個限制:它仍是 research preview;重複排程最多每小時一次;每次執行從預設分支的全新複本開始,預設只能推送到 claude/ 前綴的分支,除非個別 repo 另行放寬。
需要接進自己的管線時,可以使用 headless 無頭模式。核心是 -p(--print 的簡寫):一次性指令、沒有互動 UI,從 stdin 讀取、寫入 stdout,可以像 shell 工具一樣串接:
claude -p "summarize the changes in this diff"
課程在這裡說 -p 會跳過 hooks、skills、plugins、MCP 伺服器與 CLAUDE.md 的自動探索,只使用 Claude 加上你明確允許的工具。這點與官方文件不符:官方文件寫的是加上 --bare(確定性模式)才會跳過這些自動探索;沒有 --bare 時,claude -p 會載入與互動式 session 相同的 context。文件也註記,--bare 之後會成為 -p 的預設。本文以官方文件為準,並保留課程與文件的出入。
官方文件已把這頁改名為「以程式方式執行 Claude Code」(run Claude Code programmatically),內文稱 -p 為「非互動模式」;headless 無頭模式是課程沿用的舊說法。
headless 無頭模式也能輸出結構化 JSON。把 --json-schema(JSON schema)配 --output-format json(JSON 輸出格式),結果會放在 JSON 回應的 structured_output 欄位:
claude -p "Extract the exported function names from src/core/style.js" \
--output-format json \
--json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}' \
| jq '.structured_output.functions'
如果要把工作拆成多個腳本,可以從 JSON 輸出取出 session ID,再用 --resume(恢復 session)恢復完整 context:
claude --resume "$(jq -r .session_id /tmp/plan.json)"
--bare 則是給 CI 的選擇;官方文件稱它為「裸機模式」,並說它是腳本與 SDK 呼叫的建議模式。需要把 Claude Code 嵌進自己的 TypeScript 或 Python 產品時,才往下走到 Agent SDK;它提供 query 函式、allowedTools、system prompt、權限模式和串流訊息等元件。
| 選擇 | 適用 |
|---|---|
| Routines | 重複性工作的預設選擇,跑在 Anthropic 基礎設施,不用自己託管 |
-p headless |
工作需要自己的管線,想用腳本傳輸資料 |
--bare |
CI 需要每次運行結果相同 |
| Agent SDK | 工作需要嵌進自己的產品 |
PR 是交接重複性工作的自然位置。Claude Code 在這裡有兩條路:Anthropic 託管的 Code Review,以及自己接的 GitHub Action。
Code Review 透過 Claude GitHub app 審查 PR,不需要自己建置或託管服務,會用行內留言標示問題。啟用時由組織管理員在 Claude Code 管理設定的 Code review 區段連接 repo、安裝 GitHub app,再選擇 PR 開啟、每次推送,或有人留言 @claude review 時執行。
它會分析完整 codebase 和 diff,依嚴重程度標記問題,去除重複後以摘要表格呈現。Code Review 不會核准或封鎖 PR,也沒有託管的自動修正;判斷仍由人做。本功能目前是 research preview,僅提供給 team 和 enterprise 方案。需要在本機套用修正時,可以用 /code-review(程式碼審查)搭配 --fix(修正)。
工作若超出審查範圍,例如根據留言實作變更、排程報告,或回應 GitHub 事件,就使用 GitHub Action。先在 Claude Code 內執行 /install-github-app(安裝 GitHub app),再在 repo 設定 Anthropic API 金鑰 secret。常用的 workflow 片段如下:
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
trigger_phrase: "@claude"
prompt: "Your instructions here"
claude_args: "--max-turns 5 --model claude-sonnet-5"
常用輸入包括:
| 輸入 | 說明 |
|---|---|
anthropic_api_key |
選填 |
github_token |
預設為 secrets.GITHUB_TOKEN |
trigger_phrase |
Action 在留言中監聽的內容,預設為 @claude |
use_bedrock / use_vertex |
使用 Bedrock 或 Vertex 時切換提供者 |
prompt |
這次執行的指示 |
claude_args |
直接傳給 Claude Code 的 CLI 引數字串 |
claude_args 可以限制最大回合數、設定權限模式和允許的工具。無人值守的工作不能停下來等待核准,唯讀報告則只給它真正需要的工具。
課程有一句很值得留下來的原則:驗證的程度,應該和你給予這次執行的自由度成正比。 短 session 你可能一路看著訊息,只要快速瀏覽;無人看管或由 CI 觸發的工作,就要事後重建發生過什麼。
驗證可以收斂成四步:
/code-review,再自己讀 git diff;從 diff 開始,不要只看摘要。摘要讀起來再乾淨,也可能掩蓋計畫外的檔案變更;真正的關卡是測試是否確實執行,以及 Claude 是真的執行了測試,還是只說自己執行過。Stop hook 用 exit 2 回饋失敗,Claude 讀到後能自行修正。
當一套 Skills、Subagents、Hooks 和 MCP 設定要交給整個團隊使用時,Plugin 是把它們打包、版本化和安裝的方式。除了這些元件,它也能包含 language server protocol 伺服器、背景監控程式、主題,以及部分 settings.json。
可以依名稱直接安裝 /plugin install(安裝 plugin):
/plugin install github@claude-plugins-official
安裝後 Claude Code 會提示執行 /reload-plugins(重新載入 plugins)。如果團隊有自己的共享來源,可以用 /plugin marketplace add(新增 marketplace):
/plugin marketplace add your-org/claude-plugins
安裝前一定要讀清楚內容。Plugin 會用你的權限在你的機器上執行程式碼,附帶的 Hook 也會在符合條件的工具呼叫時觸發。即使你只是想安裝某個 Skill,也可能一併安裝它的 PreToolUse 和 Stop hook。
Plugin 不會覆寫自己的設定,而是與現有元件並行;Hooks 會疊加,Skills、agents 和 commands 會以 Plugin 名稱作為命名空間。第三方內容經過 marketplace 審查,也不等於完全值得信任,安裝前仍要確認來源與實際會執行的內容。
自己的 Plugin 可以沿用現有 .claude 結構:每個 Skill 一個資料夾、每個 Subagent 在 agents 底下一個 Markdown 檔,Hook 放在 hooks/hooks.json,MCP 設定放在 .mcp.json。選擇加入 manifest 時,.claude-plugin/plugin.json 可以描述名稱、版本、作者和用途:
{
"name": "svg-splitter-review",
"version": "0.1.0",
"description": "Reviews the SVG Splitter repo",
"author": {
"name": "Lewis Menelaws"
}
}
有 8 題:100% 已通過。以下保留題目與正確答案,中英對照的繁中是自譯。
答案:In a pre-tool use hook that stops the push(放在會阻止推送的 pre-tool use hook 裡)。
答案:Make a skill, keep skill.md lean, and push depth into reference.md and scripts Claude runs when needed(建立一個 skill,讓 skill.md 保持精簡,把深度內容推到 reference.md,以及 Claude 需要時才執行的腳本)。
答案:Start from the diff itself and git diff, and confirm tests actually passed rather than were claimed(從 diff 本身和 git diff 開始,並確認測試真的通過,而不是只被宣稱通過)。
答案:A routine that runs on Anthropic infrastructure on a cron trigger(在 Anthropic 基礎設施上以 cron 觸發執行的 routine)。
答案:Managed code review through the Claude GitHub app(透過 Claude GitHub app 使用託管的 code review)。
答案:Inspect every hook, agent, and MCP server it adds, because a plugin runs code with your privileges and its hooks fire on every matching call(檢查它新增的每一個 hook、agent 和 MCP 伺服器,因為 plugin 以你的權限執行程式碼,而且它的 hooks 會在每次符合條件的呼叫時觸發)。
答案:The classifier waves it through because broken is not dangerous; pair auto mode with a stop hook that runs your tests(分類器會放行,因為「有問題」不等於「危險」;把自動模式搭配一個會執行測試的 stop hook)。
答案:Use /goal to set a completion condition so Claude keeps working until a fast evaluator confirms it(用 /goal 設定完成條件,讓 Claude 持續工作,直到一個快速評估器確認條件達成)。
這堂課裡出現的,大多是開發者平常工作真的會用到的指令。上完課後我比較有感的是:指令除了原本的功能,還可以加上這一輪工作的意圖,讓 Claude 知道哪些資訊要留下來、接下來要往哪裡走。
例如 /compact 不一定只是單純壓縮對話,也可以寫成:/compact log 只留重要,跟我們接下來要做的目標。這樣能幫助 agent 保留後續工作需要的資訊,是相對容易上手、也很快能感受到差異的用法。
我是 Jasper,從事軟體開發,目前專注打造 AI 工作流程。
本文同步發佈於我的 Blog,和我一起探討更多 AI 議題 🚀。