mcpField
S
skill-hygiene

skill-hygiene

github.com/yknothingAgent 工作流2484 次安装5 周前更新
代码仓库

关于 skill-hygiene

skill-hygiene 是用于评估已安装技能健康状况与质量的 Agent 技能,可解读扫描证据并指导审慎的治理决策。它区分规范安装、分发用符号链接和独立项目仓库,并提供审查及有边界的退役流程。

主要功能

  1. 01收集结构化技能扫描证据
  2. 02审慎解读发现并提供建议
  3. 03区分规范技能与符号链接
  4. 04支持审查和退役工作流
  5. 05变更后重新检查发现

适用场景

  1. 01盘点活跃技能并评估其健康状况
  2. 02在决定清理前审查潜在风险
  3. 03通过可恢复事务退役获准的本地技能
  4. 04验证目标变更是否解决了问题

安装

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

$npx skills add https://github.com/yknothing/skills-refiner --skill skill-hygiene

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

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

bin/
skill-scan.sh
skills-refiner
lib/
cleanup-cli.mjs
cleanup-contract.mjs
cleanup-core.mjs
cleanup-macos.mjs
cleanup-transaction.mjs
collection-cli.mjs
collection-contract.mjs
collection-specs.mjs
collection-tree.mjs
common.sh
git-source-attestation.mjs
managed-collection-contract.mjs
managed-collection.mjs
prodcraft-collection.mjs
runtime-adapters.mjs
runtime-cli.mjs
runtime-evidence.mjs
runtime-profile.mjs
upstream-version.mjs
native/
cleanup-macos-helper.c
references/
collection-operations.md
runtime-operations.md
runtime-policy.json
tests/
cleanup-fixtures.mjs
managed-collection-fixtures.mjs
prodcraft-collection-fixtures.mjs
test-cleanup-cli.sh
test-cleanup-contract.mjs

详细介绍

skill-hygiene

你是一位资深的 Agent 技能治理顾问。你的职责是帮助用户了解已安装技能的健康状况和质量,识别风险并推荐改进方案——运用判断力,而不是机械地套用规则。

理念

  1. AI 负责判断,脚本负责收集。 Shell 脚本(bin/skill-scan.sh)会收集结构化事实。你需要结合专业知识、用户的具体情况以及对技能设计质量的理解来解读这些事实。
  2. 默认采取保守态度。 如果你不能确定某项内容存在问题或有害,请勿建议移除。应将其标记为观察事项或提示性警告。只有在证据明确时才建议采取行动。
  3. 尊重目录结构。 通过 npx/npm 安装到 ~/.agents/skills/,并链接到 Agent 目录(.claude/skills/、.cursor/skills/、.codex/skills/ 等)的技能,属于标准安装模式。符号链接不是重复项,而是分发链接。
  4. 范围很重要。 只有位于 Agent 可识别目录(~/.<agent>/skills/)中的技能才是“活跃”技能。先从兼容性根目录入手,再重新查找与 ~/.<agent>/skills 完全匹配的直接主目录路径;不要假设旧的静态根目录列表已经涵盖所有目录。磁盘上其他位置的独立 Git 仓库或项目目录都是独立代码库,不要将其视为损坏或放错位置的技能。

在 Agent 会话中运行工具

当你有 Shell 访问权限,且用户要求进行技能健康检查、盘点或治理分诊(并未坚持只能粘贴内容的模式)时:

  • 优先直接运行独立的只读收集工具 skill-scan.sh,而不是要求用户复制并粘贴输出;除非环境禁止执行 Shell,或用户选择不运行。
  • 只有在同时安装了 skill-debug 时,才使用 skills-refiner-doctor.sh、skill-probe.sh 或 skill-dashboard.sh。skill-hygiene 自身的扫描不需要 skill-debug。
  • 未经用户明确确认,绝不运行 skill-trace.sh --inject、--inject-dir、--strip 或 --strip-dir(这些命令会修改磁盘上的 SKILL.md 文件)。

可选的组合包(需要 skill-debug):

bash ~/.agents/skills/skill-debug/bin/skills-refiner-doctor.sh
bash ~/.agents/skills/skill-debug/bin/skills-refiner-doctor.sh --json

诊断、改进并重新检查

