Zum Hauptinhalt springen
Z

dsh-skill-panel

ztqing4agents/dsh-skill-panel

DSH-Webpanel: gemeinsame Liste integrierter, lokaler und Markt-Skills. Status nach Belegen auf dem Datenträger (Symlink, Installationsregister) und fester Rangfolge; Duplikate erscheinen einmal aus der priorisierten Quelle. Schalter ändern disable-model-invocation in der jeweiligen SKILL.md. Integrierte Skills haben keine beschreibbare Datei: Status im Panel gespeichert, Register unverändert; Symlinks schreibgeschützt. Hinzufügen nimmt lokales Verzeichnis oder öffentlichen github.com-Link (.git, /tree, #path:) und erstellt einen flachen Klon. Der Markt-Tab durchsucht skillhub.cn in drei Quellbereichen und installiert nach ~/.dsh/skills; mit Update-Prüfung und Rollback bei Fehlern. UI Chinesisch/Englisch. Paketname und mount id dsh-skill-panel; neben dsh-skill-center nutzbar.

Installation

dsh plugin --profile web add github:ztqing4agents/dsh-skill-panel

README

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内置
R2filesystem 但在 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。

Ähnliche Plugins