DSH Plugin Slice Bench

August 30, 2026 · View on GitHub

DSH 插件的版本兼容检测工具与 agent skill,结论由 DSH 自己的启动审计给出。

DSH(DeepSeek Harness) 是「一切皆插件」的 agent harness。换一个 harness 版本,插件可能就加载不起来。本仓库把插件单独放进一棵最小的 Cordis 树里启动,用启动审计的结论回答「这一版还能不能加载」。

特色

  • 不内置「哪些 API 变了」的结论清单 — 那种清单会过期。换一个版本重新运行,得到的就是那一版的结论。仓库里的 baselines/ 是工具运行的结果,为了展示程序效果(不是只能跑特定版本)
  • 逐个插件隔离启动 — 每个插件单独放进空的 Cordis 树,缺哪个服务由启动审计点名。不修改源码,不打补丁
  • 区分「通过」与「绿但没测全」 — 启动审计只审配置里列出的条目,看不见条目内部用 ctx.inject([...], cb) 建的可选依赖:那段回调可以一直等下去,而整棵树照报通过。本工具把这些等待单独列出并给出退出码 3,因为它正是下一个版本把该依赖变成必需时会崩的地方
  • 结论不经过模型判断 — 判定来自启动审计。同一版本连跑两次,全部包的启动状态、依赖集合、服务调用记录逐条比对,零差异
  • 零依赖、零密钥 — 只需 Node 20。不读取凭据,不发起网络请求,不修改 ~/.dsh;每次运行使用临时目录,结束即删除

快速开始

# 目标版本安装到独立目录
mkdir dsh-0.1.2 && cd dsh-0.1.2 && npm init -y
npm install @deepseek-ai/dsh@0.1.2-alpha.2 @deepseek-ai/dsh-base@0.1.2-alpha.2 @deepseek-ai/dsh-web-app@0.1.2-alpha.2
cd ..

git clone https://github.com/33moren33/dsh-slice-bench.git
cd dsh-slice-bench/skills/dsh-slice-bench   # 命令在这一层,不在仓库根

# 一、插件声明的 SDK 包在新版本是否存在(不启动,秒级)
node bin/manifest.js --engine ../../../dsh-0.1.2 --plugin ../../../你的插件

# 二、加载并运行一个回合,新旧版本各一次
node bin/talk.js --engine ../../../dsh-0.1.1 --plugin ../../../你的插件
node bin/talk.js --engine ../../../dsh-0.1.2 --plugin ../../../你的插件

# 三、插件自带 cordis.patch.yml 时,那棵树必须单独测——上一步测不到它
node bin/slice.js --engine ../../../dsh-0.1.1 --plugin ../../../你的插件
node bin/slice.js --engine ../../../dsh-0.1.2 --plugin ../../../你的插件

# 四、启动审计说「等某个服务」时,问谁提供它、以及它这一版要哪些服务
node bin/provider.js --engine ../../../dsh-0.1.2 --service <服务>
node bin/provider.js --engine ../../../dsh-0.1.2 --package <>

退出码有四档0 通过/1 被测对象判定为失败/2 没能给出答案(引擎路径错、参数错,或本工具自己出错)/3 跑起来了但结论不完整3 不是失败也不是通过,屏幕上的绿灯之下还有没测到的部分。

12 的分工是这套工具的地基:1 才是关于被测插件的结论,2 是本工具没能给出结论。每条命令 --help 会印出这四档的完整措辞。

已发布的插件先装到一个空目录:npm install <包名> --legacy-peer-deps --omit=peer(第三方插件用 peerDependencies 声明宿主 SDK,直接装会拖来整棵 SDK 并覆盖被测版本),然后把 node_modules/<包名>/ 交给 --plugin

⚠️ --omit=peer 只挡 peer 那一类。插件若把某个 SDK 包写在真 dependencies 里,它照样会被装进来,node_modules/@deepseek-ai/ 仍会出现——这不影响结论--plugin 会在搭临时环境时剔掉插件自带的这些副本,测的仍是 --engine 指的那一份。

--engine 支持两种形态:npm 安装目录,或包含 pnpm-workspace.yaml 的源码检出。

装成 skill

skills CLI(推荐)

npx skills add 33moren33/dsh-slice-bench

Claude Code

/plugin marketplace add 33moren33/dsh-slice-bench
/plugin install dsh-slice-bench

本地开发模式:

git clone https://github.com/33moren33/dsh-slice-bench.git
claude --plugin-dir /path/to/dsh-slice-bench

Codex

codex plugin add 33moren33/dsh-slice-bench

Gemini CLI

gemini skills install https://github.com/33moren33/dsh-slice-bench.git --path skills

Cursor

