jackin-release-notes
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinesejackin-release-notes
jackin-release-notes
Classify every PR merged since the last release tag into a Keep a Changelog bucket, then write the section of . The bar is exhaustive — every merged PR accounted for, none dropped, none doubled.
[Unreleased]CHANGELOG.md归类自上次发布标签以来合并的所有PR到Keep a Changelog的对应类别中,然后写入的部分。确保无遗漏——所有合并的PR都被统计,无遗漏、无重复。
CHANGELOG.md[Unreleased]When to use
使用场景
- Before a release, to populate the changelog.
- When the operator asks to preview what the next release would contain.
- 发布前,用于填充变更日志。
- 当操作人员需要预览下一个版本的内容时。
When NOT to use
不适用场景
- Cutting the release itself → (it runs this skill as its notes step).
jackin-release
- 直接执行版本发布操作 → 使用(它会将本技能作为生成发布说明的步骤运行)。
jackin-release
Process
流程
-
Find the boundary.; if none, start from the initial commit (
LAST_TAG=$(git describe --tags --abbrev=0)).git rev-list --max-parents=0 HEAD.TAG_DATE=$(git log -1 --format=%aI "$LAST_TAG")Done when you hold the boundary commit and its date. -
Gather merged PRs..
gh pr list --state merged --base main --search "merged:>$TAG_DATE" --json number,title,labels,mergedAtDone when every PR merged after the tag is in the list. -
Classify each. Sort by Conventional Commits prefix and label:
Prefix / label Bucket /feat:featureAdded /fix:bugFixed security:Security ,refactor:,chore:,docs:,ci:build:Changed deprecate:Deprecated remove:Removed no match Changed (default) Strip the prefix from the title; capitalize the first word (→feat: add TUI launcher).Add TUI launcherDone when every PR sits in exactly one bucket. -
Catch ungrouped commits.; for each,
git log <last-tag>..HEAD --oneline --no-merges. Commits with no PR land under Ungrouped commits.gh pr list --state merged --search "<sha>"Done when every non-merge commit since the tag is matched to a PR or listed. -
Write. Keep a Changelog format: one section per non-empty bucket, each entry linking its PR (
[Unreleased]). Replace the existing[#N](…/pull/N)block (between[Unreleased]and the next## [Unreleased]) — ask before overwriting entries an operator already edited. Keep the## [marker intact.<!-- next-header -->Done whencarries every merged PR under the right bucket, empty buckets omitted, and the marker survives.CHANGELOG.md -
Present for review. Show the section; let the operator re-classify or reword. Do not proceed to a release until approved.
-
确定边界。执行命令;如果没有标签,则从初始提交开始(执行
LAST_TAG=$(git describe --tags --abbrev=0))。执行git rev-list --max-parents=0 HEAD获取标签日期。TAG_DATE=$(git log -1 --format=%aI "$LAST_TAG")完成标志:获取到边界提交记录及其日期。 -
收集已合并的PR。执行命令。
gh pr list --state merged --base main --search "merged:>$TAG_DATE" --json number,title,labels,mergedAt完成标志:所有在标签之后合并的PR都已纳入列表。 -
逐个归类。根据规范提交前缀和标签进行分类:
前缀/标签 类别 /feat:feature新增 /fix:bug修复 security:安全 ,refactor:,chore:,docs:,ci:build:变更 deprecate:弃用 remove:移除 无匹配项 变更(默认) 移除标题中的前缀;将首单词大写(例如→feat: add TUI launcher)。Add TUI launcher完成标志:每个PR都被归入且仅归入一个类别。 -
捕获未关联PR的提交。执行命令;对每个提交,执行
git log <last-tag>..HEAD --oneline --no-merges查找关联PR。无关联PR的提交归入未分组提交类别。gh pr list --state merged --search "<sha>"完成标志:自标签以来的所有非合并提交都已关联到PR或被列出。 -
写入部分。遵循Keep a Changelog格式:每个非空类别对应一个章节,每条记录都链接到对应的PR(格式为
[Unreleased])。替换现有的[#N](…/pull/N)块(位于[Unreleased]和下一个## [Unreleased]之间)——在覆盖操作人员已编辑的内容前需询问确认。保留## [标记不变。<!-- next-header -->完成标志:中所有已合并PR都归入正确类别,空类别被省略,且标记未被改动。CHANGELOG.md -
提交审核。展示生成的章节;允许操作人员重新归类或修改措辞。获得批准前不得进行发布操作。
Idempotency
幂等性
Safe to re-run: reads fresh each time, asks before overwriting existing entries, fetches PR data live from GitHub.
CHANGELOG.md可安全重复运行:每次都会重新读取,覆盖现有内容前会询问确认,从GitHub实时获取PR数据。
CHANGELOG.mdCommon mistakes
常见错误
- Dropping a PR that has no conventional-commit prefix — it defaults to Changed, never omitted.
- Listing an empty bucket ("no Removed entries" is noise — drop the section).
- Forgetting the PR link in each entry.
- Overwriting an operator-edited without asking.
[Unreleased]
- 遗漏无规范提交前缀的PR —— 此类PR默认归入变更类别,绝不应该被遗漏。
- 列出空类别(“无移除记录”属于无效内容 —— 应删除该章节)。
- 每条记录中忘记添加PR链接。
- 未询问就覆盖操作人员已编辑的内容。
[Unreleased]