補寫於 2026 年 9 月 2 日,日期掛回文章原本該發的那一天。文中對 eli5 的描述以撰寫當日的專案內容為準。

要給 Claude Code 多一個 /eli5 這種斜線指令,過去的標準動作是三步:開一個 commands/ 目錄,在裡面寫一份 markdown,再回 manifest 把路徑登記好。少做一步,指令就不會出現。

eli5 這個 plugin 整包只有三個檔。

text
1
2
3
eli5/.claude-plugin/plugin.json      10 行
eli5/README.md 9 行
eli5/skills/eli5/SKILL.md 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.md and a skill at .claude/skills/deploy/SKILL.md both create /deploy and work the same way.

commands/ 沒有消失,只是不再是唯一的路。寫一個 skill,斜線指令自己就會有。

省下一個目錄還是小事。真正的差別在觸發權:走 commands/ 的年代,指令只能由使用者主動打出來,模型不會自己想到有這個東西可以用;走 skill,description 多寫一句話,模型就能自己判斷什麼時候該叫它。eli5 的 description 把兩條路一次寫完:

text
1
2
Explain a topic like I'm a 5 year old. Use when the user types /eli5 <topic>
or asks for a dead-simple picture explainer of how something works.

前半句講做什麼,後半句 Use when... 講何時用,而且後半句裡塞了兩種情況:使用者打了指令,以及使用者只是描述需求。二段式,成本是四個字。

順帶一提,它的 description 沒有任何排除句(沒有 Do NOT trigger for...),frontmatter 也沒有 allowed-tools。同一個 repo 裡會動到財務資料的 skill 就寫了排除句。差別在誤觸發的代價:eli5 被誤觸發,最壞結果是多產一份解釋,可逆而且便宜,不值得花 context 去寫防禦條款。

manifest 以前是路由表,現在是名片

1
2
3
4
5
6
7
8
9
10
{
"name": "eli5",
"version": "1.0.0",
"description": "Explain any topic like I'm 5: a dead-simple HTML picture explainer with big visuals and few words. Use /eli5 <topic>.",
"author": {
"name": "Thariq Shihipar"
},
"license": "MIT",
"keywords": ["explain", "eli5", "learning", "explainer", "html"]
}

裡面沒有任何 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-toolsmodelargument-hintdisable-model-invocation 之類),eli5 用了 2 個。而且 name 還是選填的,不寫就取目錄名,所以真正非填不可的只有 description 一個。

以前寫擴充像在填報名表,現在像在寫便利貼。

六分鐘裡改了四次

SKILL.md 全文長這樣:

1
2
3
4
5
6
7
8
9
10
---
name: eli5
description: Explain a topic like I'm a 5 year old. Use when the user types /eli5 <topic> or asks for a dead-simple picture explainer of how something works.
---

# eli5

Explain like I'm someone who knows nothing about this topic, using a HTML artifact with big pictures and few words.

Topic: $ARGUMENTS

正文三個元素:一個標題、一句指令、一個參數插槽。

它的 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 nothingknows 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 $ARGUMENTS is not present in the content, arguments are appended as ARGUMENTS: <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
2
/plugin marketplace add anthropics/claude-plugins-community
/plugin install eli5@claude-community

不想開互動面板、要寫進腳本的話用終端機版,repo README 本身就是這種寫法:

1
2
claude plugin marketplace add anthropics/claude-plugins-community
claude plugin install eli5@claude-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」的門檻,會比大部分人以為的低很多。

相關連結

本文事實以 2026-08-26 的 main 分支原始碼、git 歷史與 gh api 機器可讀元資料為準。eli5 於 2026-08-21 加入 marketplace,寫作時版本為 1.0.0;指令字串與載入路徑是 2026-08-26 實際安裝執行的結果,其餘結構與 prompt 分析來自原始碼與官方文件。