29 行的 plugin:eli5 把「寫一個 Claude Code 擴充」縮到剩三個檔
補寫於 2026 年 9 月 2 日,日期掛回文章原本該發的那一天。文中對 eli5 的描述以撰寫當日的專案內容為準。
要給 Claude Code 多一個 /eli5 這種斜線指令,過去的標準動作是三步:開一個 commands/ 目錄,在裡面寫一份 markdown,再回 manifest 把路徑登記好。少做一步,指令就不會出現。
eli5 這個 plugin 整包只有三個檔。
1 | eli5/.claude-plugin/plugin.json 10 行 |
29 行,836 bytes。沒有 commands/、沒有 agents/、沒有 hooks/,沒有任何 .py / .sh / .js,沒有 .mcp.json,連 LICENSE 檔都沒有。這不是我挑重點列,是 find eli5 -type f 的完整輸出就長這樣(依 2026-08-26 的 main 分支)。
而 /eli5 那個指令照樣出得來。
指令以前要自己宣告,現在是 skill 順便長出來的
看這個 repo 最容易卡住的地方就在這裡。plugin.json 跟 README 都寫著 Use /eli5 <topic>.,但整包沒有任何一個檔案定義過這個指令。
答案在官方文件的一句話:
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/ 沒有消失,只是不再是唯一的路。寫一個 skill,斜線指令自己就會有。
省下一個目錄還是小事。真正的差別在觸發權:走 commands/ 的年代,指令只能由使用者主動打出來,模型不會自己想到有這個東西可以用;走 skill,description 多寫一句話,模型就能自己判斷什麼時候該叫它。eli5 的 description 把兩條路一次寫完:
1 | Explain a topic like I'm a 5 year old. Use when the user types /eli5 <topic> |
前半句講做什麼,後半句 Use when... 講何時用,而且後半句裡塞了兩種情況:使用者打了指令,以及使用者只是描述需求。二段式,成本是四個字。
順帶一提,它的 description 沒有任何排除句(沒有 Do NOT trigger for...),frontmatter 也沒有 allowed-tools。同一個 repo 裡會動到財務資料的 skill 就寫了排除句。差別在誤觸發的代價:eli5 被誤觸發,最壞結果是多產一份解釋,可逆而且便宜,不值得花 context 去寫防禦條款。
manifest 以前是路由表,現在是名片
1 | { |
裡面沒有任何 skills / commands / agents 的路徑宣告。skill 是靠目錄慣例 skills/<name>/SKILL.md 被自動發現的,不用登記。官方文件講得更絕:
The manifest is optional. If omitted, Claude Code auto-discovers components in default locations and derives the plugin name from the directory name.
frontmatter 那邊也一樣。官方列出 skill frontmatter 可用的欄位共 20 個(allowed-tools、model、argument-hint、disable-model-invocation 之類),eli5 用了 2 個。而且 name 還是選填的,不寫就取目錄名,所以真正非填不可的只有 description 一個。
以前寫擴充像在填報名表,現在像在寫便利貼。
六分鐘裡改了四次
SKILL.md 全文長這樣:
1 | --- |
正文三個元素:一個標題、一句指令、一個參數插槽。
它的 git 歷史只有 5 個 commit,全部落在 2026-08-21 的 18:52 到 18:58(UTC)。六分鐘內改了四次,之後就再也沒動過。核心那句指令被改了兩次,一次換名詞,一次刪形容詞。
六分鐘內的五個 commit
初版
核心那句指令寫的是 in a HTML page。
Use HTML artifact wording in eli5 skill
改成 using a HTML artifact,同一個 commit 也把 README 裡的 a single HTML page 一併改掉。
Reword eli5 skill prompt
an idiot that knows nothing 變成 someone who knows nothing,knows nothing 原封不動留著。
Remove license file from eli5 plugin
刪掉 eli5/LICENSE,順手也把 plugin.json 裡 "license": "MIT" 那一行一起刪了。
Keep MIT license field in eli5 manifest
六秒後把那一行加了回去。
一個泛稱換成平台的一級概念
初版寫的是 in a HTML page,第二版改成 using a HTML artifact。commit 訊息是 Use HTML artifact wording in eli5 skill。
表面上只換了個詞。跟模型說「一個 HTML 頁面」,它可能就隨手寫一個 .html 檔給你;說 artifact,它會走 artifact 那條產出路徑。同一個 commit 也把 README 裡的 a single HTML page 一併改掉,兩處對齊。
寫 prompt 的老直覺是把要求講得更詳細,於是句子越長越長:「請產生一個排版精美、含有大量插圖的單一 HTML 頁面」。這裡的做法反過來,一個形容詞都沒加,只是把泛稱換成平台自己認得的那個名詞。詞彙對了,一整套內建行為跟著進來,這比多寫二十個字管用。
刪掉一個罵人的詞,資訊量沒有少
第二次修改是 an idiot that knows nothing 變成 someone who knows nothing,commit 訊息 Reword eli5 skill prompt。貶抑詞拿掉了,knows nothing 原封不動留著。
這一手值得抄。prompt 要的是「零先備知識」這個資訊,不是罵人的語氣。很多人寫 prompt 會加情緒詞去「加強語氣」,但那些詞通常不提供任何額外約束,模型讀完該推測的東西還是得推測。自檢方法一句話:把情緒詞刪掉,問自己少了哪個約束。答不出來,就是該刪。(an idiot that 本來語法也錯,應該是 who,換成 someone who 一併修掉。)
剩下兩個 commit 是六秒內的來回
第四個 commit 叫 Remove license file from eli5 plugin,它刪掉 eli5/LICENSE 這個檔,順手也把 plugin.json 裡 "license": "MIT" 那一行一起刪了。六秒後的第五個 commit Keep MIT license field in eli5 manifest,把那一行加了回去。
所以今天看到的狀態是 manifest 寫著 MIT、plugin 目錄裡沒有 LICENSE 檔。
repo 本身是 Apache-2.0,跟 eli5 宣告的 MIT 不同;兩者的優先關係沒有任何檔案說明,我也沒找到 marketplace 的授權政策文件,這點未查證。
參數插槽:不寫也會有,寫了多一個型別
正文最後一行是 Topic: $ARGUMENTS。整個 repo 的 31 個 SKILL.md,只有這一個用了 $ARGUMENTS。
官方文件對這個變數的描述有意思:
$ARGUMENTS— All arguments passed when invoking the skill. If$ARGUMENTSis not present in the content, arguments are appended asARGUMENTS: <value>.
不寫,參數照樣會被附在後面,只是標籤會是沒有語意的 ARGUMENTS:。所以 Topic: $ARGUMENTS 買到的不是「參數能用」,是把那個無意義的標籤換成一個型別註記,告訴模型後面這串東西是一個 Topic。
同一段輸入,貼上對的標籤是免費的。
「五歲」從來沒有進到執行的那句話裡
這是全篇最精緻的一手:「五歲」這個說法根本不在真正餵給模型的指令裡。
| 位置 | 用詞 | 讀者是誰 |
|---|---|---|
| frontmatter 的 description、marketplace 文案、README | like I'm a 5 year old |
人(好記、好搜尋)與觸發判斷 |
SKILL.md 正文(真正執行的那句) |
someone who knows nothing about this topic |
模型(可執行的判準) |
「五歲小孩」是行銷語言。它好記、好搜尋、好推薦,但不好執行,因為模型得自己去猜五歲小孩懂什麼。「零先備知識的人」不好宣傳,但它本身就是一條可以直接照做的約束。
以前寫 skill 的習慣是想一句最漂亮的話,然後 description 跟正文都用它。這裡的示範是:那是兩個讀者。同一件事講兩次,用詞可以完全不一樣。
裝起來才發現指令名是錯的
2026-08-26 把它裝起來跑過一次,順便撞到一個坑:真正的指令是 /eli5:eli5,不是 /eli5。
官方文件說 plugin 的 skill「always namespaced」,格式是 /plugin-name:skill-name。eli5 的 plugin 名跟 skill 名剛好都叫 eli5,而同名並不會被收斂成一段。/reload-plugins 之後選單顯示的就是 /eli5:eli5,skill 實際也是從 ~/.claude/plugins/cache/claude-community/eli5/1.0.0/skills/eli5 載入。
也就是說,plugin.json 與 README 承諾的 Use /eli5 <topic>. 是錯的,而這個 plugin 是官方 community marketplace 收錄的。這件事本身就是給 plugin 作者的提醒:description 裡承諾的指令字串,要寫 namespace 之後的實際字串。
安裝還有另一個容易打錯的地方,@claude-community 不是 repo 名。repo 叫 claude-plugins-community,marketplace 的識別名來自 .claude-plugin/marketplace.json 裡的 "name": "claude-community",兩者差了 plugins 這一段。
1 | /plugin marketplace add anthropics/claude-plugins-community |
不想開互動面板、要寫進腳本的話用終端機版,repo README 本身就是這種寫法:
1 | claude plugin marketplace add anthropics/claude-plugins-community |
想先試不裝,還有一條旁路:claude --plugin-dir ./eli5 直接載本機目錄,同名時會蓋掉已安裝版。卸載是 /plugin uninstall eli5@claude-community,官方另外警告一句:移除 marketplace 會連帶卸掉所有從它裝的 plugin。
它沒做的事,比它做了什麼更值得看
正文那 142 個字元裡,沒有提到準確性,沒有「不要犧牲正確性」,沒有「不確定就說不知道」。整個 prompt 的壓力單向指向「更簡單」,沒有任何一句話往回拉。拿它解釋技術主題,輸出會不會簡化到失真,完全靠模型自己拿捏。
逐項確認不存在的還有這些:沒有 self-check 或驗收清單、沒有 HTML 骨架或樣式規範(每次產出的視覺一致性靠模型自由發揮)、沒有 argument-hint、沒有處理「主題本身很難簡化」或「使用者根本沒給主題」的情況、沒有 references/ 第二層檔案(也就沒有 progressive disclosure)。
這些「沒有」不見得是缺陷,是取捨。29 行換到的是零維護成本跟幾乎零的 context 開銷,上線至今零改動、版本還停在 1.0.0。
我的立場是:這是 demo 級的最小可行 skill,不是 production 級的 prompt 工程。它適合拿來學一個 plugin 最少需要什麼,不適合拿來學一個要上線給人用的 skill 該寫成什麼樣。會讓我改口的條件只有一個,就是正文裡出現任何一條反向拉力(準確性下限、不確定時該怎麼辦、輸出後的自評),那它就從教材升級成可以直接抄的骨架。
真正被換掉的東西
以前做一個擴充,你在做的事情本質上是接線:註冊路徑、宣告介面、把檔案放進系統找得到的位置。線接完了,行為才開始。
現在那幾層被目錄慣例吃掉了。29 行裡有 20 行是名字、版號、關鍵字這種給機器讀的東西,真正決定它會做什麼的只有 142 個字元。而那 142 個字元被改了兩次。
所以最小可行的 plugin 不是「程式碼很短的 plugin」。它是一份文件,你唯一在寫的東西是給模型的那一句話,其他都是包裝。想清楚這件事之後,「這個小需求值不值得做成一個 plugin」的門檻,會比大部分人以為的低很多。
相關連結
- eli5 原始碼:claude-plugins-community/eli5
- Community marketplace:anthropics/claude-plugins-community
- Skills 官方文件:code.claude.com/docs/en/skills
- Plugins 官方文件:code.claude.com/docs/en/plugins
本文事實以 2026-08-26 的 main 分支原始碼、git 歷史與 gh api 機器可讀元資料為準。eli5 於 2026-08-21 加入 marketplace,寫作時版本為 1.0.0;指令字串與載入路徑是 2026-08-26 實際安裝執行的結果,其餘結構與 prompt 分析來自原始碼與官方文件。




























































































































































































