dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Skill panel for DeepSeek Harness: lists local skills in the official right sidebar with Chinese names and categories; click to insert /skill-name into the composer.
A DeepSeek Harness plugin that lists your local skills in the official right sidebar, with Chinese names, categories, and a summary for each. Click a skill to copy /skill-name to the clipboard.
English | 中文
@deepseek-ai/dsh-client-ui-sidebar-right) via the two-stage tab API. No third-party sidebar dependency.~/.agents/skills and ~/.dsh/skills, reading each skill's meta.yaml.display-name-zh / summary-cn / tag from meta.yaml; falls back to the directory name./skill-name; navigator.clipboard with a execCommand fallback.dsh plugin --profile desktop add link:<path-to-this-repo>
Then restart the desktop client. For the web profile use --profile web.
| Variable | Effect |
|---|---|
DSH_SKILL_DIRS | Extra skill roots, separated by the OS path delimiter (; on Windows, : on POSIX). Scanned before the two defaults. |
The host caches the scan for 10 seconds. The refresh button in the panel forces a rescan (GET /skill-panel/skills?refresh=1).
Each skill directory may carry a meta.yaml next to its SKILL.md:
display-name-zh: ESP32 固件工程
summary-cn: ESP-IDF 全流程 —— 任务队列、外设、CAN、Wi-Fi/BLE、OTA、LVGL…
tag: 嵌入式
All three keys are optional.
package.json dsh.bundle + dsh.client manifests
cordis.patch.yml mounts the host plugin row
dsh.plugin.json registry manifest
build.mjs esbuild: lib/index.js (ESM host) + lib/client.js (CJS, ModuleLoader)
src/index.ts host: webServer route GET /skill-panel/skills
src/client/index.tsx client: two-stage right-sidebar registration
src/client/view.tsx the panel UI
src/client/styles.ts CSS injected at mount
Host half (src/index.ts) registers one route on ctx.webServer:
ctx.webServer.register({
kind: 'exact',
path: '/skill-panel/skills',
handler: (req, res) => { /* scan + JSON */ },
})
Client half (src/client/index.tsx) registers a tab type and its body:
ctx.sidebarRightTabs.register({ id, kind, priority: 'extension', title, guide })
ctx.slots.inject('sidebar.right.pane.tab', () =>
ctx.slots.register({ name: 'sidebar.right.pane.tab', key: id }, Body))
The client bundle must be wrapped in window.__ModuleLoader__.load(...) -- build.mjs does that with esbuild's banner/footer.
package.json).MIT