Skip to content

fix(mcp): 安装技能前解析 npx 真实路径并补全子进程 PATH - #449

Merged
feigeCode merged 1 commit into
mainfrom
fix/mcp-skill-install-npx-path
Oct 22, 2026
Merged

feigeCode merged 1 commit into
mainfrom
fix/mcp-skill-install-npx-path

Conversation

@feigeCode

Copy link
Copy Markdown
Owner

现象

macOS 上从 Finder / Dock 启动 Navop,在设置页点「安装 Navop Skill」失败:

Navop Skill 安装失败:No such file or directory (os error 2)

同一条命令在终端里(PATH 含 /opt/homebrew/bin)能正常返回
{"ok":true,"result":{"path":"~/.agents/skills/navop"}}。

根因

  • GUI 进程继承的 PATH 只有 /usr/bin:/bin:/usr/sbin:/sbin(ps eww <pid> 可证),npx 一般只装在 /opt/homebrew/bin,裸 Command::new("npx") 直接 ENOENT。
  • 只把 npx 解析成绝对路径还不够:它的 shebang 是 #!/usr/bin/env node,子进程 PATH 仍缺 /opt/homebrew/bin 时 env 找不到 node(env -i PATH=/usr/bin:/bin /opt/homebrew/bin/npx --version → env: node: No such file or directory)。
  • 设置页「运行时要求」一栏原来无条件显示「已就绪」,掩盖了这个问题。

改动

  • crates/process-util 新增 program 模块:resolve_program 按环境 PATH 加上系统/家目录兜底目录(/opt/homebrew/bin、/usr/local/bin、nvm/fnm/volta/asdf/bun/pnpm 的 bin,版本号降序)解析并校验可执行位;build_command 额外把程序目录前置到子进程 PATH;Windows 上 .cmd/.bat 走 cmd /C。
  • main/src/settings/mcp_skill_install.rs 改走 process_util::build_command,启动器缺失时给出可操作提示(新增 skill_install_launcher_missing),不再把 io 错误原样抛给用户。
  • main/src/settings/mcp_helper_install.rs 的运行时要求状态改为真实探测(新增 runtime_requirements_missing,就绪文案带上解析到的路径)。
  • 持久化到 Codex / Claude 配置里的 command 仍是可移植的 "npx",不改成绝对路径(沿用 f821ed1 的取舍)。
  • AGENTS.md 记录该类 GUI 进程 PATH 问题的触发信号与正确做法。

验证

  • cargo test -p process-util → 8 passed
  • cargo test -p main → 697 passed(含新增源码契约 skill_install_resolves_the_launcher_before_spawning)
  • cargo test -p main mcp_ → 76 passed
  • RUSTFLAGS="-D warnings" cargo check -p main → ok
  • cargo clippy -p process-util -p main --all-targets → 改动文件无告警
  • GUI 等价验证:把 PATH 设成 /usr/bin:/bin:/usr/sbin:/sbin 后解析到 /opt/homebrew/bin/npx,子进程 PATH 带 /opt/homebrew/bin,npx --version 返回 11.19.0

未覆盖

Windows 上只有 .cmd/.bat 走 cmd /C 这一支能编译通过,本机是 macOS,需 Windows 实机确认安装流程。

macOS 上从 Finder / Dock 启动的 GUI 进程只继承 `/usr/bin:/bin:/usr/sbin:/sbin`,
设置页「安装 Navop Skill」裸 spawn `npx` 直接得到 `No such file or directory
(os error 2)`,同一条命令在终端里却能成功。npx 的 shebang 是
`#!/usr/bin/env node`,只把它解析成绝对路径仍会以
`env: node: No such file or directory` 失败,所以要把程序目录也补进子进程 PATH。

- process-util 新增 program 模块:`resolve_program` 按环境 PATH 加上系统/家目录
  兜底目录(Homebrew、/usr/local、nvm/fnm/volta/asdf/bun/pnpm)解析并校验
  可执行位,`build_command` 额外把程序目录前置到子进程 PATH,Windows 的
  `.cmd`/`.bat` 走 `cmd /C`
- 设置页安装技能改走 `process_util::build_command`,启动器缺失时给出可操作的
  提示(新增 `skill_install_launcher_missing`)
- MCP 运行时要求状态改为真实探测,不再无条件显示「已就绪」(新增
  `runtime_requirements_missing`,就绪文案带上解析到的路径)
- 持久化到 Codex / Claude 配置里的 `command` 仍是可移植的 `"npx"`,不改成绝对
  路径(沿用 f821ed1 的取舍)
- AGENTS.md 记录该类 GUI 进程 PATH 问题的触发信号与正确做法

验证:`cargo test -p process-util`(8 passed);`cargo test -p main`(697
passed);`cargo test -p main mcp_`(76 passed);`RUSTFLAGS="-D warnings"
cargo check -p main`;`cargo clippy -p process-util --all-targets` 与
`cargo clippy -p main --all-targets`(改动文件无告警)。另外把 PATH 设成
`/usr/bin:/bin:/usr/sbin:/sbin` 做 GUI 等价验证:解析到
`/opt/homebrew/bin/npx`、子进程 PATH 带 `/opt/homebrew/bin`、`npx --version`
返回 11.19.0。
@feigeCode
feigeCode force-pushed the fix/mcp-skill-install-npx-path branch from 3786a64 to ef699d1 Compare October 22, 2026 02:52
feigeCode added a commit that referenced this pull request Oct 22, 2026
合入 dev 做整体联调(启动验证后再决定是否合 main)
@feigeCode
feigeCode merged commit fe3faea into main Oct 22, 2026
8 checks passed
@feigeCode feigeCode mentioned this pull request Oct 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant