Skip to content

Bug:设置中「检查扩展版本」始终失败,重启无效 #263

Description

@Lamb-Yang

Summary

Bug:设置中「检查扩展版本」始终失败,重启无效

环境

  • PiDeck 0.7.7(installed),macOS 24.6.0 (x64)
  • pi 0.87.0,通过 fnm 安装(node v24.14.1)
  • 设置中已配置 customPiPath 为 fnm 完整路径;npmCommand 未配置
  • 网络正常:registry.npmjs.org、AtomGit、GitHub raw 均可达(HTTP 200),终端 npm view @earendil-works/pi-coding-agent version 正常返回 0.87.0

现象

  • 设置 → 检查扩展版本 → 提示「检查扩展版本失败」,重启应用后仍失败
  • 日志中 Extensions update command completed (updated:true),说明扩展更新链路正常
  • 终端里 npm 完全可用(PATH 含 fnm 目录),故障只出现在应用内

复现

  1. 用 fnm/nvm 等版本管理器安装 node(npm 不在系统默认 PATH,如 /usr/bin:/bin:/usr/sbin:/sbin)
  2. 从 Dock 启动 PiDeck
  3. 设置 → 检查扩展版本 → 失败

根因分析(已读 asar 确认)

  1. ExtensionManager.npmViewVersion() 硬编码 this.locator.createInvocation("npm", ["view", packageName, "version"]),spawn 依赖宿主 PATH;
  2. macOS 从 Dock 启动的 Electron 应用主进程 PATH 受限(实测不含 fnm 目录,裸 npm ENOENT/exit 127);
  3. PiLocator.warmLoginShellPath() 用 /bin/sh -lc 'printf %s "$PATH"' 异步探测登录 shell PATH,且结果进程级负缓存(失败缓存 "" 不再重试)——探测时序/失败即导致整进程拿不到 fnm 目录;
  4. 设计缺陷:设置已有「npm 命令」字段(settings.json 的 npmCommand,见 config.label.npmCommand),但 npmCommand() 只在安装 pi / 定位全局包路径时被读取;npmViewVersion() 直接写死裸 npm,未复用该字段。用户填了该字段对「检查扩展版本」无效;而 pi 正常是因为配置了 customPiPath 完整路径,npm 没有等价通道。

建议修复

  1. npmViewVersion() 改为复用 npmCommand(settingsFile)(与安装链路一致),未配置时再兜底常见目录 + 登录 shell PATH;
  2. warmLoginShellPath() 负缓存加 TTL 或失败后允许重试,而不是整进程永久 "";
  3. 失败提示带上具体原因(如 ENOENT / 超时 / 网络),不要笼统的「检查扩展版本失败」。

临时绕过

launchctl setenv PATH <fnm bin>:<系统默认 PATH> 后重启 PiDeck,可让 GUI 应用拿到完整 PATH。

附带疑问

重启后日志里的 Spawn error (pre-listener sink): spawn pi ENOENT 同样指向 PATH 问题(当时未配置 customPiPath),是否可统一把 pi/npm 解析都走设置字段?

Steps to reproduce

同上

Expected behavior

同上

Actual behavior

同上

OS

macOS

Node.js version

No response

pi version

No response

Logs or screenshots


Activity

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

    bugSomething isn't working

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions