dsh-groups:给 DSH 插件做分组一键开关

前言

DSH 的理念是「一切皆插件」,装到一定数量之后,一个现实问题就浮现了:哪些插件要随 profile 一起加载,靠 package.json → dsh.profile.bundles 这个清单决定,改完必须重启才生效。手工编辑 JSON、记着自己改回原样,这件事本身不难,但很容易出错,也不直观。

下面介绍 zyfsyx666 维护的 dsh-groups(分类:工作流,GitHub 2 stars)。它把这份清单编成几套命名组合,在面板上点一下就能整组切换,不用手动编辑 JSON。插件不内置热重载,只负责把清单改对,重启时机仍然由你自己决定。

这是什么

dsh-groups 是一个 DSH 插件,解决的是「插件清单的分组管理」:把已装插件编成自己的几套分组,点一下就能把这一组的插件写进 profile 的 bundle 清单。它支持常驻组自动叠加、兜底组不吃叠加、两组一起应用,还可以把某一组写成 agent 预设,让单个对话只开这一组。

插件以当前 DSH 进程的权限运行,读写的是 profile 目录下的本地文件。功能上是纯本地文件操作,不依赖热重载。

核心功能

面板提供四种操作,分别对应四种语义:

  • 「启用这组」是加法:当前清单 ∪ 这一组,正在使用的其它插件不会被关掉。
  • 「仅保留这组」是覆盖:关掉其它所有插件,只留这一组加核心。
  • 「停用」是减法:只把这一组加进来的插件拿出去,别的组(含常驻组)不受影响。
  • 勾选两张卡片可以「同时启用这两组」,把 A 和 B 一起加进来。

卡片上会提前告诉你点下去会发生什么,包括新增多少、已装但清单里没有的包、会顺带关掉哪些不属于任何分组的插件。三处操作都会提示重启 DSH。

叠加只影响「选哪些插件」。最终清单仍然是扁平的一层 dsh.profile.bundles,顺序保持你原有的顺序,新项追加在尾部。

多组叠加由两个标记决定,在编辑器里勾选即可,也可以直接写 plugin-groups.json 的 persist / solo 字段:

标记 含义 典型用途
常驻 persist 应用任何别的分组时,这一组会自动一起叠加上去 「常驻基础」——字体、通知、顺滑流式这类天天要开的
兜底 solo 不吃任何叠加,应用它就是干干净净只有它自己 「全关」——排查问题时关掉一切

保存时没带的标记沿用旧值。用脚本 PUT /group 只改 enable 不会把兜底标记抹掉,要显式清除就传 solo: false。

单次对话只开一组

点卡片上的「预设」,可以把这一组写成一个 agent 预设。勾「生成预设」加选能力,保存后重启 DSH,新建会话的预设列表里会出现 group-<分组id>,选它开的新对话只带这组勾选的官方 agent 能力(基础工具/计划模式/上下文压缩/子代理/联网/定时任务)。取消勾选会从补丁层整体移除。

常驻组的能力会自动并进来:任何标了「常驻」的分组勾的能力,会自动加进其它每一组的预设,预设编辑器里会明说会带上什么。兜底组不吃这套,它的预设有且只有自己勾的能力。

预设产物写在 <profile>/cordis.patch.yml 里的一段受管块,块外的手写补丁不动;内容没变时不会写盘,写之前留 .bak-before-preset-<时间戳>。

有两条硬限制需要注意:

  1. 预设只管 agent 平面。第三方插件是宿主平面,塞进预设会触发 Preset services require isolate realms 检查失败,所以「这个对话装载哪些第三方插件」仍然只能靠顶部的分组开关(要重启)。
  2. 预设只在会话空白时能换,官方判据是「还没发过任何消息」,发出第一句话后就锁定(agent-preset/locked)。

安全阀

受管块必须有完整的首尾标记且只能有一份。缺结束标记或出现第二份时,同步直接拒绝(HTTP 409 BLOCK_CORRUPT)并让文件逐字节不动,宁可不动也不吞掉块外的手写补丁。

