v0.14.1 发布后对安装、升级、渠道冲突、自动升级四项能力做了四路独立全面评审(30+ 项沙箱实证)。核心健康面(事务安全、跨语言锁协议、凭证隔离、版本语义、0.12/0.13 兼容性)全部实测通过。本 issue 立项第一批修复(v0.14.2 范围):1 个 P1 + 6 个 P2,全部为局部小改、现场影响明确。第二批 P1/P2 与 P3 积压见后续 issue。
atomgit-cli
pathAPI.resolve(packageRoot, "..", "..")
@gitcode-cli/cli
<prefix>/lib
%APPDATA%\npm
npm root -g
npm install -g <坐标>@latest --ignore-scripts
gc update
@
SysProcAttr{Setsid: true}
CREATE_NEW_PROCESS_GROUP|DETACHED_PROCESS
--ignore-scripts
npm prefix -g
fs.statSync(dst)
背景
v0.14.1 发布后对安装、升级、渠道冲突、自动升级四项能力做了四路独立全面评审(30+ 项沙箱实证)。核心健康面(事务安全、跨语言锁协议、凭证隔离、版本语义、0.12/0.13 兼容性)全部实测通过。本 issue 立项第一批修复(v0.14.2 范围):1 个 P1 + 6 个 P2,全部为局部小改、现场影响明确。第二批 P1/P2 与 P3 积压见后续 issue。
问题清单
atomgit-cli全局安装 discovery 误判 npm-local(npm/lib/install-metadata.js:151):pathAPI.resolve(packageRoot, "..", "..")上溯两级只对 scoped 包(@gitcode-cli/cli两段名)成立;非作用域坐标上溯两级得到<prefix>/lib(Windows 为%APPDATA%\npm),≠npm root -g。触发链:updater 自身npm install -g <坐标>@latest --ignore-scripts(update.js installExact)整体替换包目录删除旧元数据 → 下次运行走 discovery → 误判 npm-local → ①gc update报 "automatic update requires a global npm install"(实际就是全局安装,自相矛盾)② 每日后台检查静默停摆(gc.js finishUpdateLifecycle 要求 distribution==="npm")③ 错误元数据 ensureInstallMetadata 写盘后 sticky(端到端实证)。修法:按直接父目录 basename 是否@开头分派——scoped 上溯两级、非作用域上溯一级;补非作用域全局(Linux/Windows)与非作用域项目级用例(现有测试只覆盖 scoped)SysProcAttr{Setsid: true}、WindowsCREATE_NEW_PROCESS_GROUP|DETACHED_PROCESS(build-tag 分文件,参照 pkg/config/securewrite_* 模式)--ignore-scripts安装/更新后首跑 wrapper 需走 2×5s 的npm root -g/npm prefix -g发现 + node 启动 + Go 二进制启动,总时长可超 10s;慢机器(Windows 冷启动 + Defender)超时 → 假阴性回滚 → 回滚的 healthCheck 同样超时 → "rollback failed"(好更新被回滚)。修法:超时 10s → 30sfs.statSync(dst)抛 ELOOP 直接裸奔,绕过 "refusing non-regular install target" 可操作拒绝路径(实证)。修法:捕获列表加 ELOOP + 补 alias-loop 测试验收标准