技能中心:按区域浏览技能、从 zip 安装,并支持启用停用、卸载、回收站恢复与搜索。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-knj-extension-center
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:yangdongzhen590/dsh-knj-extension-center
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
DSH 技能中心插件:按区域浏览已加载的 skill、从 zip 安装新技能、管理(启用/禁用模型可调用、卸载入回收站、回收站恢复/彻底删除、搜索)。
- 宿主端(host):
/api/dsh-skill-center路由家族(list/install/set-enabled/uninstall/trash/detail/download),通过 loopback 信任围栏提供服务。 - 客户端(client):浏览器面板,挂载到主区域(center column),入口注册在侧边栏 knj-menu 区的「技能中心」行。
功能
| 功能 | 说明 |
|---|---|
| 浏览 | 按 系统内置(bundled)/ 用户技能(user-dsh)/ 运行时注册(runtime)三个区域分组展示;标题、描述、可调用徽标(模型/用户)、软链接徽标 |
| 搜索 | 服务端 ?q= 搜索技能名称/描述,200ms 防抖,IME 合成期间暂停 |
| 详情 | 点击卡片进入详情:frontmatter 代码块 + 正文预览(markdown-lite,转义优先);用户技能显示路径、模型可调用开关、复制路径、卸载。bundled/runtime 无文件路径,详情不可打开、只读 |
| 安装 | 上传 zip(≤8MB):本地解析预览(单一 <name>/SKILL.md、kebab-case 名称、description 必填)→ 确认信息 → 完成;重名冲突弹窗支持「覆盖(旧版入回收站)」 |
| 启停 | 模型可调用开关改写 disable-model-invocation(仅文件技能) |
| 卸载 | 移入可恢复回收站(非永久删除) |
| 下载 | 用户文件技能导出为 <name>.zip;系统内置/运行时技能不提供下载 |
| 回收站 | 恢复 / 彻底删除 / 清空;restore 409(原路径被占用)等失败内联展示 |
安装
# 一条命令同时安装插件与菜单宿主 dsh-knj-menu(已声明为 npm 依赖,版本自动配套)
dsh plugin --profile web add dsh-knj-extension-center dsh-knj-menu
安装后重启 dsh web(或确认 HMR),浏览器打开 http://127.0.0.1:3080:
侧边栏 knj-menu 区出现「技能中心」入口 → 点击替换主区域为技能列表。
与
@linxin666/dsh-client-ui-skill-explorer类插件的共存:挂载按包名隔离(mountOnce),入口均注册在knj.menu.item槽位,会并列显示。
卸载
dsh plugin --profile web remove dsh-knj-extension-center
安全模型要点
- 所有 REST 路由仅绑定 loopback 信任围栏(host webserver 注入),浏览器同源访问;每个非 2xx 响应转为
ApiError携带宿主{ error }文本。 - 卸载是移入回收站而非删除;回收站清空/彻底删除才做永久删除,且需确认。
- 安装目标固定
~/.dsh/skills/<name>/;重名时默认拒绝,用户明确选择「覆盖」才将旧版本移入回收站后安装。 - 客户端 zip 预览与宿主校验镜像一致(kebab-case、单一顶层目录、
<name>/SKILL.md、description 非空、8MB 上限),不上传前先做本地校验。 - 详情正文经 markdown-lite 转义后注入 DOM(escape-first,XSS 安全)。
- 客户端装配整体包
applyGuard:任何失败降级为console.warn,不拖垮宿主 GUI;菜单项注册经slots.inject延迟到knj.menu.item槽位声明后再执行(宿主对未声明槽位注册会 throw),入口随 knj-menu 生命周期折叠。
路由表(host)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/dsh-skill-center/list |
分组技能列表;?q= 搜索、?level= 过滤 |
| GET | /api/dsh-skill-center/detail |
?name= 原始详情(frontmatter + body) |
| GET | /api/dsh-skill-center/download |
?name=&path= 下载用户技能 zip 包 |
| POST | /api/dsh-skill-center/install |
zip base64 安装;{ overwrite } 覆盖 |
| POST | /api/dsh-skill-center/set-enabled |
{ name, path, enabled } 模型可调用开关 |
| POST | /api/dsh-skill-center/uninstall |
{ name, path } 卸载入回收站 |
| GET | /api/dsh-skill-center/trash/list |
回收站条目 |
| POST | /api/dsh-skill-center/trash/restore |
{ trashPath } 恢复 |
| POST | /api/dsh-skill-center/trash/purge |
{ trashPath } 彻底删除 |
| GET | /api/dsh-skill-center/health |
健康检查 |
开发
npm.cmd run build # tsc(host) + tsdown(client bundle) → lib/
npm.cmd test # vitest(node + jsdom)
npm.cmd run typecheck # tsc --noEmit
客户端装配入口 src/client/index.ts:apply(ctx) 依次注册 locale 字典、挂载主区域视图(CenterApp 视图状态机:列表/详情/回收站/安装)、经 slots.inject 延迟注册 knj-menu 侧边栏入口;返回合并 disposer。
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-skill-explorer★ 7810
技能中心:按来源分级浏览已加载的全部 skill,启用/禁用模型调用、创建新技能、删除进可恢复回收站。
GanyuanRan/Aegis★ 1216
面向编码 Agent 的软件工程方法包,提供基线优先规划、系统化调试、提示词卫生、完成前验证,以及修复/退役双轨跟踪技能。
superdesigndev/superdesign-skill★ 579
在 Superdesign 画布上做 UI 与营销图的设计技能:先读代码库拿上下文、抽取现有设计系统,再通过 Superdesign CLI 生成并迭代可分支的设计稿、流程页与可复用组件。
linhay/harmony-next.skills★ 351
为 DeepSeek Harness 提供 HarmonyOS NEXT 技能包、离线 API 参考及 DevEco、HDC 与模拟器自动化指南。
VDERR/echocat-skill-panel-3.0★ 201
每轮对话报告本轮调用了哪些 skill(模型自动加载、用户输入 /name,或一个都没用),并管理本机 skill 目录:粘贴仓库、文件夹、SKILL.md 或 zip 地址即可安装,中文显示名写入该 skill 的 meta.yaml,删除时保留备份。
sandbaseai/sandbase-skills★ 195
通过文件系统 Skill provider 将 88 个研究、社交情报、营销与商业 Agent Skills 挂载到 dsh。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。