事实
release.yml 的 check Claude plugin (2.1.154 / 2.1.232) 是全流程里唯一让真 Claude 和真插件包碰面的地方。它跑三件事:
sync-agentparty-plugin.ts --check(镜像同步)
claude plugin validate --strict plugins/agentparty(Claude 自己的清单校验)
verify-agentparty-plugin-install.ts(隔离目录里装一遍,查装完的文件树)
三件事里没有一件调过 inspectClaudePluginBundle,也没有一处读过 claude plugin list --json 的 mcpServers,或者断言过 party doctor claude-plugin --json 的 bundle_valid:
$ grep -n "inspectClaudePluginBundle\|doctor claude-plugin\|bundle_valid\|plugin list --json" \
scripts/verify-agentparty-plugin-install.ts
(无输出)
所以 #1096 在 0.2.263、0.2.264 两个版本上,这两个 job 都是绿的——它们校验的是「包本身合法」,不是「装完之后我们自己的检查器认不认它」。而用户撞上的正是后者。
修法
在 verify-agentparty-plugin-install.ts 装完之后加一步:拿装出来的那份 claude plugin list --json 里的条目,喂给 inspectClaudePluginBundle,断言 valid === true;不过就把 reason 打出来。
它跟单测的分工是清楚的、不重复:
两条缺一条,#1096 就还会再来一次:单测那侧当时是绿的,因为 fixture 和检查器一起错;CI 这侧是绿的,因为它压根没问过这个问题。
验收
不是靠 job 变绿:把 plugins/agentparty/claude-mcp.json 的 args 临时改一个字(模拟 #1089 那种改动),这个 job 必须红。改不红就是没接上。
事实
release.yml的check Claude plugin (2.1.154 / 2.1.232)是全流程里唯一让真 Claude 和真插件包碰面的地方。它跑三件事:sync-agentparty-plugin.ts --check(镜像同步)claude plugin validate --strict plugins/agentparty(Claude 自己的清单校验)verify-agentparty-plugin-install.ts(隔离目录里装一遍,查装完的文件树)三件事里没有一件调过
inspectClaudePluginBundle,也没有一处读过claude plugin list --json的mcpServers,或者断言过party doctor claude-plugin --json的bundle_valid:所以 #1096 在 0.2.263、0.2.264 两个版本上,这两个 job 都是绿的——它们校验的是「包本身合法」,不是「装完之后我们自己的检查器认不认它」。而用户撞上的正是后者。
修法
在
verify-agentparty-plugin-install.ts装完之后加一步:拿装出来的那份claude plugin list --json里的条目,喂给inspectClaudePluginBundle,断言valid === true;不过就把reason打出来。它跟单测的分工是清楚的、不重复:
两条缺一条,#1096 就还会再来一次:单测那侧当时是绿的,因为 fixture 和检查器一起错;CI 这侧是绿的,因为它压根没问过这个问题。
验收
不是靠 job 变绿:把
plugins/agentparty/claude-mcp.json的 args 临时改一个字(模拟 #1089 那种改动),这个 job 必须红。改不红就是没接上。