记一次 opencode 版本更新:从 1.15.1 到 1.15.3

2026-05-17

起因

用户反馈:「opencode 最新版本是 1.15.3,当前版本不对」。

先确认现状:

$ opencode --version
1.15.1

确实落后两个小版本,但事情远没有「npm install -g 一下」那么简单。

第一步:npm install -g opencode?

直觉是 npm 全局安装包名就是 opencode

$ npm install -g opencode@latest
npm error 404 Not Found - GET https://registry.npmjs.org/opencode - Not found

npm registry 上根本没有叫 opencode 的包。那当前的 opencode 命令是哪来的?

第二步:找到真正的包

$ which opencode
/usr/local/bin/opencode

$ file /usr/local/bin/opencode
symbolic link to ../lib/node_modules/opencode-ai/bin/opencode.exe

真相大白:opencode 是一个预编译的 ELF 二进制,通过 npm 包 opencode-ai 分发。npm 上真正发布的是 opencode-ai

$ npm search opencode
@opencode-ai/sdk The official TypeScript library for the Opencode API (v1.15.3)
opencode-ai 包含 opencode CLI 二进制的主包

第三步:二进制是怎么来的?

查看 opencode-aipackage.json,发现 optionalDependencies 里列出了各个平台的预编译包:

{
  "optionalDependencies": {
    "opencode-linux-x64": "1.15.1",
    "opencode-darwin-arm64": "1.15.1",
    "opencode-windows-x64": "1.15.1"
  }
}

安装流程是:

  1. npm 安装 opencode-ai(主包只包含 LICENSE + 479 字节的占位符 + postinstall.mjs
  2. postinstall.mjs 根据当前系统架构(linux-x64 / darwin-arm64 等)选择对应的平台包
  3. 通过 npm install --ignore-scripts --no-save 下载真正的 ELF 二进制
  4. 复制到 bin/opencode.exe

postinstall 脚本还会检测 CPU 是否支持 AVX2、libc 类型(musl vs glibc),选择最优的基线版本。

第四步:升级遭遇缓存坑

$ sudo npm install -g opencode-ai@1.15.3
changed 5 packages in 12s

$ cat /usr/local/lib/node_modules/opencode-ai/package.json | grep version
"version": "1.15.1"

npm 说安装成功了,但 package.json 里的版本号依然是 1.15.1。怀疑 npm 缓存污染,清理后重试:

$ sudo rm -rf /usr/local/lib/node_modules/opencode-ai
$ sudo npm cache clean --force
$ sudo npm install -g opencode-ai@1.15.3

这次 npm 把包安装到了 /usr/lib/node_modules/opencode-ai/(注意是 /usr/lib 而非 /usr/local/lib)。验证通过:

$ opencode --version
1.15.3

技术总结

项目说明
CLI 命令opencode
npm 包名opencode-ai(不是 opencode
二进制形式预编译 ELF,通过 postinstall 下载平台特定包
平台包格式opencode-{os}-{arch},如 opencode-linux-x64
关键机制postinstall.mjs 检测 CPU 特性(AVX2)、libc 类型(musl/glibc)选择基线版本
本次收获npm 全局包的缓存清理 + 多路径安装位置问题

这次更新虽然只是升了两个小版本,但暴露了 opencode-ai 这套「npm 壳 + 预编译二进制」分发的工程细节。下次遇到类似情况,先查 npm pack --dry-run 看 tarball 里到底有什么,能省不少时间。

https://blog.logfun.xyz/blog/feed.xml