DSH plugin 装了不激活:dsh.bundle 清单缺失与 inject 报错的原因与解决
DSH plugin 装了不激活,是两类声明缺失:包没有 dsh.bundle 清单(dsh plugin add 只当普通依赖装、永远不加载),或插件源码缺 inject 声明(运行时拿不到宿主注入、报 cannot get property ... without inject)。 前者需要作者补清单,后者是插件 bug;用户侧最快的办法是先回 DSH Plugin Hub 换已发布版本。
DSH plugin 装了不激活:两个报错原文与现象
现象是「装得上、激活不了」:dsh plugin add 退出码正常、包在依赖列表里,但插件能力完全不生效,或加载时报 without inject。 两段报错(来源):
- 装了不激活:终端提示包「作为普通依赖安装、不是 profile 层」(
declares no dsh.bundle — installed as a plain dependency),功能不出现——包没声明dsh.bundle,插件市场/宿主不把它当插件加载; cannot get property "systemPrompt" without inject:插件代码在声明依赖之前就读取systemPrompt等服务,Cordis 反射层直接抛错(源码);- 判断:前者是包格式问题(缺清单),后者是代码 bug(缺声明)——两者都让插件「装了等于没装」。
DSH plugin 不激活根因:缺 dsh.bundle 清单 + 缺 inject 声明
根因两条:一是包没有 dsh.bundle 清单,装进宿主必须声明配置层;二是插件源码读取服务前没声明 inject,运行时拿不到宿主注入。 展开说:
- 缺清单装不上层:官方插件发布文档定义——组合包(bundle)必须在 package.json 声明
dsh.bundle并携带cordis.patch.yml;没有dsh.bundle声明的包可以安装,但只作为普通依赖、不激活任何层(来源); - 缺 inject 拿不到服务:Cordis 要求插件先声明再用——代码调
ctx.systemPrompt却没写inject: ["systemPrompt"],反射层找不到注入即抛without inject(源码); - 两者都不是用户能修的:前者要作者改包声明重新发布,后者要作者改源码。
解决 DSH plugin 不激活(作者侧):补 bundle 清单 → 加 inject 声明 → 重装验证
如果你是插件作者:按「补清单 → 加声明 → 重装验证」修;如果你是用户:跳到第 4 节换已发布版。 作者侧步骤:
- 补 dsh.bundle 清单——在插件包内新建
cordis.patch.yml,定义要插入/覆盖的插件配置行;在package.json里声明引用:重新构建并发布;json{ "dsh": { "bundle": { "patch": "cordis.patch.yml" } } }dsh plugin add识别到dsh.bundle声明后才会把包追加进 profile 的 bundles 层(来源); - 加 inject 声明——找到读取
ctx.systemPrompt(或其他服务)的代码,在插件配置里声明依赖:或等价的yamlinject: ["systemPrompt"]ctx.inject()写法,保证先声明再使用(来源); - 重装验证——
dsh plugin --profile web remove <包名>后重新add,重启宿主,确认插件层已激活、不再报without inject。
用户侧:DSH plugin 装不活先回 DSH Plugin Hub 换已发布版
用户侧无法替作者补清单——先回 DSH Plugin Hub 插件市场换官方或已发布的版本,同时把报错反馈给作者。 步骤:
- 打开「设置 → 插件市场」(即 DSH Plugin Hub),搜索同一个插件名,看是否有已发布的官方/验证版本;
- 有就卸载当前 git 源安装的版本、改装 Hub 里的已发布版——Hub 收录的插件经过验证,缺失声明的问题更少;
- 把
declares no dsh.bundle或cannot get property ... without inject原样反馈给插件作者,附上你的 dsh 版本与安装命令; - 装不活且 Hub 也没有替代版时,先禁用该插件避免影响其他功能,等作者修复。
DSH plugin 修复后怎么验证?层激活、注入声明与能力三查
修复后用三查确认:插件真的进了 bundle 层、without inject 不再出现、插件能力在界面上生效——三查全过才算激活。 按顺序执行:
-
查插件在已安装列表:
bashdsh plugin --profile web list列表里出现包名说明已装进当前 profile;没出现说明安装没完成,回上节重装。
-
查 bundle 声明(作者侧自验)——确认插件
package.json里 dsh 声明指向补丁文件:bashgrep -A3 '"dsh"' <插件目录>/package.json输出包含
bundle.patch且指向cordis.patch.yml即清单完整;没有该段说明包还是缺dsh.bundle。 -
重启宿主看层激活:
bashdsh web启动日志里出现该插件的 bundle 层加载记录、不再报
cannot get property ... without inject,即声明问题已消除。 -
界面验证能力——Web UI 里该插件提供的命令/面板/配置项出现并可用,即真正激活。
-
运行观察收尾——持续使用一段时间不再弹
without inject类报错,修复闭环。
注意事项:DSH plugin 装了不激活先看 no dsh.bundle 提示
- 「装了不激活」先看终端有没有
no dsh.bundle提示——有就是缺清单,别反复重装。 without inject是插件 bug,别改宿主配置去绕——把报错发给作者最快。- 从 GitHub 源直接
git+https://...安装的包最容易缺声明,优先走 npm 分发的发布版。 - DSH Plugin Hub 的插件页会标注来源与版本,装前先看是不是验证过的发布版。
- 其他安装报错可参考安装报错排查。

常见问题
DSH plugin 装了不激活,最常见是包没有 dsh.bundle 清单:dsh plugin add 只会把它当普通依赖装上,永远不会加载——插件必须带 cordis.patch.yml 并在 package.json 声明 dsh.bundle.patch 才会作为配置层激活(来源)。
DSH plugin 报 without inject 是插件代码 bug:代码在声明依赖(inject)之前就读取了 systemPrompt 等服务,运行时拿不到宿主注入。报错由 Cordis 反射层抛出(源码),把这条报错原样发给插件作者即可。
补 DSH plugin 的 dsh.bundle 清单:在插件包内加 cordis.patch.yml(定义要插入/覆盖的插件配置行),并在 package.json 的 dsh.bundle.patch 字段指向它,然后重新构建发布;dsh plugin add 识别到 dsh.bundle 声明后才会把包追加进 profile 的 bundles 层(来源)。
DSH plugin 装了不激活时,用户侧最快是回 DSH Plugin Hub 换已发布版——用户侧无法替作者补清单,先回 DSH Plugin Hub 插件市场换官方或已发布的版本(Hub 收录的是验证过的插件),同时把报错反馈给作者;git 源安装的插件缺声明时尤其常见。
相关术语
- dsh.bundle
- dsh.bundle 是插件 package.json 中声明配置层的字段,指向一个 cordis.patch.yml 补丁文件;声明了它,dsh plugin add 才会把包作为 profile 层激活,否则只当普通依赖安装。— DeepSeek Harness 官方插件发布文档
- inject
- inject 是 Cordis 插件声明所需服务依赖的机制;插件代码访问 ctx.systemPrompt 等属性前必须先声明 inject: ["systemPrompt"],否则抛 cannot get property ... without inject。— DeepSeek Harness cordis 源码
- cordis.patch.yml
- cordis.patch.yml 是插件包内定义配置层内容的补丁文件,通过 package.json 的 dsh.bundle.patch 字段被 dsh.bundle 引用,用于插入或覆盖插件配置行。— DeepSeek Harness 官方插件发布文档
- 配置层(bundle layer)
- 配置层是 DSH 组合包(bundle)对 profile 的贡献形式:一个包通过 dsh.bundle 声明并携带补丁文件,安装后即成为 profile 的一个可激活层。— DeepSeek Harness 官方插件发布文档