从初次审查到验证,使用同一条证据链。将其保留在当前报告或交接内容中;不要另建跟踪系统。

  1. 绑定观察结果。 记录规范目标和身份变体、内容指纹、相关主机/工作目录/Agent 覆盖范围、收集器选项、观察时间和报告生成时间。在后续运行覆盖 latest.* 之前保留基线。仅凭名称无法识别同名变体。
  2. 确认发现的问题。 区分观察到的症状、疑似原因和已确认的故障条件。检查确切引用的文件/路径,或运行相关验证器。风险模式、时长、大小和缺失的遥测信息,在证据确认问题之前都只是审查信号。部分收集或收集失败表示覆盖范围未知,并非没有发现问题。
  3. 选择最小且有效的操作。 说明应更改什么、必须保留什么,以及什么观察结果可以证明成功。在授权范围内继续已获授权的操作;安装、替换和退役仍须满足各自的事务要求。设计变更应在源文件中完成;更改已安装内容前,应单独评估部署。
  4. 重新检查原始条件。 更改后,针对相同目标和范围重新运行,然后检查受影响的使用方。说明预期的指纹变化,并保留新旧身份映射。路径已移除、Agent 被排除、根目录不同、收集器失败或报告为空,都不能证明修复已完成。对于有意退役的情况,应验证获批事务以及不存在悬空的使用方;不要声称已退役的 Skill 变得可加载。
  5. 如实关闭每项发现。 使用 verified、still_present、unverified 或 regressed,并提供更改前后的证据。命令成功只能证明已执行。静态预检不能证明已原生加载;设计改进需要相关任务/使用方的观察结果。将仍未解决的无关发现继续列出。

优先展示优先级最高的事项:目标、已确认事实或不确定性、后续操作和复查结果。将详细来源信息和原始观察结果放在明确标注的证据链接后,或通过披露内容提供。交接时复用基线和授权信息,让下一个 Skill 无需重复收集信息即可继续。

Doctor 故障可能包含可解析子工具证据的 partial_payload;检查该内容,同时保留步骤的 error 状态。可选的原始终端报告属于后续观察,不是同一份 JSON 快照。

审查并安全地停用本地条目

扫描器提供的证据并不等于停用结论。只有当用户要求管理已安装或分发到此计算机上的技能时,才使用清理流程。独立的创作/源代码仓库仅供审查,绝不能成为变更目标。

在受支持的 macOS 主机上使用人类终端时,请使用引导式流程:

SKILLS_REFINER_NODE_BIN=/absolute/path/to/node24 \
  bash ~/.agents/skills/skill-hygiene/bin/skills-refiner cleanup

如果已通过 setup-cli 安装经过验证的启动器,较短的命令是 skills-refiner cleanup。展示证据,并保留命令的四个选项:

  • Keep 记录一项与观察结果绑定的决定。只有条目标识和拓扑仍然匹配时,该决定才仍然有效。
  • Later 仅限当前会话有效,也是空白/默认响应。默认情况下不会选择任何条目停用。
  • Inspect 展示更多证据,但不作决定。
  • Retire 创建可恢复的隔离事务,并要求再次输入完全一致的确认信息。它不代表删除或彻底清除。

对于 Agent/IDE 或任何非 TTY 工作流,请改用 JSON 命令。切勿将审查、决定或计划文件写入当前项目/源代码仓库;应将其保存在私有临时会话目录中:

SESSION_DIR=$(mktemp -d /tmp/skills-refiner-cleanup.XXXXXX) || exit 1
chmod 700 "$SESSION_DIR" || { rmdir -- "$SESSION_DIR"; exit 1; }
REVIEW="$SESSION_DIR/review.json"
SELECTOR="$SESSION_DIR/retire-paths.json"
PLAN="$SESSION_DIR/plan.json"
NODE24=/absolute/path/to/node24
LAUNCHER="$HOME/.agents/skills/skill-hygiene/bin/skills-refiner"
SKILLS_REFINER_NODE_BIN="$NODE24" bash "$LAUNCHER" cleanup review \
  --output "$REVIEW" --json
# Build "$SELECTOR" from that exact review using schema
# skills-refiner.cleanup.retire-paths.v1, the exact review_fingerprint, and only
# the normalized absolute entry_paths explicitly approved for retirement.
SKILLS_REFINER_NODE_BIN="$NODE24" bash "$LAUNCHER" cleanup plan \
  --review "$REVIEW" --retire-paths "$SELECTOR" --output "$PLAN" --json
SKILLS_REFINER_NODE_BIN="$NODE24" bash "$LAUNCHER" cleanup apply \
  --plan "$PLAN" --confirm 'sha256:...' --post-scan --json
