昨晚把本机的 DeepSeek Harness 从 0.2.1-rc.2 升到 0.2.2-alpha.2,16 秒装完。
有个前提得先说清楚。这个版本 npm 上还没更新到最新,直接装装出来的还是 0.2.1-rc.2,得手动把版本号写死才行。
npm install -g @deepseek-ai/[email protected]
少写这一段版本号,后面说的所有东西你都看不到。
启动之后,问题来了。日志里连着刷了三行 disabling profile plugin row,我装的东西被拿掉了三个。
装的时候 npm 还提了个醒,五个包的 install scripts 被拦了,包括 node-pty 和 koffi 这两个原生模块。我盯着看了会儿,还是先启动试了,web 界面能开,模型列表能拉,暂时没看出影响。这条先记着,后面要是哪里不对再回头查。
升级完第一眼就撞上这三行
日志原文是这样的。
dsh: disabling profile plugin row "plugin-market":
Plugin @deepseek-ai/[email protected]
is incompatible with dsh 0.2.2-alpha.2:
requirements {"@deepseek-ai/dsh-plugin-manager":"0.2.1-rc.2",
"@deepseek-ai/dsh-settings":"0.2.1-rc.2",
"@deepseek-ai/dsh-tools":"0.2.1-rc.2",
"@deepseek-ai/dsh-typert-protocol":"0.2.1-rc.2"}
被禁的三个是 ui-agent-team、plugin-market、tool-plugin-market。后两个其实是同一个包,被两行不同的配置引用了。
关键在 requirements 那一串。它写的是 "0.2.1-rc.2",没有脱字符,没有波浪号,就是精确的四个版本号。而运行时的那四个内部包已经升到 0.2.2-alpha.2 了。
精确匹配失败,插件被拒载。DeepSeek Harness 的处理很干脆,不加载也不报错,只打一行警告继续跑下去。
这个设计其实是对的。让一个声明「我只在这些版本上测过」的插件硬跑在新 runtime 上,崩起来更难查。拒载比带病加载好。
只是对用户来说,代价是升个版本,装的东西消失,而且只是警告不是错误,很容易漏看。
连带塌方,插件市场读不到索引
我装过自定义插件索引,配置在 ~/.dsh/profiles/web/cordis.patch.yml 第 12 行,指向本地一个静态服务。
升级后点进 Plugins → Discover,红字一行:
Could not read the index sources.
旁边挂着个 Retry,点了还是这行。

排查时我先看的是那个静态服务,lsof -iTCP:3489 果然是空的,服务早就挂了。我以为这就是全部原因,把服务拉起来,curl 返回 200,3764 字节的 index.json 躺在那儿。
回浏览器点 Retry,同一行红字。
回浏览器点 Retry 还是那行红字,这才反应过来读索引这个动作本身就是 plugin-market 干的。索引源通了,读的人不在,页面照样空。
所以这里其实压着两层,表面是索引源没起,根因是读索引的插件被禁用了。
顺手踩到一个自己的坑,记一下。那个复现用的 serve.py 把访问日志硬编码到 /tmp/market/access.log,目录被我清过,不存在。每个请求一进来就抛异常,curl 返回的是 exit 52,空回复。把目录建出来,请求才恢复正常。
修它有官方开关,藏在报错文案里
那三行警告的末尾其实给了办法,说可以用 dsh plugin allow-version 这个命令,或者走插件管理器,给一个精确版本豁免。
我先敲了一遍帮助,DeepSeek Harness 的插件子命令说明里根本没提这个用法,只说剩余参数会转发给 pnpm。
直接试,用法自己跳出来了:
dsh: Error: usage: dsh plugin allow-version <package@version>
--dsh-version <exact> --accept-risk
按这个补全,两个插件各豁免一次:
$ dsh plugin --profile web allow-version \
"@deepseek-ai/[email protected]" \
--dsh-version 0.2.2-alpha.2 --accept-risk
dsh: allowed @deepseek-ai/[email protected] for DSH 0.2.2-alpha.2
豁免精确到包和版本,换个版本得重新给一次。重启 DeepSeek Harness 之后,那三行警告从日志里消失了,Discover 立刻能读到索引,两个插件正常列出来,分类和标签筛选也都在。

