dsh-plugin-manager:在 WebUI 里开关 DSH 插件,无需重启

前言

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.jsondsh.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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye