审计与清理已安装技能
一句话:先出证据报表,再走审核,最后才删。删除永远不是第一步。
定位:Workflow 型技能。产出 = 一份可交付的报表 + 一次受控的清理。
铁律(先看,违反必出错)
- 只认两个硬证据:frontmatter 的
name:字段 + 内容哈希。目录名、__skillhub后缀、-cn中英标记一律不作判定依据。 - 哈希不同 = 不同技能。 只能表述为"同名不同内容、功能同类、建议择一";严禁说成"完全相同 / 真重复 / 冗余副本"。
- 给删除建议必须引用证据出处(具体哈希、报表行号),不许凭记忆或印象回答。
- 系统自管目录永不手动删:
plugins/cache(多版本快照)与builtin(内置)由应用管理。只有user层(~/.workbuddy/skills/)的重复才值得手动处理。 - 任何删除必须走审核流程(见下),禁止裸
rm -rf。 - "已删除"记录不可信:会话摘要/记忆里写的已删除,一律以磁盘
ls复核为准。 - 删前必须说明后果:删掉后该类别还剩什么、有无同类替代,避免把一类能力删空。
标准流程(省流:能跑脚本就别手搓)
第 1 步:扫描 + 分类 + 出报表
python scripts/audit.py all --out ./skills_report.md
一条命令完成:枚举三处技能 → 解析 frontmatter → 去重 → 分类 → 定级 → 出报表。
(scan 只出 JSON;dup 只看重复组;report 只渲染报表。)
第 2 步:读报表,标出候选
报表给出每类的技能名 / 来源层 / 副本数 / 优劣等级 / 功能介绍 / 保留建议。
只有建议为「可删 / 可合并」的才是候选——其余是"系统自管"或"按需保留"。
第 3 步:删除前多方校验(生成审核确认单)
python scripts/guarded_delete.py plan ~/.workbuddy/skills/<dir1> <dir2> ...
自动做 5 项校验(见下),产出 delete_plan.md + delete_plan.json,默认 approved: false。
第 4 步:人工审核
把 delete_plan.md 给用户看,逐条确认。用户明确批准后,把 delete_plan.json 里 approved 改为 true(或删掉被否决的条目)。
第 5 步:执行 + 复核
python scripts/guarded_delete.py apply --plan ./delete_plan.json
执行前二次校验 approved,自动备份到 ./_skill_backup_<时间戳>/,删除后再 ls 复核并打印结果。
第 6 步:沉淀速查索引 + 写记忆指针(必做,否则本次成果会浪费)
报表 400 行 / ~100 KB,进不了 memory(用户级上限 4000 字符、项目级 3000),且不参与技能路由(路由只靠每个技能的 name: + 一行 description)。
所以审计完必须做两件事,让成果能在以后真正被调用时起作用:
# 1) 生成 A/B 级速查索引(默认输出 ~/.workbuddy/skills_index.md,路径须在用户级,别放带时间戳的工作区)
python scripts/gen_index.py --data _classified.json --out ~/.workbuddy/skills_index.md
# 2) 在 ~/.workbuddy/MEMORY.md 加指针(跨项目生效,改完照抄下面的模板)
指针模板(写入 ~/.workbuddy/MEMORY.md):
## 已安装技能速查索引(跨项目)
技能路由只靠每个技能的 `name:` + 一行 description,分类评估表不会自动参与路由;
但存成文件后可主动查表,避免重复造轮子 / 选到同类里较差的 / 踩已知坑。
- 速查索引:`~/.workbuddy/skills_index.md`(A/B 级精选,含"已知坑与选型经验")— 遇到"有没有某个技能/该用哪个"先查它
- 全量表:`skills_classification_report.md`(含 C/D 级与重复清单,按需读)
- 刷新:python ~/.workbuddy/skills/skill-audit-cleanup/scripts/audit.py all → scripts/gen_index.py
- 告诫:表会过期(增删技能后需重建);等级是启发式非实测;全表太大不可写进 memory,只存指针
> 为什么要写指针:没有指针,下次会话我不会知道这张表存在,也就不会去查它——表就白做了。
5 项删除前校验(guarded_delete.py plan 自动执行)
| # | 校验 | 不通过 |
|---|---|---|
| 1 | 路径存在且含 SKILL.md,确为技能目录 |
阻断 |
| 2 | 与对照方比对 name: + 哈希:必须完全相同才算真重复;同名不同内容 → 阻断并提示"只能择一" |
阻断 |
| 3 | 不在 plugins/cache / builtin 等系统自管目录 |
阻断 |
| 4 | 删除后该功能类别仍有替代(不删成空) | 警告 |
| 5 | 已生成备份 | 自动完成 |
报表口径(交付时必须向用户说明)
- 优劣等级 A/B/C/D 是结构化启发式,不是逐一实测:依据来源权威性(内置 > 缓存/用户)、内容充实度(是否带
scripts/references/、正文长度)、是否重复综合打分。 - 功能介绍取自技能自身
SKILL.md的description。 - 数量口径差异:本技能扫描"用户级 + 内置 + 缓存"三处;技能管理界面只列"用户级 + 少量内置 + 市场插件",不计入缓存副本。两者数量差很多是正常的,差额几乎全是缓存多版本快照。
- 删用户级目录 = 卸载:技能管理基于
~/.workbuddy/skills/的文件监听缓存列表,删目录会同步消失、不留幽灵条目。
详细资料(按需加载,别一次全读)
references/lessons.md— 踩过的坑与教训(首次执行前强烈建议读,含 10 个真实事故复盘)references/methodology.md— 分类规则、定级公式、去重键、frontmatter 解析要点CHANGELOG.md— 版本历史与升级说明
脚本一览
| 脚本 | 作用 |
|---|---|
audit.py |
审计引擎:all / scan / report / dup |
guarded_delete.py |
删除守卫:plan(出确认单)→ 人工批准 → apply(校验执行 + 备份) |
gen_index.py |
生成 A/B 级速查索引,供日常选型查表(第 6 步) |
make_icon.py |
生成 96×96 图标(零依赖,可改参数重绘) |
依赖
仅 Python 标准库,无网络请求,无第三方包。