变更日志生成
让 Agent 按 Keep a Changelog 的标准小节起草条目,结合 SemVer 决定版本号,并区分用户可见变更与内部噪音;与自动化发布工具并存时划清「机器生成」与「人工润色」的边界。
输入可为 tag 区间内的 merge commit、Conventional Commits 或 PR 列表;输出须带版本号、日期与迁移提示链接(若适用)。下面分节说明标准小节含义、版本策略、流水线步骤与可交互辅助。
原则与输入
去重:同一功能多 PR 合并为一条用户向描述。链接:issue、PR、文档锚点按需附加。多包:每包独立小节或统一根 CHANGELOG 的择一规则须在 SKILL 中写死。
# CHANGELOG.md 标准格式(Keep a Changelog)
# 可直接复制此模板到项目根目录
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- (开发中的新功能在此记录,发版时移到对应版本块)
## [1.5.0] - 2024-04-10
### Added
- OAuth 2.1 PKCE 支持,增强公共客户端安全性 ([#1234](https://github.com/myorg/myapp/pull/1234))
- 新增用户偏好设置 API `PATCH /users/me/preferences`
### Changed
- 商品列表 API 性能优化,P99 从 800ms 降至 120ms ([#1256](https://github.com/myorg/myapp/pull/1256))
### Fixed
- 修复并发刷新 token 时的竞态条件 ([#1198](https://github.com/myorg/myapp/issues/1198))
### Security
- 升级 jsonwebtoken 至 9.x,修复 CVE-2022-23529
## [1.4.3] - 2024-03-15
### Fixed
- 修复 Safari 下支付回调解析失败问题
[Unreleased]: https://github.com/myorg/myapp/compare/v1.5.0...HEAD
[1.5.0]: https://github.com/myorg/myapp/compare/v1.4.3...v1.5.0
[1.4.3]: https://github.com/myorg/myapp/compare/v1.4.2...v1.4.3
Keep a Changelog 小节
推荐沿用 Keep a Changelog 的英文小节标题(便于工具解析与社区一致)。每个版本块内按读者价值排序,而非按合并时间堆砌。
- Added — 新能力、新 API、用户可见的新选项。
- Changed — 行为调整但保持兼容;性能优化若对用户可感知也放此处。
- Deprecated — 仍可用但计划移除的接口;写明替代方案与移除时间表。
- Removed — 本版本已删除的公开 API 或行为。
- Fixed — 缺陷修复;内部重构若无行为变化通常不写进对外 CHANGELOG。
- Security — 安全相关修复(可与责任披露策略对齐,不一定逐条写细节)。
SemVer 与版本号
语义化版本 MAJOR.MINOR.PATCH(可选先行版本与构建元数据)应与 CHANGELOG 中「破坏性 / 新功能 / 修复」的归类一致,供 Agent 与发布工具共用同一套规则。
- MAJOR — 不兼容的 API 或行为变更;CHANGELOG 中须有 BREAKING 或 Removed 等对应说明。
- MINOR — 向后兼容的功能新增;对应 Added(及非破坏的 Changed)。
- PATCH — 向后兼容的问题修复;主要对应 Fixed / Security(在无破坏性时)。
若团队使用日历版本(CalVer)或固定营销版本号,须在 SKILL 中单独说明,避免 Agent 仍按 SemVer 去「推算」下一版。
起草流程
从原始提交到可发布文本,建议固定顺序,减少漏项与分类错误。
[ 锁定范围:tag / 日期 / commit 区间 ]
│
▼
[ 聚合 PR / issue:去重、补链接 ]
│
▼
[ 归类到 KaC 小节 + 标 BREAKING? ]
│
▼
[ 对照 SemVer 规则草案版本号 ]
│
▼
[ 人工润色:语气、迁移、安全措辞 ]
│
▼
[ 与自动化输出 diff:去重段落 ]
自动化与边界
与 release-please、semantic-release、changesets 等工具并存时,写明「机器生成段」与「人工润色段」的边界:例如标题与日期由 CI 写,条目由 PR 模板收集,Agent 只负责把草稿改成用户向叙述。
# semantic-release 配置示例(.releaserc.json)
{
"branches": ["main", {"name": "release/+([0-9])+(.{+([0-9]),x}).x", "range": "${name.replace(/release\\//,'')}","channel": "maintenance"}],
"plugins": [
["@semantic-release/commit-analyzer", {
"preset": "conventionalcommits",
"releaseRules": [
{"type": "feat", "release": "minor"},
{"type": "fix", "release": "patch"},
{"type": "perf", "release": "patch"},
{"type": "revert","release": "patch"},
{"breaking": true,"release": "major"}
]
}],
["@semantic-release/release-notes-generator", {
"preset": "conventionalcommits",
"presetConfig": {
"types": [
{"type": "feat", "section": "Features"},
{"type": "fix", "section": "Bug Fixes"},
{"type": "perf", "section": "Performance"},
{"type": "security", "section": "Security", "hidden": false}
]
}
}],
["@semantic-release/changelog", {"changelogFile": "CHANGELOG.md"}],
["@semantic-release/npm"],
["@semantic-release/github", {"assets": [{"path": "dist/*.tar.gz"}]}],
["@semantic-release/git", {
"assets": ["CHANGELOG.md", "package.json"],
"message": "chore(release): ${nextRelease.version} [skip ci]"
}]
]
}
# GitHub Actions:自动创建 Release(release-please 方案)
# .github/workflows/release-please.yml
name: Release Please
on:
push:
branches: [main]
permissions:
contents: write
pull-requests: write
jobs:
release-please:
runs-on: ubuntu-latest
steps:
- uses: google-github-actions/release-please-action@v4
id: release
with:
release-type: node
token: ${{ secrets.GITHUB_TOKEN }}
# 仅在 release PR 被合并后(实际发布)才执行部署
- uses: actions/checkout@v4
if: ${{ steps.release.outputs.release_created }}
- name: Deploy to production
if: ${{ steps.release.outputs.release_created }}
run: |
echo "Deploying version ${{ steps.release.outputs.tag_name }}"
./scripts/deploy.sh "${{ steps.release.outputs.tag_name }}"
避免同一发行在 CHANGELOG 中出现两段重复描述;若工具会追加 commit 列表,SKILL 可规定「仅保留摘要句 + 链接,不重复列举 hash」。
小节预览与版本推算
下方可展开各小节备忘(仅本页展示);版本推算按纯 MAJOR.MINOR.PATCH 规则,不含先行版语义。演算在浏览器本地完成,不上传。
Added
新功能、新 API、新配置项。每条尽量一句说清「谁受益、怎么用一句话概括」。
Changed
兼容范围内的行为或性能变化。若实际不兼容,应改到 BREAKING / Removed,而非含糊写在 Changed。
Deprecated
仍可用但计划下线;写替代路径与预计移除版本,便于读者规划迁移。
Removed
本版本已删除的公开接口或行为;常与 MAJOR 齐升,并指向迁移文档。
Fixed
缺陷修复;用户不可见的纯内部清理一般不进对外 CHANGELOG。
Security
安全修复条目;细节披露节奏按团队安全政策,与 CVE 发布时间对齐。
输入版本号后点击 PATCH / MINOR / MAJOR。
—
---
name: changelog-generation
description: Keep a Changelog 格式、semantic-release 配置与 GitHub Release Actions
version: 2.0
---
# CHANGELOG.md 版本块模板
## [x.y.z] - YYYY-MM-DD
### Added (新能力、新 API)
### Changed (行为调整,保持兼容)
### Deprecated (计划移除,写替代方案)
### Removed (已删除 API,触发 MAJOR)
### Fixed (缺陷修复,触发 PATCH)
### Security (安全修复,对齐 CVE 披露)
# 版本号 Bump 规则
feat → MINOR(1.4.x → 1.5.0)
fix / perf → PATCH(1.4.2 → 1.4.3)
BREAKING → MAJOR(1.x.x → 2.0.0)
docs/chore → 不 bump
# 自动化工具选择
semantic-release:提交驱动,全自动版本 + CHANGELOG + Release
release-please :PR 驱动,产出 Release PR 供人工确认
standard-version:本地命令行,适合简单项目
changesets :Monorepo,每包独立版本
# GitHub Actions 最简配置(semantic-release)
# npx semantic-release # 在 CI 中运行,自动读取提交历史