今天下午五点二十,DeepSeek Harness 发了 0.2.2-rc.1。

从 alpha 转 rc,听着像是个里程碑。我把两个版本都拆开比了一遍,结论是:一个字节都没改。

先说结论

0.2.2-rc.1 发布于北京时间 2026 年 11 月 4 日 17:20(2026-11-04T09:20:32Z)。

我拿它和 2026 年 11 月 3 日发布的 0.2.2-alpha.3 做了逐文件 md5 比对,范围是顶层包、六个核心子包、以及底层框架 cordis,一共 290 个文件对齐算了一遍。

结果:每个包里唯一变的文件,都是 package.json。

dist、src、locale、README 全部一模一样。这不是「改动很小」,这是零改动。

我怎么比的

命令行就三步,没用什么特殊工具:

npm pack @deepseek-ai/[email protected] 和 @0.2.2-rc.1 各拉一份 tarball,解包到两个目录,然后按相对路径逐文件算 md5。

顶层包 20 个文件,六个子包各 30 到 60 个文件,cordis 32 个文件。两边同名文件全部对齐算一遍,只记下哈希不一致的。

包文件数内容变化的文件
dsh(顶层)201 个,package.json
dsh-agent-preset481 个,package.json
dsh-plugin-manager601 个,package.json
dsh-web-app321 个,package.json
dsh-client-ui-cordis301 个,package.json
dsh-tool-fs341 个,package.json
dsh-tool-cordis341 个,package.json
cordis321 个,package.json

没有新增,没有删除。八个包八处改动,全是版本号和依赖范围那一行。

唯一真正变了的东西

代码没变。但依赖版本号全换了一茬,这是这次发布唯一的实质动作:

包alpha.3rc.1
@deepseek-ai/cordis4.0.6-alpha.24.1.0
cordis-plugin-loader1.0.7-alpha.21.1.0
cordis-plugin-include1.0.11-alpha.21.1.0
cordis-plugin-timer1.1.8-alpha.21.2.0
@deepseek-ai/schemastery3.18.6-alpha.23.19.0
@deepseek-ai/cosmokit1.8.7-alpha.21.9.0

一句话总结:把整个 cordis 家族的 alpha 后缀去掉,抬成正式版本号。

但这里有个细节值得说。我把 cordis 4.0.6-alpha.2 和 4.1.0 也拆开比了,它的 32 个文件里同样只有 package.json 不同。也就是说连框架层都是原样搬过去的,只换了门牌号。这个比上面那张表更有意思。

那次「版本号从 alpha 变正式」,改动量是零。

所以这次发布到底图什么

图一个 tag。

发布之前,latest 指向 0.2.1-rc.5,next 指向 0.2.2-alpha.3。想装最新的得手动写全版本号。

发布之后,latest 和 next 都指向 0.2.2-rc.1。这意味着 npm i -g @deepseek-ai/dsh 不加版本号,默认装的就是它。

对大项目来说这不是小事。alpha 线是「我们自己敢用」的标记,rc 是「你也来试试,接口已经定死了」的标记。改功能是开发,改标记是承诺。这一版做的是后者。

升级花了不到一分钟

全局装一条命令,npm i -g @deepseek-ai/[email protected],跑完 dsh --version 就是 0.2.2-rc.1。

第二条命令不是升级,是修 profile。这条很多人会漏,我上次就漏了:

dsh plugin --profile web add @deepseek-ai/[email protected] @deepseek-ai/[email protected] @deepseek-ai/[email protected]

pnpm 报回来:解析 62 个包,复用 41 个,下载 21 个,新增 22 个,耗时 939 毫秒。

装完我先用 headless 模式冒烟了一次,让它「只回答两个字:收到」。它回了「收到」,说明 profile 能正常启动、模型路由通、没有插件卡在 disable 状态。这一步比看界面快。

