前言¶
DSH(DeepSeek Harness)的理念是「一切皆插件」。但装插件这件事本身,现有流程是:把包放进 profile,手动编辑 cordis.patch.yml,重启服务器,然后对下一个插件重复这套动作。装两三个还好,插件一多,改的永远是同一份 YAML,走的永远是同一条重启流程。
下面介绍 dsh-plugin-manager。它把安装、启用/禁用、卸载收进 Web GUI、独立 CLI 和一条聊天命令里,全程不需要手改配置文件。
这是什么¶
dsh-plugin-manager 是一个用来管理 dsh 插件的 dsh 插件,由 OSSKn4w7 维护,npm 包名 @osskn4w7/dsh-plugin-manager,当前版本 0.1.2,MIT 许可证,源码在 GitHub 的 OSSKn4w7/dsh-plugin-manager 仓库。
它替你写 profile 的 cordis.patch.yml:改动写入一个分隔的自动托管块,你手写的补丁逐字节保留;运行中服务器的用户补丁监视器(HMR)会立即应用这些改动,所以多数操作不需要重启。
整个包由四部分组成:
| 组成 | 作用 |
|---|---|
lib/index.js |
宿主半部:/plugin-manager/api 下的 JSON API + /plugin 聊天命令 |
lib/client.js |
浏览器半部:Settings → Plugins 里的「插件管理」标签页 |
lib/core.mjs |
共享逻辑:cordis.patch.yml 的托管块编辑、pnpm 运行器、bundle 对账 |
bin/dsh-plugin-manager.mjs |
独立 CLI(服务器停止时也可用) |
核心功能¶
- 在 Settings → Plugins 内提供「插件管理」Web GUI 标签页
- 按 npm 包名安装插件,可附带可选的 JSON 配置
- 一键启用/禁用任意 loader 条目,实时生效,无需重启
- 卸载插件
- 查看组合后的完整 Loader 树、profile 的依赖与 bundles,以及管理器自身安装了哪些条目
- 自动维护
cordis.patch.yml中的分隔托管块,手写补丁逐字节保留 - 独立 CLI
dsh-plugin-manager,服务器停止时也能用 - 聊天命令
/plugin(list / enable / disable / install / remove) - 对声明了
dsh.bundle的插件,自动把名字同步进package.json的dsh.profile.bundles,并报告needsRestart - 提供
/plugin-manager/api下的 JSON HTTP API
安装¶
前置要求:PATH 里有 pnpm;一个 web profile(或任何带 web bundle 的 profile);一台回环绑定的服务器(默认即是)。
安装方式有两种,只能选其一,混用会导致同一条目被插入两次。
方式 A:标准 dsh bundle 安装¶
dsh plugin --profile web add @osskn4w7/dsh-plugin-manager
先执行上面的命令,再重启 dsh web——bundle 补丁层是在启动时读取的。
方式 B:免重启的实时安装¶
dsh-plugin-manager bootstrap --profile web
bootstrap 会通过 pnpm 把这个包装进 $DSH_HOME/profiles/web,并把它的 Loader 条目写进 cordis.patch.yml。profile 补丁文件被实时监视,宿主半部立即激活;之后刷新一次浏览器,让客户端 bundle 被加载(Settings → Plugins → 插件管理)。
如果想在 profile 之外单独使用 CLI:
npm i -g @osskn4w7/dsh-plugin-manager
dsh-plugin-manager list --profile web
典型用法¶
三个入口做的是同一件事。
Web GUI:在 Settings → Plugins 的「插件管理」标签页里,按 npm 包名安装(可填一段可选 JSON 配置)、点按钮启用/禁用、卸载,并查看完整 Loader 树。
CLI:
dsh-plugin-manager list [--json] [--profile web]
dsh-plugin-manager enable <entry-id> # 禁用用 disable
dsh-plugin-manager install <pkg> [--config '{"a":1}']
dsh-plugin-manager remove <pkg>
dsh-plugin-manager bootstrap
聊天命令,在 web 聊天里直接输入:
/plugin list
/plugin enable <id>
/plugin disable <id>
/plugin install <pkg>
/plugin remove <pkg>
启用/禁用背后做的事:在托管块里增删一条按 id 定向的 disabled 补丁,监视器随即重组树,实时生效。
普通插件和 bundle 插件的行为有区别,需要知道:
- 普通插件(manifest 里没有
dsh.bundle):install执行pnpm add,并在托管块里插入一条实时 Loader 条目,装完即启用。 - bundle 插件(声明了
dsh.bundle):install执行pnpm add,并把名字同步进package.json的dsh.profile.bundles(与dsh plugin --profile … add同一条规则)。bundle 补丁层在启动时读取,所以这一步会报告needsRestart;重启后它的条目才会出现,之后可以正常切换。
托管块的边界¶
cordis.patch.yml 里的托管块用两行注释定界:
# >>> dsh-plugin-manager … >>>
# <<< dsh-plugin-manager <<<
块内的编辑会被覆盖,块外的一切归用户所有——手写补丁逐字节保留,这是它敢替你改文件的前提。
另外两条细节值得留意:被禁用但 id 已不存在于组合树中的行,会记录一条良性的 loader 警告;卸载包时,管理器会移除它对应的补丁。
适用场景与注意¶
适合的人:频繁安装、试验 dsh 插件的开发者;需要在服务器运行中切换插件启停;不想再手动维护 cordis.patch.yml 的人。
使用前注意:
1、两种安装方式选一种,不要混用。
2、HTTP API 仅回环监听(与服务器默认绑定一致)且没有鉴权,不要把 web 服务器暴露给不受信任的网络。
3、bundle 插件安装后会报告 needsRestart,重启一次条目才出现、才可切换。
最后一条惯例提醒:插件以当前 dsh 进程的权限运行,安装任何插件前应先检查源码与许可证。本插件是 MIT。
结尾¶
经过上面的步骤,插件管理从「改文件、重启、再改」变成了「点一下、实时生效」,托管块机制又把自动化写入和你手写的补丁隔开,两不干扰。仓库地址:https://github.com/OSSKn4w7/dsh-plugin-manager;收录页面见社区插件目录:https://www.skillhub.cn/plugins/OSSKn4w7/dsh-plugin-manager(该目录为独立社区站点,与 DeepSeek、幻方无官方从属关系)。