DeepSeek Harness (DSH) 插件 monorepo。用 pnpm workspace 聚合多个独立插件包,统一版本管理与 git 仓库管理。
dsh-plugins/
├── new-plugin.mjs ← 一键生成新插件包的脚手架
├── pnpm-workspace.yaml
├── package.json
└── packages/
├── cot-smart/ ← 现有插件(动态 CoT:按输入复杂度自动路由 off/high/max)
└── <你的新插件>/ ← 以后用脚手架生成
每个 packages/<name>/ 是一个独立的 DSH 插件包,自带:
package.json(DSH 插件标准结构,含dsh.bundle.patch)cordis.patch.yml(profile 组合入口)lib/index.js(插件逻辑)tools/(安全工具:disable/preflight/backup/rollback)README.md
# 1. 在 monorepo 根生成新插件包
cd C:\Users\Jupiter\projects\dsh-plugins
node new-plugin.mjs <your-plugin-name>
# 2. 安装依赖(链接 workspace + 装默认的 schemastery)
pnpm install
# 3. 编辑插件逻辑
# 打开 packages/<your-plugin-name>/lib/index.js,参照 packages/cot-smart 的写法实现你的功能
# 4. 装进 DSH profile
dsh plugin --profile web add link:C:\Users\Jupiter\projects\dsh-plugins\packages\<your-plugin-name>
# 5. 重启 dsh web 生效,然后提交
git add -A && git commit -m "add <your-plugin-name>"插件名用小写 kebab-case(如
my-smart)。脚手架会自动生成全套骨架并复制安全工具(路径已重连到新包)。
| 工具 | 命令 | 作用 |
|---|---|---|
| 🚑 急救禁用 | powershell -File tools\disable.ps1 |
该插件出错时,标记 disabled → dsh 跳过它正常启动 |
| 🔓 恢复启用 | powershell -File tools\enable.ps1 |
移除 disabled,插件恢复 |
| 🛡 改动前自检 | node tools\preflight.mjs |
改代码/配置后先验证(patch 数组 + 插件可导入 + Config 可解析),通过才重启 |
| 💾 备份/回滚 | powershell -File tools\backup.ps1 / tools\rollback.ps1 |
备份 profile + 插件,出问题一键还原(备份自动清理,默认保留 10 个) |
改动前 → tools\backup.ps1
重启前 → node tools\preflight.mjs (通过才重启)
启动失败 → tools\disable.ps1 → 重启(逃生) → 排查 → tools\enable.ps1 → 重启
彻底搞乱 → tools\rollback.ps1
DSH 是 fail-loud 设计:任何「已启用」的插件加载失败都会让
dsh web崩溃退出;只有disabled的插件失败是合法的。所以改插件务必"先自检、失败先 disable"。
每个插件包遵循 DSH 官方插件发布规范:
package.json必须声明"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }(否则loadProfilefail-loud)。- 发布元数据:
repository(git 地址 + directory)、engines.node >= 20、publishConfig.access: "public"。 exports含.、./invariant、./package.json三个入口。- 每个包带
lib/invariant.js(invariant companion):导出name/inject: ["invariants"]/apply,调用ctx.invariants.register(包名, installer)。纯逻辑包用空 installer 并注释说明原因(见@deepseek-ai/dsh-invariants)。 - 插件配置用
@deepseek-ai/schemastery(不是 Zod:字段默认可选,无.optional())。
plugins.json 是插件市场清单(字段对齐 awesome-dsh-plugin / dsh-plugin-hub),由脚本自动生成,勿手改:
node generate-plugins-index.mjs # 聚合各 packages/*/package.json -> plugins.json- 每个包的
dsh.market可声明author/category/modes,用于市场展示。 - CI 会校验
plugins.json是否最新(防止手改漂移)。
pnpm -r check # 每个包跑 preflight 自检 + node:test 单元测试- 单测用 Node 内置
node:test(零依赖),放在packages/<name>/test/。 - 脚手架生成的包
check脚本默认可用;写好逻辑后补测试用例即可。
- check(
.github/workflows/check.yml):push/PR 时跑pnpm -r check+ 校验 plugins.json 一致。 - publish(
.github/workflows/publish.yml):打<包名>@<版本>tag 时发布对应包到 npm(需配NPM_TOKENsecret)。
发布一个包:
git tag dsh-cot-smart@1.1.0 && git push origin dsh-cot-smart@1.1.0
# CI 自动跑 check 后 npm publishpnpm install # 安装所有 workspace 包依赖
pnpm -r build # 若有构建脚本则批量构建(当前插件无构建步骤)- 插件运行时不借用 profile 的 node_modules——每个包必须自带依赖(脚手架已在 package.json 默认带上它 import 的包)。
- 改插件
lib/index.js需要重启dsh web生效(HMR 不热重载 link 外部源码;只有 profile 的cordis.patch.yml配置会热重载)。 - 插件配置用
@deepseek-ai/schemastery,不是 Zod(无.optional(),字段默认可选)。