From legal-skills
Manages GitHub release workflow: version bumps, CHANGELOG sync, release notes, tag creation, CI monitoring, and build validation. Includes safeguards against using releases as CI test mechanisms.
How this skill is triggered — by the user, by Claude, or both
Slash command
/legal-skills:release-workflowThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
软件项目的全流程发布工作流。适用于 GitHub 上的任何类型项目。
软件项目的全流程发布工作流。适用于 GitHub 上的任何类型项目。
GitHub 项目的完整发布周期:从版本号确定到 CI 构建验证。CI 故障排查(references/ci-troubleshooting.md)和特定项目类型指南(references/ 下各文档)作为发布流程的补充参考。
config/projects.yaml 集中管理各项目的发布配置(仓库、平台、自动更新、排除产物等)。发布时先读取对应项目配置,按配置决定构建矩阵和预期产物。模板见 config/projects.example.yaml。
| 检查项 | 说明 |
|---|---|
| 工作区干净 | git status 无未提交变更 |
| 版本号一致 | 所有版本号文件(package.json / Cargo.toml / pyproject.toml 等)与 CHANGELOG.md 最新条目一致 |
| CHANGELOG 已更新 | 包含目标版本的结构化条目 |
| CI 工作流存在 | .github/workflows/ 中有 release 相关工作流且 tag 触发配置正确 |
任一条件不满足,先修复再继续。
打 tag / 创建 GitHub Release 是把版本号给真实用户,不是 CI 验证机制。把 release workflow 当作"看 CI 跑没跑通"或"我下载个 artifact 自己测一下"是反模式,必须禁止。
| 反模式 | 表现 | 为什么错 |
|---|---|---|
| 把 tag 当 smoke test | "我改了一行,打个 tag 看看 CI 跑不跑得通" | 一次 release 吃掉 300+ 配额分钟,5 次测试 = 一月配额清零 |
| 用 release 验证构建产物 | "我想看 .dmg 长什么样,必须跑 release" | 应该用专门的 preview / draft build workflow(见下) |
| 同一天 / 24h 内发多个 patch | v0.3.16 / 17 / 18 一天内连发,各是同一个 bug 的连续小修 | 全部攒到下次一起发,成本立省 60%+ |
| draft release 当"先跑一次试试" | "我先 draft release 看 artifact 行不行" | draft 一样跑完整 CI,一样消耗配额,一样污染 release 历史 |
| 单平台 dry-run 验构建 | "先跑 Linux dry-run 看看,不发全平台" | dry-run 一样消耗 CI 时间,开了口子就停不下来;改走 preview workflow |
| 小改动发 patch | "我改了 typo / 改了一行文档,必须 vX.Y.Z" | 纯 typo / 文档小改 / 单文件改动不构成发版理由,合并到下个有实质内容的版本 |
| "已经打 tag 了,跑都跑了" | "v0.3.22 tag 已经推上去了,CI 反正也在跑" | "已经做了"不是继续做的理由;记录这次浪费并阻止下次重复 |
A. 想验证 CI 跑不跑得通 / 看构建产物长什么样?
pull_request 触发的 preview workflow(可只跑 ubuntu / 单一平台,几十分钟完成)workflow_dispatch 手动触发 dry build,不触发 release workflowB. 真的有用户能拿到的修复要发?
打 tag 之前,先回答五个问题:
任一答"否"或"不知道":不要打 tag,改走 preview workflow 或合并到下次。
| 借口 | 现实 |
|---|---|
| "我就看一眼,tag 一下马上回滚" | tag 推送已经触发了完整 CI,回滚 tag 不能退款 Actions 分钟 |
| "用户催着要" | 用户不知道你的 Actions 配额,告诉 ta 合并到明天的成本和时间,让 ta 选 |
| "反正之前都这么干" | 之前能用不等于现在合理,这正是 91% 配额的直接成因 |
| "只有 release workflow 跑完整矩阵" | 加一个 preview workflow(成本是 release 的 10-20%),不要用 release 凑合 |
| "draft release 不算正式发布" | draft 一样跑完整 CI、一样消耗配额、一样污染 release 历史 |
| "小改动发 patch 很常见" | 纯 typo / 文档 / 单行不构成发版理由,合并到下个有实质内容的版本 |
| "我已经打 tag 了,跑都跑了" | "已经做了"不是继续做的理由;记录这次浪费,阻止下次重复 |
| "单平台先 dry-run 一下" | dry-run 一样消耗 CI 时间,开了口子就停不下来;改走 preview workflow |
| "这次不一样,这次真的需要发" | SemVer 的 patch 版本本来就允许累积;下次发版不是更优解吗 |
workflow_dispatch 触发 release workflow 当测试(应该触发独立的 preview workflow)以上任一出现:删掉 tag(如已打),改走 preview workflow 或合并到下次。
从用户处获取或从 CHANGELOG.md 读取目标版本号。
统一所有版本号文件(按项目类型选取):
package.json → versionCargo.toml → versionpyproject.toml → versiontauri.conf.json)## [x.y.z] 条目版本号规则(SemVer):
| 类型 | 示例 | 适用场景 |
|---|---|---|
| PATCH | 0.3.7 → 0.3.8 | Bug 修复、小改进 |
| MINOR | 0.3.x → 0.4.0 | 新功能、向后兼容 |
| MAJOR | 0.x → 1.0.0 | 重大架构变更、破坏性改动 |
信息来源有两个,必须综合使用:
来源 1 — CHANGELOG.md:结构化的变更分类(Added / Changed / Fixed 等)
来源 2 — git log:两个 tag 之间的 commit 历史,补充上下文和细节
# 获取上一个 tag
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
# 查看 commit 历史
git log ${PREV_TAG}..HEAD --oneline
# 查看详细变更(含 PR 链接)
git log ${PREV_TAG}..HEAD --format="- %s (%h)"
综合两个来源,按模板组织 Release Notes。模板和格式指南见 references/release-notes-guide.md。如果 config/projects.yaml 中存在 release_notes.profile,优先使用项目配置指定的结构;未配置时按项目类型选择默认结构。
# 确保所有变更已提交
git status
# 打 tag
git tag "vX.Y.Z"
# 推送 tag 触发 CI
git push origin "vX.Y.Z"
如果有同名旧 tag(如发布失败后重试):
git push origin :refs/tags/vX.Y.Z
git tag -d vX.Y.Z 2>/dev/null
git tag vX.Y.Z
git push origin vX.Y.Z
# 查看构建状态
gh run list --limit 3
# 各平台 job 状态
gh run view <RUN_ID> --json jobs --jq '.jobs[] | "\(.name): \(.conclusion)"'
# 失败日志
gh run view <RUN_ID> --log-failed
项目类型的特定构建产物和验证方法,见 references/ 下对应文档。
CI 构建成功后,用第 2 步准备的草稿更新 GitHub Release:
gh release edit vX.Y.Z --repo <owner>/<repo> --notes "$(cat <<'EOF'
<Release Notes 内容>
EOF
)"
Release Notes 正文不要再写 # <项目名> vX.Y.Z 或其他重复版本标题;GitHub Release 页面自身已经显示标题,正文应直接从摘要、升级提示或 Highlights 开始。
# 检查产物是否完整
gh release view vX.Y.Z --json assets --jq '.assets[].name'
对照 config/projects.yaml 中该项目的配置检查:
platforms 和 auto_update 推导)exclude_assets 中列出的产物是否意外出现release_notes.required_sections 和 release_notes.always_include 约束gh run delete <ID>| 项目类型 | 参考文档 |
|---|---|
| Tauri 桌面应用 | references/tauri-release.md |
打 tag 前(强制) — 见上文 ## ⚠️ Release ≠ 测试 — 强制约束:
发布完成后确认:
npx claudepluginhub cat-xierluo/legal-skills --plugin transcription-correctorValidates and executes software releases with changelog generation, version bumping, git tagging, and CI verification.
Creates a GitHub release with semantic versioning, changelog generation, release notes, and optional build artifacts via tags and GitHub CLI.
Automates semantic versioning releases via CHANGELOG validation, comparison links, GitHub Actions triggering/monitoring, and scaffolds release pipelines for projects.