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

技能市场 dakeqiqi123/dsh-skill-market

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

在输入框选技能,并统一安装管理技能

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 51 处,展示前 41 条)
  • 发起网络请求
    client.js:382
    const response = await fetch(`api/skill-market/${action}`, {
  • 写入剪贴板
    client.js:940
    await navigator.clipboard.writeText(token)
  • 读取本地文件
    lib/manage.js:118
    skill.installedAt = (await stat(skill.path)).mtimeMs
  • 写入本地文件
    lib/manage.js:146
    await mkdir(this.dataDir, { recursive: true })
  • 写入本地文件
    lib/manage.js:147
    await writeFile(this.usageFile, `${JSON.stringify({ used: Object.fromEntries(kept) }, null, 2)}\n`, 'utf8')
  • 读取本地文件
    lib/manage.js:154
    const parsed = JSON.parse(await readFile(this.usageFile, 'utf8'))
  • 读取本地文件
    lib/manage.js:269
    const text = await readFile(file, 'utf8')
  • 写入本地文件
    lib/manage.js:350
    await rename(directory, next)
  • 写入本地文件
    lib/manage.js:356
    await rename(file, next)
  • 写入本地文件
    lib/manage.js:365
    await writeFile(temporary, text, 'utf8')
  • 写入本地文件
    lib/manage.js:366
    await rename(temporary, file)
  • 读取本地文件
    lib/manage.js:388
    const text = await readFile(candidate.path, 'utf8')
  • 读取本地文件
    lib/manage.js:435
    const text = await readFile(file, 'utf8')
  • 删除本地文件递归
    lib/manage.js:501
    await rm(staging, { recursive: true, force: true }).catch(() => {})
  • 读取本地文件
    lib/manage.js:540
    const text = await readFile(join(candidate, 'SKILL.md'), 'utf8')
  • 读取本地文件
    lib/skill-file.js:459
    raw = await readFile(path, 'utf8')
  • 读取本地文件
    lib/skill-file.js:520
    entries = await readdir(root, { withFileTypes: true, encoding: 'utf8' })
  • 读取本地文件
    lib/skill-file.js:541
    return (await stat(path)).isFile()
  • 执行外部命令固定命令
    lib/git-install.js:42
    const child = spawn('git', args, { stdio: ['ignore', 'ignore', 'inherit'], ...options })
  • 读取本地文件
    lib/git-install.js:54
    await stat(path)
  • 读取本地文件
    lib/git-install.js:143
    for (const entry of await readdir(working, { withFileTypes: true })) {
  • 写入本地文件
    lib/git-install.js:211
    await mkdir(target, { recursive: false }).catch((error) => {
  • 写入本地文件
    lib/git-install.js:220
    await mkdir(dirname(destination), { recursive: true })
  • 写入本地文件
    lib/git-install.js:221
    await writeFile(destination, body, { encoding: 'utf8', flag: 'wx' })
  • 读取本地文件
    lib/git-install.js:226
    const parsed = await parseFrontmatter(await readFile(join(target, 'SKILL.md'), 'utf8'))
  • 删除本地文件递归
    lib/git-install.js:232
    await rm(target, { recursive: true, force: true }).catch(() => {})
  • 读取本地文件
    lib/git-install.js:369
    await readFile(join(source, candidate.entry), 'utf8'),
  • 删除本地文件递归
    lib/git-install.js:382
    await rm(working, { recursive: true, force: true }).catch(() => {})
  • 读取本地文件
    lib/git-install.js:392
    for (const entry of await readdir(directory, { withFileTypes: true })) {
  • 读取本地文件
    lib/git-install.js:399
    payload.push({ relativePath: relative(root, path).split(sep).join('/'), body: await readFile(path, 'utf8') })
  • 读取密钥环境变量
    lib/github.js:107
    const secret = token ?? process.env.DSH_SKILL_MARKET_TOKEN
  • 发起网络请求
    lib/github.js:110
    const response = await fetch(url, { headers, signal })
  • 写入本地文件
    lib/marketplace.js:178
    await mkdir(directory, { recursive: false }).catch((error) => {
  • 写入本地文件
    lib/marketplace.js:185
    await writeFile(file, renderSkillFile(skill), { encoding: 'utf8', flag: 'wx' })
  • 删除本地文件递归
    lib/marketplace.js:187
    await rm(directory, { recursive: true, force: true })
  • 发起网络请求
    lib/marketplace.js:204
    const response = await fetch(url, { signal })
  • 写入本地文件
    lib/marketplace.js:215
    await mkdir(directory, { recursive: true })
  • 写入本地文件
    lib/marketplace.js:216
    await writeFile(file, body, { encoding: 'utf8', flag: 'wx' })
  • 读取本地文件
    lib/marketplace.js:237
    text = await readFile(file, 'utf8')
  • 删除本地文件递归
    lib/marketplace.js:252
    await rm(join(this.installRoot, name), { recursive: true, force: true })
  • 读取本地文件
    lib/marketplace.js:303
    await stat(path)
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 输入框内选择技能
  • 统一管理技能
  • 四种安装来源

DeepSeek Harness 插件:在输入框里直接选技能,并在同一处管理技能(本地文件夹 / zip / 粘贴 / GitHub 四种安装来源)

README

由 DeepSeek 最新模型翻译生成
dsh-skill-market 给 DeepSeek Harness 用的技能:一个输入框入口,用来挑技能;一个管理面板,用来安装、启用、整理和删除技能。 一个把「选技能」和「管技能」放在同一处的 DSH 插件:输入框左下角一个「技能」按钮,点开就是搜索 + 技能列表;再往下两行是 从本地添加技能 和 管理技能(浏览、搜索、双击即用、两档开关、四种安装来源)。 本插件属于 DeepSeek Harness 生态的第三方插件,不是官方项目。适配:Harness 0.2.x 桌面端(Web 前端)。 开发过程、验证矩阵与踩坑记录见 docs/DEVNOTES.md;立项时的设计笔记(扩展点取证与取舍)见 docs/DESIGN.md。 功能 技能菜单(输入框左下角「技能」) - 点击后在输入框正上方打开插件自己的弹层:顶部搜索框,按技能名称、描述或标签实时过滤。 - 标签就是每行本来带的那些语义:来源、「本插件安装」、「只读」、「菜单可见 / 不可见」、「模型可用 / 不可用」、「仅用户可调用」——搜「只读」「不可见」这类词也能命中。 - 输入为空时保持原样:仍然只列 10 个技能,排序取"最近使用 / 最新搭载"里较新的那个,底部两行固定动作照旧。 - 没有匹配时不是一片空白,而是回显关键词的空状态 + 提示 + 一键清空。
展开完整文档(README 剩余 1 节)
dsh-skill-market

给 DeepSeek Harness 用的技能:一个输入框入口,用来挑技能;一个管理面板,用来安装、启用、整理和删除技能。

一个把「选技能」和「管技能」放在同一处的 DSH 插件:输入框左下角一个「技能」按钮,点开就是搜索 + 技能列表;再往下两行是 从本地添加技能 和 管理技能(浏览、搜索、双击即用、两档开关、四种安装来源)。

本插件属于 DeepSeek Harness 生态的第三方插件,不是官方项目。适配:Harness 0.2.x 桌面端(Web 前端)。
开发过程、验证矩阵与踩坑记录见 docs/DEVNOTES.md;立项时的设计笔记(扩展点取证与取舍)见 docs/DESIGN.md。

功能

技能菜单(输入框左下角「技能」)

- 点击后在输入框正上方打开插件自己的弹层:顶部搜索框,按技能名称、描述或标签实时过滤。
- 标签就是每行本来带的那些语义:来源、「本插件安装」、「只读」、「菜单可见 / 不可见」、「模型可用 / 不可用」、「仅用户可调用」——搜「只读」「不可见」这类词也能命中。
- 输入为空时保持原样:仍然只列 10 个技能,排序取"最近使用 / 最新搭载"里较新的那个,底部两行固定动作照旧。
- 没有匹配时不是一片空白,而是回显关键词的空状态 + 提示 + 一键清空。
- 键盘:↑↓ 选择、Enter 使用、Esc 关闭;点一行即把 /<技能名> 放进输入框。
- 在输入框里打 / 仍然走 Harness 自带菜单,行为不变。

管理面板

- 搜索 + 分类筛选:全部 / 本插件安装 / 本地目录 / 其他来源 / 可修改。
- 搜索同样覆盖名称、描述和上面那组标签,与筛选条件叠加生效。
- 无匹配时给出同样的友好空状态(回显关键词 + 一键清空)。
- 每行显示首字母徽标、名称(有显示名时显示它,并附 /技术名 标签)、来源徽标、描述,以及两个开关:
- 菜单可见 → user-invocable
- 模型可用 → disable-model-invocation

(与平台内置技能界面同一套语义,直接改写该技能 SKILL.md 的 frontmatter。)
- 双击任意一行即可使用:技能以 /<技能名> 的形式落进输入框光标处,面板自动关闭。
- 可改中文名:每行(可写来源)都有「改中文名」,表单里两栏——显示名(中文/任意文字,面板、弹层与 / 菜单显示的就是它)和技术名(kebab-case,/名称 调用令牌用的那个)。只改显示名时技术名与目录都不动。
- 有重命名记录的行会同时显示原名徽标(多个曾用名时显示 原名 X +N,悬停可看全部);有显示名时行上还会保留 /技术名 标签,提醒调用令牌是什么。
- 搜索同时命中显示名、技术名与所有曾用名,弹层、面板、/ 菜单与 skill_market 工具一致。
- 四种安装来源:本地文件夹 / zip 压缩包 / 粘贴 SKILL.md / GitHub 仓库。
- 列表每 2 秒自动重读,别处(或模型)装好的技能会自己出现。
- 弹层与面板都是不透明纯白底(#FFFFFF)并锁定浅色文字,深色主题下同样清晰。

给模型的入口

- skill_market 工具:list / local / catalog / search / install / install-dir / install-text / policy / rename / remove。
- 会话命令 /skill-market <list|install|add-dir|add-zip|add-text|policy|rename|touch|remove>,供手输与调试。

安装

要求:DSH 桌面端(Harness 0.2.x,Web 前端),Node 20+。

用宿主自己的安装入口(GUI 插件页安装,或命令行):

dsh plugin --profile <your-profile> add /absolute/path/to/dsh-skill-market

装完重启应用即可。不要手写 profile 的 package.json 或 cordis.patch.yml,也不要在 profile 目录里手工跑 pnpm ——上面这条命令会替你写依赖、跑包管理器、把新 bundle 选进 profile。

用本仓库源码安装时,profile 里的依赖是 file: 形式:移动或删除源码目录会让 profile 加载失败。
需要长期稳定的话,把包放到固定位置后再安装。

使用要点

技能格式:目录 <技能名>/SKILL.md 或单文件 <技能名>.md,frontmatter 至少要有 name(kebab-case)和 description。可选字段:

name: my-skill
description: 这个技能做什么(显示在菜单里) disable-model-invocation: true # 可选:禁止模型主动调用 user-invocable: false # 可选:不在用户菜单里出现

正文…

这两个可选字段就是面板里两个开关写回去的内容;都不写即两者都启用。
安装落点:默认 $DSH_HOME/skills——内置文件系统 provider 已经在扫描并监听这个目录,所以装完立即生效、无需重启。使用历史记在 $DSH_HOME/skill-market/usage.json。

zip 上传:选一个包含 SKILL.md 的 zip(可带子目录、脚本、附件),单包上限 8 MB。

配置

配置由安装入口写进 profile 的 patch 层,可用键:

| 键 | 默认 | 说明 |
| localDirs | [] | 额外扫描的技能目录 |
| installRoot | 空 | 安装落点;空 = $DSH_HOME/skills |
| rank | 350 | 本 provider 在注册表里的优先级,越小越靠前 |
| sources | [] | 精选清单里的 owner/repo[#ref] 来源 |
| token | 空 | 访问私有仓库用的 GitHub token;建议改用环境变量 |
| registerTool | true | 是否注册 skill_market 工具 |
| aliasEntries | true | 是否把技能的曾用名也发布成可调用的条目;关掉后旧名仍可搜索,但不再能当技能调用 |

名称:显示名与技术名(数据结构调整)

为什么不能直接把技能名改成中文:平台的技能名是硬性语法。@deepseek-ai/dsh-skill 里 SKILL_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)$/,注册表在三处校验它(provider 返回的候选名、载入的定义名、
skills.get() 的名字),内置文件系统 provider 也用同一套。中文写进 name: 的结果是:技能文件被 provider 忽略、
或整个 provider 的观测被拒绝 —— 技能会从菜单、skill 工具和模型目录里消失。

所以这个插件把两件事分开:

| | 技术名 name | 显示名 display-name |
| 取值 | kebab-case(小写字母/数字/连字符),≤ 64 | 任意文字,通常中文,≤ 40,单行 |
| 谁在用 | 注册表、/名称 调用令牌、skill 工具、模型目录 | 本插件的弹层、管理面板、以及 / 菜单里本插件那一组的标签 |
| 改动后果 | 真改名:目录/文件与 frontmatter 一起移动,旧名进 aliases 并可继续被调用 | 只写 frontmatter,不动文件、不动调用 |

name: audit-report-review # 技术名:唯一能被调用的那个 display-name: 审计报告复核 # 显示名:面板、弹层里看到的就是它,也是 / 菜单本插件那组的标签 description: …
original-name: audit-review # 首次改名时写入,此后永不修改
aliases: [audit-review, 报表复核] # 用过的、且不再是当前名称的名字(技术名与显示名混排),最旧在前

- 只增不删:每次改名把交出去的名字追加进 aliases(技术名和显示名都算);original-name 只写一次。
唯一的"移除"是某个名字又变回当前名称时——它不能同时是自己的曾用名。
没有第二个存储:记录写在技能自己身上,跟着技能走,卸载插件也不丢。
- 旧的技术名仍可调用:provider 会把它们发布成别名条目(rank 900,比任何真实来源都差),所以 /旧名 依旧能注入同一个技能;同名真实技能永远优先,别名不会抢占别人的名字。
设 aliasEntries: false 可整体关掉这些条目。
显示名永远不会被发布成条目——它不是合法技能名,发布会连累整个 provider 的观测被注册表拒绝。
- 列表与搜索:面板与弹层显示显示名(没有则显示技术名),旁边保留 /技术名 标签;有记录时附带「原名」徽标。
搜索同时匹配显示名、技术名、描述、标签与全部曾用名;别名条目不会被重复列成两行。
- 校验:技术名——非空、kebab-case、≤ 64、不能与任何其他技能的名称/显示名/曾用名冲突;显示名——≤ 40、单行、不能与其他技能的名称/显示名/曾用名重复。前端先判一次,宿主再判一次;只对本插件可写的来源(安装目录 / localDirs)生效。
- "最近使用":技术名变化时 usage.json 的键会跟着迁移,菜单排序不受影响。
- 兼容性:没改过名、也没设过显示名的技能不带这些键,行为与以前完全一致;name、description、 whenToUse、正文、已有策略键的位置都不变。删除技能会把记录一起删掉(文件没了,别名也没有意义)。
- 模型侧:模型的技能目录与 description 仍按技术名呈现,这是注册表的行为,插件无法改变;想让它看到中文,写在 description 里(本插件不改描述)。

开发

index.js 插件入口:注册 skill provider、宿主路由、会话命令、agent 工具 lib/manage.js 技能管理核心:列举 / 重命名 / 开关 frontmatter / 目录·zip·粘贴安装 / 使用记录 lib/marketplace.js 集市操作:目录、搜索、GitHub 安装、卸载 lib/provider.js 技能来源 provider(含曾用名条目) lib/skill-file.js SKILL.md 发现、frontmatter 解析与重命名记录 lib/github.js GitHub 目录与单文件拉取 lib/git-install.js 整目录安装 client.js 客户端半边:菜单来源 + 自绘弹层 + 管理面板 cordis.patch.yml 本插件插入 profile 配置树的那一行 test/ tools/ 测试与辅助脚本

三条约定(都很重要,改代码前先看):

- host 半边只 import Node 内置模块和相对路径文件。profile 的 node_modules 里没有 @deepseek-ai/,静态 import 它们会在插件激活前就失败;需要宿主能力时走 inject / ctx.get(),或容错动态 import。
- 客户端半边的 apply 整体包在 try/catch 里:这类 profile 把「客户端条目激活失败」当致命错误, UI 出问题绝不该让整个应用起不来。test/client-render.js 用一个极小的 React 替身把三处 UI 各渲染一遍,专门盯这条线。
- 面板与菜单的内部流量走宿主 HTTP 路由,不走会话命令——命令结果会被回显到对话里,而面板每 2 秒轮询一次。

检查:

node --check index.js && node --check client.js && node --check lib/*.js
node test/smoke.js # 与前端无关的解析 / provider 用例
node test/rename.js # 重命名:物理移动、记录、校验、使用记录迁移、别名条目
node test/client-render.js # 客户端半边:加载、激活、三个界面各渲染一次
node test/panel-logic.js # 面板纯逻辑
node test/marketplace-live.js # 真连 GitHub(可选)

已知限制

- 客户端半边在 Harness 0.2.x 桌面端前端上验证过;跨大版本升级可能需要跟随 slot / 输入触发接口调整。
- 「从本地添加技能」依赖宿主提供目录选择器;没有桌面能力时会退化为「上传 zip / 粘贴内容」。
- 弹层空查询默认 10 条是刻意的:在弹层顶部的搜索框里输入即搜全部技能;/ 菜单同理。
- zip 解包只支持 stored 与 deflate 两种压缩方式(正常压缩包都是这两种)。
- 重命名只改本插件可写的技能(安装目录与 localDirs);内置/项目技能与平台其他来源一样保持只读。
- 曾用名条目会出现在 built-in / 菜单与模型技能目录里(描述前缀「曾用名 …」);不要这份额外条目时用 aliasEntries: false 关掉,旧名仍可在面板与弹层里搜到。

License

MIT © 2026 dakeqiqi123。开发记录与验证矩阵见 docs/DEVNOTES.md。
预览分享卡片长什么样 ↓dakeqiqi123/dsh-skill-market
分享 · DeepSeek Harness Hub
dakeqiqi123/dsh-skill-market

在输入框选技能,并统一安装管理技能

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