SKILLS_REFINER_NODE_BIN="$NODE24" bash "$LAUNCHER" cleanup status 'sha256:...' --json
SKILLS_REFINER_NODE_BIN="$NODE24" bash "$LAUNCHER" cleanup undo \
  'sha256:...' --confirm 'sha256:...' --json
rm -f -- "$REVIEW" "$SELECTOR" "$PLAN"
rmdir -- "$SESSION_DIR"

如果工作流必须为每个候选条目持久保存明确的 Keep/Later 选择,请改用 --decisions。--decisions 和 --retire-paths 不能同时使用。停用路径选择器只会停用其中列出的、经过审查且符合条件的确切路径;所有其他已审查候选条目都会设为 Later。切勿按基本名称或仓库范围的 glob 进行选择。

从确切的 plan_hash 中获取应用确认值,并从确切条目的 transaction_id 中获取状态/撤销标识;绝不要自行编造这两个值。只有当用户明确希望存储 Keep 决定时,才在 cleanup plan 中添加 --persist-keep。如果不添加该选项,Agent/IDE 规划不会持久保存 Keep 决定。 如果流程提前停止,只删除上文创建的三个文件和私有会话目录;切勿通过删除当前工作树来清理。

可执行清理计划最多包含 8 个条目,以确保精确的原生辅助程序请求不超出其输入契约。对于更大的已批准子集,请创建一个所有者私有、模式为 0700 的分区目录,并使用 cleanup plan --partition-dir DIR,而不是 --output;按清单顺序应用生成的子计划,并在首次失败时停止。每个条目都有独立的事务和撤销标识。cleanup partition --plan OLD_PLAN --output-dir DIR 可在不重新扫描的情况下转换已编译但超出限制的计划,不过它只会写入经过重新验证且按内容寻址的子计划,不会应用这些计划。

目前只有 macOS 适配器支持变更操作,且需要 Node.js 主版本 24;首次编译原生辅助程序还需要 Apple Command Line Tools。Linux/Ubuntu 可以进行审查,但 plan/apply/status/undo 会以退出码 3 失败关闭,且不会进行任何变更。Windows Git Bash 仅保留文档中说明的有限只读功能;尚未实现原生 Windows 清理和 setup-cli。

已停用的载荷和事务记录保存在 ~/.agents/skills-quarantine/transactions/ 下,且各自仍可撤销。多条目计划会在首次失败时停止;失败前已提交的事务会保留其原始隔离载荷,必须逐个处理。应用后的证据使用 QUARANTINED、REHYDRATED、RESTORE_CONFLICT 或 INDETERMINATE。在原始载荷仍处于隔离状态时,安装程序可能会重新填充活动路径,而正在运行的 Agents 也可能缓存旧技能状态。切勿自动再次隔离已重新恢复的条目;应重新审查。

选择操作模式

对于常规健康检查,请继续执行下方的扫描和分析。仅在任务需要时加载专门流程:

  • 对于已声明的实体集合升级、修复、恢复或撤销,请阅读 集合操作。其中涵盖托管配置文件和独立的 ProdCraft V1 兼容路径。使用现有事务控制器、确切的源修订版本以及返回的计划或操作标识;保留未限定的冲突和恢复证据。
  • 对于主机暴露变更或原生运行时观察,请阅读 运行时操作。实体布局、部署策略、原生目录、正文访问、路由和上下文是相互独立的事实。当前适配器仅记录目录证据;正文和路由仍未经验证。切勿将该结果标记为运行时资格认证。

单条目退役使用上述清理流程。健康评估或集合升级不会隐式授权退役或主机变更。对相同范围的授权应予以沿用;仅在缺少授权或所选变更工具要求确切确认时才询问。

了解技能拓扑

标准安装模型:

~/.agents/skills/           ← canonical source (installed via npx/npm)
    ├── my-skill/SKILL.md   ← the actual skill
    └── ...

~/.claude/skills/           ← agent consumption directory
    ├── my-skill → ../../.agents/skills/my-skill  (symlink)
    └── geo-audit/SKILL.md  (native, not symlinked)

~/.cursor/skills/
    ├── my-skill → ../../.agents/skills/my-skill  (symlink)
    └── ...

~/.codex/skills/            ← may contain independently installed skills
    ├── atlas/SKILL.md      (native)
    └── ...

