前言¶
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/幻方無官方從屬關係,不是官方應用商店。