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 目录),故障只出现在应用内
复现
- 用 fnm/nvm 等版本管理器安装 node(npm 不在系统默认 PATH,如
/usr/bin:/bin:/usr/sbin:/sbin)
- 从 Dock 启动 PiDeck
- 设置 → 检查扩展版本 → 失败
根因分析(已读 asar 确认)
ExtensionManager.npmViewVersion() 硬编码 this.locator.createInvocation("npm", ["view", packageName, "version"]),spawn 依赖宿主 PATH;
- macOS 从 Dock 启动的 Electron 应用主进程 PATH 受限(实测不含 fnm 目录,裸 npm ENOENT/exit 127);
PiLocator.warmLoginShellPath() 用 /bin/sh -lc 'printf %s "$PATH"' 异步探测登录 shell PATH,且结果进程级负缓存(失败缓存 "" 不再重试)——探测时序/失败即导致整进程拿不到 fnm 目录;
- 设计缺陷:设置已有「npm 命令」字段(settings.json 的
npmCommand,见 config.label.npmCommand),但 npmCommand() 只在安装 pi / 定位全局包路径时被读取;npmViewVersion() 直接写死裸 npm,未复用该字段。用户填了该字段对「检查扩展版本」无效;而 pi 正常是因为配置了 customPiPath 完整路径,npm 没有等价通道。
建议修复
npmViewVersion() 改为复用 npmCommand(settingsFile)(与安装链路一致),未配置时再兜底常见目录 + 登录 shell PATH;
warmLoginShellPath() 负缓存加 TTL 或失败后允许重试,而不是整进程永久 "";
- 失败提示带上具体原因(如 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
Summary
Bug:设置中「检查扩展版本」始终失败,重启无效
环境
npm view @earendil-works/pi-coding-agent version正常返回 0.87.0现象
Extensions update command completed (updated:true),说明扩展更新链路正常复现
/usr/bin:/bin:/usr/sbin:/sbin)根因分析(已读 asar 确认)
ExtensionManager.npmViewVersion()硬编码this.locator.createInvocation("npm", ["view", packageName, "version"]),spawn 依赖宿主 PATH;PiLocator.warmLoginShellPath()用/bin/sh -lc 'printf %s "$PATH"'异步探测登录 shell PATH,且结果进程级负缓存(失败缓存""不再重试)——探测时序/失败即导致整进程拿不到 fnm 目录;npmCommand,见config.label.npmCommand),但npmCommand()只在安装 pi / 定位全局包路径时被读取;npmViewVersion()直接写死裸npm,未复用该字段。用户填了该字段对「检查扩展版本」无效;而 pi 正常是因为配置了customPiPath完整路径,npm 没有等价通道。建议修复
npmViewVersion()改为复用npmCommand(settingsFile)(与安装链路一致),未配置时再兜底常见目录 + 登录 shell PATH;warmLoginShellPath()负缓存加 TTL 或失败后允许重试,而不是整进程永久"";临时绕过
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