Skip to content

[Bug] v1.0.48+ no longer mounts stdio plugin overlay commands, making conference-local unreachable #655

Closed

Description

@PeterGuy326

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

  1. 安装一个包含 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。

  1. 确认插件已启用:
dws plugin list --json

实际可见:

{
  "name": "conference",
  "enabled": true
}
  1. 查看或执行插件命令:
dws conference --help
dws conference status -f json

Expected 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:

  1. 将已审核的 plugin manifest/overlay 转成 typed runtime plugin registry,并从同一 typed source 投影 Cobra commands、参数、安全语义和 Schema。
  2. 已安装且 enabled、manifest 合法的 stdio 插件,其 overlay command 必须可见并能构造 Invocation。
  3. disabled/invalid 插件不得发布命令。
  4. 命令冲突继续遵守 reserved-command 和 first-plugin-wins 规则。
  5. 增加真实 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

  1. added theissue type on Jul 17, 2026
  2. haofeng0705 commented on Oct 16, 2026

    @haofeng0705
    Collaborator

    Hi @PeterGuy326,感谢你详细定位回归区间和缺失的命令投影层。

    插件命令树未挂载这一回归已通过 PR #701 修复,并包含于正式版 v1.0.54;最新稳定版 v1.0.64 仍保留该修复。

    • 根因:静态运行时切换后只注册插件服务和客户端,没有将 manifest/overlay 中声明的命令构建并挂载到命令树。
    • 修复方式:恢复 HTTP/stdio 插件的 manifest 命令树构建与挂载,并允许插件替换隐藏的兼容占位入口(例如 conference),同时保留命令冲突和安全检查。

    这修复的是本地插件命令入口,不表示公共 conference 产品重新上线。

    1. 按原安装方式更新到最新稳定版。独立二进制安装可使用 dws upgrade;npm 安装可使用:
    npm install -g dingtalk-workspace-cli@1.0.64
    1. 确认原插件仍启用,再检查命令树和只读状态:
    dws version
    dws conference --help
    dws conference status -f json

    以上是基于发布记录及版本源码的静态分析判断,我们本次未用你的原插件运行端到端验证。我们先按已发布修复关闭这个 Issue;若最新版仍无法加载或调用,请继续提供平台、版本、脱敏 manifest/overlay 和插件加载告警,我们会沿命令挂载与 stdio 调用链继续定位。感谢反馈,欢迎继续交流。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions