mcpField
S
skill-provenance

skill-provenance

github.com/rheinmir安全10214 次安装2 周前更新
代码仓库

关于 skill-provenance

skill-provenance 是用于追踪 Skill 供应链信息的工具,面向维护已安装 Skill 的团队。它记录来源和逐文件 SHA-256 校验和,并检测文件变更及未登记的 Skill。

主要功能

  1. 01记录 Skill 来源和校验和
  2. 02对照台账验证完整性
  3. 03报告已修改、未跟踪或缺失项
  4. 04在 CI 中检查意外变更

适用场景

  1. 01添加外部 Skill 后登记来源
  2. 02检查 Skill 安装后是否变更
  3. 03在 CI 中拦截未登记或已修改的 Skill

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/rheinmir/setup --skill skill-provenance

安装后在 Claude Code 中输入/skill-provenance确认已加载。

详细介绍

Skill:skill-provenance

为每个 skill 建立来源与完整性台账。orca-sec-scans 会扫描内容中的漏洞/密钥;此 skill 回答供应链中的另外两个问题:skill 来自哪里,以及安装后是否遭到篡改。存储文件为 fdk/skills.provenance.json(来源 + 记录日期 + skills/<name>/ 中所有文件的 sha256)。通过重新计算校验和并与台账比对来验证——不一致 = MODIFIED,磁盘上存在但尚未记入台账的 skill = UNTRACKED。

WHAT

用途和背景
  • 用途: 通过台账 fdk/skills.provenance.json(来源 + 记录日期 + 所有文件的 sha256)以及重新计算校验和的 verify 命令,回答每个 skill 的两个供应链问题:来自哪里,以及安装后是否遭到篡改。
  • 触发条件(何时使用):
    • 刚从外部来源(市场、其他仓库、其他项目会话中的提炼)安装 / 提炼了 skill → 使用 record 固定来源 + 校验和。
    • 怀疑 / 想检查 skill 是否被绕过流程修改 → 使用 check。
    • 询问“这个 skill 来自哪里”、“审计 skill 来源”、“skill 校验和”、“skill 供应链”。
    • CI 想拦截陌生 skill,或被修改但尚未更新台账的 skill。
  • 非目标: 不扫描 skill 内容中的漏洞/密钥(由 orca-sec-scans 负责);不自行猜测 skill 来源。
心智模型

skills/<name>/(磁盘上的文件)→ 每个文件的 sha256 → 与台账 fdk/skills.provenance.json 比对 → OK | MODIFIED(不一致)| UNTRACKED(磁盘上存在但尚未记入台账)| MISSING(台账中存在,但磁盘上已不存在)。record = 写入/覆盖台账条目;check = 读取并比对。

输入和输出约定
FieldRequired?含义
In<name> 或 --allrecord 必填要记入台账的 skill
In--sourcerecord 必填URL、真实的 repo#ref,或 local-authored
In--ci否有 MODIFIED/UNTRACKED 时,check 返回退出码 1
Outfdk/skills.provenance.json 中的台账条目record 后来源 + 记录日期 + sha256
Out每个 skill 的状态check 后OK / MODIFIED / UNTRACKED / MISSING + 退出码
规则和能力
  • RULE-01(MUST):不得捏造来源。--source 必须是真实的 URL/ref 或 local-authored;错误的 provenance 比没有 provenance 更糟。
  • RULE-02(MUST):每次合法安装/修改后都必须执行 record——台账是真实信息的唯一来源;修改 skill 后不重新记录,会被 CI 作为异常修改拦截(这是预期行为)。
  • RULE-03(MUST):不得替代 orca-sec-scans——此 skill 负责来源/完整性,不扫描内容中的漏洞/密钥;两者都要使用。
  • RULE-04(MUST):check --ci 将 MISSING(skill 已移除)视为非错误;只有 MODIFIED/UNTRACKED 才会拦截。
  • RULE-05(MUST):存储文件 fdk/skills.provenance.json 是经整理维护的文件——与 skill 变更一同提交,避免内容偏离。
  • 能力:读取 skill 文件并计算哈希;写入本地 provenance 台账。不联网。
失败边界
  • 不知道 skill 的真实来源 → 向用户澄清,不得猜测并填写 --source。
  • check --ci 发现 MODIFIED/UNTRACKED → 失败(退出码 1);有意修改 → 重新记录,异常修改 → 调查。
  • MISSING → 报告,但不拦截。

HOW

主要工作流
步骤类型输入操作输出/退出失败/后续
W01effect空台账一次性回填 record --all --source local-authored完整台账台账已有内容 → 跳过
W02effect新技能 + 真实来源record <name> --source …台账条目来源不明确 → 澄清
W03deterministic台账 + 磁盘check(检查全部或一个技能)OK/MODIFIED/UNTRACKED/MISSING—
W04deterministic台账 + 磁盘CI 门禁 check --ci退出码 0/1MODIFIED/UNTRACKED → 退出码 1
W05effect有意修改过的技能使用旧来源重新记录新校验和未重新记录 → W04 报错

各步骤详情(W01–W05 的事实来源):

  1. 一次性回填(如果台账为空)——将所有现有技能记录为自编:
    python3 fdk/tools/skill-provenance.py record --all --source local-authored
    
  2. 安装/添加新技能时——记录真实来源(URL、repo#ref 或 local-authored):
    python3 fdk/tools/skill-provenance.py record <name> --source "https://github.com/<owner>/<repo>#<ref>"
    
  3. 随时检查完整性(输出 OK/MODIFIED/UNTRACKED/MISSING):
    python3 fdk/tools/skill-provenance.py check          # xem tất cả
    python3 fdk/tools/skill-provenance.py check <name>   # một skill
    
  4. CI 门禁——如果存在 MODIFIED 或 UNTRACKED,则退出码为 1(已接入 .github/workflows/skills-sync.yml):
    python3 fdk/tools/skill-provenance.py check --ci
    
  5. 有意修改技能后,运行 record <name> --source <旧来源> 来更新校验和——否则,check --ci 会报告 MODIFIED(这是正确的:所有更改都必须经过台账)。
分支
ID类型条件行为跳过/失败重新汇合
B01conditional_required台账为空回填 W01台账已有内容 → 跳过W03
B02recoverycheck 报告 MODIFIED有意修改 → W05 重新记录;不清楚是谁修改的 → 按意外修改调查—W03
B03recoverycheck 报告 UNTRACKED新技能有效 → W02 使用真实来源记录来源不明确 → 澄清W03
验证与停止条件

完全确定:skill-provenance.py 的校验和 + 退出码。需要人工判断的部分:--source 来源是否真实。check 全部输出 OK 时停止(MISSING 可以接受)。

示例
  • **正向示例:**刚从 https://github.com/acme/skills#v1.2 拉取技能 → python3 fdk/tools/skill-provenance.py record foo --source "https://github.com/acme/skills#v1.2" → check foo 输出 OK。
  • **边界/失败示例:**修改 skills/foo/SKILL.md 后未重新记录 → check --ci 输出 MODIFIED foo,退出码为 1;用户问“foo 来自哪里”,但没人知道 → 不要猜测并填写 --source,应询问确认。

评论

支持 Markdown