dsh-plugin-manager:不手改配置文件,从 GUI、CLI 和聊天命令管理 dsh 插件

前言

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.jsondsh.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.jsondsh.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、幻方无官方从属关系)。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye