前言¶
DSH 的理念是「一切皆插件」,用得久了,profile 里往往装了不少社区插件。想临时关掉其中一个——比如某个带前端界面的桌宠或侧边栏——通常要改配置、再重启 dsh,来回成本不低。
dsh-plugin-manager 把这件事搬进了 WebUI:在「设置 → 插件 → 插件管理」里点开关即可完成,切换即时生效,不用重启 dsh。下面介绍它的功能、安装和日常用法。
这是什么¶
dsh-plugin-manager 是由 Retr67 维护的 DSH 插件管理器,当前版本 0.1.0,采用 MIT 许可证。它提供一个 WebUI 面板,可视化查看当前加载的插件列表与开关状态,并对用户插件做热开关。
开关走的是 Cordis loader 的 entry.update({ disabled }),与官方 dsh-market 主题开关是同一条路。它只管插件的开与关,不负责安装、升级插件。
核心功能¶
- 用户插件可开关:包括
profile/package.json里安装的社区插件,以及你在cordis.patch.yml里手工添加的条目(如 MCP 桥梁)。 - 系统组件只读:DSH 自带的 host/web 基础设施只展示、不提供开关,避免误关导致 Harness 起不来;管理器自身(plugin-manager)也不会被关闭。
- 无需重启:切换后默认自动刷新网页,带前端界面的插件(桌宠、侧边栏等)也会立即完全生效;也可切换为手动刷新模式,选择保存在浏览器 localStorage。
- 跨重启保持:被关闭的插件 id 记录在
<profile>/.plugin-manager/state.json,下次启动自动回放为关闭,直到你把它重新打开。 - 「全部恢复开启」按钮:一键清空所有保持关闭的插件。
- group 插件处理:group 插件无法直接置
disabled时,管理器会自动改为开关其子条目。
状态持久化、启动回放和自愈守卫(监听 internal/plugin 事件)移植自 dsh-market。
安装与启用¶
环境要求:已安装 DeepSeek Harness (dsh) 与 Node.js(含 npx),engines 要求 node >= 22,Windows / macOS / Linux 均可。
在任意终端执行下面的命令,默认安装到 web profile:
npx -y @deepseek-ai/dsh plugin --profile web add https://github.com/Retr67/dsh-plugin-manager.git
这条命令会安装依赖,并在检测到包声明了 dsh.bundle 后,自动把插件加进 dsh.profile.bundles,下次启动自动加载。
如果你的 dsh 已全局可用,也可以直接用:
dsh plugin --profile web add https://github.com/Retr67/dsh-plugin-manager.git
要安装到其他 profile,把 web 换成对应的 profile 名即可:
npx -y @deepseek-ai/dsh plugin --profile myprofile add https://github.com/Retr67/dsh-plugin-manager.git
注意:这一步只是把插件加进 dsh.profile.bundles,不会热生效。安装后需要重启一次 dsh web 让插件加载,并刷新浏览器页面。仓库里另附 install.ps1 / install.sh 一键脚本,内部就是上面的标准 npx 命令。
卸载命令:
npx -y @deepseek-ai/dsh plugin --profile web remove dsh-plugin-manager
日常使用¶
经过上面的步骤,插件已经加载。日常操作如下:
1、打开「设置(⚙️ / Settings)→ 插件 → 插件管理」。
2、面板里分两类展示:
- 用户插件(可开关):每个插件一行,右侧有开关,点击即可打开 / 关闭。
- 系统组件(只读):只展示,不提供开关。
3、按需选择刷新模式:
- 默认自动刷新:开关后页面自动刷新,带前端界面的插件立即完全生效。
- 手动刷新:开关后不自动刷新,点面板里的「刷新」或手动刷新网页后生效;这个选择保存在浏览器 localStorage。
需要回到全开状态时,点「全部恢复开启」按钮,会一键清空所有保持关闭的插件。
HTTP API¶
面板之外,插件还暴露了三个同源 HTTP 接口,便于脚本化操作:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /plugin-manager/list |
返回插件列表与开关状态 |
| POST | /plugin-manager/toggle |
{ id, enabled } 热开关某个插件 |
| POST | /plugin-manager/reset |
恢复所有被保持关闭的插件 |
POST 接口做了 Origin === Host 的同源校验;GET 列表是只读的,且只暴露在回环地址绑定的 web server 上。
安全与实现边界¶
主机端仅使用 node 内置模块(fs/os/path),无网络调用、无子进程、无 eval;客户端用 React 渲染插件名(自动转义),所有请求都是同源 fetch。
实现边界上,它不对 package.json 的 dsh.profile.bundles 做热增删——那需要重启才能生效;它操作的是运行中的 loader entry,这也是 dsh-market 主题切换验证过的做法。
适用场景与注意事项¶
适合的情况:
- 装了不少插件,想临时关掉某个出问题或暂时不用的插件,又不想反复重启 dsh。
- 调试带前端界面的插件时,需要频繁开关对比效果。
- 希望某个插件在重启后仍保持关闭,但不想手动改配置文件。
注意事项:
- 开关只作用于运行中的 loader entry,不会修改
dsh.profile.bundles;增删 bundles 仍需重启。 - 与所有 DSH 插件一样,插件以当前 dsh 进程的权限运行。安装前建议自行检查源码与许可证;本插件源码公开在 GitHub,采用 MIT 许可证。
结尾¶
dsh-plugin-manager 解决的是一个小而具体的问题:把「关插件要重启」变成 WebUI 里点一下开关,并且跨重启保持。如果你的 profile 里插件越装越多,值得一试。
- 社区插件目录页:https://www.skillhub.cn/plugins/Retr67/dsh-plugin-manager
- 源码与 README:https://github.com/Retr67/dsh-plugin-manager