jackin-release-notes

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

jackin-release-notes

jackin-release-notes

Classify every PR merged since the last release tag into a Keep a Changelog bucket, then write the
[Unreleased]
section of
CHANGELOG.md
. The bar is exhaustive — every merged PR accounted for, none dropped, none doubled.
归类自上次发布标签以来合并的所有PR到Keep a Changelog的对应类别中,然后写入
CHANGELOG.md
[Unreleased]
部分。确保无遗漏——所有合并的PR都被统计,无遗漏、无重复。

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 →
    jackin-release
    (it runs this skill as its notes step).
  • 直接执行版本发布操作 → 使用
    jackin-release
    (它会将本技能作为生成发布说明的步骤运行)。

Process

流程

  1. Find the boundary.
    LAST_TAG=$(git describe --tags --abbrev=0)
    ; if none, start from the initial commit (
    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.
  2. Gather merged PRs.
    gh pr list --state merged --base main --search "merged:>$TAG_DATE" --json number,title,labels,mergedAt
    .
    Done when every PR merged after the tag is in the list.
  3. Classify each. Sort by Conventional Commits prefix and label:
    Prefix / labelBucket
    feat:
    /
    feature
    Added
    fix:
    /
    bug
    Fixed
    security:
    Security
    refactor:
    ,
    chore:
    ,
    docs:
    ,
    ci:
    ,
    build:
    Changed
    deprecate:
    Deprecated
    remove:
    Removed
    no matchChanged (default)
    Strip the prefix from the title; capitalize the first word (
    feat: add TUI launcher
    Add TUI launcher
    ).
    Done when every PR sits in exactly one bucket.
  4. Catch ungrouped commits.
    git log <last-tag>..HEAD --oneline --no-merges
    ; for each,
    gh pr list --state merged --search "<sha>"
    . Commits with no PR land under Ungrouped commits.
    Done when every non-merge commit since the tag is matched to a PR or listed.
  5. Write
    [Unreleased]
    .
    Keep a Changelog format: one section per non-empty bucket, each entry linking its PR (
    [#N](…/pull/N)
    ). Replace the existing
    [Unreleased]
    block (between
    ## [Unreleased]
    and the next
    ## [
    ) — ask before overwriting entries an operator already edited. Keep the
    <!-- next-header -->
    marker intact.
    Done when
    CHANGELOG.md
    carries every merged PR under the right bucket, empty buckets omitted, and the marker survives.
  6. Present for review. Show the section; let the operator re-classify or reword. Do not proceed to a release until approved.
  1. 确定边界。执行命令
    LAST_TAG=$(git describe --tags --abbrev=0)
    ;如果没有标签,则从初始提交开始(执行
    git rev-list --max-parents=0 HEAD
    )。执行
    TAG_DATE=$(git log -1 --format=%aI "$LAST_TAG")
    获取标签日期。
    完成标志:获取到边界提交记录及其日期。
  2. 收集已合并的PR。执行命令
    gh pr list --state merged --base main --search "merged:>$TAG_DATE" --json number,title,labels,mergedAt
    完成标志:所有在标签之后合并的PR都已纳入列表。
  3. 逐个归类。根据规范提交前缀和标签进行分类:
    前缀/标签类别
    feat:
    /
    feature
    新增
    fix:
    /
    bug
    修复
    security:
    安全
    refactor:
    ,
    chore:
    ,
    docs:
    ,
    ci:
    ,
    build:
    变更
    deprecate:
    弃用
    remove:
    移除
    无匹配项变更(默认)
    移除标题中的前缀;将首单词大写(例如
    feat: add TUI launcher
    Add TUI launcher
    )。
    完成标志:每个PR都被归入且仅归入一个类别。
  4. 捕获未关联PR的提交。执行命令
    git log <last-tag>..HEAD --oneline --no-merges
    ;对每个提交,执行
    gh pr list --state merged --search "<sha>"
    查找关联PR。无关联PR的提交归入未分组提交类别。
    完成标志:自标签以来的所有非合并提交都已关联到PR或被列出。
  5. 写入
    [Unreleased]
    部分
    。遵循Keep a Changelog格式:每个非空类别对应一个章节,每条记录都链接到对应的PR(格式为
    [#N](…/pull/N)
    )。替换现有的
    [Unreleased]
    块(位于
    ## [Unreleased]
    和下一个
    ## [
    之间)——在覆盖操作人员已编辑的内容前需询问确认。保留
    <!-- next-header -->
    标记不变。
    完成标志
    CHANGELOG.md
    中所有已合并PR都归入正确类别,空类别被省略,且标记未被改动。
  6. 提交审核。展示生成的章节;允许操作人员重新归类或修改措辞。获得批准前不得进行发布操作。

Idempotency

幂等性

Safe to re-run: reads
CHANGELOG.md
fresh each time, asks before overwriting existing entries, fetches PR data live from GitHub.
可安全重复运行:每次都会重新读取
CHANGELOG.md
,覆盖现有内容前会询问确认,从GitHub实时获取PR数据。

Common 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
    [Unreleased]
    without asking.
  • 遗漏无规范提交前缀的PR —— 此类PR默认归入变更类别,绝不应该被遗漏。
  • 列出空类别(“无移除记录”属于无效内容 —— 应删除该章节)。
  • 每条记录中忘记添加PR链接。
  • 未询问就覆盖操作人员已编辑的
    [Unreleased]
    内容。