分组引用了已卸载的包时,卡片会提示「未安装(会被跳过)」,编辑界面顶部逐条列出残留项,可以单独删除或一键清空。相关 HTTP 路由只接受回环地址,并校验 Host 回环、Origin 同源、Sec-Fetch-Site 不是 cross-site。

安装与启用

插件还没有发 npm,需要从 GitHub 克隆到 DSH 的插件源码目录。以下按 README 原文执行:

# 1. 克隆到 DSH 的插件源码目录
git clone https://github.com/zyfsyx666/dsh-groups.git ~/.dsh/plugins-src/dsh-groups

# 2. 在 profile 里登记
cd ~/.dsh/profiles/desktop
#    dependencies 加一行: "dsh-groups": "file:../../plugins-src/dsh-groups"
#    dsh.profile.bundles 加一行字符串: "dsh-groups"

# 3. 装依赖
pnpm install --prefer-offline

# 4. 重启 DSH

Windows 上路径是 C:\Users\<你>\.dsh\plugins-src\dsh-groups,profile 在 C:\Users\<你>\.dsh\profiles\desktop。

依赖要求 node >= 22、dsh >= 0.2.0-rc.1。装好后左侧栏会多一个「插件分组」条目(order 60)。首次打开分组定义是空的,插件不内置任何预设分组,需要你自己建。

典型用法

1、在面板里点「新建分组」或「编辑」,用勾选式界面从全部已装插件里挑。分组里存着但已经不在目录里的包会单独列出,可以一键移除。

2、按需把某组设为常驻组或兜底组。例如把字体、通知这类天天要用的放进「常驻基础」并勾上常驻,把「全关」勾上兜底。

3、点「启用这组」做加法:当前清单并上这一组,所有常驻组也会一起叠上来。想独占就点「仅保留这组」;想单独关掉某一组点「停用」,确认框会先告诉你移除几个、是哪些。

4、需要某个对话只带这一组能力时,点「预设」→ 勾「生成预设」+选能力→ 保存 → 重启 → 新建会话时选 group-<分组id>。

写盘前会备份 package.json.bak-before-groups-<时间戳> 和 cordis.patch.yml.bak-before-groups-<时间戳>。

适用场景与注意

适合装了较多 DSH 插件、需要按任务反复切换插件集合的开发者。想要独占某套插件时用「仅保留这组」,想保留正在用的东西、只加一组进来时用「启用这组」,排查问题时用兜底组一键全关。

几个必须知道的边界:

  • 插件以当前 dsh 进程权限运行,安装前应自行检查源码与许可证(MIT)。
  • 官方包(@deepseek-ai/*)不列在勾选项里,分组也不会开关它们;它们由宿主自带,不进 profile 的 dependencies。要开关官方 bundle,请用 DSH 自带的插件管理器。
  • @deepseek-ai/dsh-base、@deepseek-ai/dsh-web-app 以及官方 17 个受保护模块,加上 dsh-groups 自己、dsh-m、dshmarket 不会被任何分组关掉。
  • 插件不做热重载。DSH 的 HMR 只监视显式配置,node_modules 与 profile manifest 不在监视范围内,所以修改一定要重启才生效。

分组定义在 <profile>/plugin-groups.json,日志在 ~/.dsh/dsh-groups/plugin-groups.log,锁文件是 <profile>/package.json.lock 与 <profile>/cordis.patch.yml.lock。

结尾

dsh-groups 的价值在于把「改 JSON、重启 DSH」这套手工流程,变成面板上的几次点击,同时给出常驻/兜底两种叠加语义来处理多组共存。目录页在 https://www.skillhub.cn/plugins/zyfsyx666/dsh-groups ,源码在 https://github.com/zyfsyx666/dsh-groups 。

社区目录是独立站点,与 DeepSeek/幻方无官方从属关系,不是官方应用商店。

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

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

小夜