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

技能跨端复用器 noteflowai/dsh-skills-anywhere

DeepSeek Harnessv0.19.0
noteflowai9 天前有提交已提供中文文档扫描:含敏感能力

跨工具发现与加载技能。 将本地目录和已配置 Git 源中的 Agent Skills 汇入统一目录,通过…

34.2/100
综合分
6
GitHub 星标
1,160
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-skills-anywhere
npm 源 · dsh-skills-anywhere 的发布者账号已校验与本仓库一致

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包dsh-skills-anywhere @ 0.19.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/24 12:52:12

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 38 处,展示前 30 条)
  • 读取本地文件
    lib/mcp.js:112
    const cache = await realpath(cacheDir).catch(() => void 0);
  • 读取本地文件
    lib/mcp.js:321
    const cache = await realpath(cacheDir).catch(() => void 0);
  • 读取本地文件
    lib/mcp.js:323
    const dir = await realpath(directory).catch(() => void 0);
  • 读取本地文件
    lib/mcp.js:347
    const top = await realpath(reportedTop).catch(() => void 0);
  • 读取本地文件
    lib/mcp.js:350
    if (!await stat(join(top, ".git")).then((info) => info.isDirectory(), () => false)) return fail("checkout has no .git directory");
  • 发起网络请求
    lib/client.js:319
    const response = await fetch(new URL(REPORT_PATH, location.href), {
  • 读取本地文件
    lib/cli.js:874
    text = await readFile(file, "utf8");
  • 读取本地文件
    lib/cli.js:896
    const manifest = JSON.parse(await readFile(new URL("../package.json", import.meta.url), "utf8"));
  • 读取本地文件
    lib/provider-B0phawAx.js:650
    if (!(await stat(root.path)).isDirectory()) exists = false;
  • 读取本地文件
    lib/provider-B0phawAx.js:832
    return (await mapLimit((await readdir(root, { withFileTypes: true })).toSorted((left, right) => left.name.localeCompare(right.name)), FILE_CONCURRENCY
  • 读取本地文件
    lib/provider-B0phawAx.js:867
    entries = await readdir(dir, { withFileTypes: true });
  • 读取本地文件
    lib/provider-B0phawAx.js:878
    return await realpath(child);
  • 读取本地文件
    lib/provider-B0phawAx.js:894
    visited.add(await realpath(root));
  • 读取本地文件
    lib/provider-B0phawAx.js:903
    raw = await readFile(file.path, "utf8");
  • 删除本地文件
    lib/provider-B0phawAx.js:1174
    await rm(source.dir, {
  • 写入本地文件
    lib/provider-B0phawAx.js:1178
    await mkdir(dirname(source.dir), { recursive: true });
  • 删除本地文件
    lib/provider-B0phawAx.js:1180
    await rm(staging, {
  • 写入本地文件
    lib/provider-B0phawAx.js:1185
    await mkdir(staging, { recursive: true });
  • 写入本地文件
    lib/provider-B0phawAx.js:1218
    await rename(staging, source.dir);
  • 写入本地文件
    lib/provider-B0phawAx.js:1326
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/provider-B0phawAx.js:1327
    await writeFile(path, `${JSON.stringify(lock, null, 2)}\n`);
  • 写入本地文件
    lib/provider-B0phawAx.js:1349
    await mkdir(dirname(path), { recursive: true });
  • 读取本地文件
    lib/skill-bundle-BQetnn_v.js:102
    const root = await realpath(resolve(directory));
  • 读取本地文件
    lib/skill-bundle-BQetnn_v.js:111
    const stat = await lstat(path, { bigint: true });
  • 读取本地文件
    lib/skill-bundle-BQetnn_v.js:115
    const directoryHandle = await opendir(path);
  • 读取本地文件
    lib/skill-bundle-BQetnn_v.js:154
    if (!(await lstat(root)).isDirectory()) throw new Error("Choose a skill directory containing SKILL.md.");
  • 读取本地文件
    lib/skill-bundle-BQetnn_v.js:156
    for (const [path, stamp] of observed) if (identity(await lstat(path, { bigint: true })) !== stamp) throw new Error("Bundle changed during inspection;
  • 读取本地文件
    lib/bundle-cli-HImWdXuH.js:30
    const rel = relative(await realpath(root), await realpath(path));
  • 读取本地文件
    lib/check-files-DFqoWNmT.js:84
    const root = await realpath(dirname(skillPath));
  • 读取本地文件
    lib/check-files-DFqoWNmT.js:101
    const info = await lstat(current);
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-llm@deepseek-ai/dsh-scope@deepseek-ai/dsh-session@deepseek-ai/dsh-skill@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

5 张 · 点击查看大图

功能亮点

  • 跨工具发现与加载技能
  • 汇入本地与Git源技能
  • 检查缺失本地资源

复用技能前先检查:在浏览器或 CI 里找出缺失的本地资源,审阅固定示例,再通过 DeepSeek Harness 或 MCP 提供技能。

v0.19.02026-10-10
· 变更内容 · 新增:当固定版本的技能目录存在本地改动时,拒绝加载 expected_source_commit 完整变更日志:
v0.18.02026-10-03
· 变更内容 · 新增:通过 MCP 打开技能时,要求 Git 源提交已审核 完整变更日志: MCP 的 open_skill 接受新的可选输入 expected_source_commit。把它设为早先加载返回的 receipt.source_commit 值,只有当 Git 源检出目录的 HEAD 仍是该提交时,技能才会被交付。提供该字段时,检查按以下顺序执行:格式(40 个小写十六进制字符,由输入 schema 强制)、Git 源来源、现有的 expected_sha256 和 expected_bundle_sha256 检查(措辞不变)、由现有 sourceCommit() 探测得出的可证明提交,以及精确匹配。任何失败都返回 isError true,并给出可操作的提示信息,不返回指令文本或 receipt。不匹配时会同时给出期望提交和实际找到的提交。摘要被拒时仍不执行任何 Git 命令。省略该字段的调用行为与之前一致。tools/list 将该字段显示为可选。 以下是控制器在提交 6a40534 上的运行结果。这些是控制器的执行,不是我的。用新测试文件跑基础代码时,6 个测试中有 4 个失败:检出目录被移动、提交不可证明、格式错误的 pin/非 Git 以及 tools/list 这几个测试。检查现有行为未变的 2 个测试通过。在候选版本上,所有检查都通过:pnpm run build、功能测试(6 个测试)、pnpm run check(25 个测试文件,251 个测试)、pnpm run showcase:build 和 pnpm run showcase:check。 之前的评审发现已解决。如记录的测试源码所示,格式错误的 pin 测试直接读取解析后的 callTool 结果,并断言 isError true 和 schema 提示信息(必须是完整的 40 字符小写 Git 提交)。它不再用 try/catch 包裹调用,以免把抛出的错误变成 isError。 · 使用方法 前提:git、Node 和 pnpm,用 pnpm run build 构建本包,以及一个连接到 skills-anywhere MCP 服务器的 MCP 客户端。 1. 创建一个合成的示例 Git 源(仅演示数据): mkdir -p /tmp/demo-skills/robot-reel-review && cd /tmp/demo-skills && git init -q && printf -- '---\nname: robot-reel-review\ndescription: Synthetic demo skill\n---\n\nReview the robot reel.\n' > robot-reel-review/SKILL.md && git add -A && git -c user.name=demo -c user.email=demo@example.com commit -qm initial 2. 手动步骤:按 README.md 中描述的源配置,把 /tmp/demo-skills 注册为 Git 源,然后让服务器把它同步到源缓存。配置语法此处不再重复。 3. 通过 MCP 调用 open_skill,传入 {"name": "robot-reel-review"},记录 structuredContent.receipt.source_commit,一个 40 字符的小写十六进制值。 4. 之后的加载中,调用 open_skill 并传入 {"name": "robot-reel-review", "expected_source_commit": ""}。结果内容相同,且 receipt.source_commit 等于该 pin。 5. 在 /tmp/demo-skills 中提交一次改动并同步到缓存。重复带 pin 的调用。结果 isError true,内容为:Git source commit changed for "robot-reel-review": expected , found ;在更新 expected_source_commit 前先审核这次改动。 6. 审核新版本后,把 pin 换成找到的提交。 参见 docs/VERIFIED-LOADS.md 中关于要求已审核源提交的一节。 · 范围与升级 范围:独立的 MCP open_skill 工具,仅适用于来自已配置 Git 源的技能。dsh 服务商技能工具、skill:// 资源和命令行均未改动。 pin 能证明什么:它证明检出目录的 HEAD,而不是没有未提交或未跟踪的文件。把它和 ex
v0.17.02026-10-01
· 变更内容 · chore(deps):在 actions 组里把 github/codeql-action/upload-sarif 从 4.38.0 升到 4.38.2,由 @dependabot[bot] 提交 · docs:定义产品路线图和验收里程碑 · docs:用外部证据验证产品方向 · feat:在 MCP open_skill 回执里记录 Git 源提交 完整变更日志: 在候选提交 59390b7 上,一次成功的 MCP open_skill 调用如果通过了 expected_sha256 和 expected_bundle_sha256 校验,现在会返回 structuredContent.receipt.source_commit。对于来自 Git 源的技能,它是加载时该源缓存检出目录的 40 位小写 HEAD SHA。对于智能体目录、插件市场和额外的本地目录,它是 null,也不会为它们运行任何 Git 命令。对于无法证明提交的 Git 源,它同样是 null,服务器会记录一条「skills-anywhere: source commit unavailable for : 」警告。这涵盖 Git 缺失或执行失败、超时,以及工作树没有自己的 .git 或 .git 在缓存之外的情况。这种情况下加载仍返回不变的内容。Git 不经过 shell 运行,并会移除 GIT_* 变量。发现过程止于缓存目录,因此外层仓库的提交永远不会被上报。被拒绝的加载会在任何 Git 查找之前抛出原有错误。对外声明的 outputSchema 包含 source_commit。schema 字符串仍是 skills-anywhere-load-1。以下内容不变:loadReceipt()、LoadReceipt、OpenedSkill、导出的 openSkill()、dsh 服务商与工具回执、skill:// 资源以及渲染文本。控制器在 59390b7 上运行的检查:变更前的验收运行有 3/3 个功能测试失败,因为回执只有 11 个字段。变更后,pnpm run build 通过。tests/test_feature_ea6b51801ed9.test.ts 通过。pnpm run check 通过,其日志显示 24 个测试文件、245 个测试全部通过。pnpm run showcase:build 和 pnpm run showcase:check 也通过。 · 用法 前置条件:带 npx 的 Node.js,以及 git。以下数据均为合成演示。这段流程是手工示例,控制器没有运行它。 mkdir -p my-skills-repo/my-skill cat > my-skills-repo/my-skill/SKILL.md <<'EOF' --- name: my-skill description: Synthetic demo skill --- Demo instructions v1. EOF git -C my-skills-repo init -q -b main git -C my-skills-repo add -A git -C my-skills-repo -c user.name=demo -c user.email=demo@example.invalid commit -qm v1 export DSH_HOME="$PWD/demo-dsh" npx dsh-skills-anywhere add ./my-skills-repo npx dsh-skills-anywhere sync open_demo() { (printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"demo","version":"0"}}}' '{"jsonrpc":"2.0","method":"notifications/initialized"}' '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"open_skill","arguments":{"name":"my-skill"}}}'; sleep 3) | npx dsh-skills-anywhere mcp } open_demo git -C my-skills-repo rev-parse HEAD id 2 响应里的 structur
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-skills-anywhere 跨工具发现与加载技能。 将本地目录和已配置 Git 源中的 Agent Skills 汇入统一目录,通过 DeepSeek Harness(dsh)实时提供器或本地 stdio MCP 服务器按需访问。 OpenSSF Scorecard Glama maintenance rating 迁移技能前,先检查附件 检查安装目录中缺失的本地链接,再比较目录变更并通过 MCP 加载。 浏览器目录检查 · 三个真实固定版本样例。 npx dsh-skills-anywhere@0.19.0 check path/to/SKILL.md --resources --json 加上 --fail-on-resource-issues 开启 CI 门禁。此功能检查本地 Markdown 链接目标,不检查正文中的依赖,也不执行技能。范围与教程。 首次复核,无需克隆仓库 — 检查一个缺失的技能附件,补齐后复核 CI 门禁。
展开完整文档(README 剩余 1 节)
dsh-skills-anywhere

跨工具发现与加载技能。 将本地目录和已配置 Git 源中的 Agent Skills 汇入统一目录,通过 DeepSeek Harness(dsh)实时提供器或本地 stdio MCP 服务器按需访问。

OpenSSF Scorecard
Glama maintenance rating

迁移技能前,先检查附件

检查安装目录中缺失的本地链接,再比较目录变更并通过 MCP 加载。
浏览器目录检查 · 三个真实固定版本样例。

npx dsh-skills-anywhere@0.19.0 check path/to/SKILL.md --resources --json

加上 --fail-on-resource-issues 开启 CI 门禁。此功能检查本地 Markdown 链接目标,不检查正文中的依赖,也不执行技能。范围与教程。

首次复核,无需克隆仓库 — 检查一个缺失的技能附件,补齐后复核 CI 门禁。

从你的工作流开始

| 需求 | 使用方式 |
| 在多个 Agent 工具中复用技能 | 汇总本地目录与 Git 源,通过 dsh 或本地 MCP 按需加载 |
| 审核技能变更后再加载 | 比较说明文件与目录清单,要求加载内容匹配已审核的哈希 |
| 核对 Agent 收到了哪些指令 | 保存 MCP 加载回执,关联工具调用和任务评测结果 |

快速开始

需要 Node.js 22.19+ 或 24+。CLI 和本地 MCP 服务器可独立使用;Git 源另需 Git。

先查看已发现的技能:

npx dsh-skills-anywhere list

接入 MCP 客户端时,使用本地服务器配置。使用 DeepSeek Harness 时,安装到所用 profile:

dsh plugin --profile web add dsh-skills-anywhere

启动 dsh 后通过 skill 工具或 /技能名 加载。需要添加 Git 源时运行 npx dsh-skills-anywhere add anthropics/skills。
安装详情包括发布包、源码安装和 dsh 版本要求。

在 CI 中检查技能。 任何保存 SKILL.md 的仓库都可以使用本项目的 GitHub Action(0.14.0 起)。
被拒绝的文件、字段修复和隐藏字符会显示为拉取请求注释,并生成作业摘要与 JSON 报告:

- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: noteflowai/dsh-skills-anywhere@v0.14.0
with:
fail-on-repair: true
fail-on-hidden-characters: true

输入、输出与检查范围。无需模型密钥,也无需安装 DeepSeek Harness。

先在浏览器体验

首页直接显示一个资源检查样例。选择自己的技能目录后,可用 Save result image 保存含计数与检查范围的结果图;图片不含文件名,JSON 报告保留复核所需路径。

检查自己的 SKILL.md。 Hugging Face 演示可在浏览器中并排检查严格模式与宽容模式,查看字段修复、调用设置并下载检查报告。文件不会上传;检查范围是本项目的解析行为,报告列出识别到的外部来源地址、完整提交号形式与作者工具声明;引用内容、脚本行为及客户端兼容性需要单独验证。

本地技能检查:解析结果、外部来源地址及作者工具声明。

体验 Hugging Face 交互演示:在示例工作区中查看技能来源、处理重名、调整目录预算,并搜索未列出的技能。无需安装或模型 API。演示原理。

查看技能指令、比较目录清单或分享目录视图。键盘导航保留选中行与目录设置,用于本地复核的文件始终在浏览器中处理。

目录如何汇总

不同客户端使用的项目级、用户级和插件目录存在差异。Skills Anywhere 原地发现已配置来源中的 SKILL.md,通过 dsh 或已连接本地服务器的 MCP 客户端提供统一目录。
目录定义描述发现路径;已测试的协议连接单独记录在兼容矩阵中。

在 dsh 里,它在内置的 ctx.skills 注册表上多注册一个提供器,模型原有的 skill 工具和 /name 调用方式不变,只是能看到更多技能:

- 预定义的 Agent 目录。 包括 Claude Code、Codex、Cursor、Gemini CLI、GitHub Copilot、Windsurf、Kiro、Goose、Cline、Kimi CLI、Letta Code 等项目级和用户级路径,具体见目录注册表。通过 MCP 时还包括共享的 .agents/skills 约定,因此自身不读取该目录的客户端(例如 Claude Code)也能看到安装在那里的技能。
- Claude Code 插件市场。 嵌套在 ~/.claude/plugins/marketplaces//plugins//skills/ 里的技能,包括 Anthropic 官方市场。
- 已配置的 Git 源。 指定技能仓库、子目录、分支、标签或提交;提供器维护本地检出,并在 lock 文件中记录实际提交。
- 原地读取本地文件。 每次加载重新读取已有技能,无需复制到各客户端目录。Git 源使用下文说明的托管缓存。

目录预算控制进入模型会话目录的技能摘要数量,默认最多 50 个。
其他允许调用的技能仍可通过 find_skills 搜索并按需加载,/name 调用方式不变。

这套技能池在 dsh 之外也能用:dsh-skills-anywhere mcp 通过工具和 skill:// 资源供已配置的 MCP 客户端发现和加载。
具体工作流取决于客户端对工具调用、资源和技能指令的支持。

提供器会去重软链接和字节相同的条目,支持文档中列明的 frontmatter 修复,并对 discord/configure、telegram/configure 等重名条目添加前缀。
CLI 展示实际发布的目录、跳过的条目及每项变更的原因。

校验记录的技能选择

当分类器、LLM 或人工为某个任务选定技能时,route 会对照本机已安装的技能校验这个选择。
route prepare 用与 find_skills 相同的关键词搜索对所有已发现的技能排序,先去掉 open_skill 会拒绝的技能,再保留前 8 个,生成类型化的选择请求(skills-anywhere-route-request-1)。保留选项 _none 表示“没有合适的技能”,它永远不会是合法的技能名。每个候选都记录来源、SKILL.md 路径和内容哈希。决策方写出响应后, route apply 把它当作不可信数据读取,并只报告一种结果。整个过程不加载、不执行技能,也不访问网络。

dsh-skills-anywhere route prepare "fill pdf forms" --json > req.json
由决策方写出 resp.json,例如: {"choice": "pdf-forms", "confidence": 0.86, "model": "example"} dsh-skills-anywhere route apply --request req.json --response resp.json --min-confidence 0.7

| 结果 | 退出码 | 含义 |
| selected | 0 | 置信度达到阈值;输出要打开的技能名、来源和 SKILL.md 路径 |
| no_match | 0 | 决策方以不低于阈值的置信度选择了 _none |
| abstain | 0 | 响应未给出置信度,或置信度低于 --min-confidence |
| stale | 1 | prepare 之后,所选技能被删除、不再可打开,或其 SKILL.md 路径或内容哈希发生变化(内容被编辑,或同名技能被其他来源取代);请重新运行 prepare |
| invalid_input | 2 | 文件无法读取或不是 JSON、请求 schema 不对、选择不在选项内,或置信度不是 0 到 1 之间的数字 |

--min-confidence 取值无效,或在其他命令上使用 --request/--response/--min-confidence,同样以退出码 2 结束。默认值 0.7 只是未经校准的占位值,请根据自己决策方在保留测试集上的结果选择阈值。
--json 输出 skills-anywhere-route-result-1,包含结果、选择、置信度、阈值和 model(仅作来源记录);响应中的其他字段会被忽略。请求文件包含本机的绝对路径。

检查技能交付

成功的 MCP open_skill 调用返回加载回执,关联已交付的指令正文、原始 SKILL.md 与可选目录摘要。调用方可将回执关联到工具 span,再与任务结果一起检查。
回执记录交付事实;指令遵循与权限执行需要分别检查。
数据契约 · EvalArc 评估工作台。

示例:复核机器人记录

通过 MCP 加载 Microduck 帧复盘技能,让 Agent 先调用 Robot Reel 校验原始关节记录,再整理有依据的结论。
交互技能示例(选择 04 Review robot evidence)· 本地操作说明 ·可复用技能。
网页展示技能内容;只读校验由你所用 Agent 的执行工具完成,无需重新仿真或 GPU。

审核后加载同一份文件

MCP open_skill 返回原始文件的 SHA-256。传入 check --json 或之前一次打开结果中的 expected_sha256,文件变化时会在返回指令前拒绝加载。
作者刚设置的禁用标志立即生效,不受目录缓存影响。
固定文件版本的使用说明。

MCP 协议支持: 本地 stdio 命令支持旧版初始化与 2026-07-28 协议握手;四种 SDK 配置和安装后的 npm 包均通过真实子进程验证。
兼容范围与嵌入迁移说明。具体客户端工作流的验证范围见该矩阵。

审核技能目录里的全部文件。 bundle /path/to/skill --json 生成目录清单,可比较脚本/资源的新增、删除和内容变化,再通过 MCP expected_bundle_sha256 按审核指纹加载。
首页对比区展示“说明没变、脚本已变”,也支持在本地浏览器比较自己的两份清单。流程与边界。
指纹覆盖该目录内记录的路径与文件内容。外部依赖和执行权限需要另行审核;文件在加载后仍可能变化。

SKILL.md 未变、脚本已变:在本地比较技能目录清单。

安装详情与目录示例

已发布到 npm,附有构建来源(provenance);每个 GitHub release 也提供相同的 tarball。

以下为目录发现的输出示例,路径与数量取决于本地安装和已配置来源:

$ npx dsh-skills-anywhere list
NAME FROM PATH
discord-access claude plugin discord @ claude-plugins-official ~/.claude/plugins/marketplaces/.../discord/skills/access/SKILL.md
frontend-design claude plugin frontend-design @ claude-plugins-official ~/.claude/plugins/marketplaces/.../frontend-design/skills/frontend-design/SKILL.md
skill-creator claude plugin skill-creator @ claude-plugins-official ~/.claude/plugins/marketplaces/.../skill-creator/skills/skill-creator/SKILL.md
...
31 skills, 6 renamed — run dsh-skills-anywhere doctor for details

不用 npm:从 git 检出或 release tarball 安装

每个 GitHub release 都附带预构建的 tarball,dsh plugin add 和 npx 都可以直接使用它的 URL(https://github.com/noteflowai/dsh-skills-anywhere/releases/download/v0.19.0/dsh-skills-anywhere-0.19.0.tgz)。若需要尚未发布的提交:

dsh plugin --profile web add github:noteflowai/dsh-skills-anywhere

git 安装拿到的是源码,pnpm 需要运行本包的 prepare 构建脚本。pnpm 10+ 默认拒绝:第一次 add 会失败并打印出需要放行的精确键名(包含提交哈希)。把它原样复制到 profile 的 pnpm-workspace.yaml 后重新执行 add:

$DSH_HOME/profiles/web/pnpm-workspace.yaml
allowBuilds:
'dsh-skills-anywhere@https://codeload.github.com/noteflowai/dsh-skills-anywhere/tar.gz/<sha>': true

需要可复现安装时请锁定提交:github:noteflowai/dsh-skills-anywhere#<sha>。

环境要求

- DeepSeek Harness 0.1.5-rc.1 及以上(测试套件在 0.1.5-rc.1 和 0.1.5-rc.2 上通过),且 profile 挂载了 @deepseek-ai/dsh-skill(自带的 web、acp、headless、sdk profile 都满足)
- Node.js 22.19+ 或 24+
- git 源需要 PATH 中有 git(其余功能不依赖 git)

会发现哪些技能

| 位置 | 示例 | dsh source 标签 | 默认 rank |
| 其他 Agent 的项目级技能 | <project>/.claude/skills/、<project>/.cursor/skills/ | anywhere-project | 250 |
| 其他 Agent 的用户级技能 | ~/.codex/skills/、~/.cursor/skills/ | anywhere-user | 550 |
| Claude Code 插件市场及已安装插件缓存 | ~/.claude/plugins/marketplaces//plugins//skills/ | anywhere-claude-plugins | 580 |
| git 源 | anthropics/skills、vercel-labs/agent-skills/skills | anywhere-source | 700 |

在 dsh 注册表里,同名技能按较小的 rank 优先。内置目录保留原值: .dsh/skills 为 100、.agents/skills 为 200、~/.dsh/skills 为 400、 ~/.agents/skills 为 500。不同来源按这些数值共同排序,例如 rank 250 的 Agent 项目级条目优先于 rank 400 的 dsh 用户级条目。
在 dsh 内,内置 .agents/skills 与 .dsh/skills 目录不会被重复扫描。
独立运行的 MCP 服务器旁边没有内置提供器,因此它也会以相同的 rank(200 与 500)提供共享的 .agents/skills 与 ~/.agents/skills(Codex、Amp、Goose、Zed 与 Letta Code 的默认位置)。
嵌入 createSkillsAnywhereServer 时可传入 sharedDirs: false 或排除 agents id。

运行 npx dsh-skills-anywhere agents 查看完整 Agent 表以及本机存在哪些目录。

技能格式

提供器读取包含 SKILL.md 的目录及 dsh 的平铺 <name>.md 文件,采用 Agent Skills 格式。
解析 name、description、disable-model-invocation 与 user-invocable,并保留 license、compatibility、allowed-tools 和 metadata。

compatibility 与 allowed-tools 是作者声明,运行环境要求和工具权限由客户端管理。
argument-hint、context 等未知字段保留在 metadata.frontmatter 中;保留字段不代表实现了原客户端的对应行为。scripts/、references/、assets/ 通过技能资源目录提供给调用方使用。

默认的宽松模式下:缺少 name 时回退到目录名,非法 name 归一化为 kebab-case,缺少 description 时取正文第一段。每次修复都会记录并由 doctor 展示。设置 lenient: false 可与内置提供器的严格行为保持一致。

git 源

npx dsh-skills-anywhere add anthropics/skills # 默认分支
npx dsh-skills-anywhere add anthropics/skills@v1.0.0 # 标签或分支
npx dsh-skills-anywhere add vercel-labs/agent-skills/skills # 子目录
npx dsh-skills-anywhere add https://github.com/o/r/tree/main/dir # GitHub tree URL
npx dsh-skills-anywhere add git@gitlab.com:group/skills.git # 任意 git URL
npx dsh-skills-anywhere add ./local/skills-repo --project # 本地仓库,项目级
npx dsh-skills-anywhere add o/r --ref 3f2a9c1 --rank 300 # 锁定提交,设置优先级

源来自三个地方,按顺序合并:插件配置 config.sources、用户文件 ~/.dsh/skills-anywhere/sources.json、项目文件 <project>/.dsh/skills-anywhere.json(提交到仓库即可与团队共享)。CLI 负责编辑后两者。

每个仓库在 ~/.dsh/skills-anywhere/cache/<host>/<owner>/<repo> 维护本地检出;指定分支、标签或提交时使用 <repo>@<ref>。后台同步在启动时、每隔 syncIntervalMs(默认 6 小时)以及来源配置变化时运行,实际提交写入 ~/.dsh/skills-anywhere/lock.json。
发现过程读取已有缓存。刷新失败时保留已有检出;从未同步成功的源没有可用缓存技能。
成功更新后使目录缓存失效,发现过程无需等待网络同步。

只想引入仓库里的部分技能时,每个技能目录写一条源,repo 相同,ref 填完整的提交 SHA,这些源共用一个检出。examples/isaaclab-v3.0.0 用这种方式引入 5 个 IsaacLab 用户技能(需手动启用),附带记录文件哈希和许可证的目录清单,并列出绕过这种白名单的情况。

目录预算与 find_skills / open_skill 工具

dsh 会把每个模型可调用技能的名称和描述放进会话,每次请求都带上。加上插件市场和几个 git 源,这就是几百行上下文。因此提供器会对技能排序,只把前 catalog.limit 个(默认 50)标记为模型可调用;其余技能以关闭模型调用的方式发布,不进目录,但你仍可用 /name 加载。

由 dsh-skills-anywhere/tools 行注册的两个工具让模型也能触达被隐藏的部分:

- find_skills(query, limit?) 按关键词搜索全部技能(名称、描述、whenToUse、来源),无论是否在目录中,并标明哪些已列出。
- open_skill(name) 按精确名称加载任意技能,包括被预算隐藏的。frontmatter 里写了 disable-model-invocation: true 的技能仍会被拒绝,与内置 skill 工具行为一致。

- id: skills-anywhere
config:
catalog:
limit: 30 # 0 = 不限制(旧行为)
pin: [frontend-design] # 始终列出
hide: [example-skill] # 从不列出,但仍可搜索、可 /name 调用
- id: skills-anywhere-tools
config:
findLimit: 10

作者禁用的技能不占预算。哪些技能保留在目录中遵循下文的优先级顺序:项目级优先于用户级,再优先于市场与 git 源。工具行依赖工具运行时(ctx.tools);在没有它的 profile 中该行保持挂起,提供器独立工作。

CLI

提交前检查技能。 运行 npx -y dsh-skills-anywhere@0.19.0 check skills/example/SKILL.md --fail-on-repair,使用与在线体验相同的解析器,批量检查明确指定的文件,输出带文件摘要的 JSON 报告和 CI 退出码。
默认严格解析,--lenient 接受提供者的修复,--fail-on-repair 要求没有修复。
报告还会列出不可见字符和改变文字方向的字符(hiddenCharacters),--fail-on-hidden-characters 可据此拒绝文件。
不会扫描其他目录、同步仓库或执行技能。在 GitHub Actions 中,uses: noteflowai/dsh-skills-anywhere 会选取所有受 Git 跟踪的 SKILL.md 并标注结果。命令、GitHub Action 与检查范围。

dsh-skills-anywhere list [--all] [--json] 提供器发布的技能(--all 显示被隐藏的重复项) dsh-skills-anywhere agents [--json] Agent 目录定义及本机存在的路径 dsh-skills-anywhere sources [--json] 已配置的 git 源及已同步的提交 dsh-skills-anywhere add [--ref] [--path] [--rank] [--project] dsh-skills-anywhere remove [--project] dsh-skills-anywhere sync [--force] [--json] 立即克隆或刷新全部源 dsh-skills-anywhere doctor [--json] 被修复、跳过、重命名、去重的技能及原因 dsh-skills-anywhere mcp 通过 stdio MCP 向已配置客户端提供技能

所有命令支持 --cwd <dir> 指定项目。CLI 与插件走同一套代码,无需 dsh 运行。

作为 MCP 服务器使用

dsh-skills-anywhere mcp 启动本地 stdio Model Context Protocol 服务器,通过以下工具提供相同的已配置来源、去重与命名规则。
在兼容客户端的 MCP 配置中注册该服务器即可连接:

| 工具 | 作用 |
| list_skills | 浏览全部允许模型调用的技能及其描述、来源(支持 limit、offset) |
| find_skills | 按关键词搜索名称、描述与来源 |
| open_skill | 加载某个技能的完整指令,以及其脚本和参考文件所在目录 |

技能同时以 skill://<名称> 资源提供,并为支持资源引用的客户端提供自动补全。
MCP 工具与资源入口会排除 frontmatter 设置了 disable-model-invocation: true 的技能。服务器可独立于 dsh 运行。

下面提供客户端配置示例。自动连接检查覆盖兼容矩阵列出的四种 SDK 配置及安装后的发布包;具体应用行为取决于客户端版本及其对工具和资源的支持。

Claude Code(作为插件安装;本仓库同时也是一个插件市场)

claude plugin marketplace add noteflowai/dsh-skills-anywhere
claude plugin install dsh-skills-anywhere@noteflowai

也可以只注册裸服务器:claude mcp add skills-anywhere -- npx -y dsh-skills-anywhere mcp。两种方式都需要重启一次 Claude Code 才会连接。

Cursor(.cursor/mcp.json 或 ~/.cursor/mcp.json)

{ "mcpServers": { "skills-anywhere": { "command": "npx", "args": ["-y", "dsh-skills-anywhere", "mcp"] } } }

Codex(~/.codex/config.toml)

[mcp_servers.skills-anywhere]
command = "npx"
args = ["-y", "dsh-skills-anywhere", "mcp"]

MCP 目录标识为 io.github.noteflowai/dsh-skills-anywhere。仓库也提供 Agent Plugin 清单(plugin.json 与 mcp.json),供支持该格式的客户端使用;请按所用客户端的流程安装。

如果客户端在项目目录之外启动服务器,加上 --cwd <dir>。已配置的 Git 源会在启动时后台同步。
嵌入自己的程序时,import { createSkillsAnywhereServer } from 'dsh-skills-anywhere/mcp'
返回 McpServer 和提供器,传输层接入方式见嵌入与迁移指南。

在 dsh web 界面里浏览和开关技能

在 dsh web 中打开 设置 → 插件 → 插件配置,Skills Anywhere 卡片会列出提供器找到的全部技能,按所在位置分组(Agent 目录、Claude Code 插件、git 源),并标出目录状态——已列出给模型、未列出(被预算或你挡在目录外)或作者禁用——以及重名时被改成的名字。每一行提供 置顶(始终列出)、隐藏(不进模型目录,但 /名称 和 find_skills 仍可达)和 排除(从提供器中彻底去掉);目录预算可以就地修改,筛选框按名称、描述和来源搜索。

修改会作为 skills-anywhere 命名空间写入 profile 的 dsh 设置文档,叠加在 cordis.patch.yml 的 catalog 和 excludeSkills 之上,模型目录立即跟随变化:无需重启,无需手改文件。卡片只在挂载了 dsh 设置服务和 web 服务器的 profile 中出现(自带的 web profile 满足);其他场合提供器的行为与组合配置完全一致。

配置

在 profile 的 cordis.patch.yml 中覆盖该行。patch 会替换整个 config 块,因此需要写全所有你关心的键:

- id: skills-anywhere
config:
agents: true
excludeAgents: [openclaw]
claudePlugins: true
sources:
- anthropics/skills
- { repo: vercel-labs/agent-skills, path: skills, ref: main, rank: 650 }
excludeSkills: [example-skill]

| 字段 | 默认值 | 含义 |
| providerName | skills-anywhere | 在 ctx.skills 上的提供器名 |
| agents | true | 扫描其他 Agent 的技能目录 |
| excludeAgents | [] | 跳过的 Agent id(见 agents 命令) |
| sharedDirs | dsh 中为 false,MCP 服务器为 true | 同时扫描 dsh 内置提供器已读取的 .agents/skills 与 ~/.agents/skills |
| extraProjectDirs | [] | 额外的项目相对技能目录 |
| extraUserDirs | [] | 额外的绝对路径或 ~/ 技能目录 |
| claudePlugins | true | 扫描 Claude Code 插件市场与缓存 |
| sources | [] | git 源:字符串或 { repo, ref?, path?, rank? } |
| sourcesFiles | true | 同时读取用户级与项目级 sources.json |
| cacheDir | ~/.dsh/skills-anywhere/cache | 源的检出位置 |
| sync | true | 是否克隆/刷新 git 源 |
| syncOnStart | true | 插件启动及项目首次使用时刷新 |
| syncIntervalMs | 21600000 | 后台刷新间隔;0 表示关闭 |
| syncTimeoutMs | 120000 | 单条 git 命令超时 |
| maxDepth | 5 | 源与市场内的目录遍历深度 |
| dedupe | true | 折叠软链接与字节相同的重复项 |
| lenient | true | 修复可恢复的 frontmatter 而不是跳过 |
| watch | true | 监视本地根目录,变化时刷新目录 |
| excludeSkills | [] | 要隐藏的技能名(原始 frontmatter 名或 list 显示的发布名均可);可在 web 卡片中运行时修改 |
| ranks | { project: 250, user: 550, claudePlugins: 580, sources: 700 } | 各组优先级 |
| catalog.limit | 50 | 本提供器进入模型目录的技能数;0 = 不限制 |
| catalog.pin | [] | 始终列出的名称 |
| catalog.hide | [] | 从不列出的名称(仍可 /name 调用和搜索) |
| dshHome、home | $DSH_HOME / ~ | 路径根,主要用于测试 |

dsh-skills-anywhere/tools 行接受 findLimit(默认 10)、findMaxLimit(50),以及 find / open 布尔值以便只注册其中一个工具。

优先级与去重规则

1. 按 rank 顺序扫描根目录;同一 rank 内按 Agent 表顺序,再按路径。
2. 指向同一文件(软链接)的条目折叠为第一个;同名且正文字节相同的条目折叠为第一个。两者都在 doctor 中显示为隐藏的重复项。
3. 仍然同名但内容不同的条目全部保留。如果其中有你自己的(来自 Agent 目录),它保持原名,其余加上插件、仓库或 Agent 前缀(如 telegram-configure);如果全部来自市场或 git 源,则全部加前缀,得到 discord-access、telegram-access 而不是一个没有意义的 access。doctor 会列出重命名。
4. 随后 dsh 注册表按 rank 把本提供器的候选与内置候选合并。

集成示例与实测结果

通过示例将交付回执与另行计算的任务检查关联起来。
报告保留技能指令、工具结果与每一份交付程序,便于复核完整过程。

| 工作流 | 示例与证据 | 实测结果 |
| 对照技能交付方式 | 27 次 Qwen3-8B 尝试,分三组工程配置比较无技能、直接交付与 MCP | 直接交付与 MCP 条件均无尝试完全完成任务;最后一组配置中,无技能条件有 2/3 次完全完成。 |
| 从指定会话继续工作 | Funes MCP 源码示例与六次接续尝试,每种条件三次 | 六次检索调用全部成功;六份程序均未修改,两种条件各有 0/3 次完全完成任务。 |

复核独立来源 SWE 任务:另一组固定实验在 Astropy、pytest、SymPy 三个公开任务上保留四条件共 36 次尝试。
直接加载与 MCP 预加载交付相同指令,无关内容组也匹配初始提示长度。
没有尝试获得原生验收:31 次有可判读报告,5 次因上游基础设施标记而保留为不确定; 8 次产生非空补丁。中文方法与离线记录 分别呈现工具失败、原始评分标签和不完整用量。

携带前序会话的固定技能版本继续工作:另一组独立保存的六次尝试均由工作流通过 MCP 预加载相同的历史技能。
六次加载均成功,记忆组合计成功检索六次;六份程序均未修改,完整任务验收为 0/6。
报告将原始版本指纹、交付回执、检索内容与任务检查逐项关联。

运行期行为报告与隔离技能组合示例分别展示最终文件验收、服务提交和授权检查。
报告保留 32 个原生脚本对照及全部 12 次模型尝试;模型没有完成所需服务提交。
中文方法提供复现步骤和结果的解释范围。

这些小规模公开任务研究用于评估特定工作流;普遍的技能或记忆效果收益需要另行验证。
研究说明集中提供复现方法、技能组合对照与各批次记录。

安全说明

- 插件只读取技能文件,绝不写入你的 Agent 目录。
- git 源会在插件启动和刷新周期在本机运行 git。对不完全信任的源请锁定提交,并检查 lock.json。
- 加载技能会把指令加入 Agent 上下文。使用前应检查指令及引用脚本;执行权限由客户端控制,加载成功不保证模型遵循指令。
- 技能通过 Node 文件系统 API 读取,而非 dsh 沙箱化的 ctx.fs;内置提供器读取自带根目录时也是如此。

开发

pnpm install
pnpm run check # 类型检查 + lint + 测试 + 构建
pnpm pack # 生成 tarball,供 dsh plugin --profile <name> add ./dsh-skills-anywhere-*.tgz

测试直接跑在真实的 @deepseek-ai/dsh-skill 注册表和临时目录里的真实 git 仓库上。

参与贡献

欢迎 issue 与 PR。在 src/agents.ts 中添加发现路径时,请注明来源并验证目录发现行为。客户端接入需要单独检查协议与工作流。
详见贡献指南。

社区收录:Awesome DeepSeek Harness · Awesome Gemini CLI。
发布历史与核验记录。

许可证

MIT © Note Flow AI
预览分享卡片长什么样 ↓noteflowai/dsh-skills-anywhere
分享 · DeepSeek Harness Hub
noteflowai/dsh-skills-anywhere

跨工具发现与加载技能。 将本地目录和已配置 Git 源中的 Agent Skills 汇入统一目录,通过…

回到顶部