🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

技能中心 WLX2007/DSH-SkillsHub

DeepSeek Harness
WLX200722 天前有提交已提供中文文档扫描:含敏感能力

搜索安装并管理本地 Agent 技能

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/14 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add WLX2007/DSH-SkillsHub
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/11/04·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 22 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 45 处,展示前 39 条)
  • 发起网络请求
    src/client/api.ts:271
    return this.request(API.setEnabled, { method: 'POST', body: { name, path, enabled } })
  • 发起网络请求
    src/client/api.ts:283
    return this.request(API.setProviderEnabled, { method: 'POST', body: { name, provider, enabled } })
  • 发起网络请求
    src/client/api.ts:288
    return this.request(API.create, { method: 'POST', body: payload })
  • 发起网络请求
    src/client/api.ts:293
    return this.request(`${API.read}?name=${encodeURIComponent(name)}&path=${encodeURIComponent(path)}`)
  • 发起网络请求
    src/client/api.ts:312
    return this.request(API.update, { method: 'POST', body: payload })
  • 发起网络请求
    src/client/api.ts:317
    return this.request(API.delete, { method: 'POST', body: { name, path } })
  • 读取本地文件
    src/core/collect.ts:207
    if (existsSync(join(current, '.git'))) return current
  • 读取本地文件
    src/core/collect.ts:313
    if (!existsSync(root)) return
  • 读取本地文件
    src/core/collect.ts:316
    entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    src/core/collect.ts:345
    const target = await stat(join(root, name))
  • 读取本地文件
    src/core/collect.ts:356
    if (!existsSync(file)) continue
  • 读取本地文件
    src/core/collect.ts:359
    content = await readFile(file, 'utf8')
  • 写入本地文件
    src/core/collect.ts:604
    await mkdir(targetDir, { recursive: true })
  • 写入本地文件
    src/core/collect.ts:605
    await writeFile(target, buildSkillContent(name, description.trim(), whenToUse, content, false), 'utf8')
  • 写入本地文件
    src/core/collect.ts:624
    await writeFile(path, buildSkillContent(name, description.trim(), whenToUse, content, disabled), 'utf8')
  • 写入本地文件
    src/core/collect.ts:649
    await mkdir(trashDir, { recursive: true })
  • 写入本地文件
    src/core/collect.ts:651
    await rename(unit, trashTarget)
  • 读取本地文件
    src/core/frontmatter.ts:132
    const content = readFileSync(file, 'utf8')
  • 写入本地文件
    src/core/frontmatter.ts:152
    writeFileSync(tmp, rewritten, { encoding: 'utf8', flag: 'wx' })
  • 写入本地文件
    src/core/frontmatter.ts:153
    renameSync(tmp, file)
  • 删除本地文件
    src/core/frontmatter.ts:157
    unlinkSync(tmp)
  • 读取本地文件
    src/core/provider-toggles.ts:161
    return deserializeProviderToggles(await readFile(providerToggleFile(dshHome), 'utf8'))
  • 写入本地文件
    src/core/provider-toggles.ts:169
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    src/core/provider-toggles.ts:180
    await rename(temp, path)
  • 删除本地文件
    src/core/provider-toggles.ts:182
    await unlink(temp).catch(() => {})
  • 发起网络请求
    src/market/fetch.ts:125
    response = await fetch(url, withIdentityEncoding({
  • 读取本地文件
    src/market/installer.ts:167
    if (existsSync(targetDir)) {
  • 写入本地文件
    src/market/installer.ts:190
    await mkdir(stagingDir, { recursive: true })
  • 写入本地文件
    src/market/installer.ts:222
    await mkdir(join(target, '..'), { recursive: true })
  • 写入本地文件
    src/market/installer.ts:223
    await writeFile(target, body, 'utf8')
  • 写入本地文件
    src/market/installer.ts:237
    await writeFile(join(stagingDir, '.skills-hub.json'), JSON.stringify(provenance, null, 2), 'utf8')
  • 删除本地文件递归
    src/market/installer.ts:243
    await rm(stagingDir, { recursive: true, force: true }).catch(() => {})
  • 写入本地文件
    src/market/installer.ts:273
    await rename(from, to)
  • 发起网络请求
    src/market/proxy.ts:109
    async fetch(url: string, options: FetchTextOptions = {}): Promise<string> {
  • 请求外部主机raw.githubusercontent.com
    src/market/registry.ts:129
    if (url.startsWith('https://raw.githubusercontent.com/')) return this.proxy.fetch(url, merged)
  • 发起网络请求
    src/market/registry.ts:129
    if (url.startsWith('https://raw.githubusercontent.com/')) return this.proxy.fetch(url, merged)
  • 读取本地文件
    src/routes.ts:370
    const raw = readFileSync(scanned.path, 'utf8')
  • 读取本地文件
    src/routes.ts:438
    const raw = readFileSync(skill.path, 'utf8')
  • 读取本地文件
    src/routes.ts:620
    const disabled = parseFrontmatter(readFileSync(skill.path, 'utf8')).disableModelInvocation === true
扫描于 2026/11/5(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
涉及外部主机:raw.githubusercontent.com

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-layout@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-settings-plugins@deepseek-ai/dsh-client-ui-sidebar@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
@wulongxi/dsh-skills-hub Skills Hub(技能中心) 是 DeepSeek Harness(DSH)的一个插件,在 Web GUI 中添加一个原生面板,用于发现、安装和管理 Agent Skills。 一个面板提供三项能力: - 市场 —— 搜索在线技能库(默认源 skillhub.cn,另有 skills.sh 与任意公开 GitHub 仓库),预览技能的完整文档,并在决定安装前查看其文件清单。 - 我的技能 —— 按来源分组浏览运行时加载的全部技能;启用/停用技能、编辑其 SKILL.md、或将其删除(删除移入 .trash,不直接丢失)。 - 创建 —— 把新技能写入用户级或项目级技能根,frontmatter 处理由面板代劳。 面板读取官方技能根(<项目>/.dsh/skills、<项目>/.agents/skills、~/.dsh/skills、~/.agents/skills,加上配置的 customSkillDirs),并与宿主技能注册表合并——面板显示的技能就是模型实际收到的技能。 | 状态 | 市场搜索与预览:已可用。技能安装:已可用(M3)。
展开完整文档(README 剩余 1 节)
@wulongxi/dsh-skills-hub

Skills Hub(技能中心) 是 DeepSeek Harness(DSH)的一个插件,在 Web GUI 中添加一个原生面板,用于发现、安装和管理 Agent Skills。

一个面板提供三项能力:

- 市场 —— 搜索在线技能库(默认源 skillhub.cn,另有 skills.sh 与任意公开 GitHub 仓库),预览技能的完整文档,并在决定安装前查看其文件清单。
- 我的技能 —— 按来源分组浏览运行时加载的全部技能;启用/停用技能、编辑其 SKILL.md、或将其删除(删除移入 .trash,不直接丢失)。
- 创建 —— 把新技能写入用户级或项目级技能根,frontmatter 处理由面板代劳。

面板读取官方技能根(<项目>/.dsh/skills、<项目>/.agents/skills、~/.dsh/skills、~/.agents/skills,加上配置的 customSkillDirs),并与宿主技能注册表合并——面板显示的技能就是模型实际收到的技能。

| 状态 | 市场搜索与预览:已可用。技能安装:已可用(M3)。 |
| 要求 | DSH >= 0.2.0-rc.2 |
| 许可证 | BSD-3-Clause |
| 语言 | 简体中文、English(跟随 GUI 语言设置) |

安装

从本地检出(link 安装)

dsh plugin --profile <profile> add link:<本仓库路径>

重启 DSH 服务后,侧边栏出现技能中心入口;选中即在中央栏打开面板。

从 npm 安装(发布后)

dsh plugin --profile <profile> add @wulongxi/dsh-skills-hub

使用

市场页

输入关键词回车即搜索。搜索框左侧的来源选择器决定本次搜索询问哪个注册站;选择作用于下一次搜索,因此列表永远与产生它的查询一致。

- skillhub.cn(默认)—— 国内 Skill 商店,19 万+ 技能,直连无需加速节点。该站点明确邀请 Agent 集成:发布面向 Agent 的集成文档(install/skillhub.md)、robots.txt 全开放、读路径全程无鉴权。结果带中文描述、下载量与图标。
- skills.sh —— Agent Skills 注册中心的搜索接口。该来源只服务一页;面板如实说明,而不是提供一个只会返回空结果的"加载更多"按钮。
- GitHub 仓库 —— 仓库也可以直接浏览:输入 owner/repo(完整 URL、.git 后缀均可),面板通过 GitHub API 枚举其中每一个技能目录。

长结果列表滚动到底自动加载下一页,并保留显式的「加载更多」按钮作为键盘/点击目标。点技能名打开详情弹窗,正文由 shell 自己的 markdown 渲染器呈现——与在会话中读到的排版完全一致——并列出文件清单与总大小。

许可证如实标注,绝不粉饰。 每条结果都声明其许可证:声明了的直接显示(MIT、GPL-3.0 等);未声明的显示未声明许可证。抽样目录中过半条目未声明,而这是用户决定是否把技能复制到磁盘前必须知道的事实。

从市场安装

详情弹窗里就是安装入口。安装动作出现在正文读完之后,许可证行与文件清单和按钮同屏。安装确认两次:先选目标位置(用户级 ~/.dsh/skills 全局生效,或当前项目的 .dsh/skills),再弹确认框——在做出决定的时刻重述许可证状态。

安装过程以"失败不留痕"为设计目标:

- 先暂存后改名。 文件先落在目标旁的暂存目录,全部到齐并通过限额后才整目录改名就位。失败或取消的安装不改变磁盘原状——不会留下半个技能被模型加载。
- 同名即报错。 已存在同名技能绝不静默覆盖(面板应答 409;更新已装技能是 M4 的事)。
- 处处有界。 单文件 2 MB、总量 16 MB、最多 200 个文件,且清单里每个路径都要先通过严格的相对路径文法校验才会被写盘。
- provenance 随技能走。 安装目录内的 .skills-hub.json 记录市场 id、来源、安装时的许可证与时间戳——M4 的更新检查就从它读回。

我的技能页

技能按来源分组(项目、用户、插件提供方、运行时注册)。有文件支撑的技能可以启用/停用——开关会改写其 frontmatter 中的 disable-model-invocation——可以编辑、删除。运行时由插件注册的技能磁盘上没有文件;面板按组说明一次,而不是在每一行上重复,其启用状态保存在面板自己的配置中。

预览

每条技能都能预览,包括磁盘上没有 SKILL.md 的内置与运行时注册技能——host 对它们回退到运行时技能注册表,弹窗如实标注来源(「来自文件」/「来自技能注册表」)。frontmatter 字段以定义列表呈现在正文上方,绝不混入 markdown:开头那行 --- 在 GFM 里是主题分隔线,会把 YAML 变成标题和零散散文。

配置

插件配置(profile patch):

| 字段 | 类型 | 默认值 | 说明 |
| enabled | boolean | true | 总开关;false 时不挂载任何路由。 |
| githubProxies | string[] | 内置降级链 | GitHub raw 内容的加速前缀,按序尝试;包含 "" 表示先试直连。 |
| customSkillDirs | string[] | [] | 额外扫描的技能根目录。 |
| dshHome | string | $DSH_HOME 或 ~/.dsh | 覆盖用户配置根。 |

安全模型

- 全部路由位于共享 loopback 围栏之后(套接字地址 + Host 头 + 浏览器同源标记)。未配对的局域网客户端在触碰任何技能文件之前即收到 403 forbidden: loopback-only。装载 dsh-remote-web-ui 时,有效的已配对设备 cookie 是额外放行路径;未配对与已撤销设备仍收到 403。
- 客户端提交的 path 只是身份声明。 触碰任何文件之前,host 重新扫描并要求同名技能解析到完全相同的路径。因此消失的项目技能不可能被重定向到同名的用户级技能上,这些路由也无法被用来读写任意路径。
- 浏览器从不发送 URL。 市场请求只携带 host 签发的不透明技能 id;仓库、ref、目录与文件路径一律由 host 侧重建,且 id 文法逐段校验,路径逃逸在到达任何 fetch 之前即被拒绝。
- 远程抓取只发生在 host 半区,位于信任围栏之后。未认证 GitHub API 允许 60 次/小时,因此只有"发现"(列目录)碰它,并缓存 30 分钟;文件正文经加速节点链从 raw.githubusercontent.com 读取,不占用该预算。skillhub.cn 直连。
- 注册站图标走代理而非直链。 图标 URL 由 host 侧按显式策略抓取(仅 https、域名白名单、图片类型、256 KB 上限)并转为 data URL 回传,浏览器从不加载第三方源:无 referrer 泄漏、无逐次渲染的追踪请求。
- 安装只从 id 重建一切。 安装路由只收不透明技能 id 与面板正在显示的工作区;文件清单来自技能自身的详情清单(绝非客户端提交),落盘目录由 host 侧推导,清单中每个路径在拼接到暂存根之前先过校验。因此安装能写到的只有技能根下的技能目录。
- 写操作有上限(正文 64 KB)、符号链接技能拒绝删除/编辑(两者都会越出其技能根)、删除移入 .trash 而非直接抹除。

架构

本包是双半区 DSH 插件:

- host 半区(lib/index.js,运行于 DSH 服务进程)—— 服务 /api/skills-hub/ 路由族,独占网络访问、文件 I/O 与信任围栏。
- client 半区(lib/client.js,运行于 Web GUI)—— 经 shell 的官方槽位(sidebar.panellist 与 keyed main 槽)注册侧边栏入口与中央栏页面,行盒、高亮与面板切换全部归 shell 所有,与官方插件页、定时任务页完全一致。

客户端只构建在宿主冻结的浏览器模块表之上(react、@deepseek-ai/cordis、@deepseek-ai/dsh-client-ui-);每个控件都是官方共享原语(Button、Switch、Input、Menu、Modal、MarkdownText 等)——不手搓任何控件。注册失败只记录日志并降级面板,绝不拖垮 GUI 启动。

开发

pnpm install
pnpm typecheck # tsc --noEmit
pnpm build # tsc -b tsconfig.build.json && tsdown

测试套件(node tests/<file>.mjs 运行):

| 套件 | 范围 |
| m0-smoke.mjs | 按 host 的方式加载两个 bundle;断言 loader 合约、注入 require 的使用与路由注册。 |
| m1-host.mjs | 在真实临时技能目录树上驱动路由族:扫描分级、写路由身份校验、符号链接保护、围栏拒绝。 |
| market.mjs | 市场层 fake transport 零网络:聚合、去重、id 文法(含路径逃逸尝试)、来源合约、安装器的暂存/路径安全/provenance。 |
| ui-structure.mjs | UI 守卫:只用官方原语、卡片 anatomy、滚动高度链——每条都有负向控制。 |
| theme-tokens.mjs | 校验引用的每个 CSS 自定义属性都存在于发行主题中——未定义的 token 会让 var() 静默丢弃整条声明。 |
| market-live.mjs、icon-live.mjs、install-live.mjs、tools/scroll-selftest.mjs | 手动的真网络 / 真浏览器冒烟;不进自动门禁。 |

目录结构

src/
index.ts host 入口:插件合约、配置、mount-once 防重 routes.ts /api/skills-hub/ 处理器 access.ts, loopback.ts, pair-access.ts 信任围栏(loopback + 已配对设备 cookie) http.ts 限长 body 读取、JSON 写出 core/ 多根技能扫描、frontmatter 解析/改写、插件提供技能的开关存储 market/ 市场源注册:抓取限额、TTL 缓存、加速链、 skill-id 编解码、来源适配器 client/ browser 半区:字典、槽位注册、面板 tests/ 自动化套件(见「开发」) docs/ 设计文档(中文)

路线图

| 里程碑 | 范围 | 状态 |
| M0 | 插件骨架、侧边栏入口、构建管线 | ✅ 已交付 |
| M1 | 本地管理:浏览 / 启停 / 编辑 / 创建 / 删除 / 预览 | ✅ 已交付 |
| M2 | 市场:多源搜索、详情预览、分页、图标 | ✅ 已交付 |
| M3 | 安装引擎:校验、限额、原子写入、provenance | ✅ 已交付 |
| M4 | 生命周期:来源记录、更新检查、本地修改检测 | 规划中 |
| M5 | 自定义注册清单、离线导入、加速节点设置界面 | 规划中 |

许可证

BSD-3-Clause © WLX2007
预览分享卡片长什么样 ↓WLX2007/DSH-SkillsHub
分享 · DeepSeek Harness Hub
WLX2007/DSH-SkillsHub

搜索安装并管理本地 Agent 技能

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部