← 返回列表
未验证
一个 DSH 插件,用于锁定你的 agent 的 skill 被允许做什么——并在发生变化时告诉你。
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/16 · 已提供中文文档
DSH 插件:锁定、验证并治理 AI 代理技能。在你安装之前就告诉你一个技能能做什么——以及当它在你的审查之后悄悄获得某项能力时。不附带任何启动时代码。
综合分
30.6
GitHub 分
30.6
用户评分
—
★ Stars
1
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add liyixuan201211/dsh-skillnotary该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
dsh-skillnotary
一个 DSH 插件,用于锁定你的 agent 的 skill 被允许做什么——并在发生变化时告诉你。
一个 agent skill 是一个包含 SKILL.md 的文件夹,你的 agent 会加载并遵循它。它通常包含可运行的 shell、脚本和 MCP 配置:未经审查的代码,拥有工具访问权限,没有任何锁定,悄无声息地变化着。
大多数 skill 安全工具回答的是“这个 skill 现在危险吗?”
skillnotary 回答的是“这还是我批准的那个 skill 吗——而且它是否仍然只被允许做它当初做的事?” 这是一个不同的问题,而正是这个问题能捕捉到在你的审查之后发生的变化。
dsh plugin --profile web add github:liyixuan201211/dsh-skillnotary
中文:安装、更新、审查 agent skill 或 DSH 插件之前,先锁定它、审计它的能力,并在它被上游改动时发现。多数工具回答“这个 skill 现在危不危险”,本插件回答的是“它还是我批准的那个吗,还只被允许做当初那件事吗”。
它改变了什么
安装后,agent 会遵循 skills/skillnotary/SKILL.md:在添加或更新 skill 之前,它会运行 skillnotary audit(它能做什么?)、verify(它是否是被批准的那个?)和 policy(它在这里被允许吗?)——并报告 critical/high 级别的发现,而不是悄悄安装。
它附带两个 skill:
- skills/skillnotary/ —— 上述审查循环,用于你采纳或更新某样东西的那一刻。
- skills/skillnotary-drift-watch/ —— 用于那一刻之后:它通过 DSH 的调度工具设置一个周期性的 verify,这样一旦你不再关注后发生变化,skill 就会被注意到,而不是事后才被发现。
它存在的意义所在的那一刻:
$ skillnotary verify
✗ 2 drift(s) detected:
✗ release-notes [integrity-changed] content digest changed: e4qHXFFicS -> Cj7IuwNp3Gb
✗ release-notes [capabilities-changed] capabilities changed: [exec] -> [agent.spawn,exec]
一个哈希告诉你“有东西变了”。第二行告诉你,这个 skill 获得了生成更多 agent 的能力。你可以离线自行复现:
git clone https://github.com/liyixuan201211/skillnotary
cd skillnotary && bash demo/run.sh
安装
this plugin
dsh plugin --profile web add github:liyixuan201211/dsh-skillnotary
the tool it drives (not on npm yet; run it from git today)
npx --yes github:liyixuan201211/skillnotary --help
如果你愿意,可以固定到某个提交:
dsh plugin --profile web add github:liyixuan201211/dsh-skillnotary#
本插件不附带任何启动时代码
cordis.patch.yml 是一个空补丁,这是有意为之:
- 启动时的 insert 会在 DSH 进程内、针对每个 profile、以你的完整权限运行代码——一个扩大启动图的安插件本身就是攻击面;
- 一个糟糕的 insert 可能拖垮整个启动层(~/.dsh/cordis.patch.yml 对此带有明确警告),而发布可能做到这一点的东西是不负责任的;
- 该 skill 不需要任何权限——它要求 agent 通过普通的 shell 工具运行 npx skillnotary …,在那里你可以看到并批准每一条命令。
如果你是在安装前审查这个插件:cordis.patch.yml 就是全部内容,其中没有任何东西会执行。
它会审计自身
这两个技能都会像其他任何技能一样被 skillnotary 检查,并且两者都声明了 allowed-tools: Bash,因为它们确实会要求 agent 运行命令。有两个发现被保留下来,我们选择保留它们,而不是去规避它们:
skillnotary MEDIUM R007 Runtime package installation (SKILL.md:45)
npx --yes github:liyixuan201211/skillnotary --help
skillnotary-drift-watch MEDIUM R007 Runtime package installation (SKILL.md:23)
sn() { npx --yes github:liyixuan201211/skillnotary "$@"; }
· 4 finding(s) suppressed (config.ignore matched R001:reference/; config.ignore matched R007:reference/)
✓ no findings at or above "high"
npx 确实是运行时包安装。压制它才是更不诚实的做法,而 medium 低于默认的 maxSeverity: high,所以 CI 门禁仍然通过。
被压制的发现属于同一类误报,而且出现在唯一无法避免的地方:reference/capabilities.md 和 reference/workflow.md 引用命令是为了记录它们,而能力表必须列出检测器要查找的字符串。因此 skillnotary.config.json 豁免了 reference/——按规则和按路径豁免,绝不豁免整个文件:
{ "version": 1,
"ignore": ["R001:reference/", "R007:reference/"],
"allowInlineSuppressions": false }
作用域是关键:R001 只在 reference/ 内被静默,因此入口点 SKILL.md 真正行使的能力仍然会被报告。
用一张表说明 skillnotary 做什么
| 支柱 | 命令 | 你能得到什么 |
|---|---|---|
| 锁定 | lock | skills.lock:内容摘要、解析后的提交,以及能力集 |
| 验证 | verify | 字节和*能力与你批准的内容发生漂移 |
| 证明 | keygen / sign | 基于 DSSE 信封与 in-toto 声明的 ed25519 |
| 治理 | policy | 按技能允许/拒绝、按能力门禁、严重性阈值 |
| 修复 | fix | 将技能实际需要的 allowed-tools 写入其 SKILL.md |
| 安装 | apply | 将锁定的技能复制到 harness 目录,并重新检查每个摘要 |
| 门禁 | ci | 将以上所有内容作为单个 CI 步骤 |
零运行时依赖;TypeScript 无需构建步骤(Node ≥ 23.6)。
诚实的局限
- 检测是上下文作用域的正则表达式,而不是沙箱。有针对性的混淆可以绕过它;一份干净的
报告意味着“没有已知信号”,而不是“安全”。
- 只扫描每个文件的开头(每个文件 1 MB,每个技能 64 MB);当发生截断时,规则
R025 会说明这一点,而不是隐藏它。
- 证明是 DSSE + in-toto,但这不是 Sigstore——没有无密钥/OIDC,
没有透明度日志。
- 锁文件固定了一个技能;它不会沙箱化你的 agent 运行该技能时它所做的
事情。
链接
- skillnotary — 该工具:
- 对该工具本身的安全审计(8 项发现,均已修复):
- 插件市场:
许可证
MIT同作者(liyixuan201211)的其他插件
扫码进群