Provides a skill management panel and command-line interface for DSH, supporting hot adding/removing, enabling/disabling, cross-workspace migration, and grouping.
- Language
- JavaScript
- License
- MIT
- Branch
- main
Install
$ dsh plugin --profile web add github:Fishquito7/dsh-skill-viewerRun the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial
One-Sentence Pitch
Add a "Skills" settings panel to DeepSeek Harness, plus a dsh-skill command-line tool, letting you toggle, add, remove, migrate, and group-manage skill files directly from the web interface and terminal—without manually editing SKILL.md or restarting the gateway.
Core Features
- Add a "Skills" entry under "Plugins" in the web settings page, displaying registered skill cards with search by name and click-to-expand for full
SKILL.mdcontent - Provide enable/disable toggles (closed skills can be re-enabled later), delete buttons, and batch migration buttons; state changes take effect instantly via file renaming, with DSH's built-in listener detecting changes within ~200ms
- Support adding skills from
.mdfiles, directories with top-levelSKILL.md, and.zippackages; drag-and-drop or click "+" to upload, max 200 files or 8 MB per batch - Workspace tab bar ("Global" + each workspace, filterable by group) for one-click switching to show only skills in a specific scope; skills with the same name in global and workspace appear as separate rows
- Skill grouping (private display config only for this plugin, stored in
~/.dsh/skills/.system/skill-viewer/groups.json), does not modify skill files themselves, can filter by group - Built-in
dsh-skillCLI:list/add/enable/disable/delete/scope/migrate/update, works even when gateway is down, hot-reloads changes
Technical Implementation
- Language: TypeScript (ESM,
type: module) - Key Dependencies:
@deepseek-ai/dsh-typert-protocol(register Typert remote service),@deepseek-ai/dsh-home-paths(resolve user home),fflate(ZIP extraction),yaml(frontmatter parsing),zod(wire schema validation) - Architecture Pattern: Cordis half-zone plugin;
cordis.patch.ymlautomatically mounts theskills-viewerbundle todsh.profile.bundles; host-sideapply(ctx)registers a remote service namedskillsViewerwithtypert, exposing methods (list/workspaces/groups/checkUpdate/saveGroup/deleteGroup/content/setEnabled/migrate/batchMigrate/deleteSkill/addSkill) to the API gateway; client is a browser-side React component (client.ts), communicating with the host via Typert protocol; CLI is an independentnodeentry pointlib/cli.js - Entry Files:
src/index.ts(host half-zone),src/client.ts(Web UI client),src/cli.ts(CLI), compiled output inlib/
Use Cases
Users who frequently toggle/add/remove skills without touching YAML or restarting the gateway. For example, after setting up a new workspace, batch-import several skills then enable them as needed, or migrate a debugging skill from a project to global sharing; the CLI is also suitable for directly managing skills in terminal, SSH remote, or when the gateway is unavailable.
Prerequisites & Compatibility
| Dependency | Min Version | Notes |
|---|---|---|
| DSH (cordis / typert) | 0.1.0-rc.6+ | From @deepseek-ai/dsh-typert-protocol: ^0.1.0-rc.6 |
| Node.js | Not declared | No engines field in package.json; source uses built-in APIs like node:fs/promises, AbortController, fetch |
| Platform | macOS / Windows / Linux | Cross-platform; process.platform === "win32" branch handles Windows path case-insensitivity |
| Native Modules | None | All dependencies (fflate/yaml/zod/@deepseek-ai/*) are pure JS, no node-pty, node:sqlite, etc. |
Installation
dsh plugin --profile web add github:Fishquito7/dsh-skill-viewer
Configuration
| Config | Type | Description | Default |
|---|---|---|---|
DSH_HOME | Env Variable | User home directory, overrides default ~/.dsh | ~/.dsh |
DSH_AGENTS_HOME | Env Variable | Legacy user home directory, overrides default ~/.agents | ~/.agents |
This plugin requires no additional YAML/Schema editing; cordis.patch.yml is automatically appended by dsh plugin add, no manual maintenance needed.
FAQ
Q: What does this plugin do?
A: Adds a "Skills" settings panel and dsh-skill CLI to DeepSeek Harness, enabling direct enable/disable, add, remove, migrate, and group management of skill files from web and terminal—the underlying mechanism is modifying SKILL.md, and DSH's file listener automatically detects changes.
Q: What will I see after installation?
A: A "Skills" entry appears under "Plugins" in the settings page: skill card list, status toggles, search bar, workspace tab, group tab, add and migration buttons; the terminal gains the dsh-skill command. No manual cordis.patch.yml editing needed.
Q: Is additional configuration required?
A: No configuration needed. Only two environment variables DSH_HOME and DSH_AGENTS_HOME can change the user home (defaults ~/.dsh, ~/.agents), keep defaults for normal use.
Q: What sources are supported for adding skills?
A: Three forms: single .md file, directory with top-level SKILL.md, .zip package; drag-and-drop or click "+" to upload; auto-detects structure; invalid content (missing SKILL.md, frontmatter errors, duplicate names in batch, path conflicts) will be rejected with explanation.
Q: What if a skill with the same name exists in both global and workspace?
A: Displayed as separate rows by (name + scope) in the UI, independent of each other; CLI's enable/disable/delete with duplicate names across scopes must explicitly use --global/--project/--workspace, otherwise exits with error—no silent operations on the "winning" one.
Q: Where is data stored? Will it be lost after uninstalling the plugin?
A: Skill entities are ordinary files: global in ~/.dsh/skills/, workspace in <workspace project root>/.dsh/skills/. Disable = rename SKILL.md to SKILL.md.disabled, enable = rename back. Uninstalling the plugin does not touch these files; they continue to be discovered by DSH's built-in provider.
Q: What if Git installation fails?
A: pnpm v11 disallows git-hosted plugins from running prepare scripts by default; add the key pnpm provides in the error to allowBuilds in the profile directory's pnpm-workspace.yaml and retry; or directly install the release tarball to bypass build script restrictions.
Q: Why can't bundled skills be modified?
A: Skills deployed with DSH (source === "bundled") are read-only; both UI and CLI will reject disabling, deleting, and migrating, with prompt "Bundled with deployment, cannot be modified."
Learning Curve
Beginner — one-click installation, no YAML modifications needed; page features are clickable, CLI's list/enable/disable/delete/add require no complex parameters.
Known Issues & Limitations
- Legacy frontmatter fields
disableModelInvocation/modelInvocablewill be rejected; must usedisable-model-invocation/user-invocableinstead (src/skill-files.ts:111-113) - Bundled skills (
source === "bundled") cannot be disabled, deleted, or migrated (src/index.ts:627,src/index.ts:728) - pnpm v11 disallows running
preparescripts during Git installation by default, reports "git-hosted plugins build on install..."; need to allowlist in profile directory'spnpm-workspace.yamlunderallowBuilds, or install release tarball (README.md:39-50) dsh-skillCLI by default scans only the current directory's anchored project root and user home; managing other workspaces requires--cwd <workspace path>; same-name multi-scope operations must explicitly use--global/--project/--workspace(src/cli.ts:79-80,src/cli.ts:493-516)- Add skill total size limit 8 MB, max 200 files per batch; zip structure must be "one directory containing
SKILL.md" or "flat multiple.md" files, otherwise entire batch is rejected (src/index.ts:302-303,src/index.ts:821) dsh-skill updatedirectly requests the latest version URL from GitHub Releases; will fail when network is unreachable or rate-limited (src/cli.ts:466); web端的"检查更新" button failure is silently ignored (src/client.ts:1082)
English | 简体中文
DSH 插件,在 Web 设置页同时提供「技能」与「MCP」两个管理面板,并随包提供统一终端命令 dsh-panel(skill / mcp 两个子命令族)。
注意:本项目提供的参考命令默认指定profile为默认的--profile web,需要更改profile的请自行注意。
功能
技能面板
- skill 卡片列表:预览已注册安装的 skill,点击卡片可展开查看完整内容
- skill 状态:启用、停用状态标签,与内置插件列表同款样式
- skill 管理:开关热启用/停用、删除;按名称搜索;进入页面自动刷新
- skill 添加(0.7.0 统一入口):点“+”直接选文件(
.md/.zip),或把文件、压缩包、 技能文件夹直接拖进页面——自动识别目录束/单文件/压缩包结构,不合规内容会被拒绝并提示原因 - 工作区分栏(0.3.0):技能实体直接存放在其所属位置里——全局在
~/.dsh/skills,限定工作区在该工作区的.dsh/skills。页面“技能列表”下方 有一条工作区横栏(全局 + 各工作区,可横向滚动),点击即只显示该工作区下的技能。 - 批量迁移:“+”号左侧的迁移按钮:源工作区、目标工作区(可多选)与技能都在 对话框内手动选择,批量复制或移动(默认不勾选任何技能;逐个迁移、失败不影响 其余;移动模式限单个目标)。源工作区有分组时,可在技能列表上方按分组筛选(0.7.0)。
- 技能分组(0.5.0):工作区横栏下方新增分组横栏(全部 + 分组名,可横向滚动),
点击只显示该分组下的技能。“分组”按钮(迁移按钮左侧)打开分组编辑器:新建/重命名/
删除分组、选择工作区、命名并批量勾选成员。分组只写入插件自己的显示配置
(
~/.dsh/skills/.system/skill-viewer/groups.json),不修改技能目录。 - 作用域化管理(0.6.4):同名技能同时存在于全局与某工作区时,删除、启停、
查看内容均按(名称+作用域)精确操作——页面各行独立展开、独立操作,绝不影响
其它作用域里的副本;找不到指定作用域的条目会直接报错,不会回退误操作。
命令行同名技能也需用
--global/--project/--workspace显式指定。
MCP 面板(v2.0.0)
- 设置页「技能」下方新增「MCP」页,管理 profile
cordis.patch.yml中的 MCP 服务器受管块; - 支持 Stdio(本地命令)与 HTTP(streamable-http)两种调用方式;
- 支持新增、编辑、启停、删除、测试连接;保存后由 DSH HMR 热加载,无需重启网关;
env/headers密钥在 RPC 与页面中脱敏,编辑时缺省 key 保留旧值;cordis.patch.yml面板块外的用户内容逐字节保留。
安装
-
安装本包(bundle 层自动挂载,无需编辑配置文件)
dsh plugin --profile web add https://github.com/Fishquito7/dsh-skill-mcp-panel/releases/download/v2.0.1/dsh-skill-mcp-panel-2.0.1.tgz首选发行版 tarball:不走 Git,不受 pnpm v11 的构建脚本限制。 也可以从 Git 安装(Git 来源的依赖默认禁止运行 prepare 构建脚本;若报 “git-hosted plugins build on install...”,把 pnpm 在上面打印的 key 加到 profile 目录
pnpm-workspace.yaml的allowBuilds下再重跑):dsh plugin --profile web add github:Fishquito7/dsh-skill-mcp-panel -
重启网关
dsh-restart重启后刷新页面:设置 → “插件”下方为“技能”,其下方为“MCP”。
命令行
统一父命令为 dsh-panel。
技能子命令
dsh-panel skill --help
dsh-panel skill list # 列出技能(含工作区:全局 / 工作区)
dsh-panel skill add <path> # 添加到全局(.md 文件、目录束或 .zip 压缩包)
dsh-panel skill add <path> --workspace D:\项目A # 直接添加到指定工作区
dsh-panel skill scope <name> --global # 迁移单个技能到全局
dsh-panel skill scope <name> --workspace D:\项目A # 迁移单个技能到指定工作区(--copy 复制)
dsh-panel skill migrate <name...|--all> --from <全局|路径> --to <全局|路径> [--copy] [--yes]
dsh-panel skill update [--profile <name>] # 检查并更新插件(默认 web 配置)
# 批量迁移(复制/移动)
dsh-panel skill disable <name> # 停用
dsh-panel skill enable <name> # 启用
dsh-panel skill delete <name> # 删除(需确认)
MCP 子命令
dsh-panel mcp list [--profile <name>]
dsh-panel mcp add --name <serverName> --stdio --command <cmd> [--args <arg> ...] [--env KEY=VALUE ...] [--cwd <path>] [--profile <name>]
dsh-panel mcp add --name <serverName> --http --url <url> [--header KEY=VALUE ...] [--profile <name>]
dsh-panel mcp enable|disable <serverName> [--profile <name>]
dsh-panel mcp remove <serverName> [--yes] [--profile <name>]
dsh-panel mcp test <serverName> [--profile <name>]
dsh-panel mcp update [--yes] [--profile <name>]
dsh-panel update [--yes] [--profile <name>] # 更新整个 dsh-skill-mcp-panel
MCP 配置写入目标 profile 的 cordis.patch.yml 受管块;网关在线时自动热加载。面板块由
# >>> dsh-skill-mcp-panel:mcp:begin / # <<< ...end 标记,请勿手改块内内容。
CLI 只扫描当前目录锚定的项目根与用户根;管理其他工作区的技能请加 --cwd <工作区路径>。
同名技能存在于多个作用域时,enable/disable/delete 需加 --global/--project/--workspace 指定操作哪一份。
工作原理
技能部分:
页面和 dsh-panel skill 命令的每次操作,最终都是对磁盘上技能文件(SKILL.md)的改动,DSH 自带的文件监听器立刻发现变化——所以启用/停用、增删、迁移都热生效,无需重启网关。
- 技能实体直接存放在其工作区的技能文件夹:全局 =
~/.dsh/skills,工作区 =<工作区>/.dsh/skills,没有隐藏存储或联接点——卸载插件后技能仍是普通文件,照常被 DSH 发现 - 停用 = 把
SKILL.md改名为SKILL.md.disabled,启用 = 改回来 - 改变所属位置 = 真实地把文件复制/移动到目标位置的文件夹(先校验、失败回滚)
- 随部署附带的技能(bundled)为只读,不可停用或删除
MCP部分:
- 负责把 MCP 服务器配置写进 profile 的 cordis.patch.yml 受管块;真正连接和注册工具的是 DSH 官方插件 @deepseek-ai/dsh-mcp-client,由 DSH 的 HMR 自动加载。
开发
源码为 TypeScript,位于 src/;编译产物 lib/*.js 随仓库一起提交(保证 Git 直装可用)。
改完源码后运行 pnpm build:tsc 编译到 lib/ 并剥离浏览器束的多余模块标记。
发布时 npm pack 会通过 prepack 自动重新构建,无需手工编译。
卸载
dsh plugin --profile web remove dsh-skill-mcp-panel
License
MIT