packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
把当前对话里的 Mermaid 图表渲染成右侧栏的一个页面,一图一卡片;点击卡片可全屏查看并缩放、拖动,对话里的原始代码块保持不动,因此复制或引用源码照常可用。
A DeepSeek Harness client plugin that adds a Mermaid page to the right Sidebar. It renders the Mermaid diagrams in the conversation you are reading, without touching the conversation itself.
Published as
dsh-mermaid-panel, notdsh-mermaid: that package name belongs to MrmoLabs/dsh-mermaid, which renders diagrams inline in the chat instead. The two do different things and can now be installed side by side.
mermaid) and a guide capsule, so the empty Sidebar offers it as a door.The chat's code block is never hidden or replaced. Copying the source from the transcript, quoting it, or letting the model read it back still works, and a change to the chat's DOM costs the page its input rather than the transcript.
ctx.sidebarRightTabs, sidebar.right.pane.tab, and the ctx.locale / ctx.slots services.The chat renders an unknown language as a plain code card with no language attribute, so the page reads the first declaration line and accepts:
graph / flowchart followed by a direction (TB, TD, BT, RL, LR);sequenceDiagram, classDiagram, stateDiagram, erDiagram, gantt, pie, journey, gitGraph, mindmap, timeline, xychart-beta, quadrantChart, and the rest;%% comments, and a YAML front-matter block.Mermaid's own parser is the final word: a source that fails to render shows the failure notice and its source instead of a diagram.
Every card is its own viewport, so a diagram can be examined without leaving the Sidebar.
−, +, and the percentage sit in the card's lower-right corner, on hover or while zoomed.The card's Enlarge button opens the same diagram full screen, where the wheel, the buttons, + / -, Esc, and Fit all work over the whole window. A click on the diagram itself is a pan, not a way into that view.
Both views are portals or plain transforms inside the page: the full-screen one mounts on document.body so the Sidebar's scroll container cannot clip it, and neither keeps state once the card is gone.
The repository publishes a format 1 market index at
https://raw.githubusercontent.com/Natsubrei/dsh-mermaid-panel/main/index.json
Add it in Plugins → Discover → Add index, then install Mermaid diagrams from the list. Discover ships off by default: switch on Custom plugin markets under the Plugins page's experimental list first. The index entry pins a commit, so installation is reproducible and needs neither npm nor a token — DSH runs git against this repository.
The entry is generated, not hand-edited: npm run market reads package.json and the current commit and rewrites index.json. Run it after the commit that carries the built artifacts, then commit the index on its own.
node build.mjs
Then install the package directory as a bundle in the Harness profile, for example through the plugin manager's install_bundle action. The bundle patch inserts the entry into the profile's cordis.yml. client.js and client.mermaid.js are committed, so a Git install needs no build step.
| File | Role |
|---|---|
index.js | Host half. Rendering is browser-only, so it contributes nothing. |
src/client.jsx | The page type, its body, and the scan. Built into client.js. |
client.mermaid.js | The Mermaid engine as a lazy loader chunk, requested on the first diagram. |
cordis.patch.yml | Inserts the plugin into the profile. |
locale/en.json, locale/zh.json | Plugin-inventory title and description. |
index.json | The market index this repository publishes; generated by scripts/market-index.mjs. |
scripts/market-index.mjs | Rewrites index.json from package.json and the current commit. |
AGENTS.md | The release steps, the distribution URLs, and the gotchas that otherwise cost an afternoon. |
The page type contributes one guide capsule, the same door ui-sidebar-terminal uses. Open the right Sidebar and pick Mermaid on the guide page. If the Sidebar has exactly one door registered — ours, when no other type offers a guide capsule — the Sidebar seeds that page as its first tab instead of the guide; that seeding rule belongs to the Sidebar, not to this plugin.