mcpField
R
release-notes

release-notes

github.com/jackin-project开发3164 次安装5 周前更新
代码仓库

关于 release-notes

release-notes 是一项仓库技能,可根据上一个发布标签之后合并的 PR 和未归组提交,生成或更新 CHANGELOG.md 的 [Unreleased] 部分,供维护者准备并审核发布说明。

主要功能

  1. 01检测上一个发布标签
  2. 02使用 gh 收集已合并的 PR
  3. 03按变更日志类别归类内容
  4. 04纳入未关联 PR 的提交
  5. 05覆盖现有条目前先询问
  6. 06提交草稿供审核

适用场景

  1. 01在发布前准备变更日志
  2. 02预览下次发布包含的变更
  3. 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 launcher
  • fix: 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 数据

评论

支持 Markdown