packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
给插件页「已安装」列表加一行分类 Tab(全部 / 界面与外观 / 用量与账户 …),记住选中的分类;在可编辑对照表里登记的补丁插件会缩进挂在它修的插件下面。纯显示层,不写任何文件。
English | 中文
A DeepSeek Harness plugin that adds one row of category tabs to the Plugins page's Installed list, and nests patch plugins under the plugin they patch.


All · Appearance & UI · Usage & account · Models & subscriptions · Memory & context · Tools & abilities · Tasks & workflow · Market & install. Pick a tab to see only that category; the choice is
remembered per browser and the counts follow installs / uninstalls live. Plugins that match no category land
in Other, always last.└ line and tagged Patch; the parent gets an N patches tag. A patch follows
its parent's category. If the parent is not installed, the patch is shown on its own as usual.gap: 22px, 13/20px, 2px underline,
official focus ring) and use only DSH design tokens, so they follow light / dark and third-party skins.# desktop app
dsh plugin --profile desktop add github:p56568833/dsh-plugin-groups
# web
dsh plugin --profile web add github:p56568833/dsh-plugin-groups
Then fully quit and reopen DeepSeek Harness (or restart dsh web and refresh the page).
Uninstall from the Plugins page, or dsh plugin --profile desktop remove dsh-plugin-groups.
Everything lives at the top of client.js:
| Table | What it does |
|---|---|
CATEGORIES | Tab order = array order. packages are exact package names (checked first); keywords are regexes on the package name for plugins you install later. Matching is by package name, not by the displayed title, because titles change with translation plugins and UI language. |
PARENTS | patch package → parent package. Add a line for any patch plugin you use. The shipped entries are examples from the author's setup and only show when both plugins are installed: dsh-skin-fixes, dsh-cn-greeting → dsh-claude-style; dsh-story-progress → dsh-story-turing; dsh-market-sidebar → dshmarket. |
Tab labels follow the page's own language (Chinese when the page heading is Chinese, English otherwise).
Against the official @deepseek-ai/dsh-client-ui-plugin-manager markup:
| Hook | Used for |
|---|---|
[data-plugin-panel] | the Plugins page |
[data-plugin-group="bundles"] ul | the Installed card list (a flex-direction: column list) |
li[data-plugin-package="<npm name>"] | one card — the same attribute the page itself uses to scroll to a plugin |
The tab row is inserted as the list's first child with order: -1; filtering sets display: none on cards;
nesting only sets the flex order (cards are never moved in the DOM — React keeps owning the order) plus
data-dsh-pg-* markers styled by CSS. A MutationObserver re-applies after React re-renders and ignores its own
mutations. If the hooks ever disappear after a DSH update, the plugin does nothing and logs one warning.
Diagnostics on <html>: data-dsh-plugin-groups = idle / flat / active:N / broken / renamed, and
data-dsh-plugin-groups-tab = the active tab. The selected tab is stored in
localStorage["dsh-plugin-groups/tab.v1"].
node verify.mjs
Runs the tab and nesting behaviour against a fake DOM (switching, remembering, highlight fallback, idempotence,
clean uninstall), and — on macOS with the desktop app installed — reads the official plugin-manager source out
of app.asar to assert the DOM hooks still exist, with negative cases proving those assertions can fail.