关于 release-notes
release-notes 是一项仓库技能,可根据上一个发布标签之后合并的 PR 和未归组提交,生成或更新 CHANGELOG.md 的 [Unreleased] 部分,供维护者准备并审核发布说明。
主要功能
- 01检测上一个发布标签
- 02使用 gh 收集已合并的 PR
- 03按变更日志类别归类内容
- 04纳入未关联 PR 的提交
- 05覆盖现有条目前先询问
- 06提交草稿供审核
适用场景
- 01在发布前准备变更日志
- 02预览下次发布包含的变更
- 03重新生成或更新现有的 [Unreleased] 部分
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jackin-project/ jackin-dev --skill release-notes安装后在 Claude Code 中输入/release-notes确认已加载。
详细介绍
发布说明
根据自上一个发布标签以来已合并的 PR,生成或更新 CHANGELOG.md 的 [Unreleased] 部分。
适用场景
- 发布前填充变更日志
- 想预览下一个版本将包含哪些内容时
- 收到更新或重新生成变更日志的请求时
流程
第 1 步:检测最新标签
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
如果不存在标签,则这是首次发布。使用初始提交作为起点:
FIRST_COMMIT=$(git rev-list --max-parents=0 HEAD)
第 2 步:获取标签日期
TAG_DATE=$(git log -1 --format=%aI "$LAST_TAG" 2>/dev/null || echo "")
第 3 步:收集已合并的 PR
gh pr list --state merged --base main --search "merged:>$TAG_DATE" --json number,title,labels,mergedAt --jq '.[] | {number, title, labels: [.labels[].name], mergedAt}'
第 4 步:为每个 PR 分类
根据标题前缀和标签,将 PR 归入 Keep a Changelog 的类别:
| 标题前缀 | 标签 | 类别 |
|---|---|---|
feat:、feature: | feature、enhancement | 新增 |
fix: | bug、bugfix | 修复 |
security: | security | 安全 |
refactor:、chore:、docs:、ci:、build: | refactor、chore、docs | 变更 |
deprecate: | deprecated | 弃用 |
remove: | removed | 移除 |
如果 PR 不匹配任何前缀或标签,则默认将其归入 变更。
生成条目时,去掉标题中的约定式提交前缀。例如:
feat: add TUI launcher变为Add TUI launcherfix: symlink escape in mounts变为Fix symlink escape in mounts
将每个条目的首字母大写。
第 5 步:查找未分组的提交
查找自上一个标签以来未关联任何已合并 PR 的提交:
git log "$LAST_TAG"..HEAD --oneline --no-merges
对每个提交,检查它是否属于某个 PR:
gh pr list --state merged --search "<commit-sha>" --json number --jq '.[0].number'
未关联 PR 的提交归入 未分组的提交 部分。
第 6 步:格式化变更日志部分
按 Keep a Changelog 格式整理,并添加 PR 链接:
## [Unreleased]
### Added
- Add TUI launcher for interactive agent selection ([#12](https://github.com/jackin-project/jackin/pull/12))
### Fixed
- Fix symlink escape in container mounts ([#15](https://github.com/jackin-project/jackin/pull/15))
### Changed
- Extract testing instructions into TESTING.md ([#18](https://github.com/jackin-project/jackin/pull/18))
仅包含有条目的部分。不要包含空部分。
如果有未分组的提交,则添加:
### Ungrouped commits (not from PRs)
- `205875a` docs: fix resolve_agent_source references
- `efa41b8` docs: split TODO into individual files
第 7 步:检查是否已有未发布部分
读取 CHANGELOG.md,检查 [Unreleased] 部分是否已有内容。
如果有,请询问用户:
"
CHANGELOG.md的[Unreleased]部分已有条目。您想要: A)从头重新生成(替换现有条目) B)保留现有条目并添加缺少的 PR"
第 8 步:写入 CHANGELOG.md
如果 CHANGELOG.md 不存在,则使用标准标题创建该文件:
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/),
and this project adheres to [Semantic Versioning](https://semver.org/).
## [Unreleased]
[generated entries here]
如果 CHANGELOG.md 已存在,则替换 ## [Unreleased] 部分的内容(即 ## [Unreleased] 与下一个 ## [ 标题之间的所有内容,或直到文件末尾)。
第 9 步:提交审核
向用户展示完整的 [Unreleased] 部分。允许用户:
- 请求修改(“将 PR #42 移至新增”“重新措辞此条目”“移除此提交”)
- 按当前内容批准
在用户批准变更日志内容之前,不要继续。
幂等性
此技能可安全地多次运行:
- 写入前始终检查
CHANGELOG.md的当前状态 - 覆盖现有条目前会先询问
- 每次都会从 GitHub 获取最新 PR 数据