feat(mcp): 支持 pnpm 作为包管理器并适配裸 Node 安装环境 - #6381
Conversation
- 新增 `pnpm_shim_target` 函数解析 pnpm 启动器内联脚本路径 - 在定位 MCP 包时增加 pnpm bin 目录作为备选路径 - 在查找 npm cli 时回退至 PATH 环境变量以支持无 npm 伴生的 Node 安装 - 添加针对 pnpm shim 解析的单元测试
- 新增 pnpm 安装命令常量 - 在未检测到 npm 包时优先使用 pnpm - 实现 install_command 方法以支持 pnpm - 更新 update_command 逻辑以处理 pnpm 安装场景 - 修正状态检查中的 install_command 引用
- 增加 locate_command("dbx-mcp-server") 逻辑以检测 PATH 中的 shim
- 将 path_shim_package 合并到 preferred_mcp_package 的参数中
- 支持 Yarn、Bun 及手动配置目录的包管理器检测
|
直接 locate_command("dbx-mcp-server") 找 PATH 上的 shim,解析其包——这样任何把 shim 放 PATH 的安装(yarn/bun/手动)都能显示当前版本 |
t8y2
left a comment
There was a problem hiding this comment.
这版还有两个兼容性缺口需要处理:
-
NodeRuntime::probe仍然通过find_npm_cli(...)?强制要求 npm CLI,随后立即执行npm root -g。如果环境确实只有 Node + pnpm、PATH 中没有 npm,探测会在 pnpm 包发现逻辑运行前直接返回失败,因此目前还没有完整支持标题所述的裸 Node 安装环境。请补充完全没有 npm 的回归场景,并让 npm 元数据在 pnpm-only 路径中不再成为前置条件。 -
PATH shim 的注释和描述宣称支持 Yarn、Bun 与手动安装,但
mcp_package_from_command_dir在附近找不到 pnpm 时会把这些安装统一标记为Npm。这样界面中的更新和卸载操作会对非 npm 安装执行 npm 命令。需要准确识别包管理器,或者将无法确认来源的包设为只读探测并禁用对应管理操作,避免误操作其他包管理器的全局安装。
- 新增 managed_automatically 字段到 McpServerStatus 接口 - 新增 Unknown 包管理器类型,用于处理无法确认来源的安装(如 Yarn、Bun 或手动复制) - 将 npm_cli_path 和 npm_root 改为 Option 类型,支持 pnpm-only 或裸 Node 环境 - 安装/卸载按钮在检测到非自动管理模式时禁用,并显示手动管理提示 - 更新错误信息文案,区分 npm 不可用与未知管理器的情况 - 补充单元测试验证未知包管理器的只读行为及 pnpm 识别逻辑
- 在 `McpServerStatus` 中新增 `runtime_available` 字段,指示是否存在兼容的 Node.js 运行时(npm、pnpm 或裸环境) - 独立检测 `npm_available` 字段,以便在仅有 pnpm 或无 npm CLI 的环境中正确反映状态 - 更新前端 UI 及逻辑,将安装按钮的禁用条件从 `npm_available` 修改为 `runtime_available` - 使用 `translateBackendError` 统一处理后端错误信息 - 新增针对未知包管理器和 npm CLI 缺失的国际化错误提示
- 添加 `pnpm_global_dir` 函数查询 pnpm 实际管理的全局目录 - 新增 `pnpm_package_manageable` 检查,确保只在 pnpm 可管理的目录下自动操作 - 将 pnpm home 目录优先加入 PATH,避免 pnpm 因全局 bin 目录不在 PATH 而拒绝运行 - 防止对旧版 `pnpm-global` 布局的包执行错误的更新/删除操作
- 在检测位置时增加对 pnpm home 目录的探测,以兼容全局 shims - 安装/更新逻辑统一使用 `pnpm add -g`,以修复旧版布局下的更新问题 - 优化包管理器识别逻辑,通过路径特征区分 pnpm 与其他管理器 - 优化错误信息,根据不同包管理器显示具体的全局安装路径 - 移除不可靠的 `pnpm_package_manageable` 检查,改用路径字符串匹配 - 更新单元测试以覆盖 pnpm store-links 和 legacy 布局
- 将 `#[test]` 属性移动到函数定义上方 - 移除重复的 `#[test]` 声明 - 确保 `pnpm_shim_resolves_inline_script_path` 测试正确注册
1. 区分"运行时可用"与"npm CLI 可用"
2. pnpm 更新/安装改用 pnpm add -g(根因修复)
3. 探测 pnpm 全局 bin 目录(修复"装完找不到包")
4. pnpm shim 识别(pnpm_located_shim)
5. run_package_manager_command PATH 修复
6. 安装后校验信息修复
7. 后端错误本地化
|
- 调整 `npm_root` 和 `npm_cli_path` 的断言以匹配 `Option` 类型 - 确保测试用例正确处理可能为空的返回值
- 根据平台动态生成 shim 文件名和内容,分别处理 Windows 和 Unix 环境 - 调整 pnpm 命令日志断言,从 `update` 改为 `add` 以匹配实际行为 - 统一路径分隔符处理,确保跨平台测试兼容性
t8y2
left a comment
There was a problem hiding this comment.
这个 head 仍有几项需要修改:
-
当前根据 pnpm 可执行文件的位置推断并覆盖
PNPM_HOME。例如/usr/local/bin/pnpm会得到PNPM_HOME=/usr/local,可能导致普通用户无写权限,或者把全局包装到与用户现有 pnpm 配置不同的目录。这里应读取 pnpm 的真实全局目录或保留用户环境,而不是从启动器路径推断。 -
目前仍将“shim 同目录或父目录存在 pnpm”视为该 shim 属于 pnpm。Yarn、Bun 或手工 shim 与 pnpm 共用
/usr/local/bin等 PATH 目录时,更新和卸载仍可能错误调用 pnpm。需要从 shim 的真实目标或安装布局确认所有权;无法确认来源时应只读展示并禁用管理操作。 -
设置页显示的升级命令仍是
pnpm update -g,实际按钮执行的是pnpm add -g,用户看到的命令与真实行为不一致。 -
现有测试仍没有真正覆盖“Node + pnpm,PATH 完全没有 npm”时通过
NodeRuntime::probe的完整路径;当前 exact-head Rust 测试仍有 1 项失败,frontend typecheck 和 i18n Autofill 也未通过。
请先统一 pnpm 全局目录和 shim 所有权语义,补充真实无 npm 的 probe 回归测试,并修复 exact-head CI 后再请求复审。

变更说明
DBX 的 MCP 服务器状态检测此前依赖 node 与 npm 相邻安装、包位于 npm 全局根目录。当用户使用 pnpm 管理(常见于裸 Node + pnpm 全局包、版本管理器)时:
本 PR 三处根因修复:
本;
变更类型
涉及前端
验证