這幾天在整理 Claude Code 的 Skill 架構時,突然發現一件事:現在輸入 / 的時候,Command 指令不會正確出現了,查了一下才知道,原來 Anthropic 在 v2.1.3 就已經悄悄把 Custom Commands 合併進了 Skills 系統 [1],changelog 裡輕描淡寫的一句話:
「Merged slash commands and skills, simplifying the mental model with no change in behavior」
簡化心智模型,聽起來很美好對吧?但社群的反應告訴我們,事情沒那麼單純。
Command 跟 Skill 原本是什麼?
先回顧一下合併前的狀態,原本 Claude Code 有兩套獨立的機制:
Custom Commands(.claude/commands/*.md)是使用者主動觸發的指令,你放一個 deploy.md 進去,就會多一個 /deploy 的 Slash Command,重點是:只有你打 /deploy 的時候,他才會被載入 Context,不打就不佔空間,這個行為非常直覺,也非常可控。
Skills(.claude/skills/*/SKILL.md)則是更豐富的知識模組,支援 frontmatter 設定、子目錄結構、Progressive Disclosure,而且最關鍵的差異是:Claude 可以自動判斷要不要載入,不需要你手動觸發。
兩者的核心差異其實不是功能強弱,而是控制權在誰手上,Command 是「我說了才做」,Skill 是「他覺得該做就做」。
合併之後發生了什麼?
v2.1.3 之後,.claude/commands/ 裡的檔案在技術上仍然能用(向下相容),但他們現在被當作 Skills 來處理,官方文件也明確寫了 [2]:
「Custom commands have been merged into skills. A file at
.claude/commands/deploy.mdand a skill at.claude/skills/deploy/SKILL.mdboth create/deployand work the same way.」
聽起來只是搬個家?但有一個行為改變讓很多人跳腳:原本只有手動觸發才會載入的 Commands,現在可能被 Claude 自動載入了。
GitHub Issue #14851 [3] 是最早回報這個問題的,發文者的描述很直接:「Commands are now apparently ‘skills’ and are loaded into context without being invoked. This effectively removes command functionality from Claude Code.」
也就是說,你原本可能有 10 個自訂指令安靜地放在 commands 目錄裡,佔零 Token,合併之後,Claude 開始自動掃描並載入他認為「相關」的指令,你的 Context 預算就這樣被侵蝕了。
社群的三個主要疑慮
一、Context 汙染
這是最多人反映的問題,如果你是重度 Commands 使用者,可能有幾十個自訂指令,合併前他們完全不影響 Context,合併後卻開始被自動載入,用我們第三篇 Context Engineering 的語言來說,這違反了 JIT 載入原則,把「on-demand」的東西變成了「eager loading」。
二、可控性問題
paddo.dev 的一篇分析文章 [5] 指出了 Skills 系統的可控性困境:你沒辦法強制 Claude 在你需要的時候載入某個 Skill,也沒辦法阻止他在你不需要的時候載入,載入時機完全由 LLM 推理決定,這對需要精確控制工作流程的開發者來說是一個退步。
三、文件混亂
合併初期,changelog 說「merged」但文件還在分開描述 Commands 和 Skills,Issue #17578 和 #17288 都在反映這個問題,開發者搞不清楚到底現在該用哪個目錄、行為有什麼差異。
技術差異對照
| Command(舊) | Skill(新) | |
|---|---|---|
| 位置 | .claude/commands/*.md | .claude/skills/*/SKILL.md |
| 觸發 | 僅使用者手動 /command | 使用者手動 或 Claude 自動載入 |
| Context 載入 | 觸發時才載入 | 可能被自動載入 |
| 子檔案支援 | 不支援 | 支援(同目錄下的模板、腳本等) |
| Frontmatter | 不支援 | 支援(description、invoke、tools 等) |
| 向下相容 | 仍可使用(無移除日期) | 官方建議方向 |
我的觀察
或許 Anthropic 的方向是對的,把兩套做同一件事的機制合併成一套,從架構簡化的角度來看完全合理。而且 Skills 確實比 Commands 強大很多,支援 frontmatter 控制、子目錄結構、Progressive Disclosure,這些都是 Commands 做不到的。
但這個過渡期的痛點也很真實,特別是 Context 自動載入這件事,對於已經在精心管理 Token 預算的開發者來說,突然多了一個不可控的 Context 消耗來源,這不是「簡化心智模型」,而是「增加了一個需要管理的變數」。
目前 .claude/commands/ 目錄仍然可用,沒有公布正式移除日期(Issue #37447 [4] 正在追蹤這件事),所以如果你還在用 Commands,短期內不需要急著遷移,但長期來看,往 Skills 靠攏應該是不可避免的方向。
或許最好的策略是:先把最重要的 Commands 遷移到 Skills 格式,但在 frontmatter 裡明確設定 invoke: user,這樣至少可以保留「只有我說了才做」的控制權,同時享受 Skills 的其他好處。
如果你想自己遷移你的 Commands 到 Skills,我寫了另外一篇資源文章說明,文章中有提供一個 Agent Playbook 可以下載,你到那篇文章下載 Playbook 之後叫 Agent 照做就可以了。
參考資料:
[1] Claude Code v2.1.3 Release — 合併 Commands 與 Skills 的版本 changelog https://github.com/anthropics/claude-code/releases/tag/v2.1.3
[2] Extend Claude with skills — 官方文件 — Skills 系統官方說明 https://code.claude.com/docs/en/skills
[3] Issue #14851 — Commands loaded as skills without invocation — 最早回報自動載入問題的 GitHub Issue https://github.com/anthropics/claude-code/issues/14851
[4] Issue #37447 — Track full deprecation of .claude/commands/ — 追蹤 commands 目錄正式移除時程 https://github.com/anthropics/claude-code/issues/37447
[5] Claude Skills: The Controllability Problem — paddo.dev — Skills 可控性分析 https://paddo.dev/blog/claude-skills-controllability-problem/
支持這個系列
如果這系列文章對你有幫助,考慮請我喝杯咖啡
請我喝杯咖啡
