DeepSeek Harness 安装报 ERESOLVE?DSH plugin npm latest 冻结排查
DeepSeek Harness 装插件报 ERESOLVE unable to resolve dependency tree 或 ERR_PNPM_FETCH_404,根因几乎都在官方包族的 npm dist-tag:绝大多数 @deepseek-ai/dsh-* 包的 latest 冻结在首次公开发布版 0.0.1-rc.1,而这条旧线的 peer 元数据引用了改名前的死包名(npm 上 404)。 解析器一旦走到这条线,就同时拿到两条版本线或直接 404。避开的办法是把整个包族钉在同一条当前版本线上,并对已建好的 profile 用 pnpm.overrides 兜底。
DeepSeek Harness 安装报错长什么样:三种形态
同一个根因在三种入口下表现为三种报错,先认出形态再动手,能省掉大半试错。 社区实测记录(#2763、#984):
- ERESOLVE 版本树冲突:全新项目里裸装
@deepseek-ai/dsh-agent-spine-demo等包,报npm error ERESOLVE unable to resolve dependency tree,明细里能看到peer @deepseek-ai/dsh-bash-env@"^0.0.1-rc.1" from @deepseek-ai/[email protected]——即旧 line 的 peer 声明;而@deepseek-ai/dsh-bash-env在 npm 上根本不存在(npm view返回 404)。 - pnpm 直接 404:
ERR_PNPM_FETCH_404 GET https://registry.npmjs.org/@deepseek-ai%2Fdsh-type-meta: Not Found。缺的是dsh-type-meta,它由dsh-tools/dsh-session的 peer 链间接拉取;@deepseek-ai/dsh-tasks、@deepseek-ai/[email protected]也是同一形态。 - 装到老版本误以为包不存在:
dsh plugin --profile <name> add @deepseek-ai/dsh-base装到的是latest解析出的0.0.1-rc.1,随后报「没公开 / 不存在」——包是有的,只是latest指错了地方。
一个关键的判别信号:npm install 能过、pnpm 必挂。npm 走宽松解析,pnpm 默认严格解析 peer 范围并重解析整棵依赖树,所以同一个仓库用不同包管理器会给出完全相反的结论。对 DSH插件 和 DeepSeek插件 的安装脚本而言,这个信号同样成立。
DSH plugin 安装中为什么 npm latest 会冻结在 rc 线:dist-tag 与发布链机制
latest 不是「最新版本」,而是一个可以长期不动的标签;官方发布脚本对 prerelease 从不推进 latest,只把它们挂到 alpha / next,于是 latest 就一直停在早期 rc 线。 拆开看两层机制:
- 标签层:
latest与next/alpha指向哪个版本,需要显式操作(npm dist-tag add)才会变(npm 文档)。实测抽查 13 个包时,dsh-agent-spine-demo/dsh-tool-bash/dsh-llm/dsh-session等的latest都是0.0.1-rc.1,只有dsh-agent、dsh-app-boot例外,next则统一指向当前线——包族内部不一致,裸装自然混线。 - 元数据层:
0.0.1-rc.1这条线的 peer 范围按改名前的包名书写(dsh-bash→dsh-shell、dsh-tasks→dsh-jobs、dsh-bash-env→dsh-shell-env),这些旧名在 npm 上从未发布,404 不可避免;作为对照,当前线的元数据本身是正确的,问题只在latest指向哪里。 - pnpm 版本差异放大了它:profile 的
autoInstallPeers: false写在pnpm-workspace.yaml,而该 key 只在 pnpm ≥10 生效,pnpm 9.x 只从.npmrc读,于是被静默忽略,pnpm 回退到自动安装 peers,把整棵 peer 树(含 404 包名)都拉一遍(#984 机制补充)。 - 发布节奏造成的时差是另一面:
npm publish先于 release 分支合入 tag,会出现「npm 上有包、GitHub 看不到对应dsh-v*tag」的窗口;latest冻结在 rc 线期间,npm i -g @deepseek-ai/dsh装到的版本也会与仓库代码相差两条线(#5417)。
DSH plugin 怎么对齐 npm tag 安装:钉同一条线、@alpha 与 pnpm.overrides
核心做法只有一句:先查清 tag,再把「整个包族」钉在同一条线上,不要依赖默认解析。 社区已验证的步骤:
- 查 tag:
npm view @deepseek-ai/dsh-tools dist-tags,把latest/next/alpha各自指向的版本看清楚;npm view <包名> version只会报告latest那条线,容易误判。 - 全族统一钉线:在项目的
package.json里把用到的@deepseek-ai/*全部写成同一条当前线(实测^0.1.0-rc.6一版全新项目解析出 81 个包、正常安装并跑通含工具调用的完整回合)。只钉其中几个包、其余留给默认解析,仍旧混线。 - 按需选线:想跟官方开发线就装
@alpha(实测窗口内@deepseek-ai/dsh@alpha=0.1.2-alpha.5),想稳就接受latest的 rc 线;要与仓库代码一一对应,以 GitHub 的dsh-v*tag 为基准,alpha可能领先半天到一天。 - 已建 profile 不必重建:在 profile 的
pnpm.overrides里为卡住的那个包指定可用版本即可。实测案例:[email protected]声明@deepseek-ai/dsh-tool-subagent": "*","*"被解析到0.0.1-rc.1、进而拉出 404 的dsh-tasks;覆写为0.1.0-rc.6(第一个去掉该 peer 的版本)后安装恢复。 - 插件走本地安装也能绕开:
dsh plugin --profile <name> add .从本地 checkout 安装时,@deepseek-ai/*由 harness 安装目录的 fallbacknode_modules解析,缺失的 peer 根本不需要下载(#984);插件依赖安装的其它失败形态另见 插件依赖安装失败排查。 - 长期解法在官方:一次性把包族所有
latest对齐当前线(或与next一致)即可消除绝大部分默认安装失败;社区量化口径是 325 个 npm 可装插件中 160 个受影响、全族 tag 对齐后可恢复 100 个。给插件市场提安装入口时,用 DSH Plugin Hub「设置 → 插件市场」装插件更稳——它安装失败会回滚 manifest,profile 不被污染,只是被卡住。
版本漂移还会引出另一类症状(装到旧版核心包导致工具调用崩溃 reading 'prepare'),机制与本文相关但不是同一件事:核心包版本漂移排查。
DSH plugin 排查注意事项
别拿 latest 当「当前版本」,也别只钉一部分包——混线比落后更危险。 五条要点:
- 不要用
npm install @deepseek-ai/dsh-*@latest判断「当前版本」,latest可能落后两条线;npm view <包名> dist-tags才是完整视图。 - 混线比落后更危险:只钉部分包会同时装到两条线的 peer 范围,冲突是必然而非偶发。
- 404 包名不要试图强行安装:
dsh-type-meta、dsh-tasks、dsh-bash-env等是改名前的历史名,npm 上没有对应实体,只能等发布链补齐或换成当前名的包。 pnpm.overrides属临时措施:它让当前 profile 能用,但不会修好上游元数据;官方 tag 对齐后建议移除,避免长期钉住旧版本。- 安装失败后先确认 profile 未被写坏:pnpm 会在失败时中止整棵树,社区实测插件市场会回滚 manifest,但自行手工编辑过 profile 的话,装完先开一个全新会话验证工具调用是否正常。

来源:Discussion #2763、Discussion #984、Discussion #5417、npm dist-tag 文档。
常见问题
DeepSeek Harness 装插件报 ERESOLVE 的根因,是官方包族的 npm latest dist-tag 不一致:多数包停在首次公开发布版 0.0.1-rc.1,少数包(如 dsh-agent、dsh-app-boot)已是当前线,裸装或按 npm view 报告的 latest 钉 ^ 范围时会同时装到两条版本线,两线的 peer 范围互不兼容,必然 ERESOLVE(来源:Discussion #2763)。
在 DeepSeek Harness 里,这些包名是改名前(dsh-bash → dsh-shell、dsh-tasks → dsh-jobs、dsh-bash-env → dsh-shell-env)的历史名字,npm 上从未存在,返回 404。它们由 latest 线上的包通过 peer 链间接引用,所以只要解析器走到这条线就必然 404;临时可改从本地 checkout 安装(dsh plugin --profile <name> add .),或等官方审计发布链补齐(来源:Discussion #984)。
在 DSH plugin 安装场景里,pnpm 默认严格解析 peer 范围并会重解析整棵依赖树,范围指向 404 包名即中断;而 initProfile 生成的 autoInstallPeers: false 写在 pnpm-workspace.yaml 里,该 key 只在 pnpm ≥10 生效,pnpm 9.x 只从 .npmrc 读取,于是被静默忽略、回退到自动安装 peers(来源:Discussion #984)。
DeepSeek Harness 插件安装对齐 npm tag 的做法,是先用 npm view <包名> dist-tags 查出 latest / next / alpha 各指向哪个版本,再把整个包族钉在同一条线上(例如 ^0.1.0-rc.6 或 rc.7,实测可干净安装 81 个包);追开发线装 @alpha,追稳定线接受 latest。已建好的 profile 可在 pnpm.overrides 里为出问题的包指定可用版本,不必重建 profile(来源:Discussion #5417)。
相关术语
- dist-tag(分发标签)
- dist-tag 是 npm 上指向某个具体版本的可读别名,默认有 latest、next 等;不带版本号安装时按 latest 解析,因此 latest 指向哪条线决定了用户裸装装到什么。— https://docs.npmjs.com/cli/v10/commands/npm-dist-tag
- prerelease(预发布版本)
- prerelease 是形如 0.0.1-rc.1、0.1.2-alpha.5 的版本号,semver 中排序低于同号正式版;发布脚本常只把 prerelease 挂到 alpha/next 标签、不推进 latest。— https://docs.npmjs.com/cli/v10/commands/npm-dist-tag
- peer dependency(同层依赖)
- peer dependency 是期望由上层安装者提供、不由本包直接落盘的依赖声明;pnpm 会校验 peer 范围,若范围指向 npm 上不存在的包名,安装直接报 404。— https://github.com/deepseek-ai/deepseek-harness/discussions/2763
来源
- deepseek-harness Discussion #2763:包族 npm dist-tag latest 不一致,全新项目按默认版本安装必然 ERESOLVE· deepseek-ai(GitHub Discussions)
- deepseek-harness Discussion #984:dsh-type-meta 未发布到 npm,阻塞 pnpm 安装与社区插件开发· deepseek-ai(GitHub Discussions)
- deepseek-harness Discussion #5417:npm 发布与代码仓库不一致· deepseek-ai(GitHub Discussions)
- npm Docs:npm-dist-tag(dist-tag 的读写与语义)· npm Docs