为 DSH 提供技能管理面板与命令行,支持热增删、启停、跨工作区迁移和分组。
- 语言
- JavaScript
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add github:Fishquito7/dsh-skill-viewer在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
对话式安装
帮我安装 DeepSeek Harness 插件 Fishquito7/dsh-skill-viewer:先查看仓库 https://github.com/Fishquito7/dsh-skill-viewer.git 确认安全性,然后执行安装命令并验证插件加载成功。
把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。
一句话定位
给 DeepSeek Harness 装上一块"技能"设置面板,并附带 dsh-skill 命令行,让你在 Web 界面和终端里直接开关、增删、迁移、分组管理技能文件——不需要手工改 SKILL.md,也不需要重启网关。
核心能力
- 在 Web 设置页"插件"下方新增"技能"入口,展示已注册技能的卡片列表,支持按名称搜索、点击展开查看完整
SKILL.md内容 - 提供启用/停用开关(关闭后下次想用再开)、删除按钮、批量迁移按钮,状态切换通过文件改名即时生效,DSH 内置监听器约 200 ms 内自动感知
- 支持从
.md文件、含顶层SKILL.md的目录束、.zip压缩包三种方式添加技能,可拖拽到页面或点"+"上传,单次最多 200 个文件 / 8 MB - 工作区横栏("全局" + 各工作区,可分组筛选)一键切换只显示哪个作用域下的技能;同名技能在全局与工作区各自独立成行
- 技能分组(仅本插件私有显示配置,存
~/.dsh/skills/.system/skill-viewer/groups.json),不改动技能文件本身,可按分组过滤 - 自带
dsh-skill命令行:list/add/enable/disable/delete/scope/migrate/update,网关关闭时也能用,热生效
技术实现
- 语言: TypeScript(ESM,
type: module) - 关键依赖:
@deepseek-ai/dsh-typert-protocol(注册 Typert 远程服务)、@deepseek-ai/dsh-home-paths(解析用户根)、fflate(ZIP 解压)、yaml(frontmatter 解析)、zod(wire schema 校验) - 架构模式: Cordis 半区插件,
cordis.patch.yml把skills-viewerbundle 自动挂到dsh.profile.bundles;宿主端apply(ctx)在typert注册一个名为skillsViewer的远程服务,并把方法(list/workspaces/groups/checkUpdate/saveGroup/deleteGroup/content/setEnabled/migrate/batchMigrate/deleteSkill/addSkill)暴露给 API 网关;客户端是浏览器侧 React 组件(client.ts),通过 Typert 协议与宿主对话;CLI 是独立node入口lib/cli.js - 入口文件:
src/index.ts(宿主半区)、src/client.ts(Web UI 客户端)、src/cli.ts(CLI),编译产物在lib/
适用场景
日常需要频繁开关 / 增删技能,又不想碰 YAML 和重启网关的用户。比如新装了一套工作区想先批量导入若干技能再按需启用,或想把一个调试技能从某个项目迁到全局共享;CLI 还适合在终端、SSH 远程或网关暂不可用时直接管理技能。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH(cordis / typert) | 0.1.0-rc.6+ | 来自 @deepseek-ai/dsh-typert-protocol: ^0.1.0-rc.6 |
| Node.js | 未声明 | package.json 没有 engines 字段;源码使用 node:fs/promises、AbortController、fetch 等内置 API |
| 平台 | macOS / Windows / Linux | 跨平台运行;process.platform === "win32" 分支处理 Windows 路径与大小写不敏感 |
| 原生模块 | 无 | 全部依赖(fflate/yaml/zod/@deepseek-ai/*)均为纯 JS,无 node-pty、node:sqlite 等 |
安装方式
dsh plugin --profile web add github:Fishquito7/dsh-skill-viewer
配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
DSH_HOME | 环境变量 | 用户根目录,覆盖默认的 ~/.dsh | ~/.dsh |
DSH_AGENTS_HOME | 环境变量 | 兼容旧版用户根目录,覆盖默认的 ~/.agents | ~/.agents |
本插件无需额外编辑 YAML / Schema;cordis.patch.yml 由 dsh plugin add 自动追加,无需手工维护。
常见问题
Q: 这个插件是做什么的?
A: 给 DeepSeek Harness 增加一个"技能"设置面板与 dsh-skill 命令行,能在 Web 上和终端里直接启用/停用、添加、删除、迁移、分组管理技能文件——底层就是改 SKILL.md,DSH 的文件监听器会自动感知。
Q: 安装后能看到什么?
A: 设置页"插件"下方会出现"技能"入口:技能卡片列表、状态开关、搜索框、工作区横栏、分组横栏、添加与迁移按钮;终端会多出 dsh-skill 命令。无需手动改 cordis.patch.yml。
Q: 是否需要额外配置?
A: 无需配置。只有 DSH_HOME 和 DSH_AGENTS_HOME 两个环境变量可改用户根目录(默认 ~/.dsh、~/.agents),普通使用保持默认即可。
Q: 添加技能支持哪些来源?
A: 单个 .md 文件、含顶层 SKILL.md 的目录、.zip 压缩包三种形式,可拖拽或点"+"上传;自动识别结构,不合法内容(如 SKILL.md 缺失、frontmatter 报错、批内重名、路径冲突)会被拒并说明原因。
Q: 同名技能同时存在于全局和工作区怎么办?
A: 页面里按(名称+作用域)分行显示、互不影响;CLI 的 enable/disable/delete 在同名多作用域时必须用 --global/--project/--workspace 显式指定,否则直接报错退出,不会偷偷操作胜出那条。
Q: 数据存在哪里?卸载插件会丢吗?
A: 技能实体就是普通文件:全局在 ~/.dsh/skills/,工作区在 <工作区项目根>/.dsh/skills/。停用 = 把 SKILL.md 改名为 SKILL.md.disabled,启用 = 改回来。卸载插件不会触碰这些文件,照常被 DSH 内置提供方发现。
Q: 从 Git 安装失败怎么办?
A: pnpm v11 默认禁止 git 来源插件跑 prepare 脚本,按报错中 pnpm 给的 key 加到 profile 目录 pnpm-workspace.yaml 的 allowBuilds 下再重跑;或者直接装 release tarball,绕开构建脚本限制。
Q: bundled 技能为什么改不了?
A: 随 DSH 部署自带的技能(source === "bundled")是只读的,UI 与 CLI 都会拒绝停用、删除与迁移,提示"随部署附带,不可修改"。
上手难度
入门 — 安装命令一键完成,无需修改任何 YAML;页面功能靠点击即可,CLI 的 list/enable/disable/delete/add 也不需要复杂参数。
已知问题与限制
- 旧版 frontmatter 字段
disableModelInvocation/modelInvocable会被拒绝,必须改用disable-model-invocation/user-invocable(src/skill-files.ts:111-113) source === "bundled"的随部署技能不可停用、删除、迁移(src/index.ts:627、src/index.ts:728)- 从 Git 安装时 pnpm v11 默认禁止运行
prepare脚本,会报"git-hosted plugins build on install...";需在 profile 目录的pnpm-workspace.yaml的allowBuilds下放行,或改装 release tarball(README.md:39-50) dsh-skillCLI 默认只扫描当前目录锚定的项目根与用户根;管理其他工作区需加--cwd <工作区路径>;同名多作用域操作必须显式--global/--project/--workspace(src/cli.ts:79-80、src/cli.ts:493-516)- 添加技能总大小上限 8 MB、单批最多 200 个文件;压缩包结构必须是"一个目录含
SKILL.md"或"平铺的若干.md",否则整批拒绝(src/index.ts:302-303、src/index.ts:821) dsh-skill update直接请求 GitHub Releases 最新版 URL,网络不可达或被限流时会失败(src/cli.ts:466);web 端的"检查更新"按钮失败会被静默忽略(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
收录徽章
[](https://deepseek-plugin.org/plugins/Fishquito7/dsh-skill-viewer)把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。