前言¶
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-<时间戳>。
有两条硬限制需要注意:
- 预设只管 agent 平面。第三方插件是宿主平面,塞进预设会触发
Preset services require isolate realms检查失败,所以「这个对话装载哪些第三方插件」仍然只能靠顶部的分组开关(要重启)。 - 预设只在会话空白时能换,官方判据是「还没发过任何消息」,发出第一句话后就锁定(
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/幻方无官方从属关系,不是官方应用商店。