如果你只用 npm install -g openclaw,你装到的永远只有 latest 那一条线。而 npm 上真实存在的是六条同时在维护的线——latest、beta、extended-stable、以及 8 月、7 月、6 月三条 LTS 回补线。
这六条线的依赖表差异有多大?我们把 npm registry 的全量元数据拉下来,逐条做了集合比对,结论是:六条线一共涉及 79 个直接依赖,其中 66 个在不同线上的锁定版本互不相同,只有 47 个包在全部六条线上都存在,而每条线依赖总数从 54 到 68 不等。
本文所有数字来自 2026-10-19 15:0x(Asia/Shanghai)对 GET https://registry.npmjs.org/openclaw 的全量解析(响应体 20,058,783 字节,versions 字段 280 条)以及对 6 个被锁依赖的上游包 registry(openai、@anthropic-ai/sdk、@google/genai、ws、@agentclientprotocol/sdk、@openclaw/fs-safe)的发布时间核对。口径不外推到 registry 之外,registry 里没有的信息一律标注 UNKNOWN。
一、先把六条线的位置摆清楚
OpenClaw 当前的 dist-tags 只有三个,但实际在维护的线是六条。多出来的三条是 LTS 回补线,它们不带 tag,只能靠版本号前缀识别:
| 线 | 代表版本 | 发布日期 | 直接依赖数 |
|---|---|---|---|
| latest | 2026.10.5 | 2026-10-18 | 66 |
| beta | 2026.10.10-beta.2 | 2026-10-19 | 68 |
| extended-stable | 2026.9.33 | 2026-10-15 | 66 |
| LTS 8 月线 | 2026.8.35 | 2026-10-02 | 66 |
| LTS 7 月线 | 2026.7.35 | 2026-09-21 | 56 |
| LTS 6 月线 | 2026.6.35 | 2026-09-10 | 54 |
注意依赖总数这个梯度:66 → 68 → 66 → 66 → 56 → 54。8 月线还有 66 个依赖,7 月线只剩 56 个,6 月线 54 个。这不是巧合,而是回补线各自停在不同功能分叉点留下的痕迹——6 月线甚至还没有 @openclaw/ai 这个依赖(它最早出现在 2026-07-11 的 2026.7.1-beta.4,全库共 48 个版本引用它)。
下面这张截图是 latest 线代表版本 2026.10.5 在 unpkg 上的 package.json 原文,dependencies 区块就在页面中部:

而这是 6 月回补线 2026.6.35 的同一区块,只有 54 条:

