我為什麼把這 7 個東西都寫成 Skill——一個 PM 的客製化判斷
Claude Code 的客製化機制有 5 層——CLAUDE.md、Skill、Subagent、Hook、MCP。最務實的入手點是 Skill:比 Hook 簡單、比 Subagent 直接、比 MCP 輕量。我寫過 7 個 Skill,從這個過程沉澱出三條判斷準則——什麼東西該抽成 Skill、什麼東西該留在 CLAUDE.md、什麼東西該抽到 shared-rules。
上一篇講完 CLAUDE.md,最後留了一個鉤子:「永遠該載入的寫 CLAUDE.md、按需才該載入的寫 Skill」。這篇把這條 trade-off 攤開——我為什麼有 7 個東西不寫進 CLAUDE.md、改寫成 Skill。
Claude Code 的客製化選項聽起來多——CLAUDE.md、Skill、Subagent、Hook、MCP——但實際用過會發現大多數人最先碰到、也最划算的是 Skill。原因簡單:比 Hook 容易設定、比 Subagent 跟主 session 更黏、比 MCP 不需要外部依賴。我 7 個 Skill 累積下來摸出該不該寫成 Skill 的判斷準則,這篇攤開。
Skill 跟 CLAUDE.md 的真正差別:always-on vs on-demand
課程把 Skill 描述成「有名稱、有描述常駐、Claude 判斷要用的時候才載入完整內容」的模組。這個機制的設計重點不在「能寫多複雜的步驟」,在它跟 CLAUDE.md 的根本差別——always-on vs on-demand。
CLAUDE.md 是 always-on:每次 session 啟動就 append 到 prompt 前,不管你這次要做什麼,它都先吃進 context。Skill 不一樣:name 跟 description 常駐(讓 Claude 知道有這個工具),但 full content 只在 Claude 判斷要用時才完整展開。
從 context 預算的角度看,這是「稅率」的差別。寫進 CLAUDE.md 等於每次 session 繳一次 context 稅;寫成 Skill 只在被觸發的 session 繳。如果某條規範一個月只在某一類任務出現一次,把它放 CLAUDE.md 就是讓另外幾百次 session 都默默繳這條稅、卻完全沒用到。
另一個角度:CLAUDE.md 適合「無論做什麼都該知道的東西」——專案 stack、commit 規範、不可違反的安全規則。Skill 適合「只有特定情境才該知道的東西」——某類任務的 SOP、某種文件的格式規範、某種錯誤的排查流程。前者是憲法,後者是手冊。
我寫了哪 7 個 Skill:分布在 3 個專案
我目前有 7 個 Skill,分布在 3 個主力專案:
knowledge-vault:vault-agent
vault-agent 是個人知識庫專用的 Skill,使用者下指令 ingest <標籤> 或 query <關鍵字> 時觸發、做 vault 的素材沉澱跟查詢。為什麼是 Skill 不是 CLAUDE.md:vault 操作流程很複雜(提案制、多檔分工、edge case),常駐會稀釋整份 CLAUDE.md,而我大多數 session 不在 ingest——按需載入更合理。
outsidewriter:3 個寫作相關 Skill
- writing-style:每次轉寫文章時載入,確保風格一致。
- fact-check:轉寫完成後強制執行的查核流程。
- output-formats:四種輸出格式(WP / FB / Threads / LinkedIn)的格式規範,產出階段才載入。
這三個的共同點:都是「寫文章」這個任務型態才會用到的東西。如果寫進 CLAUDE.md,每次跟 outsidewriter 對話(包含 debug、規劃、討論)都會繳 context 稅、但 90% 對話用不到這些規範。
gwarket-site:3 個技術相關 Skill
- code-conventions:修改或建立程式碼時參考的技術慣例。
- deployment-troubleshooting:部署後前端顯示異常、API 不正確、路由分流失敗等問題的排查指南。
- ui-design:做介面設計決策、建立新元件、討論視覺風格時用。
這三個的判斷邏輯也一樣——某種特定任務型態才需要的細節,常駐進 CLAUDE.md 是浪費。7 個 Skill 加起來覆蓋三個主力專案的客製化需求。下一段把這個過程沉澱出的判斷準則攤開。
三條判斷準則:什麼東西該抽成 Skill
準則 1:被多個專案需要的東西,不寫進單一專案的 CLAUDE.md
第一個訊號是重複。同一份規範如果同時被 insidewriter 跟 outsidewriter 需要、或被 gwarket-site 跟 publish-tools 需要,重複放兩處遲早會分裂。
我自己踩過:寫作風格規範一開始放在 outsidewriter 的 SKILL,後來 insidewriter 也要用。第一個直覺是複製一份過去——但複製等於下次改規範要改兩次、漏改一次就分裂。最後抽到 shared-rules/ 這個獨立 layer,writing-style.md、fb-writing.md、threads-writing.md、reading-protocol.md 都在那。各專案的 CLAUDE.md 跟 SKILL 只 reference 不重複。
注意:被多個專案需要的東西不一定要寫成 Skill——它可能是 shared-rules 裡的純 markdown 規範檔。Skill 是一種封裝形式,shared-rules 是另一種。準則 1 處理的是「不該綁在單一 CLAUDE.md」,不是「一定要寫成 Skill」。
準則 2:只在特定任務型態出現的規範,不放每次都讀的常駐記憶
第二個訊號是任務頻率不對等。fb-writing.md 的內容只在「寫 FB 貼文」這個任務出現。放進 outsidewriter 的 CLAUDE.md,每次 session(包含選題、轉寫、查核、發布、debug)都繳一次 context 稅,但只有發布階段那一輪用得到。
反面也成立:永遠該知道的東西不該寫成 Skill。publish-tools 的「四條發布鐵律」(不准新增分類標籤、預設發草稿、密碼從 .env 讀、安全字 confirm)是 always-on——任何 session 都不能違反。寫成 Skill 反而有風險(如果 Claude 沒主動載入呢?)。這條留在 CLAUDE.md。
準則 3:規範越精細,越要抽成獨立 Skill
第三個訊號是字數壓力
deployment-troubleshooting 是最好的例子。它寫了 15KB、涵蓋 Cloudflare Worker / Pages 路由分流失敗的多種樣態、WordPress headless API 異常的排查步驟、DNS 設定的常見錯誤。這些細節有用、但只在「部署出包了」那少數時刻用得到。寫進 CLAUDE.md 等於每次 session 都繳這 15KB 的稅。寫成 Skill、需要時才完整載入,是更划算的設計。
三條準則一起看,本質都是 context 預算的最佳化——把對的東西放對的層級,讓 always-on 那層只留必要的、把可選的東西交給 on-demand。
踩坑案例:Skill 不是寫了就有用
我自己最有代表性的踩坑是「連寫的人自己都會記錯規範在哪個檔」。
2026 年某次寫 FB 貼文相關任務,我給 Claude Code 的指令說「請參考 outsidewriter/CLAUDE.md 裡的 FB 規範」。Claude Code 執行時實際讀檔,發現 FB 規範不在 outsidewriter/CLAUDE.md,而是在 outsidewriter/.claude/skills/output-formats/SKILL.md 裡。它停下來提了三道判斷題等我確認,才繼續往下做。
這個案例後來在我的 vault 裡被歸類為「摘要失真」的一個 sub-pattern——「source pointer 缺漏」。問題不在內容錯,是「指向錯」:vault 寫了 FB 規範的內容描述,但沒明指 source 在哪個檔案;過了一段時間我自己記憶錯位,以為它在 CLAUDE.md。
這個踩坑帶出一條紀律:SKILL.md 重大改動之後,先用「主 agent 扮演」跑 dry-run,再正式載入。理由是:「扮演」執行時主 agent 會把規範當「描述」讀,遇到模糊處會停下質疑;載入後 SKILL 的執行更接近「指令式」,主 agent 傾向順著流程跑、不質疑。Dry-run 等同「規範審稿」,正式上線等同「規範被使用」——兩者偵測缺陷的能力不同。
寫 Skill 比寫 CLAUDE.md 有更高的靜默失真風險,因為它的內容不每次都被檢視。CLAUDE.md 每次 session 開頭都會被讀;Skill 只在觸發時才用,不觸發的時候規範變舊、跟實際情況脫節,你不會立刻發現。Dry-run 紀律是這個風險的工程層防線。
我的觀點:Skill 划算,但邊界要誠實標
Skill 是 Claude Code 客製化裡最划算的入手點。比 Hook 容易(不用碰 settings.json)、比 Subagent 直接(共享主 session context、看得到對話脈絡)、比 MCP 輕量(不需要外部 server)。它解決的問題是「條件式載入規範」,這個問題大多數使用者都會遇到。
但這篇有一條我必須誠實標出的邊界——Hook、Subagent、MCP 我目前都還沒實際用過。
寫 vault-agent 的時候我評估過 Subagent,最後選 SKILL,理由是 vault 的 ingest 流程要從當前對話 context 抓內容,Subagent 看不到主對話、SKILL 才能。這算是「評估過後選 SKILL」的決策層紀錄。但我沒有真的用過 Subagent,所以無法寫「我用過然後砍掉」的踩坑層。
MCP 我沒接過任何 server,連 publish-tools 都是直接打 WordPress REST API。Hook 我所有的 settings.json 都沒設過 hooks 區段,需要「執行後檢查」的場景(如 vault 的 Auto-Lint)我都用 prompt 規則寫進 CLAUDE.md 處理。
我刻意不在這篇硬寫這三個。原因簡單:沒實證的判斷沒有重量。寫「該不該上 MCP」而我從沒用過 MCP,就是 listicle、不是判斷。等我真的有需要碰、踩到坑、有取捨再寫。
這也是我對 Claude Code 客製化的整體哲學:能用 CLAUDE.md 解決的就不必動 Skill;能用 Skill 解決的就不必動 Hook;能用 prompt 規則解決的就不必動 MCP。每加一層機制都是工程成本,要看你需不需要那個層級的穩定性與自動化。
常見問題
Skill 跟 prompt template 差在哪?
Prompt template 是你每次貼進對話的文字塊,靠你記得用、貼對地方。Skill 是 Claude 看到對話內容後自動判斷該不該載入的模組——不需要你手動觸發。差別是「被動 vs 主動」:你下指令 Claude 才用 template,Claude 自己判斷情境後拉 Skill。Skill 也可以包含腳本、有結構化的 frontmatter(name、description、觸發條件),prompt template 通常只是純文字。
多少個 Skill 算太多?
沒有絕對數字,但訊號很具體:當你自己開始記不住某個規範在哪個檔案、得開資料夾搜尋,就是 Skill 太多或拆得太碎了。我踩過這個坑——以為 vault 寫了規範就好、結果幾個月後自己記錯位置。Skill 越多越要紀律:一份索引文件記每個 Skill 的觸發條件、SKILL.md 重大改動跑 dry-run、定期檢查觸發描述是否還對得上實際情境。Skill 多了會互相干擾的風險真實存在,但管理紀律到位前不必預設上限。
這是 Claude Code 101 系列的第 3 篇(系列收尾):
- 第 1 篇:Claude Code 不是更強的補全——它跑的是會自己驗證的 Agent 迴圈
- 第 2 篇:Context 才是 Claude Code 的稀缺資源
- 第 3 篇:我為什麼把這 7 個東西都寫成 Skill——一個 PM 的客製化判斷(本篇)
三篇串起來其實是同一條敘事:Claude Code 不是學一個工具,是學一種協作模式。第 1 篇講 Agent 跟補全的本質差別,第 2 篇講協作的稀缺資源 context 怎麼管,第 3 篇講客製化怎麼分層。會用的人不一定背更多指令,是更懂怎麼配置這個 Agent 周邊的長期記憶——CLAUDE.md 是憲法、Skill 是手冊、shared-rules 是跨專案共識,每一層都該收得乾淨、放在對的位置。
本文部分觀念基於 Anthropic 公開課程 Claude Code 101(https://anthropic.skilljar.com/claude-code-101)。文章內容為作者自身學習筆記與觀察,非課程翻譯或轉述。