Repository navigation
[Bug] v1.0.48+ no longer mounts stdio plugin overlay commands, making conference-local unreachable #655
Description
Describe the Bug
从 v1.0.48 开始,已安装且 enabled 的 stdio 插件仍会被加载,server descriptor 和 StdioClient 也会注册,但插件 overlay.json 中声明的命令不再生成并插入 Cobra 命令树。
这使本机 conference-local 插件成为“命令面孤儿”:proxy 和底层 stdio 执行链都还在,但当前 DWS 没有任何公开或隐藏命令能够构造 Invocation 并调用它。
这不是 dws plugin 管理命令缺失,也不是 conference proxy 损坏,而是插件命令投影层的功能回归。
Steps to Reproduce
- 安装一个包含 stdio server 和 CLI overlay 的插件,例如:
{
"name": "conference",
"version": "0.1.0",
"type": "managed",
"minCLIVersion": "0.2.33",
"mcpServers": {
"conference-local": {
"type": "stdio",
"command": "${DWS_PLUGIN_ROOT}/bin/conference-proxy",
"cli": "overlay.json"
}
}
}其中 overlay.json 的顶层 command 为 conference,并包含 create_conference、get_conference_status、get_conference_id 等 toolOverrides。
- 确认插件已启用:
dws plugin list --json实际可见:
{
"name": "conference",
"enabled": true
}- 查看或执行插件命令:
dws conference --help
dws conference status -f jsonExpected Behavior
- overlay 中的命令应进入 Cobra 树,例如
conference start、conference status、conference camera open等。 dws conference status应通过stdio://conference/conference-local调用本地 proxy。- 如果静态 Schema 架构不再允许旧式动态命令构建,应提供等价的 typed plugin registry / Schema 投影或通用 MCP 调用入口,不能让已加载插件不可达。
Actual Behavior
dws conference --help 只剩已下线兼容入口:
Available Commands:
meeting 会议管理(已下线)
member 成员管理(已下线)
执行 dws conference status -f json 返回:
conference 视频会议能力当前不可用:该产品已从开源 CLI 下线
隐藏的 dws mcp 也是无子命令的 stub,因此没有通用调用旁路。
Regression Range
在同一台机器、同一份已安装 conference 插件上,从仓库标签构建验证:
-
v1.0.47:conference start/status/get-id/...命令存在;conference status成功返回:{ "conference_id": "", "in_conference": false } -
v1.0.48:只剩meeting/member已下线占位入口。
主线回归落点为 a32d7985e62e5fbabdaaeb0e16a56f4a1c1bf8c0(refactor: switch to static endpoint delivery runtime):
- 删除
internal/compat和compat.BuildDynamicCommands; registerStdioServerFromOverlay攭为只注册 descriptor/client 并返回 nil commands;- 去掉
pluginCmds = append(pluginCmds, cmds...); - 后续
561525a18bd6647d7edac6b819d4f3f7497cbd44将当前链路收口为 manifest-only lazy registration,loadPlugins()最终固定return nil。
Relevant Code
internal/app/root.go: root 仍接收pluginCmds,但loadPlugins()最终固定返回nil。internal/app/plugin_stdio_overlay.go: 只调用AppendDynamicServer/RegisterStdioClient,不再生成 Cobra commands。internal/helpers/conference.go: 当前 conference 是直接返回“已下线”的兼容 stub。internal/cli/canonical.go:dws mcp是无调用子命令的 stub。internal/app/root_full_coverage_test.go: 当前测试明确断言loadPlugins(...) == nil。internal/app/plugin_registration_test.go: 只验证 descriptor/client 注册与懒启动,没有验证 overlay commands 可见、可执行。
Suggested Fix / Acceptance Criteria
建议按插件框架的功能回归修复,不直接机械恢复已删除的 internal/compat:
- 将已审核的 plugin manifest/overlay 转成 typed runtime plugin registry,并从同一 typed source 投影 Cobra commands、参数、安全语义和 Schema。
- 已安装且 enabled、manifest 合法的 stdio 插件,其 overlay command 必须可见并能构造 Invocation。
- disabled/invalid 插件不得发布命令。
- 命令冲突继续遵守 reserved-command 和 first-plugin-wins 规则。
- 增加真实 fixture stdio plugin 的端到端测试:
- overlay command 出现在根命令树;
- leaf 参数正确;
- 执行 leaf 会启动并调用对应 stdio server;
- 插件禁用后命令消失;
- Schema/命令完整性策略对 runtime plugin 有明确且可验证的处理。
Environment
- OS: macOS 15.5
- Architecture: arm64
- CLI Version:
v1.0.53-beta.2 - CLI Commit:
1c09115 - Go Version:
go1.25.9 darwin/arm64
Additional Context
当前本机插件状态已验证:manifest 合法、enabled、overlay 包含 33 个 tool override、proxy 文件存在且可执行。底层 runner 的 stdio 执行能力仍存在;缺失的是把 overlay tool 暴露成命令并创建 Invocation 的入口。
Activity
haofeng0705 commentedon Oct 16, 2026
Hi @PeterGuy326,感谢你详细定位回归区间和缺失的命令投影层。
插件命令树未挂载这一回归已通过 PR #701 修复,并包含于正式版 v1.0.54;最新稳定版 v1.0.64 仍保留该修复。
conference),同时保留命令冲突和安全检查。这修复的是本地插件命令入口,不表示公共 conference 产品重新上线。
dws upgrade;npm 安装可使用:以上是基于发布记录及版本源码的静态分析判断,我们本次未用你的原插件运行端到端验证。我们先按已发布修复关闭这个 Issue;若最新版仍无法加载或调用,请继续提供平台、版本、脱敏 manifest/overlay 和插件加载告警,我们会沿命令挂载与 stdio 调用链继续定位。感谢反馈,欢迎继续交流。