补一句,--accept-risk 这四个字是认真的。我这次运气好,插件跑起来没出事,但不保证。
新界面长什么样

插件页现在是 Installed 和 Discover 两栏。Installed 里分成上下两段。
上面一段叫 Built-in plugin settings,四条。Subagent 管递归深度、数量和模型。Web search 管 DeepSeek 搜索源的配置。Agent loop 控制 agent 怎么派发工具调用。Shell 限制单条命令能跑多久、能吐多少输出。
下面一段叫 Experimental plugins,五条,各带一个开关:
Agent teams 让 agent 把活拆给具名队友,共享一块任务板,再把结果报回来。
Voice input 用 SenseVoice 在本机转录,首次使用要先装依赖。
Custom plugin indexes 就是给 Plugins 加 Discover 那一栏的,从你加的索引源里浏览和安装。
Auto authorization review 是新增的审核模式,每次工具调用前先让模型对着你原本的要求过一遍,合规的批量放行。
Change requests & worktrees 追踪每个会话的变更请求和它的检查、评审结果,还能让新会话直接在 Git worktree 里起。
这五条里前两条默认开着,后三条默认关。
插件页上真变了的两处
绕完这一圈,回头看清这次升级到底给了什么。
插件详情页现在直接渲染包自带的 README。点进某个实验性插件,看到的是完整的文档,带 English 和中文切换、Summary、目录,往下还有一段叫 Use this package。
更有意思的是同一个页面把那个 bundle 拆成了 5 个 component 逐个列出来,每个一行,带图标、一句话说明、短名、完整包名,右边一个独立的开关。
比如 Change requests & worktrees 这个包,展开是五个部分。
Change requests、GitHub change requests、Session change requests、Worktree service、Change request panel。页面顶部写着 Components 5 total · 5 off。
底部还标了来源,Code source 是 Built in,当前版本 0.2.2-alpha.2。

这比过去那种「一个插件一个开关」清楚太多。一个 bundle 里各部分能查、能单独开关,装了什么不用去翻配置文件。
我的一点看法
这次经历最有意思的地方不是那个坑,而是它暴露的设计取舍。
精确版本锁让插件生态安全,代价是每次 runtime 升级都可能批量失效。alpha 和 rc 之间尤其明显,几个内部包一升,所有声明依赖它们的插件全部掉线。
DeepSeek Harness 给了豁免开关,但默认路径是拒载。它赌的是「宁可少加载,不要带病跑」。
对做插件的人,这意味着每跟一次 runtime 版本,都要重新发一次版本声明。对用插件的人,这意味着升级前得知道自己装了什么,不然升级后连哪里少了都未必看得出来。
DeepSeek 官方在 0.2.2-alpha.2 的发布说明里还写了一条,说插件热更新失败会尝试恢复旧版本。这个机制救的是运行中的更新,救不了启动前的版本检查,两套逻辑互不相干。
这版还列了几个我没验的:subagent_oar 能把独立任务交给本机的 Codex 或 Claude CLI 去跑,开发者工具那个统计插件能按轮次看上下文、缓存、模型和工具耗时。前者听着最有意思,但界面上没找到入口,估计要单独装,我没动。热更新失败回滚那条也一样,官方口径,我没构造出失败场景。
你升级工具链之前会先看一眼自己装了哪些插件吗?还是跟我一样,升完才发现东西没了。
参考资料
- DeepSeek Harness v0.2.2-alpha.2 发布说明:https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.2-alpha.2
- 本机实测环境:macOS arm64,DeepSeek Harness 由 0.2.1-rc.2 直升 0.2.2-alpha.2,npm 全局安装
