2026年9月24日 · 阅读 —

开源发布别再拍脑袋:oss-release-prep 把“能不能发”拆成一张张有证据的清单

Agent 与 SkillsAI 工程实践

开源发布别再拍脑袋:oss-release-prep 把“能不能发”拆成一张张有证据的清单

发布到 GitHub 之前,我们大多数人靠的是直觉。

“README 写得差不多就行”“LICENSE 好像有”“代码里应该没有密钥吧”——这几句话单独听都有道理,凑到一起就是发布现场漏掉真实风险的方式。我见过不止一次,仓库推上去才发现 .gitignore 没配、绝对本机路径混进了某个配置、密钥早就躺在 git 历史里了。

自己在逐步开源本地的一些存货项目过程,不断调整积累了一些规则经验,制作了该 skill: oss-release-prep 。它不制造神奇能力,只做一件踩在我判断点上的事:把“能不能发布”拆成一个个可打勾、必须有证据支撑的检查项,再产出规范、可切换的中英双语文档。这篇讲它到底怎么拆、拆完有什么用、以及哪些设计值得抄进自己的发布流程。

oss-release-prep/
├── SKILL.md                        # 激活入口(frontmatter + 规则)
├── prompts/oss-release-prep.md     # 完整执行规范
├── agents/openai.yaml              # 可发现元数据
├── references/
│   ├── readme-style.md             # README 结构与详细度基准
│   └── release-checklist.md        # 发布前逐项检查表(A–K,D 节为硬阻断)
├── examples/release-checklist-sample.md   # 检查清单输出样例(不含真实密钥)
├── evals/
│   ├── eval.yaml
│   └── cases/                      # basic-success / edge-incomplete-input / edge-scope-boundary
├── scripts/validate_skill_package.py
└── tests/test_oss_release_prep.py  # 本地单测(unittest)

使用方式

把本 Skill 指向一个项目,它会:

  1. 勘察仓库——目录结构、构建/测试命令、依赖与运行环境、git 状态、现有 README / License / 忽略规则、是否存在敏感文件。
  2. 跑发布检查清单——按 references/release-checklist.md 逐项核对并记录证据。
  3. 补齐缺失工件——按需创建/修复 LICENSE、.gitignore、.gitattributes、缺失的 README 章节、徽章与结构说明。
  4. 生成中英双语 README—— README.md(英)+ README.zh-CN.md(中),结构镜像、切换链接互指。
  5. 提升可发现性(可选)——About 描述、topics、GitHub Discussions、gruvbox-material 双语主页。
  6. 构建发布产物(可选)—— uv build 的 sdist/wheel 附为 release assets;更新监管工具后做一次外部 reviewer 代码审查作为质量门禁。
  7. 交付——报告改了什么、如何验证、产物路径、风险/回滚,并把敏感信息扫描结果作为独立证据项。

发布动作(git push、gh repo create)仅在您显式授权时执行;否则本 Skill 把可复制的命令交给您运行。

一道它不是回答“怎么写 README”,而是“凭什么能发布”的题

先给它一个准确画像:把任意项目整理成符合 GitHub 开源要求的状态,并产出规范、详细、可中英双语切换的 README。但它真正的立场,落在 README 里反复出现的四个字上:以证据而非直觉为准。

翻译成工程语言就是每个发布项都要被核对并记录,无依据的“应该没问题”一律视为未通过。这个判断我完全认,因为它跟我给 Agent 做验收时遇到的是同一个问题:

光说“这功能能跑”不算数,你得能证明它跑过;光说“没有敏感信息”也不算数,你得把扫描结果摆出来。

对照表:

凭直觉的反例这套 Skill 做的事
“看起来差不多就行”每项都有证据:命令输出、文件存在、git 状态
只写一个 README,内容随意固定结构:徽章 + 目录 + 结构 + 快速开始 + License + 维护者
一个文件里中英混排两个独立文件 + 互指的切换链接
想发就发敏感信息扫描、License 检查、构建测试验证、发布动作门禁
漏掉产物与其他推广位发布产物、About/topics、Discussions、项目主页

四个核心概念

第一,证据链。 一个检查项只有被可引用的事实撑住才算通过。事实可以是命令输出、文件存在、git 状态、具体代码位置。无依据的“应该没问题”不叫通过,叫待办,并且会被如实记进下一步。这一条定的是最低要求:结论必须能回溯到某个具体动作,而不是“我印象里没问题”。