为什么要重跑?因为 dsh 的 profile 是一层叠一层的插件堆,全局升了 dsh 之后,profile 里那些还钉在 alpha.3 的插件和主程序版本对不上,启动时会被版本校验直接 disable。

上次升 alpha.3 我只升了全局,结果六行插件被关掉,storage-domain 就在其中。它一挂,工作区、会话列表、定时任务跟着全卡死,网页版直接废掉,最后靠这条命令才救回来。

所以我的顺序固定了:先全局,再 profile,最后验证。少一步就是给自己找麻烦。

上次没救回来的那个,这次回来了

上次升级唯一遗留的伤是 ui-agent-team:它版本线特殊,npm 上找不到能和 alpha.3 对齐的包,只能一直禁用着。

这次它有对应版本了。装完之后 profile_ping 报的插件清单里,这三个都在:

@deepseek-ai/dsh-experimental-agent-team

@deepseek-ai/dsh-experimental-client-ui-agent-team

@deepseek-ai/dsh-experimental-tool-agent-team

上一版被禁的 dsh-storage-domain 也在列表里。插件页面上,「Agent teams」那个开关是打开的,新会话的标题栏上还多了一个 Agent team 的标识。

装的时候出了一句提示,我觉得值得原样记下来:@deepseek-ai/dsh-experimental-client-ui-agent-team 没有声明 dsh.bundle,所以它是作为普通依赖装的,不是一个 profile 层。

换句话说它能用,但它在体系里的位置和那些 bundle 不一样。这种话厂商不会写在发布说明里,只在安装输出里闪一句。

profile 里不全是官方包

顺手看了一眼 profile 的依赖清单,六条:

三个 bundle 现在是 rc.1,agent-team-web-profile 还停在 0.1.6-alpha.2,剩下两条是我自己装的,一个从本地 tgz 装,一个直接从 GitHub 仓库装。

这说明 dsh 的 profile 不是一个封闭的官方套装,是你自己拼的组合。好处是你想加什么加什么,代价是升级时得自己盯:哪些是官方的、哪些钉在某个版本、哪些根本不在官方的版本线上。

agent-team-web-profile 就是例子。它是 agent-team 的界面层,版本线和主程序完全独立,主程序到 rc.1 了它还在 alpha.2。这种包不会跟着你升级,它自己走自己的。

顺手验了一遍

升级完之后我在网页版开了一个新会话,只发一句:调用 profile_ping,把返回的 JSON 原样贴出来。

十秒完成,返回的开头是 "profile": "web", "dshVersion": "0.2.2-rc.1", "plugins": [ 后面跟着 212 个插件名。

这 212 行就是我这个 profile 现在的真实构成,从 cordis-plugin-timer 一直到我自己写的 dsh-plugin-profile-ping。想确认升级到底有没有生效,看这一个数字比看任何界面都准。

顺带一提,这个查询本身花了 56.3K token,缓存命中 86%,上下文只用了 3%。开销主要在插件清单太长,不在推理。

一个查版本的经验

如果你也想追 dsh 的版本,有个坑得避开:子包的 latest 标签是滞后的。

比如 dsh-experimental-client-ui-agent-team,它的 latest 停在 0.1.5-alpha.2,alpha 停在 0.2.2-alpha.3,真正的新版本在 next 里。

npm view <包名> dist-tags 三个标签一起看,别只看 latest。主包现在 latest 是对的,子包不是。

我的判断

这类版本值不值得跟?我的答案是跟,但不用急。

代码零变化意味着风险接近零,升不升都不会坏你的环境。真正的收益不在 dsh 本身,而在那些跟着转正的插件:ui-agent-team 这种跨版本线的包,只有在整条线一起转 rc 的时候才会被放出来。

反过来说,如果你手上有个跑得好好的 alpha.3,没有任何插件被禁,那这次不用动。等 0.2.2 正式版出来再一次性跟上,中间这几天不会有新功能给你。

你升级的时候会先看发布说明,还是直接拆包比一遍?