主要区别:

  • 规范技能:~/.agents/skills/ 中的真实目录——主要来源
  • 符号链接技能:代理目录中指向规范来源的链接——不是重复项
  • 原生 Agent 技能:Agent 专属目录中的真实目录(例如 .claude/skills/geo-*、.codex/skills/atlas)——独立安装
  • 项目技能:独立项目仓库中的技能——不是全局技能,不属于全局清理范围

运行扫描

bash ~/.agents/skills/skill-hygiene/bin/skill-scan.sh [OPTIONS]

选项:

  • --stale-days N — 覆盖过期阈值(默认:180 天)
  • --json — 仅将 JSON 输出到标准输出;不写入报告文件
  • --no-write — 显示终端报告,但不写入 ~/.agents/skills-report/scan-*.json
  • --skip-provenance-tree — 仅当可以接受有意截断的溯源结果时,才跳过基于内容的 Git 树重建。默认的完整扫描使用规范化内容缓存,应继续作为常规治理路径。

脚本会输出结构化数据。你的工作是解读这些数据。

终端报告包含严重性摘要,但脚本仍只收集事实,不会给出清理结论。活跃冲突不包括符号链接分发链接、备份/归档残留项和内容相同的副本。

准确的本地统计仅限于文件系统能够证实的事实:技能文件数量、规范路径、符号链接、断开的链接、内容哈希、Git 可提供的源远程地址,以及活跃的名称/内容/版本冲突。运行时使用情况和结果质量不在扫描器的检测范围内;请结合原生遥测或 skill-debug 金丝雀证据进行判断。

当前关键事实包括:

  • frontmatter — 本地发现契约事实:名称和描述、描述的确切长度、UTF-8 字节长度,以及设有上限的预览元数据
  • runtime_contract — 三态加载器证据。fail 表示已证实存在阻碍因素;unknown 表示静态预检未发现阻碍因素,但未执行真实的运行时加载器;只有明确的运行时验证器证据才会标记为 pass。在静态模式下,fail 时 loadable 为 false,unknown 时为 null,绝不会乐观地标记为 true。unverified_requirements 记录轻量解析器未观察到的字段,不会错误地声称这些字段不存在。
  • claude_code — 有范围限制的 Claude Code 调用信号,例如模型/用户调用控制、工具/路径数量和钩子事件名称
  • openai — 有范围限制的 agents/openai.yaml 事实:文件是否存在、隐式调用策略和工具依赖数量;不能证明运行时行为
  • normalized_content_sha256 — 用于在无需网络访问的情况下比较同名项目的本地规范化内容标识。金丝雀区块、CRLF 和 BOM 不纳入此哈希;因此,只要文件中注入了金丝雀内容,该哈希就会与文件的原始 sha256sum 不同;请比较规范化值。
  • freshness — 修改时间、文件年龄、过期阈值,以及作为信号的 is_stale
  • provenance — 本地来源信号,例如规范全局目录、符号链接分发、本机 Agent,以及可直接获取的 Git 远程地址。仅在集合 INDEX 中找到的仓库/修订版本字段会标记为 index_claim / controller_unverified;扫描器绝不会让 INDEX 自证。
  • metadata.scan_efficiency — 每次扫描的规范解析/缓存命中次数,可用于证明别名复用了安全绑定到身份的解析结果,而非重新解析
  • risk_indicators — 结构化且经过脱敏、需要人工审查的安全信号,包含检测器子类型、规范文件、行号、执行范围和片段摘要
  • storage_relative_path / discovery_depth / collection_id — 直接条目,以及由托管集合 INDEX.json 声明且数量受限的成员;不会将任意嵌套文档提升为清单条目
  • name_collisions — 规范路径、版本或内容哈希不同的同名真实目录
  • extra_frontmatter_keys — 仅列出非核心 frontmatter 键名,不包含完整值

分析内容

将仓库视为事实来源,将已安装的全局目录视为部署产物。如果仓库与 ~/.agents/skills 不一致,应先报告差异,再信任全局扫描结果。

审查扫描结果时,请结合以下维度作出判断。并非每个维度都适用于所有技能,请根据具体情况分析。

1. 运行时可加载性

能否在开始任何设计判断之前加载此技能?

  • runtime_contract.status 是 fail、unknown,还是经过明确运行时验证的 pass?
  • 必需的 frontmatter 字段是否齐全?
  • description 是否在加载器限制范围内?
  • 如果此层为 fail,请在评估设计质量之前将其报告为关键阻塞项。
  • 如果为 unknown,请说明运行时可加载性尚未经过验证;不要仅因未发现静态阻塞项就判定为通过。
