DeepSeek Harness 插件市场误报兼容?engines.dsh 与 peerDependencies
插件只在 peerDependencies 里声明支持范围,市场却对从旧版到未来大版本一律显示兼容,这是市场侧的数据源缺了一截,不是你的范围写错了。 据讨论 #9907,compatibilityOf() 只从索引条目的 engines.dsh 构造 manifest,而索引校验把 engines 设为可选并在缺失时填 {},于是「没有要求」被评估成「任意版本都兼容」。安装前的 preflight 反而会拒绝,形成列表与安装结论相反的现象;在 DSH 插件市场 里遇到这种标记,按下面的顺序排查。
DeepSeek Harness 插件市场说兼容,安装却说版本不满足
同一份插件,在市场和安装器里得到相反结论,说明两边读的不是同一份声明。 先把两边的输入摆出来:
- 市场列表读取索引条目,预期字段只有版本、发布时间、来源和
engines。 - 安装器读取包 manifest,预期同时看
engines.dsh与peerDependencies。 - 条目缺
engines.dsh时,市场拿到的是没有要求的 manifest,预期返回compatible: true。 - 安装器按
peerDependencies算出真实范围,预期运行时不在范围内就整批拒绝。
DeepSeek Harness 断点:compatibilityOf 只拿到 engines.dsh
据讨论中社区核对源码,断点不在评估器,而在传给评估器的 manifest。 版本兼容的判定口径可以对照 DSH 插件版本兼容 看,这里只留四步:
compatibilityOf()从索引条目拼出{ name, version },预期只有engines.dsh存在时才补上engines。- 索引校验器把
engines当可选字段,缺失时填{},预期类型注释也写明「缺省表示任意版本」。 - 兼容性评估器看到没有任何要求,预期返回
undefined,外层翻译成compatible: true。 - 于是只有
peerDependencies的包,预期在市场里永远显示绿色,包括低于声明下限和任意未来大版本。
DeepSeek Harness 市场误报影响谁
错误的绿色标记影响的是选择阶段,而不是安装结果。 三类场景最明显:
- 插件只在 peers 里声明多段范围时,预期市场对所有运行时都显示兼容。
- 用户当前版本低于声明下限时仍看到绿色,预期点安装才被拒。
- 未来大版本发布后,预期同一插件仍显示兼容,即使作者从未适配。
- 第三方索引省略
engines时,预期市场无法区分「没有要求」和「没有写」。 - 用户把绿色标记当成承诺去选版本,预期装完才发现运行时不受支持,问题被推迟到运行期。
DSH插件修法:engines 必填、回退 peers 还是 preflight
三条路都能让兼容标记和真实范围对齐,差别在治格式、治读取,还是只把结论提前到选择阶段。 取舍可以按四点判断,再决定改哪一层:
- 必填方案只改校验与生成约定,读取侧代码不动,预期评审面更小。
- 回退方案要同时改索引类型、生成器与市场,预期任何一侧漏改都会继续误报。
- 必填方案会让旧索引在升级后校验失败,预期发布方需要补数据。
- 回退方案能兼容已有索引,预期会引入第二个解析器,范围折叠结果可能不一致。
- 无论选哪条,预期索引条目和 manifest 最终使用同一份范围,标记与安装器不会再冲突。
路径一:索引格式要求 engines 必填
这是修复面最小、语义最一致的做法:让索引条目必须携带解析后的 engines.dsh,缺了就校验失败。 生成器本来就会从 peers 折叠出范围,把校验对齐即可。
- 在索引 schema 里把
engines从可选改为必填,engines.dsh同样必填且非空,预期缺字段的条目被拒绝。 - 让生成器继续按现有逻辑解析
peerDependencies,多段范围逐段求交并去重,预期输出是解析后的范围。 - 同步更新格式说明,删掉与实现矛盾的「engines 可选」和「没有 peer 回退」表述,预期文档与校验器一致。
- 对手写或第三方索引,在发布流程里加一次校验,预期缺字段的条目无法入库。
- 预期结果:条目不可能再隐式表示「任意版本」,
compatible: true只在范围真的满足时出现。
路径二:市场侧回退读 peerDependencies
如果索引短期无法改格式,可以让市场在 engines.dsh 缺失时改用 peers 评估,但要接受多一个解析器。 据讨论回复,这条路的代价是生成器与读取侧各有一套范围解析,容易漂移。
- 在索引版本类型里增加可选的
peerDependencies字段,并让生成器原样带上,预期生成器能输出 peers 范围。 - 在
compatibilityOf()里先看engines.dsh,缺失时再用 peers 构造 manifest,预期两种来源都能产出 manifest。 - 把范围解析抽成共享实现,生成器与市场都调用同一个函数,预期只有一套解析逻辑。
- 给
MarketCompatibility.requirements增加来源标记,说明范围来自 engines 还是 peers,预期诊断信息能指出来源。 - 预期结果:只在 peers 声明范围的插件也能得到正确的兼容结论,诊断信息不再指向作者 manifest 里不存在的字段。
路径三:安装期 preflight 兜底提示
前两条修的是展示,这一条保证即使展示错了,用户也能在点安装前看到真实原因。 安装器本来就会拒绝,缺的是把结论提前到选择阶段。
- 在市场详情页加载时,用完整 manifest 调一次与安装器相同的评估函数,预期详情页拿到完整 manifest 的结论。
- 不兼容时把安装按钮改为不可用,并显示所需范围与当前运行时版本,预期按钮被禁用。
- 用户仍然尝试安装时,把 preflight 的拒绝原因原样展示,预期用户看到真实原因而不是一句失败。
- 记录评估用的是
engines.dsh还是peerDependencies,并缓存到详情页,预期重复点击不重新计算。 - 预期结果:安装不会再出现「看起来能装、点下去整批失败」的落差。
DeepSeek Harness 兼容标记的验证:三个运行时版本
至少用低于下限、范围内、未来大版本三个运行时各测一次,才能确认标记不再无条件为真。 验证顺序如下:
- 选一个只在 peers 声明范围的插件,先确认索引条目里有没有
engines.dsh,预期你知道条目带的是哪种来源。 - 在低于声明下限的运行时打开详情页,预期显示不兼容而不是绿色。
- 在声明范围内的运行时打开,预期显示兼容。
- 用一个高于所有声明段的版本再测,预期不兼容。
- 点一次安装,预期 preflight 结论与页面标记一致。
DeepSeek Harness 作者与用户各自该怎么做
作者不要把市场标记当承诺,用户也不要把绿色标记当保证。 两边各有一条可执行的检查:
- 作者在 manifest 里同时写
engines.dsh与peerDependencies,预期不同读取方都能拿到范围。 - 作者发布后打开索引条目,确认
engines字段存在且范围是解析后的结果,预期条目不再缺字段。 - 作者在发布说明里写清实际适配的运行时区间,预期读者不只能看到市场的绿色标记。
- 用户装前先在终端执行一次
dsh plugin add的 dry-run 或查看安装器提示,预期能看到真实范围。 - 用户遇到列表与安装结论冲突时,以安装器为准,并把索引条目缺失
engines的情况反馈给市场,预期冲突只可能来自索引本身没更新。
来源:Discussion #9907。
常见问题
DeepSeek Harness 里安装判断是对的,市场展示错了。据讨论 #9907,市场只用索引条目的 engines.dsh 评估兼容,条目里没有这个字段就当成「任意版本」;安装前的 preflight 则会取 name、version、engines、peerDependencies 一起评估,不满足就整批拒绝。两边数据源不同,所以出现列表说兼容、安装被拒。
DeepSeek Harness 的市场索引里有没有这个范围,取决于索引由谁生成。参考生成器会解析 peerDependencies 并折叠成 engines.dsh,所以官方生成的条目带着范围;手写或第三方索引则可能省略 engines,而校验器把 engines 设为可选并填 {},省略就被解释成任意版本。先看条目的 engines 字段即可分辨。
DeepSeek Harness 市场索引的版本类型里根本没有 peerDependencies,硬加会引入第二个范围解析器。据讨论回复,生成器已经做了一次范围折叠,读取侧再做一次容易产生漂移;更稳的做法是让索引必须携带解析好的 engines.dsh,或在改动格式时让两侧共用同一个解析实现。
DeepSeek Harness 的问题是选择器和信任问题,不是安装漏洞。用户看到兼容标记才会决定安装,点下去却被整批拒绝,体验和信任都会受损;同时本该被隐藏的版本仍然出现在列表里。preflight 兜底只能防止装错,不能替代兼容标记本身正确。
相关术语
- compatibilityOf()
- compatibilityOf 是插件市场用来判断某个已发布版本能否在当前 DSH 运行时使用的函数。它从索引条目构造 manifest,只填 name、version 与可选的 engines.dsh,再交给兼容性评估器。— https://github.com/deepseek-ai/deepseek-harness/discussions/9907
- engines.dsh
- engines.dsh 是插件 manifest 中声明所需 DSH 版本范围的字段。市场索引条目沿用它作为唯一兼容性来源,缺失时会被当成没有版本要求。— https://github.com/deepseek-ai/deepseek-harness/discussions/9907
- peerDependencies
- peerDependencies 是 npm manifest 中声明宿主依赖范围的字段,也是 DSH 文档里 engines.dsh 缺失时的回退来源。它可以表达带上下界的多段范围。— https://github.com/deepseek-ai/deepseek-harness/discussions/9907
- preflight(安装前校验)
- preflight 是 DSH 在真正调用包管理器之前执行的兼容性与依赖检查。它读取完整 manifest,不满足要求时整批拒绝安装,而不是装完再回滚。— https://github.com/deepseek-ai/deepseek-harness/discussions/9907