第二,敏感信息红线,且是硬阻断。 API key(sk-…、ghp_…、AKIA…)、token、cookie、私钥、密码、个人数据、绝对本机路径,全部严禁公开。任一命中立即中止发布——这个“立即”不豁免“还没推送”的情况。也就是说,你就算只在本地看到密钥,它也把发布停在这里,逼你先处理。这不是苛刻,是我写过流程就知道的那句实话:密钥一旦进历史,删文件没用,得轮换。宁可在这里停下来。

第三,双语双文件 README。 README.md(英文)+ README.zh-CN.md(中文)各自独立成文、结构镜像、切换链接互指。GitHub 会自动把 README.zh-CN.md 识别为语言变体,仓库首页就会出现切换 tab。它禁止单文件内中英混排。这件事对很多项目的价值,比想象中大——听过太多“双语就是这个文件前面贴段英文后面贴中文”的混排,检索和切换都很痛苦。

第四,门禁式发布 + 验证分层。 推广动作(git push、gh repo create、覆盖线上内容)只在用户显式授权时执行,否则如实报告“未执行”,并把可复制的命令交给你自己跑。同时它把静态检查、结构校验、实际运行、发布动作分开报告,任何没执行的一步都如实标注,绝不混进“已通过”。

这个“验证分层不互相冒充”的设计我特别认同。因为发布场景最坑的,就是把“静态检查过了”误读成“已经发布成功”或“行为已验证”。这三件事根本不是一回事。

A–K:十一节检查清单,K 是给监管工具收口

它的发布检查清单是十一个字母,每一节都需要证据,缺证据即视为未通过。我按用途重新排了一下,方便看清它堵的是哪些洞:

节关注点它堵的坑
A版本库状态git init + 已提交、默认分支、无被跟踪的敏感文件
B必备文件README、README.zh-CN、LICENSE、.gitignore、.gitattributes
CREADME 质量徽章 + 定位 + 目录 + 快速开始 + 结构/用法 + License + 维护者,命令能跑通
D敏感信息扫描(红线)无 key/token/私钥/个人数据/绝对路径,命中即阻断
E可验证性构建/测试命令已运行并通过,依赖与安装步骤有据可查
F动作门禁push / repo create 仅在显式要求时执行
G可发现性一行 About、topics(ai、llm、skill、persona、self-memory),用 gh repo view 验证
H项目主页gruvbox-material 黑金风格 index.html,内置中英切换
I社区运营启用 GitHub Discussions 且至少一个类别
J发布产物uv build 的 sdist/wheel 附到 release,用 gh release view 验证
K发布质量门禁监管工具清理干净(make-code-clean、code-review-graph);更新工具后做外部 reviewer 代码审查

最值得反复看的是 D。它不只是“检查一遍”,而是被定性为红线且优先于其他所有规则,不因尚未推送而豁免。我把它理解成一个比“发布动作”更靠前的刹车:很多事故不是发生在 git push 那一刻,而是发生在你以为没问题、参数却早埋下的那一刻。

五个设计原则,几乎每一条都是工程判断

它 README 里的“安全边界与设计原则”部分,我逐条读下来,基本就是一份可复用的发布观:

  • 敏感信息红线居首且最高,优先于其它所有规则。
  • 绝不占位伪造:示例绝不用“改几个字符的真实密钥”冒充兼容,一律用无意义占位符(sk-YOUR_KEY_HERE、<token>),且不与真实值同构。
  • 以证据为准,只写有依据的结论,未验证项如实标注。
  • 不虚构内容:技术栈、构建/测试命令、依赖均以本项目为准,不外借、不编造。
  • 发布动作显式授权;验证分层不被混淆——静态检查不等于已发布,也不等于已验证行为。

“绝不占位伪造”这条我单独拎出来说。很多演示工具为了“看起来能跑”,会用 sk-xxx 这种和真实格式同构的假 key。这套 Skill 明确禁止,要求占位符既无意义又不与真实值同构。这是一个很容易被忽略、却很关键的纪律——因为一旦示例和真实值长得像,用户在复制过程中就可能混进真东西。

它给自己留的验证,也配得上它的主张

强调“以证据为准”的工具,自己也得能验。它自带三层验证:

# 包契约 + 密钥/绝对路径扫描
python3 scripts/validate_skill_package.py .

# 本地单测(unittest)
python3 -m unittest discover -s tests

