「寫一次,到處都能跑」很誘人,也很容易讓團隊高估 agent plugin 的可攜性。
同一個 plugin 在 VS Code 找得到,在 CLI 也載入成功,只能證明套件送到了。MCP 依賴是否真的綁上、權限被拒絕時會走哪條路、失敗後能不能留下可重現的證據,仍然取決於各個 client 的執行環境。
Agent Plugins 1.0 讓一個套件可以帶著 skills 與 MCP 設定,在 VS Code、Copilot CLI、GitHub Copilot SDK 和 Copilot app 等相容 client 之間分發;client 專屬行為則能留在各自的 namespaced directory。這解決了不少重複安裝與設定漂移,但它處理的是分發單位,不是跨 client 的執行等價性,更不是所有廠商都適用的通用 plugin 標準。
團隊如果把「安裝成功」當成「工作流可用」,問題通常會在上線後才出現。
我會把一個 agent plugin 拆成四份契約來管理,而不是只看 manifest 能不能被讀取。
先定義這個 skill 到底承諾什麼:輸入格式、任務範圍、預期輸出、停止條件,以及失敗時必須回傳的狀態。
例如,外部 reader 無法使用時,skill 應該回傳 dependency_unavailable,而不是改用模型記憶湊出一份看似合理的答案。這條規則要由共用 skill 決定,不該讓每個 client 自由猜測。
列出 MCP server 或外部服務的版本、連線條件、credential 來源,以及依賴不可用時允許的降級方式。
「設定檔裡有 MCP」不代表 runtime 已完成 binding。client 可能找得到 plugin,卻因為啟動方式、環境變數或驗證流程不同,根本沒有把所需工具接上。
檔案、網路、credential 與 tool scope 要分別寫清楚,也要定義哪些動作需要 approval。
同一個唯讀研究任務,在 IDE 裡可能能讀 workspace,在 CLI 裡卻從另一個工作目錄啟動;某個 client 遇到未知網域會詢問使用者,另一個則直接拒絕。這些差異不能藏在「支援此 client」一句話裡。
最後才是 client adapter。它負責 discovery、設定位置、事件格式,以及 UI 或 CLI 的互動差異,但不應偷偷改掉核心任務的成功標準。
adapter 可以不同,驗收結果不能各說各話。
下面不是 GitHub 官方的 Agent Plugins schema,而是一份由團隊自行維護的發佈資料。欄位和值都只是示意,重點是讓每次升版都有可追查的測試邊界。
plugin_id: genui-research
plugin_version: 1.4.0
skill_version: 3
tested_clients:
vscode: org-baseline-2026-08
copilot_cli: org-baseline-2026-08
mcp_dependencies:
resource_reader: team-pin-2026-08
required_scopes:
files: read-only
network: fixture-origin-only
credentials: none
acceptance_fixture: fixtures/genui-research-v3.yaml
evidence_path: evidence/genui-research/1.4.0/
rollback_to: 1.3.2
這份 envelope 應跟著 plugin source 進版控。tested_clients 記錄實際測過的組合,不要寫一個模糊的 all;rollback_to 也必須指向上一個通過相同驗收流程的版本,而不是「目前看起來還能用」的資料夾備份。
假設團隊有一個 genui-research plugin,共用 skill 會從固定的公開資源集合尋找 Generative UI 資料。驗收時可以選用 Awesome Generative UI 的生成式 UI 資源頁 當測試來源,要求每個 client 找出兩筆與 MCP Apps UI 直接相關的資源,保留標題、公開連結與判定理由。
這個頁面只是人為整理的公開資源目錄,不是 Agent Plugin,也不是 MCP server。真正要測的是 plugin 能否透過指定的 reader 完成相同任務。
fixture 至少要固定這些條件:
resource_reader,不可用時必須明確失敗。不要比較兩個模型寫出的理由是否一字不差。該比的是任務結果、來源連結、工具綁定、權限行為與證據是否完整。
以下是一份精簡的相容性矩陣:
| 驗證項目 | VS Code | Copilot CLI |
|---|---|---|
| 安裝與 discovery | 通過 | 通過 |
| 核心任務結果 | 通過 | 失敗 |
| MCP/tool binding | 通過 | resource_reader 未綁定 |
| 拒絕未授權寫入 | 通過 | 行為未知 |
| 執行證據 | 已保存 | 缺少 tool trace |
| 回退測試 | 通過 | 尚未測試 |
CLI 端雖然顯示 plugin 已載入,甚至可能憑模型既有知識產生兩個像樣的結果,這一版仍然不能 promote。因為它違反 dependency contract,也沒有證明 deny path 與 rollback 可用。
這正是只做 happy path 測試會漏掉的地方。輸出看起來正確,不代表工作流按照約定完成。
一個可維護的流程不需要很花俏,但每一步都要留下東西:
同一波 coding-agent 更新往往還會帶來 task queue、平行 subagent、rewind、memory 與 model choice 等不同工作流能力。plugin 進入這些 client 後,執行生命週期本來就不會只剩下一種。把差異寫進測試矩陣,比假設平台會替你抹平差異可靠得多。
套件裝得上,只代表配送完成。當團隊能回答某一版在哪些 client、哪些依賴與哪些權限下通過測試,也能指出失敗證據和回退版本時,這個 plugin 才算是可維護的軟體,而不是一份被複製到很多地方的設定資料夾。