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

技能语义检索 ryasrk/dsh-awesome-skills

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

按需语义搜索六千余个本地技能,避免占用对话上下文

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ryasrk/dsh-awesome-skills
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · skill
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 61 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-awesome-skills(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/23 01:15:51

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

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

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 48 处,展示前 46 条)
  • 读取本地文件
    lib/index.js:233
    if (!existsSync(dir))
  • 写入本地文件
    lib/index.js:234
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:243
    writeFileSync(file, ROUTER_SKILL.replaceAll('__QUERY_BIN__', queryBin).replaceAll('__CORPUS_DIR__', corpusDir));
  • 发起网络请求
    client/client.js:141
    const response = await fetch(api$1("/dsh-awesome-skills/query"), {
  • 发起网络请求
    client/client.js:165
    const response = await fetch(api$1("/dsh-awesome-skills/status"));
  • 写入剪贴板
    client/client.js:244
    navigator.clipboard.writeText(path).then(() => done(true), () => done(false));
  • 发起网络请求
    client/client.js:1413
    const response = await fetch(api("/dsh-awesome-skills/priority"));
  • 发起网络请求
    client/client.js:1451
    const response = await fetch(api("/dsh-awesome-skills/priority"), {
  • 发起网络请求
    client/client.js:1476
    const response = await fetch(api("/dsh-awesome-skills/priority"), {
  • 读取本地文件
    lib/search.js:95
    this.meta = JSON.parse(readFileSync(this.files.meta, 'utf8'));
  • 读取本地文件
    lib/search.js:96
    const buf = readFileSync(this.files.vectors);
  • 读取本地文件
    lib/search.js:114
    this.session = await ort.InferenceSession.create(new Uint8Array(readFileSync(this.files.model)), { executionProviders: ['wasm'] });
  • 读取本地文件
    lib/search.js:115
    const tk = JSON.parse(readFileSync(this.files.tokenizer, 'utf8'));
  • 读取本地文件
    lib/search.js:254
    const fp = JSON.parse(readFileSync(this.files.fp, 'utf8'));
  • 读取本地文件
    lib/search.js:257
    const raw = JSON.parse(readFileSync(this.files.grams, 'utf8'));
  • 写入本地文件
    lib/search.js:271
    writeFileSync(tmp, JSON.stringify(plain));
  • 写入本地文件
    lib/search.js:272
    renameSync(tmp, this.files.grams);
  • 写入本地文件
    lib/search.js:274
    writeFileSync(fpt, JSON.stringify({ fp: this.corpusFingerprint(), t: Date.now(), n: this.meta.length }));
  • 写入本地文件
    lib/search.js:275
    renameSync(fpt, this.files.fp);
  • 删除本地文件
    lib/search.js:279
    unlinkSync(this.files.grams + '.' + process.pid + '.tmp');
  • 写入本地文件
    lib/search.js:319
    writeFileSync(tmp, JSON.stringify(Object.fromEntries(this.qcache)));
  • 写入本地文件
    lib/search.js:320
    renameSync(tmp, this.files.qcache);
  • 读取本地文件
    lib/priority-loader.js:106
    if (!existsSync(file)) {
  • 读取本地文件
    lib/priority-loader.js:115
    raw = readFileSync(file, 'utf8');
  • 读取本地文件
    lib/tools.js:56
    const size = statSync(resolved.path).size;
  • 读取本地文件
    lib/tools.js:166
    return { ok: true, path, file: file ?? 'SKILL.md', content: readFileSync(target.path, 'utf8') };
  • 读取本地文件
    src/index.ts:283
    if (!existsSync(dir)) mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/index.ts:283
    if (!existsSync(dir)) mkdirSync(dir, { recursive: true })
  • 写入本地文件
    src/index.ts:292
    writeFileSync(file, ROUTER_SKILL.replaceAll('__QUERY_BIN__', queryBin).replaceAll('__CORPUS_DIR__', corpusDir))
  • 读取本地文件
    src/priority-loader.ts:164
    if (!existsSync(file)) {
  • 读取本地文件
    src/priority-loader.ts:173
    raw = readFileSync(file, 'utf8')
  • 读取本地文件
    src/search.ts:134
    this.meta = JSON.parse(readFileSync(this.files.meta, 'utf8')) as SkillEntry[]
  • 读取本地文件
    src/search.ts:135
    const buf = readFileSync(this.files.vectors)
  • 读取本地文件
    src/search.ts:151
    this.session = await ort.InferenceSession.create(new Uint8Array(readFileSync(this.files.model)), { executionProviders: ['wasm'] })
  • 读取本地文件
    src/search.ts:152
    const tk = JSON.parse(readFileSync(this.files.tokenizer, 'utf8')) as { model: { vocab: Record<string, number>; unk_token?: string } }
  • 读取本地文件
    src/search.ts:290
    const fp = JSON.parse(readFileSync(this.files.fp, 'utf8')) as { fp?: string }
  • 读取本地文件
    src/search.ts:292
    const raw = JSON.parse(readFileSync(this.files.grams, 'utf8')) as unknown[][]
  • 写入本地文件
    src/search.ts:305
    writeFileSync(tmp, JSON.stringify(plain))
  • 写入本地文件
    src/search.ts:306
    renameSync(tmp, this.files.grams)
  • 写入本地文件
    src/search.ts:308
    writeFileSync(fpt, JSON.stringify({ fp: this.corpusFingerprint(), t: Date.now(), n: this.meta.length }))
  • 写入本地文件
    src/search.ts:309
    renameSync(fpt, this.files.fp)
  • 删除本地文件
    src/search.ts:312
    unlinkSync(this.files.grams + '.' + process.pid + '.tmp')
  • 写入本地文件
    src/search.ts:352
    writeFileSync(tmp, JSON.stringify(Object.fromEntries(this.qcache)))
  • 写入本地文件
    src/search.ts:353
    renameSync(tmp, this.files.qcache)
  • 读取本地文件
    src/tools.ts:65
    const size = statSync(resolved.path).size
  • 读取本地文件
    src/tools.ts:173
    return { ok: true, path, file: file ?? 'SKILL.md', content: readFileSync(target.path, 'utf8') }
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 语义搜索本地技能
  • 按需检索技能
  • 避免占用对话上下文

智能体插件技能

README

由 DeepSeek 最新模型翻译生成
description: "对 6,097 个技能的本地语料库(skills.sh 前 100 名 + a5c-ai/babysitter 库)进行语义向量搜索,以 DeepSeek Harness 捆绑包形式安装" kind: "package-reference" dsh-awesome-skills 一个 DeepSeek Harness 捆绑包,让智能体能够对精选的本地技能语料库进行语义访问——包括 skills.sh 前 100 名(83 个 GitHub 托管的技能)以及完整的 a5c-ai/babysitter 库(约 2,100 个技能)——总计 6,097 个技能——而无需将该语料库放入每轮对话的模型目录中。 为什么 DeepSeek Harness 发现的技能目录会成为一个目录条目,而每个目录条目都会在每一轮对话中注入到模型的上下文中。一个庞大的语料库放在那里,意味着每一轮都要付出非常高昂的 token 成本,而这些东西在某一轮对话中几乎从不需要。 这个插件颠覆了这一点。语料库留在目录之外;取而代之的是安装一个很小的 skill-router 技能,它教会智能体按需搜索语料库。
展开完整文档(README 剩余 1 节)
description: "对 6,097 个技能的本地语料库(skills.sh 前 100 名 + a5c-ai/babysitter 库)进行语义向量搜索,以 DeepSeek Harness 捆绑包形式安装" kind: "package-reference"

dsh-awesome-skills

一个 DeepSeek Harness 捆绑包,让智能体能够对精选的本地技能语料库进行语义访问——包括 skills.sh 前 100 名(83 个 GitHub 托管的技能)以及完整的 a5c-ai/babysitter 库(约 2,100 个技能)——总计 6,097 个技能——而无需将该语料库放入每轮对话的模型目录中。

为什么

DeepSeek Harness 发现的技能目录会成为一个目录条目,而每个目录条目都会在每一轮对话中注入到模型的上下文中。一个庞大的语料库放在那里,意味着每一轮都要付出非常高昂的 token 成本,而这些东西在某一轮对话中几乎从不需要。

这个插件颠覆了这一点。语料库留在目录之外;取而代之的是安装一个很小的 skill-router 技能,它教会智能体按需搜索语料库。

语料库

语料库按来源组织,每个 owner/repo 一个目录,每个技能目录都包含其完整内容——SKILL.md 以及它指向的每一个引用文件(示例、模板、脚本):

skills/
├── a5c-ai/babysitter/ # ~2,100 个技能(specializations + methodologies,含 domains 树) ├── mattpocock/skills/ # 17 个技能(tdd、grilling、code-review、...) ├── microsoft/azure-skills/ # 20 个技能(含 microsoft-foundry:191 个文件) ├── anthropics/skills/frontend-design/ ├── vercel-labs/agent-skills/ # vercel-react-best-practices(62 条规则) ├── obra/superpowers/ # brainstorming、systematic-debugging、... └── ... # 157 个 owner/repo 分组,6,097 个技能,17,600+ 个文件

skills.sh 排行榜上仅存在于网站的 17 个条目(open.feishu.cn 的 lark 套件及类似条目,它们没有公开仓库)被排除在外——没有可获取的内容。

| 路径 | 内容 |
| lib/ | 编译后的插件宿主 + 搜索服务 + query.js CLI |
| skills/skills.json | 语料库索引:每个技能的名称、路径、描述 |
| skills/vectors.f32 | 384 维 L2 归一化嵌入向量,每个技能一行 |
| model/ | all-MiniLM-L6-v2,量化 ONNX + 分词器 |

索引是预构建并已提交的。技能正文位于规范语料库目录(~/.dsh/awesome-skills/skills)中,由包引用——而非复制:搜索结果返回指向该目录的路径,因此磁盘上语料库只有一份副本。

安装

dsh plugin --profile web add github:ryasrk/dsh-awesome-skills

该插件以 cordis 捆绑包形式挂载(参见 cordis.patch.yml),并在 apply 时将捆绑的 skill-router 技能安装到 ~/.agents/skills/skill-router。捆绑的 skill-router 会在每次 apply 时刷新——随附的副本是其行为的唯一事实来源。

面向模型的工具

在暴露 tools 服务的主机上,该插件注册两个工具,它们在进程内以宿主权限运行——这是通往语料库的标准权限模式路径,因为该 agent 不需要 Bash 或工作区外的 Read:

- skills_search(query, k?) —— 经过校准的混合搜索;设置旋钮(prio/blacklist/whitelist)适用。
- skills_read(path, file?) —— 从某个命中目录中读取一个文件,受限于语料库根目录(禁止遍历),仅限文本扩展名,上限 64 KiB。

skill-router 技能教授工具优先的流程,并保留 node lib/query.js CLI(stdin 输入 JSON → stdout 输出 JSON)作为与 shell 无关的单段回退方案,供没有工具服务的宿主使用——它读取 stdin 并写入 stdout,因此在任何 shell(bash、PowerShell、cmd)上都不需要 bash 特有的语法。

排序

三条通道融合,然后在候选池上重新排序:

score = (1 - WEIGHT) * semantic + WEIGHT * lexical + GRAM_WEIGHT * char-3-gram

- 语义 —— MiniLM 余弦相似度,对所有行进行暴力计算。精确;无量化漂移。
- 词法 —— IDF 加权的 token 重叠度。
- 字符 3-gram —— 与文字系统无关,因此 CJK/西里尔字母查询和技术标识符仍能区分。

WEIGHT 0.55,GRAM_WEIGHT 0.5,池大小 1200。在随附语料库上用 150 条标签的规范集重新检验:R@1 80%,R@3 93%。

速度

在随附的 6,097 个技能语料库上测量(暴力计算仍会对每一行评分;每进程的模型加载占主导):

| 路径 | 延迟 |
| 冷启动(模型加载) | ~0.7s |
| 热启动(查询缓存命中) | ~0.6s |

派生缓存(每个技能的字符 gram、查询嵌入)位于语料库旁边,并以语料库指纹为键,因此语料库变更会自动使其失效。

服务接口

其他插件和工具可以直接使用搜索服务:

const search = ctx.get('skills-search')
const hits = await search.search('set up end-to-end browser tests', 5)
const dir = search.skillDir(hits[0].path) // e.g. .../skills/mattpocock/skills/tdd

命中的 path 是语料库根目录下的子路径(owner/repo/skill),每个消费者都拼接 corpusDir + path + /SKILL.md——优先级加载器、skill-router 模板和设置 UI 都共享这一约定。参考文件位于 SKILL.md 旁边,因此命中的目录就是完整的操作手册。

配置

所有字段均可选,通过 cordis.patch.yml 中的一行配置:

| 字段 | 默认值 | 含义 |
| corpusDir | ~/.dsh/awesome-skills/skills | 技能正文(/SKILL.md) |
| home | 操作系统主目录(os.homedir()) | 路由器技能安装所在的基础主目录(/.agents) |
| agentsHome | /.agents | 宿主读取其 skills/ 根目录的 agents 主目录;覆盖 $DSH_AGENTS_HOME |
| installSkillRouter | true | 在 apply 时安装路由器技能 |

环境变量:DSH_AWESOME_SKILLS_CORPUS(语料库)、DSH_AWESOME_SKILLS_INDEX(CLI 的索引目录)、DSH_AGENTS_HOME(agents 主目录;解析方式与宿主技能提供程序相同,因此迁移后的 agents 主目录仍能接收路由技能)。

重建索引

索引以预构建形式随 skills/skills.json 和 skills/vectors.f32 提供;用户永远不需要重建它。在更改语料库后重建是维护者步骤,需在单独的语料库摄取工作区中完成(遍历器位于那里,而不在此包中)——它会递归读取语料库并重写 skills.json 和 vectors.f32,然后将它们复制回此仓库的 skills/。如果已部署的配置文件带有过期的索引,请将此仓库的 lib/ 和 skills/ 目录重新同步到该配置文件的已安装副本中。

技能目录是任何包含 SKILL.md 的目录;嵌套在其中的目录(作为参考材料提供的子技能)不会被单独索引。拉取源代码更改后重新生成客户端包:npx tsdown -c tsdown.client.ts,然后运行 node scripts/preflight.mjs。

许可证

MIT
预览分享卡片长什么样 ↓ryasrk/dsh-awesome-skills
分享 · DeepSeek Harness Hub
ryasrk/dsh-awesome-skills

按需语义搜索六千余个本地技能,避免占用对话上下文

这是你的仓库?认领条目

回到顶部