- Home
- Plugin
- Competenze
- dsh-skill-panel
dsh-skill-panel
ztqing4agents/dsh-skill-panel
Pannello Web DSH: lista unica di skill integrate, locali e del mercato. Stato valutato da prove su disco (link simbolico, registro d’installazione) e precedenza fissa; i duplicati appaiono una volta dalla fonte prioritaria. Gli interruttori modificano disable-model-invocation nel relativo SKILL.md. Le integrate non hanno file scrivibile: stato salvato nel pannello, registro invariato; link simbolici di sola lettura. Aggiungi accetta una directory locale o un link pubblico github.com (.git, /tree, #path:) e crea un clone superficiale. La scheda mercato esplora skillhub.cn in tre ambiti di origine e installa in ~/.dsh/skills, con controllo aggiornamenti e rollback degli errori. UI cinese/inglese. Pacchetto e mount id dsh-skill-panel; compatibile con dsh-skill-center.
Installazione
dsh plugin --profile web add github:ztqing4agents/dsh-skill-panelREADME
dsh-skill-panel(技能面板)
DSH 技能面板:一个侧栏入口 + 一页全局面板,把内置 / 本地 / 已安装三类技能分成三组列出来, 每行一个开关,直接启用或停用。
- 一眼分得清:分组依据是磁盘与台账的真实证据(软链、
_meta.json、安装台账、目录名结构), 不是猜的;同名技能只出现一次,显示的就是模型实际会拿到的那一条。 - 开关真的生效:本地/已安装技能改写它自己的
SKILL.md里的disable-model-invocation,其余字节一个不动 (含 CRLF、BOM、注释与行序);内置技能没有可写文件,状态存在插件自己的存储里,面板内即读即生效。 - 找得到也装得上:技能市场连的是 skillhub.cn 的镜像目录(ClawHub 的技能也在里面),来源分「所有来源」
(默认,22.4 万)/「SkillHub」(16.1 万)/「ClawHub」(6.3 万)三档,一档一次请求;一键装到
~/.dsh/skills/,装完在新建的会话里可用;工具条「+ 添加技能」旁的 ⌄ 是宿主那张两项菜单:「安装第三方技能」开添加弹窗(既能填本机目录路径,也能填 GitHub 仓库链接)、「让 Agent 创建技能」进创造模式让 Agent 帮你写一个。添加弹窗认这些写法(github:owner/repo或https://github.com/owner/repo,可带/tree/<分支>/<子目录>);详情页头「卸载」连目录带台账记录一起删——两处都按宿主的形状做(一次输入、一次确认,成功不弹提示)。 - 点得进去:「已安装」页签的行点标题就进这个技能的本地详情——调用名(kebab,可直接选中复制)、技能文件与真实位置、
提供者与只读原因、
SKILL.md正文、来源信息(代码来源 / 当前版本,本地技能是目录或link:路径)、市场装的技能才有版本区块(进页签与打开详情会自动检查、可展开看新版本,有新版本时详情页头出现「更新」,也能手动「重新检查」)、以及「查看仓库」外链;右侧开关仍是行里唯一的独立控件。内置插件点进去是它包含的组件列表(图标 + 名称 + 描述 + 右侧状态与开关,行本身不可点)。 「技能市场」页签的卡片同样可点开详情,点卡片的空白处进详情、点按钮只安装;详情头部照宿主「插件详情页」排:面包屑「技能」+ 图标行(右侧动作组:更新(有新版本时才有)→ 卸载(红色描边)→ 开关)+ 名称 / 版本 / 作者 / 描述,来源信息在页尾。 - 图标跟着身份走:从市场装的技能在「已安装」列表里显示它在市场里的同一张图;没有上游身份的技能仍是首字母瓦片。

安装
装完都要重启 DSH——bundle 列表只在启动时读取。
桌面 App 用户:在 App 内「插件」页 → 添加插件 → 粘贴 github:Ztqing4Agents/dsh-skill-panel,装好后侧栏出现「技能」一行,点开就是本页。不走 CLI 是因为 --profile desktop 由 App 独占,CLI 会被 error: profile "desktop" is managed exclusively by the Electron application 挡住。
CLI / 自建 profile 用户:dsh plugin --profile <name> add github:Ztqing4Agents/dsh-skill-panel(--profile 是必填项,缺了报 error: required option '--profile <name>' not specified)。需要 pnpm 在 PATH 上(缺了报 spawn pnpm ENOENT);安装时会去 npm registry 补装 8 条 peer 依赖,所以不能只通 github.com。重复执行是幂等的(Already up to date)。
本地开发用 link:(安装时不需要构建,client.js 已随包入库;只有改 src/client/** 时才需要 npm run build):profile 的 package.json 里写 "dsh-skill-panel": "link:/path/to/dsh-skill-panel"、dsh.profile.bundles 加上 dsh-skill-panel,再在 profile 的 node_modules 里建一条相对软链指向包目录。
从旧版本(dsh-skill-center)升级:先 mv ~/.dsh/dsh-skill-center ~/.dsh/dsh-skill-panel(收藏、安装台账、插件开关三个文件都在这个目录里),再把 profile 里的旧包名换成新的;不 mv 就读不到旧数据。
页面
| 区域 | 内容 |
|---|---|
| 页头 | 大标题、副标题、ⓘ 说明、更新提示(N 个技能可更新 / 部分失败 / 全部最新;宿主同位只有这一句,不显示计数)、刷新 |
| 页签 | 「已安装」/「技能市场」(市场页签见下节);市场页签切走再回来,已加载的页与筛选都还在;「已安装」面切走再回来会回到列表顶部(只有「进详情再返回」才回到原滚动位置) |
| 分区 | 内置技能配置(按提供者折成块:univer、dsh-office… 点块看它包含的技能)→ 本地技能 → 已安装技能,空分区也保留区标题与该区空文案 |
| 行 | 48×48 首字母彩色瓦片(配色与 skillhub.cn 一致)+ 名称 + 单行描述 + 右侧开关(行高 64px) |
| 页脚 | 另有 N 个技能位于项目级或其他目录,首版不展示 |
页头随滚动收拢并停靠,控件逐渐让位(先去掉按钮文字,再让页签换行)——照宿主「插件」页的实现搬来,不是另做一套。
技能市场
切到「技能市场」页签:搜索框搜当前范围(停顿 250ms 发请求、回车立即),范围在所有来源(默认)/ SkillHub / ClawHub 之间切换,可按分类收窄、可改排序(默认 / 最近更新 / 下载量 / 收藏量);标签带该分类数量(「全部」是范围总数), 滚到底自动翻页、取尽才出现「没有更多了」。点卡片的空白处看详情(概览 + 事实表 + 包内文件清单),「返回市场」回到原位置与已加载页数。
装到哪:$DSH_HOME/skills/<name>(默认 ~/.dsh/skills/<name>),与手装技能同一位置,由 Harness 自己的技能系统发现。
<name> 取自包里 SKILL.md 声明的 name,不是市场显示的名字,所以会出现「市场叫 A、目录叫 B」——详情页「安装到」一行就是最终路径。
什么时候生效:新建的会话里可用;当前会话仍用它已加载的清单,所以不会立刻出现(面板也不会说「立即生效」或「请重启」)。
同名怎么办:本机已有同名目录时一律拒绝安装并给出完整路径,没有覆盖入口——要换版本先把旧目录移出 ~/.dsh/skills/ 再装;已经装过的技能要升级请走「已安装」页签详情页的「更新」。
为什么有的技能装不了:宿主技能名是 ^[a-z0-9]+(?:-[a-z0-9]+)*$(小写 kebab-case),声明名是 Design、带空格或中文的包一律拒绝——
不是本插件保守,是宿主硬装进去也不会加载;出路只有等作者改名,或装好后手动改 SKILL.md 的 name 与目录名。
三分区怎么判
首个命中即定,顺序不可换:
| 序 | 条件 | 结论 |
|---|---|---|
| R1 | 来源不是 filesystem | 内置 |
| R2 | filesystem 但在 bundled 档 | 内置 |
| R3 | 项目级 / 自定义根 / user-agents 档 | 本版不展示(计入页脚) |
| R4 | 目录是软链 | 本地 |
| R5 | 安装台账命中 | 已安装 |
| R6 | _skillhub_meta.json / _meta.json 带 source | 已安装 |
| R7 | _meta.json 同时有 ownerId + slug | 已安装 |
| R8 | 目录名 <handle>--<slug> 且后缀等于声明名 | 已安装(中置信) |
| R9 | 其余 | 本地 |
同名跨分区只显示一次,按档位数值小者胜(100 项目级 < 200 < 250 运行时 < 300 < 400 用户 < 500 < 600 bundled): 面板显示的必须是模型实际拿到的那一条。图标不参与这套判定:它只决定那一行画图还是画首字母。
已知限制
- 软链技能只读:不渲染开关,改渲染「软链·只读」标记;即使有人直接打接口,服务端也会返回
409 E_SYMLINK_READONLY且不写任何字节。 - 内置技能的开关只在本面板内生效:注册表不感知这份状态,模型是否仍收到该技能取决于提供它的 provider。面板如实说明,不假装改动了别处。
- 「+ 添加技能」加的是本机目录:输入一个技能目录的完整路径(可以
~开头),校验SKILL.md与名字后整份复制进~/.dsh/skills/<name>;同名已存在、名字不合规、目录里有软链、条目或体积超限都拒绝,且不留半成品。 - 市场是网络功能,一次只看一个范围:离线或当前范围连不上时,市场页签进整页错误态(可重试),「已安装」 页签完全不受影响。「所有来源」是上游一次不带过滤的请求,所以列表天然混排,但仍是一页一次请求。
- 搜索与浏览都能翻页:关键词搜索走同一个目录端点,三个范围都能一直往下翻。
- 三个范围都有分类:分类表同一张(12 类),数量按范围各算、换范围时旧数字留着、新数字到了就地替换 (不换骨架);取不到数量时该标签只显示名字。
- 标题优先显示上游名字:从市场装的技能在「已安装」里显示它在市场里的标题(鼠标悬停可看到 kebab 调用名)。
取不到上游标题时回落技能自己声明的显示名(
metadata.displayName),再没有就显示目录名/kebab 名。 - 图标只对本面板装的技能生效:手工放进
~/.dsh/skills/的技能、别的工具装的技能没有我们写下的来源记录, 仍是首字母瓦片——我们不猜身份(也不从目录名反推)。 - 图标是上游给的图片地址:卡片与详情显示上游给的绝对
https图片,宽幅图标按原比例完整显示、不裁切;没有图、 取不到或加载失败都回落首字母。已安装行的图标后补(先首字母,补齐再换图,同一技能只问一次),每次打开面板重新取 一次,所以断网时全是首字母(不影响技能本身)。 - 卡片显示三段数字:评分(由上游
score折算成 4.0–5.0)· 下载量 · 收藏数,不显示安装数;缺失的值整段不渲染, 不会显示成 0。这三段都是显示上游的数字,本版没有自己的评分或收藏入口。 - 装完若台账写入失败:目录会在、面板却显示「未安装」,此时再装会被同名检查拦下;把目录移出
~/.dsh/skills/后重装即可。 - 会检查更新,也能更新:市场装的技能在进「已安装」页签、打开详情、点页头刷新、手动「重新检查」时自动检查(不弹提醒),页头那句更新提示给出「N 个技能可更新 / 部分技能检查更新失败 / 所有技能均为最新版本」;有新版本时详情页头出现「更新」,走覆盖安装,失败保留或回滚到原版本、启用状态保留,但上游文件会整体替换那个技能目录,本地改动会丢。
- 仍没有版本回退:回退只在「新版本出问题」时才有用,还没做——换回旧版得手动把目录移出
~/.dsh/skills/再装。卸载技能已经有入口(详情页头的「卸载」)。 - 包声明名不合规就不能装:见上节——本插件不改名、也不用 slug 顶替。
- 写路由只接受面板展示过的
(名称, 路径):执行前重新扫描,路径不完全一致即409 E_STALE_PATH, 软链、越界、无 frontmatter 一律拒绝。 - 所有路由仅限本机(loopback 套接字 + Host 头 + 浏览器同源标记,带转发头一律否决)。
要求
- DSH
>= 0.2.1,Node>= 20;技能市场只需要访问api.skillhub.cn(经本插件的 Host 代理转发,浏览器不直连)。 - 运行时零依赖;
esbuild只在重新构建client.js时需要。
许可
BSD-3-Clause,全文见 LICENSE。