DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Skill Panel — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins

dsh-skill-panel

Skill Panel

dsh Web 应用的技能管理面板

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add dsh-skill-panel@1.3.1
README兼容性版本

兼容性与来源证明

Skill Panel 以 dsh-skill-panel 发布,当前版本为 1.3.1。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
npm
Registry 更新时间
2026/9/22

版本

1.3.1stable
2026/8/20
1.3.0stable
2026/8/17
1.2.0stable
2026/8/17
查看其余 1 个版本收起版本
1.0.0stable
2026/8/14

相关插件

正在加载相关插件…

最新版
1.3.1
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
90.6 kB
文件数
6
Surface
web
许可证
MIT
发布源
npm
GitHub
★ 2
周下载
24
最近提交
2026/8/20
查看源码 ↗项目主页 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Client Ui Task Board@linxin666/dsh-client-ui-task-board面向 DSH Web GUI 的主机权威任务面板,支持实际会话执行、主机 cron 调度以及可选的跨平台空闲睡眠保护;以挂载方式提供,无需修改 DSH 源代码。Remote Web Ui@linxin666/dsh-remote-web-ui通过扫码配对访问 dsh Web GUI,共享一个官方界面:设置按钮旁的二维码可将手机和 PC 配对到同一个 Web GUI(手机采用竖屏触控适配层,PC 使用完整桌面界面),通过一次性令牌和 rClient Ui Git Graph@linxin666/dsh-client-ui-git-graph外部 dsh Web GUI 插件:空会话 Git 分支选择器和 Git 图,包含实际的主机端 Git 操作与防护,作为 dsh 配置文件包Web All@linxin666/dsh-web-allDSH Web UI 全家桶聚合插件:一键安装全部功能插件(task-board / git-graph / pet / remote-web-ui / web-ui-settings / skin-center / community-plugins / compat shim)。compat 桥接层已并入本包(src/client),无需独立 compat npm 包。

README

dsh-skill-panel

A skill management panel for the DeepSeek Harness web app: browse, search, filter, enable/disable, and uninstall your agent skills from the settings page or the sidebar.

Built entirely on the harness's public plugin surface — a Typert Remote service on the host half, slot-registered React UI on the browser half. No forks, no internal APIs, no build step (pure JS); runtime imports are limited to the harness-provided @deepseek-ai/dsh-storage-domain and zod (declared as dependencies).

Features

  • Skill list with name, description, source label, and per-source counts
  • Search and source filtering (user .agents, user .dsh, project roots, custom, bundled)
  • Model / User invocation switches (rewrites the SKILL.md frontmatter; unspecified switches are preserved)
  • Disable / Enable button — fully disables a skill while remembering its previous state, and restores exactly that state on enable
  • Uninstall with two-step confirm (deletes the skill directory, bundled skills are protected)
  • Detail view with whenToUse, on-disk path, and the SKILL.md body
  • Skill groups — create / rename / delete groups, manage membership per group (add / remove skills), browse skills grouped; persisted through the official ctx.storageDomain (no self-made storage files)
  • All reads are session-scoped — the panel shows exactly the catalog your current session serves
  • Writes invalidate discovery synchronously, and the slash-menu cache is refreshed through the official forwarded events

Requirements

  • DeepSeek Harness 0.1.0-rc.6+ (web profile)
  • pnpm available (corepack enable provides it)

Install

corepack enable                                   # once per machine
dsh plugin --profile web add dsh-skill-panel     # from npm
# or: dsh plugin --profile web add github:nianchen8/dsh-skill-panel
dsh web                                           # restart to load the package

The panel then appears under Settings → Skills and the sidebar's Skills button.

How it works

SKILL.md files (project / user / bundled roots)
        │  discovery (skill-filesystem providers, layered per scope)
        ▼
host skill registry  ── snapshot({cwd, scope: agent}) ──► SkillPanelService (Typert Remote)
        ▲                                                       │  /api/skillPanel/*
        │  fs/observed invalidation                             ▼
        └── frontmatter writes / deletions               browser client (fetch RPC)
                                                                 │  slots.register
                                                                 ▼
                                              Settings page · sidebar button · overlay
  • Host half (index.js): a TypertRemoteService with twelve Remote endpoints — getConfig, listDetailed, getDetail, setInvocation, setDisabled, uninstall, plus the group CRUD groupList, groupCreate, groupUpdate, groupDelete, groupAddSkill, groupRemoveSkill. Reads resolve the session-scoped skill view (same catalog the model sees); writes rewrite SKILL.md frontmatter or delete the skill directory, then emit fs/observed for synchronous discovery invalidation and replay agent-preset/selected so the official slash menu drops its cached catalog. Groups live in a ctx.storageDomain domain (skill_groups), opened lazily and closed on unload; when storage is unavailable the panel degrades to a read-only group view.
  • Browser half (client.js): plain React via the platform module table, registered into sidebar.footer.action, shell.overlay, and settings.section. All data crosses the standard API gateway over /api/skillPanel/<method>.

Placement configuration

The three UI entries (sidebar button, overlay, settings page) default to the tail of their slot: at registration the browser half reads the slot's live entries and places itself after the largest existing order, so a fresh deployment always lands at the bottom of the list regardless of how many entries already occupy the slot.

Arrival semantics (why same-strategy plugins don't fight): the tail order is computed once at registration — the browser half never re-registers after it arrives. Each registration is an atomic read→compute→register, so the next arrival always sees the previous one and appends strictly after it (max + 1, no ties). Once an entry lands, its position is fixed; if it later unloads and comes back (fiber restart), it re-appends at the tail again. Two plugins using this identical strategy therefore coexist as A(0), B(1), C(2), … with the latest arrival always last — no chasing, no livelock.

Each entry can be individually overridden through the loader entry's config in the profile composition (profiles/<name>/cordis.patch.yml):

- id: skill-panel
  config:
    entries:
      sidebar:
        enabled: true        # show the sidebar button (default true)
        order: 5             # explicit position; omit = dynamic tail
        # slot: conversation.session.header.actions   # optional relocation
      overlay:
        enabled: true
        order: 10
      settings:
        enabled: false       # hide the settings page
  • enabled — whether the entry registers at all.
  • order — exact ascending position in the slot; absent means dynamic tail (max existing order + 1 at registration time).
  • slot — target slot key; omit for the built-in seats above. When relocating, the component degrades gracefully to the props the new slot provides (useSessions/wide are optional in the panel code).

The resolved placement is exposed to the browser through skillPanel/getConfig; if the endpoint is unavailable (e.g. before a restart), the browser half falls back to the defaults above.

Development

The package is pure JavaScript; edit index.js / client.js, then restart dsh web (the client bundle is rescanned at boot).

node --check index.js client.js
npx oxlint --deny-warnings index.js client.js

License

MIT