dsh-skill-panel

September 10, 2026 · View on GitHub

English | 中文 | 日本語

A DeepSeek Harness plugin. Adds a skill button to the sidebar. Clicking it opens a dialog that lists the skills loaded in the current session; hovering a row reveals a button that opens that skill's folder on disk.

Compatibility

Tested on DSH 0.1.5-rc.1 (web profile). Also runs on 0.1.2-rc.1 — those two releases are what dsh.engines.dsh in package.json declares, so a host or plugin manager can read the same range without parsing this file.

The plugin only uses documented plugin surfaces — the sidebar.footer.action slot, remote.skills.list, and session.openWorkspacePath. It does not patch DSH itself, so uninstalling it leaves nothing behind.

The folder button needs the host to expose SkillEntry.directoryPath. Stock DSH does not expose it yet, so on a stock host the dialog still lists every skill but the folder buttons stay hidden. (See Host-side enhancement.)

Install

  1. Add the plugin:

    dsh plugin --profile web add github:lywusichen/dsh-skill-panel
    
  2. Restart DSH.

  3. A skill icon appears at the bottom of the left sidebar, next to Settings. Click it to open the dialog.

What it does

  • Lists the current session's skills: name, routing description, and a user-only badge where applicable. The list is fetched per session and shares the composer's / skill cache.
  • Opens a skill's local directory in the host's default file manager.
  • Keeps an open dialog in sync when skills change on disk. On DSH releases that emit skills/change this is instant; on older cores it falls back to a 30 second poll.
  • Follows the web UI locale (simplified Chinese, English, Japanese).

Screenshots

Skill trigger in the sidebar foot

Loaded-skills dialog

Open local folder

Host-side enhancement

The folder button reads SkillEntry.directoryPath, a field added to the skill catalog by a small host patch: the catalog projection copies the path from skill.resourceBase when the skill is backed by a directory. Skills backed by a URL or an opaque resource have no directory, so they render without the button.

On a host without that field the plugin degrades quietly — the dialog works, the button is simply absent.

Build

npm install        # esbuild only
npm run build      # bundles src/client.jsx -> lib/client.js

The client bundle is a single CJS file. @deepseek-ai/* and the react modules stay external because the DSH shell provides them as platform-static modules. Commit lib/client.js — git-hosted installs consume the built artifact directly, without running a build.

License

MIT