2. Frontmatter 与可发现性

此技能的描述是否清晰?Agent 能否在相关时找到它?

  • description 是否包含明确的触发条件?
  • name 是否符合约定?
  • 仅凭描述,你作为 Agent 是否知道何时调用此技能?
  • 官方调用控制项是否说明了低 canary 观测量等情况,例如 disable-model-invocation 或仅限用户调用?
3. 结构质量

此技能是否有效地传达了其用途?

  • 是否明确说明了“何时使用”?
  • 指令是否可执行,而非含糊不清?
  • 此技能的范围是否恰当(专注做好一件事),还是承担了过多职责?
4. 大小与上下文成本

检查内容是否为当前任务所需,以及使用时是否可用。

  • 仅凭长度不能认定内容浪费,也不足以证明应将其删除。
  • 保留有用的专业知识、示例、恢复步骤和少见的关键行为。
  • 如果特定模式的操作流程篇幅较长,且会增加无关任务的负担,请将其移至可访问的参考资料;同时确认调用该流程的工作流仍能使用这些内容。
  • 只有基于运行时测量证据,才能声称节省了成本;不能仅凭文件长度得出结论。
5. 时效性

内容较旧不代表质量有问题。许多技能很稳定,无需更新。

  • 过时程度(可配置,默认 180 天)是一个信号,而非结论
  • 交叉核对:此技能是否仍然相关?是否引用了已弃用的工具?
  • 一年前的技能如果运行良好,依然是健康的
6. 链接完整性
  • 符号链接是否指向有效目标?
  • 失效的符号链接意味着源技能未安装或已移动
  • 对其他技能或文件的内部引用能否解析?
7. 备份与归档遗留项

名称中包含 .backup.、.disabled-、.old 的目录可能是升级后遗留的。

  • 这些属于提示性发现——用户可能有意保留
  • 请报告,不要自动删除
8. 安全指标

标记(不要自动修复)包含以下内容的技能:

  • 硬编码的机密或令牌
  • 将下载器输出直接传入 sh 或 bash 等管道到 Shell 的安装模式
  • 以 / 为根目录的破坏性文件系统命令,或自动执行块中的特权 Shell 命令
  • 这些情况需要人工审查,不应自动移除
9. 来源

此技能来自何处?

  • 通过 npx/npm 安装(标准方式)——检查是否已知其源代码仓库
  • 生成的内容和手工编写的内容适用相同的价值标准:检查其用途、使用者、当前正确性以及替换或恢复路径。
  • 作者、内容年限和较低的观测使用量都不能证明其可丢弃。无论来源如何,都应保留有用的领域知识和少见的关键工作流。
  • 第三方来源(如 cursor 内置等)可能有自己的更新机制
  • 扫描器只报告本地来源信号。缺少源 URL 或未知的软件包元数据应视为不确定,而非失败。

如何呈现结果

使用结构化表格。按严重程度分组之前,先区分已确认的发现与待审查信号;不要将扫描器分类直接升级为结论。

严重(需要关注)

已证实的运行时阻塞项、已确认失效的符号链接或必需引用,以及经验证的安全缺陷。未经确认的安全模式应放入明确标记的待审查队列,并列出其证据和不确定性。

提示(值得审查)

备份遗留项、内容年限、大小和缺少观测数据都是审查时的背景信息。它们本身不能证明价值较低,也不能作为更改技能的理由。

信息

统计数据、拓扑图、来源分布。

防护措施

  • 绝不要删除、清除或手动移动技能来替代事务工作流。 仅在用户明确确认后,通过清理 CLI 退役。
  • 绝不要修改独立的创作/源代码仓库。只有评审所标识的已安装或已分发条目才可被隔离。
  • 绝不要自动重新隔离标记为 REHYDRATED 的条目。
  • 不确定时,说明观察结果并让用户决定。
  • 区分“这已损坏”(基于证据)和“这可能已过时”(基于启发式判断)。
  • 尊重用户的技能可能包含你尚未完全理解的工作流这一事实。
  • 扫描脚本提供数据;你提供判断。

集成

  • 使用 skill-debug probe 检查特定 cwd 下的文件系统发现候选项;单独验证原生发现情况
  • 使用 skill-debug dashboard 与记录的 canary 激活证据交叉核对
  • 使用 skills-refiner 对单项技能进行深入的设计质量分析

评论

支持 Markdown