外加 evals/ 目录里的三个基于规则的评测用例:一个成功路径(basic-success)、两个拦截用例(edge-incomplete-input 信息缺失、edge-scope-boundary 范围拦截)。这三个用例相当于把“成功 / 该拦住的没拦住 / 输入不全时不硬编”三种预期行为都锁死,用来防止以后改坏了。它自己遵守“静态校验、单测、评测逐层分开”的原则,没有把脚本跑过就当成行为验证。

环境要求也很克制:Python 3,无第三方依赖。一个工具敢把依赖压到零,本身就是对“好用”的一种定义。

值钱的是它把“能不能发布”从主观感觉,翻译成了可打勾、可回查、可复制的清单。 这跟我们做测试、做 Agent 验收是同一条主线——把抽象判断拆成带证据的检查动作。

它有几个设计,我觉得可以直接抄进自己的发布流程:

  1. 敏感信息红线独立成节且最高优先,不跟其他检查混在一起讨价还价。
  2. 动作门禁:push、建仓库这类不可逆动作,默认只给命令、不代为执行。这是对“自动化容易替人做主”的反制。
  3. 发布产物可验证:uv build 出来的 sdist/wheel 不只是“生成了”,还要用 gh release view 去验证真的挂上了。
  4. K 的监管工具收口:更新 make-code-clean、code-review-graph 这类监管工具后,先做一次外部 reviewer 代码审查再发布。设备更新一轮就跑一轮审查,防止新工具没磨合就进生产。

同时也要说清它的适用范围,免得过度使用。 FAQ 里已说明:不是所有项目都需要全部章节。默认产出详版本,但章节按项目实际情况取舍,基准与两个详细度级别写在 references/readme-style.md。发布产物里的 uv build 也只是 Python 示例,非 Python 项目该换二进制、JS bundle 或容器镜像。所以它更适合当一个“发布前检查骨架”来用,而不是一套必须原样照搬到任何仓库的教条。

很多人会问“我的项目这么小,也要整个 A–K 吗”。答案是否定的。小项目从 B、C、D、E 起步就够,G、H、I、J 这类可发现性和产物的提升项,等真需要再补。检查清单的价值在于帮你发现“该做而没做”的事,不在不停加项。

几个 FAQ 的答案,其实已经替你想清了取舍

它 README 里的 FAQ 都很短,但每个都挡在常见误判上,我按原文提炼成一句句判断:

  • 它会自己 push 或建仓库吗? 不会。发布动作需要显式授权,未授权时如实报告“未执行”并给出可复制的命令。
  • 只支持 Python 项目吗? 不是。检查清单适用于任意仓库;uv build 只是 Python 示例,非 Python 项目用等价产物。
  • 发现密钥会怎样? 红线命中即中止:先移除密钥、轮换已泄露凭据、用 git filter-repo 等清除 git 历史,重扫零命中后再继续。
  • 为什么是两个 README 而不是一个文件混排? 独立文件、结构镜像、切换链接互指,GitHub 自动识别语言变体并出切换 tab。
  • 小项目需要全部章节吗? 不需要。默认详尽版,章节按项目实际取舍。

别把“看起来发了”当成“真的能发”

这套 Skill 最大的感受,不是它多聪明,而是它的立场跟我处理 Agent 验收时完全一致:“能跑”换成工程的衡量标准,是“有证据、可回查、失败能停”。

发布这个动作的平替,永远是那张把“凭感觉”换成“有依据”的清单:README 内容有结构、命令能跑通、密钥扫描零命中、动作需要你点头、产物用命令真验证过。这几条单拎出来都不惊艳,连起来就是一次能让人睡着的发布。

oss-release-prep 把这个过程做成了可复用的 Skill。你大可直接把它拿过来跑一遍自己的仓库,当它替你列出第一条“没证据、算待办”的项时,你就会明白它到底省掉了多少埋在地下的雷。

附:项目信息

项目说明地址
oss-release-prep开源发布准备 + 中英双语 README 生成的 Codex Skill,MIT 许可GitHub xsoway/oss-release-prep(README.zh-CN.md 等)
结构SKILL.md 激活入口 + prompts 执行规范 + references 基准/清单 + evals 评测 + scripts 校验manifest 如上,无第三方依赖,Python 3

快速验证它自己是健康的两次命令:

python3 scripts/validate_skill_package.py .
python3 -m unittest discover -s tests

项目地址: https://github.com/xsoway/oss-release-prep

#开源 #Skill #Agent #README #发布流程 #证据