关于 npm 里 dependencies 字段的语义(安装期会被解析的运行时依赖)与 devDependencies 的区别,可以对照 npm 官方文档 package.json 文档;而上面这个对比里出现的两个版本号,都可以在 unpkg 上的 openclaw@2026.10.5 原始文件 与 openclaw@2026.6.35 原始文件 里逐行核对。
二、差异最剧烈的包:79 个里有 66 个版本不同
把六条线的依赖表并成一张表,逐格比对。分歧最大的这些包,任何两条线装出来的运行时都不是同一个:
| 依赖包 | latest | beta | ext-stable | LTS 8 月 | LTS 7 月 | LTS 6 月 |
|---|---|---|---|---|---|---|
@openclaw/ai |
2026.10.5 | 2026.10.10-beta.2 | 2026.9.33 | 2026.8.35 | 2026.7.35 | 无 |
@openclaw/fs-safe |
0.25.0 | 0.26.5 | 0.21.1 | 0.5.6 | 0.4.1 | 0.3.0 |
openai |
7.27.0 | 7.28.0 | 7.20.0 | 7.5.0 | 6.45.0 | 6.39.1 |
@earendil-works/pi-tui |
1.0.0 | 1.0.3 | 0.86.1 | 0.84.2 | 0.80.3 | 0.78.0 |
@anthropic-ai/sdk |
0.131.0 | 0.131.0 | 0.127.0 | 0.120.0 | 0.109.1 | 0.100.1 |
typebox |
1.3.34 | 1.3.35 | 1.3.34 | 1.3.17 | 1.3.3 | 1.1.39 |
@trycua/cua-driver |
0.32.0 | 0.33.4 | 0.28.2 | 0.21.0 | 无 | 无 |
@google/genai |
2.27.0 | 2.27.0 | 2.23.0 | 2.18.0 | 2.10.0 | 2.7.0 |
@modelcontextprotocol/sdk |
1.32.0 | 1.32.1 | 1.31.0 | 1.30.0 | 1.29.0 | 1.29.0 |
playwright-core |
1.63.0 | 1.63.0 | 1.63.0 | 1.62.1 | 1.61.1 | 1.60.0 |
@clack/prompts |
1.8.1 | 1.8.1 | 1.8.1 | 1.7.0 | 1.6.0 | 1.4.0 |
@openclaw/proxyline |
0.4.0 | 0.4.0 | 0.3.12 | 0.3.7 | 0.3.3 | 0.3.3 |
@agentclientprotocol/sdk |
1.7.0 | 1.7.0 | 1.4.0 | 1.4.0 | 1.1.0 | 0.22.1 |
表里有三处值得单独拎出来:
第一,@openclaw/fs-safe 在 8 月线上是 0.5.6,而主线只有 0.25.0。 按常规语义,0.5.6 应该是更新的版本,但 8 月线锁的恰恰是它。这条线的版本号从 2026-09-19 的 2026.9.5 开始出现了一次归零式的重新编号(从 0.8.5 突然跳到 0.13.1、0.18.1、0.21.1、0.23.0、0.24.2、0.25.0、0.26.5),而 8 月线仍停留在重新编号之前的旧号段 0.5.6。两个号段不是同一条线上的先后关系——registry 里 @openclaw/fs-safe 共 73 个版本,0.25.0 发布于 2026-10-08,0.5.6 发布于 2026-08-14,两者并存。
第二,@agentclientprotocol/sdk 在 6 月线上是 0.22.1,主线已经是 1.7.0。 中间横跨了整个 1.x 大版本。这个包目前共 57 个版本,0.22.1 发布于 2026-05-18,1.7.0 发布于 2026-10-02。
第三,typebox 在 6 月线是 1.1.39,在主线是 1.3.34。 同一个 minor 大版本内也是两个完全不同的次版本。
这三处合起来说明一件事:latest 和 LTS 线的差异不是「同一条线的新旧两代」,而是已经分叉。用 8 月线不等于「用稍微旧一点的 latest」。
三、把六条线按时间轴摆开,漂移是可以量化的
只看一张表不容易判断”哪条线更新”。我们把每条线的每个锁定版本,回到上游 registry 查出它自身的发布时间,再和 OpenClaw 该版本的发布时间相减,得到”这条线在安装时,这个依赖已经发布多少天了”:
| 线(代表版本) | openai |
@anthropic-ai/sdk |
@google/genai |
@agentclientprotocol/sdk |
ws |
|---|---|---|---|---|---|
| latest(2026.10.5) | 16 天 | 17 天 | 16 天 | 16 天 | 22 天 |
| beta(2026.10.10-beta.2) | 14 天 | 18 天 | 16 天 | 16 天 | 22 天 |
| extended-stable(2026.9.33) | 25 天 | 26 天 | 28 天 | 55 天 | 68 天 |
| LTS 8 月(2026.8.35) | 45 天 | 43 天 | 43 天 | 42 天 | 55 天 |
| LTS 7 月(2026.7.35) | 88 天 | 81 天 | 89 天 | 83 天 | 44 天 |
| LTS 6 月(2026.6.35) | 104 天 | 104 天 | 104 天 | 114 天 | 110 天 |
这张表的信息量比上一张更大:
latest线的滞后稳定在 14~22 天——这是一个正常的”跟随上游但不追最新”的节奏。extended-stable的ws滞后 68 天,@agentclientprotocol/sdk滞后 55 天——比同一条线上的其他依赖(25~28 天)明显更旧。这不是整条线都旧,而是线内个别包被有意按住了。- 三条 LTS 线的滞后整体在 42~114 天之间,且越老的线越旧。6 月线的四个 AI 相关包全部滞后 104 天以上。
反过来也要说清楚:滞后不等于落后。 LTS 线的意义就是”不再追新”,所以 6 月线装到 104 天前的 openai@6.39.1 是设计意图,不是缺陷。这张表只能用来说明”你选了哪条线,就意味着接受多旧的依赖”,不能用来判断哪条线更好。
四、回补线发一次,主流线的依赖就整体回退一次
这是本次全量比对里最反直觉的一个发现。
观察 2026 年 9 月之后”上一个发布”和”这一个发布”之间的依赖变动方向:
| 日期 | 新发布 | 上一个发布 | 依赖降级数 | 依赖升级数 |
|---|---|---|---|---|
| 09-10 | 2026.6.35(LTS 6 月) | 2026.9.3(主线) | 29 | 0 |
| 09-11 | 2026.9.4(主线) | 2026.6.35 | 0 | 29 |
| 09-18 | 2026.7.33(LTS 7 月) | 2026.9.4 | 28 | 0 |
| 09-19 | 2026.9.5(主线) | 2026.7.33 | 0 | 30 |
| 09-20 | 2026.7.34(LTS 7 月) | 2026.9.5 | 30 | 0 |
| 09-28 | 2026.8.33(LTS 8 月) | 2026.9.6 | 26 | 0 |
| 10-01 | 2026.8.34(LTS 8 月) | 2026.9.7 | 28 | 0 |
| 10-08 | 2026.9.9(主线) | 2026.10.1-beta.2 | 10 | 1 |
| 10-12 | 2026.10.2(主线稳定) | 2026.10.5-beta.1 | 16 | 0 |
| 10-13 | 2026.10.3(主线稳定) | 2026.10.5-beta.3 | 17 | 0 |
| 10-15 | 2026.9.33(ext-stable) | 2026.10.5-beta.4 | 19 | 0 |
| 10-15 | 2026.10.4(主线稳定) | 2026.10.10-beta.1 | 18 | 0 |
| 10-18 | 2026.10.5(主线稳定) | 2026.10.4 | 0 | 17 |
看清楚这个模式:每次 LTS 回补线发一个版本,紧随其后的主线稳定版就把一大批依赖退回到更旧的版本。 10-12、10-13、10-15 三天里连续三个主线稳定版(2026.10.2 / 2026.10.3 / 2026.10.4)分别把 16、17、18 个依赖降级;等到 10-18 的 2026.10.5 才一次性把 17 个依赖全部升回最新。
我们进一步做了隔离:把”跨线切换导致的降级”(比如从 2026.9.3 的主线切到 2026.6.35 的 LTS 线)单独剔除后,全库 280 个版本里,同一版本线内部真正的降级事件只有 1 个(2026-07-18 的 2026.7.1-1 把 @openclaw/ai 从 2026.7.2-beta.2 退回 2026.7.1-1)。剩下 54 个”同线降级”事件里,53 个的共同特征是:从预发布版晋升为稳定版的那一刻发生的。
也就是说,2026.10.2 / 10.3 / 10.4 这三个稳定版不是”beta 版的自然晋升”,而是从 beta 版的依赖集合退回到一份更保守的依赖集合之后再打上稳定标签。这个模式在 2026-10-18 的 2026.10.5 上被撤销:它一次把 17 个依赖升回 beta 线的水平。
这个发现对使用者的直接影响是:如果你在 10-12 到 10-15 之间用 npm 装过 latest,你装到的是一份比 beta 线旧一档的依赖;而 10-18 之后又换成了新的。 同一个月内三次装 latest,装到的依赖集合可以完全不同。npm 官方对 dependencies 解析规则和版本范围的说明见 package.json 文档。
五、锁定层本身是稳的:^ 浮动范围已经 5 个月零出现
这里要把另一件事说清楚,否则容易被上面”依赖在变”的结论误导。
OpenClaw 从 2026-05-12 17:09 的 2026.5.12-beta.1 开始,把 dependencies 里所有 ^ 浮动范围一次性清空。我们全量核对了 280 个版本:这一天之后发布的 124 个版本里,出现 ^ 的版本数是 0 个。最后一个带 ^ 的版本是 2026-05-11 16:38 的 2026.5.10-beta.5,它在 24.5 小时后被整体替换。
那次替换的具体形态是:2026.5.10-beta.5 → 2026.5.12-beta.1 之间,依赖总数 62 → 62(无新增、无删除),但其中 41 个依赖的版本字符串被改写——绝大多数只是去掉了 ^ 前缀(ws 从 ^8.20.0 变成 8.20.0),少数几个同时升了版本(yaml 从 ^2.8.4 到 2.9.0、playwright-core 从 1.59.1 到 1.60.0、@anthropic-ai/sdk 从 0.95.1 到 0.95.2)。
这次替换的背景(pnpm.overrides 那 25 条补丁如何在 5 月 10 日被拆掉、13 小时的锁定真空)站内已有专门文章:OpenClaw 装过 25 个依赖补丁,5 月 10 日一夜之间全部撤走,本文不复述,只补一个它没覆盖的结论:那次改动之后,^ 归零的机制至今没有被打破,124 个版本、5 个月、零例外。
配套的两项旁证:
- 最新版本
2026.10.10-beta.2的devDependencies62 条,全部为精确版本,^数量为 0。 packageManager字段曾覆盖 2026-01-30 到 2026-07-18 的连续版本(pnpm 10.23.0 一路升到 11.1.0),但在2026.7.1-2之后连续 43 个版本都没有这个字段。这一项的机制本文不做推断,见下文 UNKNOWN。
六、给使用者的三条可执行结论
1. 先确认自己在哪条线上,再谈版本新旧。 npm view openclaw dist-tags 只会给你三个 tag,六条线里另外三条不带 tag。在 LTS 线上装出来的东西和 latest 不是同一份依赖,这跟版本号大小无关。
2. 如果在用 LTS 线,重点核对 @openclaw/fs-safe 和 @agentclientprotocol/sdk 这两个包的版本号是否与你的预期一致。 它们是六条线里分歧最大、且号段存在重叠/断层的两个——fs-safe 的 8 月线锁在旧号段 0.5.6 而主线在 0.25.0,@agentclientprotocol/sdk 的 6 月线还在 0.22.1 而主线已到 1.7.0。核对方法是把 package.json 里这两行和你打算对比的那条线逐一比对。
3. 生产环境请锁定具体版本号,不要依赖 latest 的语义。 因为本文第四节已经证明:latest 在 2026-10-12 至 10-15 的三天里连续三次更换了依赖集合,而 tag 名始终没变。如果你的部署脚本写的是 npm install -g openclaw@latest,那这三次变更都会直接进到你的环境里。
关于 @openclaw/fs-safe 旧号段(0.3.0 / 0.4.x / 0.5.x)与新号段(0.13.x ~ 0.26.x)并存的原因、typebox 在 6 月线停在 1.1.39 的原因,以及 LTS 线的具体支持周期,站内关于 OpenClaw 版本三轨制与 LTS 编号规则的实测可以看这两篇:OpenClaw 版本三轨制首次同日齐动 和 LTS 线版本号为什么从 7.1 跳到 7.33。
信息来源与采集口径
- 主数据源:npm registry 官方接口 registry.npmjs.org/openclaw,实测抓取时间 2026-10-19 15:03–15:12(Asia/Shanghai),响应体 20,058,783 字节,
versions字段 280 条,dist-tags= latest 2026.10.5 / extended-stable 2026.9.33 / beta 2026.10.10-beta.2。 - 上游核对:对 openai、@anthropic-ai/sdk、@google/genai、ws、@agentclientprotocol/sdk、@openclaw/fs-safe 六个包分别取全量 registry,用
time字段核对每个被锁版本的发布时间。所有被引用的版本号均在上游 registry 中确认存在。 - 依赖分类口径:本文”依赖”一律指
dependencies字段的运行时依赖,不含devDependencies(62 条)、optionalDependencies(最新版本 84 条)、peerDependencies。 - 降级/升级的判定:仅对两侧都是纯数字版本串的依赖做比较,按前三段数字元组比较大小;跨版本线切换与同线内变化分开统计。无法按此口径判定的条目不计入。
- 配图 2 张均为 unpkg 上对应版本
package.json原文页面的实际截图(2026.10.5、2026.6.35),无示意图、无占位图。 - 本文所有数字均可按上述接口复算。registry 之外的任何信息(GitHub Actions 配置、构建脚本、回补线的内部决策)均未作为论据。
UNKNOWN(registry 元数据无法证实,不做推断)
- UNKNOWN:
@openclaw/fs-safe的旧号段(0.3.0 ~ 0.5.6)与新号段(0.13.0 ~ 0.26.8)并存的原因——registry 只记录两个号段各自独立发布,无任何字段说明版本号策略是否变更。 - UNKNOWN:
@openclaw/ai这个依赖为何只在 2026-07-11 之后才出现(共 48 个版本引用)——本文只能确认引入时点,无法确认是代码拆分重构还是打包方式调整。 - UNKNOWN:2026-10-12 / 10-13 / 10-15 三个主线稳定版为何把依赖退回更旧版本——registry 只能观测到”降级了 16/17/18 个”,没有任何字段记录决策依据。
- UNKNOWN:
packageManager字段在2026.7.1-2之后连续 43 个版本消失的原因——可能是改用其他 CI 方式发布,但 registry 无对应证据。 - UNKNOWN:三条 LTS 线(6/7/8 月)的官方支持周期、终止日期与回补触发条件——
dist-tags中只有extended-stable一个标签指向回补线,另外两条连标签都没有。 - UNKNOWN:
openai在 6 月线锁6.39.1、8 月线锁7.5.0、主线锁7.27.0,这三条线之间是否经过兼容性验证——registry 无验证记录。 - UNKNOWN:
@agentclientprotocol/sdk从 0.22.1 跨到 1.x 是否包含破坏性变更,以及 LTS 线是否同步了适配——本文只记录版本号差异,不推断兼容性。 - UNKNOWN:
@trycua/cua-driver、koffi、quickjs-wasi、npm、typescript等包在各线上的”有/无”差异(例如 6 月线没有npm、7 月线没有@trycua/cua-driver)是否对应功能裁剪——registry 无功能映射信息。








