Introduction¶
The philosophy of DSH is “everything is a plugin”. After installing a sufficient number of plugins, a practical problem arises: determining which plugins to load with a profile. This is decided by the manifest package.json → dsh.profile.bundles, and changes only take effect after a restart. While manually editing JSON and remembering to revert it isn’t difficult, it is prone to errors and lacks intuitiveness.
Below is dsh-groups, maintained by zyfsyx666 (Categories: Workflow, GitHub 2 stars). It compiles this manifest into several named groupings. You can switch the entire group with a single click on the panel, without needing to manually edit JSON. The plugin does not have built-in hot reloading; it only ensures the manifest is updated, leaving the timing of the restart up to you.
What is this¶
dsh-groups is a DSH plugin that solves “grouped management of plugin manifests”: bundling installed plugins into your own custom groups and writing them into the profile’s bundle manifest with a single click. It supports automatically stacking persistent groups, preventing the fallback group from being stacked, applying two groups simultaneously, and can write a specific group as an agent preset so that a single conversation only enables that group.
Plugins run with the permissions of the current DSH process and read/write local files within the profile directory. Functionally, this is pure local file operation and does not rely on hot reloading.
Core Features¶
The panel provides four operations, corresponding to four semantics:
- “Enable this group” is an addition: Current manifest ∪ This group. Other plugins currently in use will not be turned off.
- “Keep only this group” is an overwrite: Turn off all other plugins, keeping only this group and core ones.
- “Disable” is a subtraction: Remove only the plugins added by this group; other groups (including persistent groups) are unaffected.
- Checking two cards enables “Enable both groups together”, adding both A and B.
The card will inform you in advance of what will happen when clicked, including how many new items will be added, packages that are installed but not in the manifest, and which plugins not belonging to any group will be turned off. All three operations will prompt you to restart DSH.
Stacking only affects “which plugins are selected”. The final manifest remains a flat layer dsh.profile.bundles, preserving your original order, with new items appended to the tail.
Multi-group stacking is decided by two flags; you can check them in the editor or directly write the persist / solo fields in plugin-groups.json:
| Flag | Meaning | Typical Use |
|---|---|---|
Persistent persist |
When any other group is applied, this group is automatically stacked along with it | “Persistent Base” — fonts, notifications, smooth streaming, things you open every day |
Fallback solo |
Is not subject to stacking; applying it means only itself | “All Off” — troubleshooting, turn off everything |
When saving, flags not present will retain their old values. Using the script PUT /group to only change enable will not wipe the fallback flag; to clear it explicitly, pass solo: false.
Use Only One Group in a Single Conversation¶
Clicking “Preset” on the card can write this group as an agent preset. Check “Generate Preset” + select abilities. After saving and restarting DSH, the preset list in the new session will show group-<group-id>. Selecting it opens a new conversation with only the official agent abilities checked (Basic Tools / Planning Mode / Context Compression / Sub-agent / Online / Scheduled Tasks). Unchecking it will remove it from the patch layer.
Abilities from persistent groups will automatically merge in: any abilities checked in a group marked “Persistent” are automatically added to every other group’s preset; the preset editor will explicitly state what is included. The fallback group is not subject to this; its preset contains only the abilities it has checked.
Preset artifacts are written as a managed block within <profile>/cordis.patch.yml. Hand-written patches outside the block remain unchanged; the file is not written if the content hasn’t changed. A .bak-before-preset-<timestamp> is created before writing.
There are two hard limits to note:
- The preset only manages the agent plane. Third-party plugins are on the host plane. Stacking them into a preset triggers a check failure (
Preset services require isolate realms), so “which third-party plugins this conversation loads” still relies on the top-level group switches (requires a restart). - A preset can only be changed when the session is empty. The official criterion is “haven’t sent any messages”; it locks after the first sentence is sent (
agent-preset/locked).
Safety Valve¶
The managed block must have complete start and end tags and exist only once. If the end tag is missing or a second copy appears, the sync will reject it directly (HTTP 409 BLOCK_CORRUPT) and leave the file byte-for-byte unchanged, preferring not to move the file over swallowing hand-written patches outside the block.
When a group references an uninstalled package, the card will prompt “Not installed (will be skipped)”. The editor top lists residual items one by one, allowing you to delete them individually or clear all at once. The related HTTP routes only accept loopback addresses and validate that the Host header is loopback, the Origin is same-site, and Sec-Fetch-Site is not cross-site.
Installation and Activation¶
The plugin has not been published to npm yet and needs to be cloned from GitHub to DSH’s plugin source directory. Execute the following per the original README:
# 1. Clone to DSH's plugin source directory
git clone https://github.com/zyfsyx666/dsh-groups.git ~/.dsh/plugins-src/dsh-groups
# 2. Register in profile
cd ~/.dsh/profiles/desktop
# Add a line to dependencies: "dsh-groups": "file:../../plugins-src/dsh-groups"
# Add a line to dsh.profile.bundles: "dsh-groups"
# 3. Install dependencies
pnpm install --prefer-offline
# 4. Restart DSH
On Windows, the path is C:\Users\<you>\.dsh\plugins-src\dsh-groups, and the profile is at C:\Users\<you>\.dsh\profiles\desktop.
Dependencies require node >= 22 and dsh >= 0.2.0-rc.1. After installation, a “Plugin Groups” entry (order 60) will appear in the left sidebar. The first time you open group definitions, they will be empty; the plugin does not bundle any preset groups and you need to create your own.
Typical Usage¶
- Click “New Group” or “Edit” in the panel to pick from all installed plugins via a checkbox interface. Packages stored in the group but no longer in the directory are listed separately and can be removed with one click.
- Set a group as the persistent group or fallback group as needed. For example, put fonts, notifications, and other daily essentials into “Persistent Base” and check the persistent flag, and check “All Off” as the fallback.
- Click “Enable this group” to perform addition: merge the current manifest with this group; all persistent groups will also stack up. If you want exclusive access to a set, click “Keep only this group”; if you want to turn off a specific group, click “Disable”, and the confirmation box will first tell you how many and which ones are being removed.
- When you need a conversation with only this group’s abilities, click “Preset” → Check “Generate Preset” + select abilities → Save → Restart → Select
group-<group-id>when creating a new session.
Backups package.json.bak-before-groups-<timestamp> and cordis.patch.yml.bak-before-groups-<timestamp> are created before writing to disk.
Use Cases and Notes¶
Suitable for developers who have installed many DSH plugins and need to switch plugin sets repeatedly based on tasks. Use “Keep only this group” when you want exclusive access to a set of plugins; use “Enable this group” when you want to keep what you are using and just add one group; use the “All Off” fallback group to turn off everything at once for troubleshooting.
Several boundaries you must know:
- Plugins run with the permissions of the current dsh process. You should check the source code and license (MIT) yourself before installing.
- Official packages (
@deepseek-ai/*) are not listed in the checkboxes, and groups do not switch them; they are provided by the host and do not appear in the profile’sdependencies. To switch official bundles, please use DSH’s built-in plugin manager. @deepseek-ai/dsh-base,@deepseek-ai/dsh-web-app, and the 17 official protected modules, along withdsh-groupsitself,dsh-m, anddshmarketcannot be turned off by any group.- The plugin does not support hot reloading. DSH’s HMR only monitors explicit configuration;
node_modulesand the profile manifest are not within the watch scope, so modifications must be restarted to take effect.
Group definitions are located at <profile>/plugin-groups.json, logs are at ~/.dsh/dsh-groups/plugin-groups.log, and lock files are <profile>/package.json.lock and <profile>/cordis.patch.yml.lock.
Conclusion¶
The value of dsh-groups lies in turning the manual process of “edit JSON, restart DSH” into a few clicks on the panel, while providing two stacking semantics (persistent/fallback) to handle multiple groups coexisting. The directory page is at https://www.skillhub.cn/plugins/zyfsyx666/dsh-groups, and the source code is at https://github.com/zyfsyx666/dsh-groups.
The community directory is an independent site and has no official affiliation with DeepSeek or Huafang; it is not the official app store.