git clone https://github.com/33moren33/dsh-slice-bench.git
cp -r dsh-slice-bench/skills/* .cursor/skills/

DSH 本体

skills/dsh-slice-bench/ 复制到项目的 .agents/skills/,或让 Skill provider 加载本仓库的 skills/ 目录。该目录是自足的,包含 skill 与它调用的全部命令。

Skill 索引

Skill说明版本覆盖
dsh-slice-bench三种模式(兼容体检/升级后回归/版本差异)、每步执行什么、输出如何判读、报告格式;细节在 references/ 按需加载任意两个版本之间

命令

命令位于 skills/dsh-slice-bench/,相对路径以该目录为工作目录。

命令用途
bin/manifest.js插件声明的 SDK 包(含自带组合补丁里的)在目标版本是否存在
bin/talk.js加载插件并运行一个对话回合:能否启动、回合是否完成、有无异常
bin/provider.js某个服务由哪个包提供(声明与运行时确认分开报);某个包在这一版是否还在、官方 bundle 给它的条目 id 与 config、它要求哪些服务
bin/flow.js单个包隔离启动,记录它对每个服务的属性访问与方法调用
bin/survey.js逐包隔离启动,统计能否独立激活
bin/closure.js不动点迭代,求每个包能够启动的最小包集合
bin/bundles.js从官方 bundle 提取条目与 config,建立索引
bin/slice.js指定若干包、或直接用插件自带的 cordis.patch.yml 组成一棵树并启动
matrix/run.js同一份会话产物,新旧版本能否互相读取

官方函数

本工具不依赖任何官方插件包(package.json 无 dependencies),运行时从被测版本解析下列接口,逻辑写在本工具内。

接口来源用途
boot(name, configPath)@deepseek-ai/dsh-app-boot由一份条目清单启动完整的树,不经过 profile 机制
assertEntriesActivated / assertEntriesLoaded同上判定来源:点名未激活的条目及其等待的服务
loadOverlayPatches同上解析 bundle 的 cordis.patch.yml
installFailLoud同上使静默失败显式化
ctx.registry / ctx.reflect / fiber.state@deepseek-ai/cordis遍历运行实例、读取服务表
ctx.reflect.provide(name, value)同上记录用的桩服务由它注册
isolate基座原语,cordis.yml 声明式配置使桩服务优先于真实服务被解析

实现思路参考官方文档与源码:教程第 6 章「组合与 HMR」的 diagnose.ts 示例(遍历插件注册表定位 PENDING 实例)、第 3 章「服务」(插件如何提供服务)、同第 6 章的服务隔离声明;以及官方自省工具按 Symbol 枚举服务、官方沙箱包装注入服务的写法。条目与 config 一律取自各 bundle 随包发布的 cordis.patch.yml

模型适配器:对话用的是一个 22 行的确定性适配器(移植自官方测试夹具),不使用官方 dsh-llm-replay——后者属于 test-support,不在安装集内,基于它的工具无法在用户实际安装的版本上运行。

基线

条目索引存入 skills/dsh-slice-bench/baselines/,下一个版本可直接 diff。逐包服务调用记录体积较大,作为 Release 附件提供。

版本形态包数条目索引服务调用记录
0.1.1-rc.2npm 安装197仓库内Release
0.1.2-alpha.1源码检出263仓库内
0.1.2-alpha.2npm 安装224仓库内Release

⛔ **这三份不能随便互相 diff。**源码检出含仓库里全部的包(包括没发布的),npm 安装只含装得到的,两者比「包在不在」两个方向都会错。上面 0.1.1-rc.2 → 0.1.2-alpha.2 那组结论之所以成立,是因为两边同为 npm 安装。⚠️ 0.1.2-alpha.1 没有发布到 npm,所以它只有源码检出这一种形态。工具在做这种比较时会自己把「包在不在」降进「判不了」那一档。

0.1.1-rc.20.1.2-alpha.2 的运行结果:移除 2 个包;21 处依赖声明变化,其中 17 个包将 sessionProjections 从作用域注入改为条目级 inject.d.ts 未变化,导出 diff 无法发现);会话日志存储形式变化而格式版本号未变。

适用范围

已在 0.1.1-rc.20.1.2-alpha.2(均为 npm 安装)与 0.1.2-alpha.1(源码检出)上运行;测试样本包含 npm 上的 5 个第三方插件。

当前限制:浏览器侧只检查声明的包名,不检查实际加载;服务调用记录覆盖启动阶段;已验证平台为 Windows + Node 24。

目录

skills/dsh-slice-bench/           自足的 skill,复制这一个目录即可使用
├── SKILL.md                      agent 操作规程
├── references/                   命令详解、方法说明
├── bin/                          命令
├── lib/                          引擎识别、临时环境、驱动
├── workload/                     对话组合、模型适配器、桩服务
├── matrix/                       跨版本产物检查
└── baselines/                    各版本条目索引

参考资源

License

MIT