skill-publish-audit — 技能发布就绪审查
定位
把一个只在你机器上跑得通的 WorkBuddy 技能,整理成能发到 skillhub 给别人用户级安装的形态。
它不是给技能打"质量分"(那是 Workbuddy_skill_upgrade 的活),而是审"能不能发布"——
- 头牌功能引用的脚本/数据有没有随包发布?
- 有没有写死私有模块路径 / 个人 vault / 别人的 home 目录?
- 有没有打包个人数据 / 第三方品牌素材 / 二进制缓存?
- frontmatter 是否规范、描述是否像"简介"而不是"触发词堆砌"?
与 Workbuddy_skill_upgrade 的分工
| 技能 | 关注 | 典型用法 |
|---|---|---|
Workbuddy_skill_upgrade |
单技能 8 维质量评分 + 自动修复 | "这个 skill 质量怎么样、帮我修" |
skill-publish-audit(本技能) |
发布就绪度:自包含 / 无私有耦合 / 无隐私授权风险 | "我要发布这个 skill,帮我整理" |
> 配合:先用本技能做发布就绪审查与整理,再用 Workbuddy_skill_upgrade 对遗留质量问题做精修。
何时使用
- 用户说"发布审查 / 发布就绪 / 整理这个 skill / skillhub 发布"时
- 任何要把私有技能外发给陌生用户的场景(用户级安装,环境不可控)
发布就绪审查 9 维
| 维度 | 权重 | 审什么 |
|---|---|---|
| 自包含性 | 20% | SKILL.md 引用的 scripts/ references/ state/ templates/ 文件是否真实存在于包内;是否无二进制缓存(skillhub 会跳过) |
| 依赖准确性 | 15% | 声明依赖(其他技能 / 模块)是否真实可获取;CLI 示例指向的脚本是否存在 |
| 隐私与授权 | 20% | 无个人数据泄漏、无第三方品牌素材、license 已声明且合规 |
| 跨平台兼容 | 10% | 路径用 expanduser/pathlib,无 macOS/Windows 专属硬编码、无他人 home 路径 |
| frontmatter 合规 | 15% | 必需字段齐全、格式合法、allowed-tools 仅工具原语 |
| 描述质量 | 10% | 精简价值陈述(<100~200 字),非触发词堆砌 |
| 文档一致性 | 5% | 无重复章节、版本号/标题一致、引用文件实际存在 |
| 无私有生态耦合 | 5% | 不写死私有模块名;必须耦合时改写为"可选,缺失自动跳过" |
| 报错健壮性 | — | 代码反模式:静默吞异常(except: pass)、裸 json.load 未 try 包裹(P1/P2,仅 .py,AST 判定) |
> 详细检查项与 grep 模式见 references/publish-audit-checklist.md。
> 踩坑经验与完整黑名单见 references/publish-audit-lessons.md(实战避坑手册)。
标准工作流(7 阶段)
阶段一:盘点
- 列出技能目录全部文件(
find <skill-dir> -type f)。 - 读取
SKILL.md、所有references/*.md、scripts/*、state/*、templates/*、manifest.json(如有)。
阶段二:自包含性检查(最关键)
- 在
SKILL.md正文与脚本里,提取所有对scripts/…、references/…、state/…、templates/…的引用。 - 逐一核对文件是否在包内存在;任一缺失即 P0(功能在用户环境直接失效)。
- 若缺失文件其实在另一个私有模块里 → 把该文件复制进本包并改相对路径(首选),或改写为可选。
> 可用内置检查器自动跑:python scripts/audit_skill_publish.py --skill-dir <path>
阶段三:去私有耦合 + 清个人/第三方的东西
按 checklist 的 grep 模式扫描,命中即处理:
- 私有模块路径(Work_skill_*、Ob_* 等你的私有体系)→ 改写为"可选,缺失自动跳过"
- 个人 Obsidian vault / 工作区路径 → 改为"当前工作区"
- 他人 home 路径(/Users/<name>、/home/<name>)→ 改为 expanduser("~")
- 个人数据(私人 issue-pool、私人 skill 名清单)→ 清空或脱敏为模板
- 第三方品牌素材(如 Darwin.skill by 花叔、含他人署名的模板)→ 删除(授权风险 P0)
- 二进制/缓存产物(__pycache__/, *.pyc, *.pyo, *.pyd, *.so, *.dylib, *.pkl, .DS_Store, Thumbs.db)→ 删除(skillhub 上传跳过 P0)
- ⚠️ 光删不够:WorkBuddy 加载 skill 时 CPython 会就地在 ~/.workbuddy/skills/<name>/ 重生 __pycache__/*.pyc,删完还会被重新污染。根治方案见下方「⚠️ pyc 再生根因与根治」。
- macOS 专用脚本(scripts_darwin/,写死 open / 他人路径)→ 删除或平台化
⚠️ pyc 再生根因与根治(发布翻车头号原因)
现象:发布审查全绿、包也清干净了,一上传 skillhub 却报「不支持的文件类型:xxx.cpython-311.pyc」或「部分文件被跳过」。
根因:WorkBuddy 在加载/运行 skill 时会调用 CPython 解释器执行 scripts/*.py。CPython 默认在导入模块时就地生成字节码缓存 __pycache__/*.cpython-311.pyc。也就是说——哪怕你打包时 100% 干净,skill 一旦被 WorkBuddy 加载,缓存立即重生。手动 rm -rf __pycache__ 只能救一次,下次加载又来。
根治(一次性,永久生效):让 CPython 不写字节码缓存。
> 持久化环境变量 PYTHONDONTWRITEBYTECODE=1,所有新启动的 Python 进程(含 WorkBuddy 的 Python)都会继承,从此 __pycache__ 不再在 skill 目录滋生。
Windows(注册表持久化,推荐):
# 写入 HKCU\Environment 并自动广播 WM_SETTINGCHANGE
[Environment]::SetEnvironmentVariable("PYTHONDONTWRITEBYTECODE","1","User")
等价 Python(脚本化/跨调用):
import winreg
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Environment", 0, winreg.KEY_SET_VALUE) as k:
winreg.SetValueEx(k, "PYTHONDONTWRITEBYTECODE", 0, winreg.REG_SZ, "1")
> macOS / Linux:写入 ~/.bashrc / ~/.zshrc:export PYTHONDONTWRITEBYTECODE=1
验证:新开一个进程确认已继承(已运行的 WorkBuddy 进程需在设变量之后启动才生效):
python -c "import os; print(os.environ.get('PYTHONDONTWRITEBYTECODE'))" # 应输出 '1'
find ~/.workbuddy/skills/<name> -name __pycache__ # 设好后应为空
发布前防御性清理(设好环境变量后,清掉历史残留即可,且不会再生成):
# macOS / Linux / Git Bash(Windows 同样可用)
find ~/.workbuddy/skills/<name> -type d -name __pycache__ -exec rm -rf {} +
# 或用本技能内置器(仅删 __pycache__/ 与 *.pyc,不碰源码/数据):
python scripts/audit_skill_publish.py --skill-dir <path> --clean-cache
阶段四:frontmatter 规范化 + 描述 + 一致性
- 必需字段:
name version description author triggers agent_created updated allowed-tools+ 建议补tags category license homepage allowed-tools只放工具原语(Read,Write,Edit,Grep,Glob,Bash,Skill…),不放 skill 名(如find-skills)description精简为价值陈述;删掉正文里的重复章节;统一版本号与标题license默认MIT;homepage留空或填你的仓库
阶段五:生成发布元数据 + 验证自包含
- 产出三件套(见"输出物"):发布就绪包 + 审查报告 + 发布资料
- 验证:把引用进包的关键脚本在临时环境 dry-run(如
auto_repair.py --dry-run),确认零私有依赖、备份写入本包state/ - 列出"仍需用户拍板"项(homepage、子技能发布方式等)
阶段六:发布前最终安检(上传前最后一道闸)
> 清理(阶段三)+ 审计器闸口(阶段五)之后、点上传之前,跑一遍「发布前最终安检 7 步」,拦截 90% 的上传被拒。
> 完整命令模板与判读见 references/publish-audit-lessons.md 第八节。
核心 7 步:① 禁用文件类型扫描(__pycache__/.pyc/.pyo/.so/.pkl/.DS_Store 全应为 0,并查 output/ 是否含私有数据)② 文件清单核对(应只留文本)③ frontmatter 合规(无重复字段、版本号对)④ 敏感信息 grep(私有路径/用户名/凭证)⑤ 运行时缓存内容抽检(确认公开非私有)⑥ 脚本硬编码路径扫描 ⑦ 文档结构完整性(章节/FAQ 条目数)。
Windows 删除兜底:Bash rm -rf / PowerShell Remove-Item 在 WorkBuddy 沙箱里会把 /c/... 错转成 \c\... 导致静默删除失败。清 __pycache__ 最稳用 Python:
import shutil, glob
for d in glob.glob(r'<skill-dir>\**\__pycache__', recursive=True):
shutil.rmtree(d, ignore_errors=True)
阶段七:经验回流 (Experience Loopback) — v1.5.0 新增
> 每次审计完成后,自动提取本次发现的新模式,去重后追加到经验池 publish-audit-lessons.md,形成 "审计 → 发现 → 沉淀 → 下次审计更聪明" 的自迭代闭环。
触发:运行审计器时加 --learn 标志。
流程:
1. 从审计结果中提取候选经验(P0 全部、P1 新模式、P2 仅"报错健壮性"类)
2. 与经验池已有条目指纹比对 SHA256 去重
3. 生成结构化 Markdown 条目并追加到 lessons.md
4. 若发现新文件扩展名/私有耦合模式 → 提示是否应加入审计器黑名单
用法:
# 预览模式(推荐先跑,确认要追加什么)
python scripts/audit_skill_publish.py --skill-dir <path> --learn --learn-dry-run
# 实际追加到经验池
python scripts/audit_skill_publish.py --skill-dir <path> --learn
# JSON 模式(CI/CD)— 结果 .experience_loopback 字段
python scripts/audit_skill_publish.py --skill-dir <path> --learn --json
经验类型:
| 类型 | 来源维度 | 示例 |
|---|---|---|
new_blacklist |
二进制残留 | 发现新 skillhub 拒绝文件类型 |
private_coupling |
私有耦合 | 发现新私有模块名前缀 |
anti_pattern |
报错健壮性 | 新代码反模式实例 |
privacy |
隐私授权 | 新隐私泄漏模式 |
cross_platform |
跨平台 | 新平台兼容问题 |
case_study |
各维度 | 具体翻车案例实录 |
自迭代机制:每次 --learn 都会让经验池增长,下次审计时新黑名单/模式已内化(需手动确认规则更新到 audit_skill_publish.py)。经验池本身成为活的"发布避坑知识库"。
内置检查器(可选,自动化部分检查)
scripts/audit_skill_publish.py 自动完成阶段二/三的大部分扫描:
# 基础用法
python scripts/audit_skill_publish.py --skill-dir ~/.workbuddy/skills/your_skill
# 审整批:
python scripts/audit_skill_publish.py --skills-root ~/.workbuddy/skills --name your_skill
# 批量审计(逗号分隔):
python scripts/audit_skill_publish.py --skills-root ~/.workbuddy/skills --name skill_a,skill_b,skill_c
# 输出增强
python scripts/audit_skill_publish.py --skill-dir <path> --json # JSON 输出(CI/CD,含 fix_hint)
python scripts/audit_skill_publish.py --skill-dir <path> --verbose # 详细模式(显示修复建议)
python scripts/audit_skill_publish.py --skill-dir <path> -v # 同上(简写)
# 缓存清理(发布前)
python scripts/audit_skill_publish.py --skill-dir <path> --clean-cache # 清理 pyc
python scripts/audit_skill_publish.py --skill-dir <path> --clean-cache --dry-run # 预览
# 经验回流(阶段七)
python scripts/audit_skill_publish.py --skill-dir <path> --learn # 追加经验
python scripts/audit_skill_publish.py --skill-dir <path> --learn --learn-dry-run # 预览
输出 P0/P1/P2 问题清单(缺失文件、私有耦合模式、个人/品牌风险、二进制缓存、frontmatter 缺失),每条问题含 fix_hint 修复建议。
人工整理时以此为基础,再补"改写措辞 / 生成描述"等需要判断的工作。
> 报错健壮性扫描:审计器还会对 .py 脚本做「反模式」检测,固化 skill-check 的「报错提示铁律」:
> - except: pass / except Exception: pass(空 pass 体)→ 配置/环境错误被静默吞掉,用户需自己猜(P1 / P2)
> - 裸 json.load / json.loads(未被 try 包裹)→ 配置文件损坏会抛 traceback 裸崩(P2,AST 判定;含 grep 预筛选优化)
>
> 例外:纯注释说明「有意忽略」的 pass # 有意忽略… 不会被判(正则要求 pass 行尾无注释),鼓励用注释显式标注意图。
v1.6.0 新增能力:
- scripts_darwin/ 深度扫描:检测 open/pbcopy/osascript 等 macOS 专属命令 + 硬编码他人路径
- --clean-cache --dry-run:预览将删除的缓存文件
- --name 支持逗号分隔批量审计(JSON 模式输出 batch 汇总)
- --verbose / -v:显示每条问题的 [FIX] 修复建议
- JSON 输出每条问题均带 fix_hint 字段
- 大文件(>1MB)截断扫描并发出警告
- AST 解析前用字符串搜索预筛选,避免无谓 parse
输出物(建议三件套)
| 文件 | 内容 |
|---|---|
<publish_dir>/<skill>/ |
发布就绪、自包含、去耦合的技能包 |
发布审查报告.md |
一句话结论 + 9 维自评 + P0/P1/P2 清单 + 已落地修复 + 待拍板项 |
skillhub_发布资料.md |
可直接复制的发布元数据(显示名/简介/描述/标签/分类/协议/依赖/检查清单) |
> 元数据模板见 references/publish-metadata-template.md。
使用方式速查
| 用户说 | 执行 |
|---|---|
| "发布审查 / 发布就绪" | 完整 7 阶段 |
| "整理这个 skill" | 阶段二~五整理 |
| "这个 skill 能发吗" | 阶段二/三快速体检 + 结论 |
审计后加 --learn |
自动回流经验到避坑手册 |
FAQ
审计器使用
Q1:审计器报 P0=0,但上传 skillhub 时还是被拒了,为什么?
A:最常见三个原因:
1. pyc 再生:__pycache__/ 被 WorkBuddy 加载 skill 时就地重生。审计器扫时干净,上传瞬间已经脏了。→ 持久化 PYTHONDONTWRITEBYTECODE=1(见阶段三"pyc 再生根因与根治"),设好后 --clean-cache 清一次残留。
2. 黑名单漏网:skillhub 的白名单很窄(基本只认 .md/.py/.json/.yaml/.txt/.csv),可能有你没见过的扩展名被拒。→ 上传前用 find <pkg> -type f | sort 核对文件清单,只留纯文本。
3. 私有数据藏在 output/:地图/报告类 skill 的 output/ 常含带本地路径/技能名的 HTML,属 P0 隐私泄漏 → 发布前删除或脱敏。
Q2:--learn-dry-run 和 --dry-run 有什么区别?
A:--learn-dry-run 控制经验回流预览(不写 lessons.md);--dry-run 是通用预览标志,配合 --clean-cache 预览缓存删除。两者独立,可组合:
python scripts/audit_skill_publish.py --skill-dir <path> --clean-cache --dry-run # 预览缓存清理
python scripts/audit_skill_publish.py --skill-dir <path> --learn --learn-dry-run # 预览经验回流
Q3:JSON 模式怎么用?输出里有什么?
A:--json 输出一个完整 JSON 对象,包含 summary(P0/P1/P2 计数)、pass(bool)、issues 数组(每条带 level/dimension/message/file/fix_hint)。配合 --learn 时还多一个 experience_loopback 字段。批量审计时顶层多 batch: true 和 skills 数组。
python scripts/audit_skill_publish.py --skill-dir <path> --json | python -m json.tool
python scripts/audit_skill_publish.py --skill-dir <path> --json > audit_result.json
Q4:审计器扫到很多 P1 私有耦合,但我那些 Ob_/Work_skill_ 引用是故意的(文档说明),怎么办?
A:审计器对正文提及和真实文件引用做了区分——正文提及降为 P2(复核确认即可),真实文件引用才判 P1。如果引用确实需要保留(如伴侣技能协作),在协作表中标注"可选安装,缺失不影响核心功能"即可。如果是文档示例中的私有名,全局替换为 my- / my-skill- 前缀再发布。
Q5:--verbose 输出太多,只想看 P0 怎么办?
A:用 --json 然后 grep 过滤:
python scripts/audit_skill_publish.py --skill-dir <path> --json | python -c "
import sys,json; d=json.load(sys.stdin)
for i in d['issues']:
if i['level']=='P0': print(f\"[{i['level']}] {i['message'][:80]}\")"
发布前必做
Q6:发布前一定要跑哪些步骤?按什么顺序?
A:推荐顺序(从粗到细):
1. python scripts/audit_skill_publish.py --skill-dir <path> → 看 P0 数量
2. --clean-cache --dry-run → 确认要清的缓存,再 --clean-cache 实际清
3. 手工:全局替换私有名(Ob_* → my-)、清空 issue-pool、删第三方品牌素材
4. --verbose 重跑确认 P0=0 / P1=0
5. 跑"阶段六:发布前最终安检 7 步"(命令模板见 lessons.md 第八节)
6. --learn --learn-dry-run 预览要追加的经验 → --learn 实际追加
Q7:issue-pool.json 有私人问题怎么办?
A:保留文件但清空内容为模板:
import json
with open('issue-pool.json', 'w') as f:
json.dump({"issues": []}, f, indent=2)
审计器会自动检测 issues 数组长度,非空即报 P1。
Q8:skillhub 上传后用户反馈脚本报错,怎么排查?
A:常见三类:
1. 路径问题:检查脚本是否用了 pathlib / expanduser("~"),而非硬编码 C:\Users\JackW\...
2. 依赖缺失:用户没有你本机装的第三方库 → 在协作表标注前置要求,或改写为标准库实现
3. 静默吞异常:查审计报告维度 9(报错健壮性)— 有 except: pass 的地方就是用户"猜谜"的根源 → 改为打印清晰错误信息
Q9:一次发布多个技能怎么批量审计?
A:
# 逗号分隔
python scripts/audit_skill_publish.py --skills-root ~/.workbuddy/skills --name skill_a,skill_b,skill_c
# JSON batch 输出
python scripts/audit_skill_publish.py --skills-root ~/.workbuddy/skills --name skill_a,skill_b --json
JSON batch 模式返回 {"batch": true, "skills": [...], "overall_pass": bool}。
环境与工具链
Q10:Windows 上用 Bash 删 __pycache__ 为什么删不掉?
A:WorkBuddy 的 Bash 沙箱会把 /c/Users/... 错转 \c\Users\... 导致 rm -rf 静默失败(exit=0 但没删)。最稳用 Python:
import shutil, glob
for d in glob.glob(r'<skill-dir>\**\__pycache__', recursive=True):
shutil.rmtree(d, ignore_errors=True)
或直接用审计器的 --clean-cache(内部就是 shutil.rmtree,不受沙箱拦截)。
Q11:PYTHONDONTWRITEBYTECODE=1 设好了,怎么验证生效了?
A:
python -c "import os; print(os.environ.get('PYTHONDONTWRITEBYTECODE'))" # 应输出 '1'
注意:已运行的 WorkBuddy 进程不感知新变量,设好后需重启 WorkBuddy。设好变量后,之前被加载过的 skill 目录仍有历史 .pyc 残留,用 --clean-cache 清一次即可,之后不会再生。
Q12:这个技能和 Workbuddy_skill_upgrade 到底怎么配合?
A:
| 步骤 | 用哪个 | 做什么 |
|------|--------|--------|
| 1. 发布就绪整理 | skill-publish-audit | 清缓存/脱敏/去耦合/自包含 → 能发了 |
| 2. 质量问题精修 | Workbuddy_skill_upgrade | 8 维质量评分 + 自动修复 → 发得好 |
| 3. 发布前最后确认 | skill-publish-audit | 跑一次 --verbose 确认 P0=0 |
经验回流
Q13:--learn 追加的经验会不会让 lessons.md 越来越臃肿?
A:有 SHA256 去重机制——同章节+同模式的新经验会被自动跳过([SKIP])。建议定期(每 5~10 次发布)人工审查"第九节:自动收录条目",把高价值条目合并到上方对应章节(一~八节),然后清理自动条目区。
Q14:经验回流建议我"加入 BINARY_EXTENSIONS",要怎么操作?
A:打开 scripts/audit_skill_publish.py,找到 BINARY_EXTENSIONS 或 REJECTED_EXTENSIONS 集合,添加新扩展名。例如发现 .xyz 被拒:
REJECTED_EXTENSIONS = {".tsv", ".xyz"}
改完后跑一次自测确认语法正确:python -m py_compile scripts/audit_skill_publish.py
真实案例
Q15:能不能给一个完整的、真实跑通过的发布示例?
A:可以——本机已经发布上架的 Workbuddy_skill_upgrade(大家习惯叫它"skill check" / 技能巡检) 就是直接用本技能审出来、修干净、再发到 skillhub 的。完整链路如下,可作为你下次发布的模板:
① 待审对象
- 包结构:scripts/(多个 .py:audit_engine / eco_optimizer / dashboard_blocks / profile_guide / auto_repair / upgrade_advisor / init-pool / dashboard 等)+ references/(FAQ.md、示例 json、模板等)+ state/(运行时数据)
② 首次审计暴露的问题
| 级别 | 问题 | 对应维度 / 来源 |
|------|------|------|
| P0 | scripts/__pycache__/*.pyc 残留 | 二进制残留(skillhub 拒二进制) |
| P0 | state/results.tsv | skillhub 不允许 .tsv |
| P0 | state/repair_backups/*.bak_20260728 备份 | 备份不应随包 |
| P1 | Ob_* / Work_skill_* 私有模块名写死在 references/state/ | 私有生态耦合 |
| P1/P2 | except: pass 静默吞异常 | 维度 9 报错健壮性 |
| P2 | eco_optimizer.py 缩进 SyntaxError(隐藏 bug) | 改完才被 py_compile 发现 |
③ 按本技能工作流处理
- 阶段三:用 Python shutil.rmtree 清 __pycache__/;持久化 PYTHONDONTWRITEBYTECODE=1 根治缓存再生
- 阶段三:删 state/results.tsv、state/repair_backups/;私有名全局替换为 my- / my-skill-
- 维度 9:silent except 改为打印 路径 + 行号 + 原因 + 修复命令 到 stderr;reconfigure guard 加 pass # 有意忽略 注释
- 阶段五/七:python -m py_compile scripts/*.py 全量编,修掉 eco_optimizer 缩进错误
④ 最终闸口
python scripts/audit_skill_publish.py --skill-dir <Workbuddy_skill_upgrade>
# => P0=0 / P1=0 / P2=0 ✅ 可进入发布整理
随后 skillhub publish 上架,陌生用户已可直接安装。
⑤ 这个案例能教什么
- 发布包只留文本是铁律:.pyc / .tsv / .bak 全是上传翻车点
- 缓存会再生,靠环境变量根治,不要指望手动删
- 审计器自己的"跳过逻辑"和"检查逻辑"必须分开,否则 .pyc 会漏检
- 任何改动后 py_compile 全量自测,避免隐藏 SyntaxError
> 本案例已回流进 references/publish-audit-lessons.md(经验池),作为模板复用。
扩展文档指引 ★
> 以下文件按需读取,不在加载 SKILL.md 时自动读取。
| 文档 | 何时读取 | 文件路径 |
|---|---|---|
| 9 维详细检查项 + grep 模式 | 执行体检需要具体打分项/扫描词时 | references/publish-audit-checklist.md |
| skillhub 发布元数据模板 | 生成发布资料时 | references/publish-metadata-template.md |
| 发布审计经验池(避坑手册) | 排查 skillhub 上传被拒 / 缓存再生 / 审计器回归教训 | references/publish-audit-lessons.md |
更新日志
v1.6.1(2026-08-02)
- FAQ 新增「真实案例」小节 + Q15:以本机已上架的
Workbuddy_skill_upgrade(即"skill check")为完整示例,演示用本技能审计→修干净→发 skillhub 的全链路,作为可复用模板
v1.6.0(2026-08-02)
- 新增
fix_hint系统:每条审计问题自动映射可操作修复建议(get_fix_hint函数),JSON 输出含fix_hint字段,--verbose模式显示[FIX]行 - 新增
scripts_darwin/深度扫描(_scan_darwin_dir):检查open/pbcopy/osascript等 macOS 专属命令 + 硬编码/Users/路径 - 新增
--dry-run统一预览标志:配合--clean-cache预览将删除的文件;配合--learn优先用--learn-dry-run - 新增
--verbose/-v:显示扫描开始提示 + 每条问题的修复建议 - 批量审计:
--name支持逗号分隔多个技能名(--name skill_a,skill_b),JSON 模式返回 batch 汇总 - 大文件安全:>1MB 文本文件截断扫描并在问题清单中警告(
read_text_safe函数) - AST 性能优化:
_check_robustness先用字符串json.load预筛选再ast.parse,避免无谓解析 --clean-cache增强:新增dry_run参数支持预览模式;函数签名变为clean_cache(skill_dir, dry_run=False)
v1.5.0(2026-08-02)
- 新增「阶段七:经验回流」:每次审计后自动提取新发现模式(P0 全部 / P1 新模式 / P2 反模式),SHA256 去重后追加到
publish-audit-lessons.md,形成自迭代闭环 - 新增 CLI 标志:
--learn(启用经验回流)、--learn-dry-run(预览模式)、--json(JSON 输出,--learn --json结果含.experience_loopback字段) - 效率优化:合并 3 次
rglob目录遍历为单次统一遍历,大目录扫描速度提升 ~3x - 修复:Windows 终端 emoji 打印导致
UnicodeEncodeError的问题(全部改为 ASCII 标记) - Python 审计器新增 5 个经验提取引擎函数(
extract_lessons/load_existing_fingerprints/format_lesson_markdown/suggest_rule_updates/append_lessons_to_file)
v1.4.0(2026-08-02)
- 新增「阶段六:发布前最终安检」:清理 + 审计器闸口之后、上传之前跑「7 步自检」(禁用文件/清单/frontmatter/敏感信息/缓存抽检/硬编码路径/文档结构),拦截 90% 上传被拒
- 固化 Windows 沙箱删除兜底:Bash
rm -rf/ PowerShellRemove-Item在 WorkBuddy 沙箱会把/c/...错转\c\...静默失败;清__pycache__最稳用 Pythonshutil.rmtree - 新增经验:
PYTHONDONTWRITEBYTECODE=1设好后,此前被加载的 skill 目录仍带.pyc残留须再清;output/含本地技能名的 HTML 属 P0 隐私泄漏须删;运行时.json缓存(如hot_cache.json)建议一并清理 - 经验池
references/publish-audit-lessons.md新增第八节「发布前最终安检 7 步」实战模板 + 第四节补 Windows 删除兜底/输出目录/缓存 json 三条
v1.3.3(2026-08-02)
- 新增经验池文档
references/publish-audit-lessons.md:把多轮真实发布整理(含.pyc漏检、.tsv/.bak黑名单、缓存再生、审计器 4 个回归教训、报错提示铁律、发布前清理清单)系统沉淀为实战避坑手册 - 修一致性:SKILL.md「发布就绪审查」维度表由 8 维补到 9 维(维度 9 报错健壮性已在 v1.3.0 加入,但表格此前遗漏),并在「扩展文档指引」加入经验池入口
v1.3.2(2026-08-02)
- 新增 skillhub 黑名单扩展检查:实测
.tsv被 skillhub 拦截;.bak/.bak_*为备份文件不应随包发布。二进制/缓存扫描新增REJECTED_EXTENSIONS与REJECTED_SUFFIX_STARTS,命中 → P0。 - 优化运行时产物判定:
RUNTIME_ARTIFACTS中新增state/results.tsv(audit_engine.py 运行时输出,且 skillhub 不允许 .tsv)。已确认的运行时产物现在直接跳过,不再报 P2「state/ 引用文件缺失」。
v1.3.1(2026-08-02)
- 修复二进制扫描漏检
__pycache__的 bug:原_skip()把__pycache__/.venv/dist/node_modules全部跳过,导致.pyc文件明明存在,审计结论却显示 P0=0;上传 skillhub 时才被拦截。新增_skip_for_binary_scan(),二进制/缓存产物扫描只跳过.git/.workbuddy,其余目录全部检查。 - 实测:在临时技能目录放入
scripts/__pycache__/audit_engine.cpython-313.pyc,审计器正确报出[P0] 禁止上传的二进制/缓存文件与[P0] 禁止上传的缓存目录 __pycache__/。
v1.3.0(2026-08-02)
- 新增「报错健壮性」反模式扫描:检测
except: pass/except Exception: pass(静默吞异常,P1/P2)与裸json.load/json.loads(未被 try 包裹,P2,AST 判定) - 修复引用路径中文括号误判:
REF_PATTERN现排除中文括号(),避免`references/xxx.json`(说明)被当成缺失文件(原误报 P0) - 收紧
obsidian_vault模式:仅匹配真实私有 vault 路径段(华为家庭存储/01-助理管理/04-工作日记),不再误伤技能分类关键词(如 taxonomy 里的obsidian)与通用笔记软件名 - 新增非包目录跳过:扫描时跳过
.workbuddy/.git/node_modules/__pycache__/.venv/dist,只盯真正的发布包内容(项目记忆等不再被误报)
v1.2.0(2026-07-30)
- 新增「⚠️ pyc 再生根因与根治」独立节:揭示发布翻车头号原因——WorkBuddy 加载 skill 时 CPython 就地重生
__pycache__/*.pyc,光清不够 - 给出永久根治方案:持久化
PYTHONDONTWRITEBYTECODE=1(Windows 走HKCU\Environment/winreg,macOS·Linux 走 shell profile),新进程继承后不再生成缓存 - 内置检查器新增 P2 预防项:未持久化该变量时主动提醒"清完可能被重新污染"
- 内置检查器新增
--clean-cache一键清理缓存产物(仅删__pycache__/与*.pyc,不碰源码/数据)
v1.1.0(2026-07-29)
- 新增二进制/缓存产物检测(
__pycache__/,*.pyc,*.pyo,*.pyd,*.so,*.dylib,*.pkl,.DS_Store,Thumbs.db),命中即 P0 - 修复 skillhub 上传常见翻车:Python 缓存文件(含
*.cpython-311.pyc)被跳过的问题
v1.0.0(2026-07-22)
- 从一次真实发布整理(Workbuddy_skill_upgrade)沉淀为可复用技能
- 8 维发布就绪审查体系 + 5 阶段标准工作流
- 内置
audit_skill_publish.py自动扫描缺失文件 / 私有耦合 / 个人品牌风险 - 配套检查清单与发布元数据模板