关于 changelog-generator
为 Java 项目根据 Conventional Commits 生成变更日志的 Skill。它会识别版本规则和现有日志格式,并归类变更、建议版本升级。
主要功能
- 01从项目文件和标签识别版本规则
- 02读取现有变更日志格式
- 03按类别整理提交
- 04添加问题和版本比较链接
- 05建议版本升级
适用场景
- 01发布前准备变更日志
- 02查看指定标签后的变更
- 03为特定问题添加日志条目
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ decebals/ claude-code-java --skill changelog-generator安装后在 Claude Code 中输入/changelog-generator确认已加载。
附带文件README.md
详细介绍
变更日志生成器技能
根据 Java 项目的约定式提交生成变更日志。
使用时机
- 发布前
- 用户说“生成变更日志”/“更新变更日志”/“上次发布后有哪些变化”
- 完成一个里程碑后
版本规范检测
按以下优先顺序检测版本规范:
1. 检查 CLAUDE.md(如果存在)
grep -A5 "## Versioning" CLAUDE.md 2>/dev/null
查找明确的规范:
## Versioning
This project uses Semantic Versioning (x.y.z).
Tag format: `release-x.y.z`
2. 回退:从 git 标签检测
git tag --sort=-version:refname | head -10
| 检测到的模式 | 版本规范 |
|---|---|
v3.15.0、3.15.0 | SemVer(x.y.z) |
release-3.15.0 | 带前缀的 SemVer |
v2.1、2.1 | 两段式(x.y) |
2026.01、26.1 | CalVer |
| 无匹配模式 | 询问用户 |
3. 回退:从 CHANGELOG.md 检测
grep -E "^\#+ \[.*\]" CHANGELOG.md | head -5
从现有条目中提取版本格式。
4. 最后手段:询问用户
No versioning convention detected. Which format does this project use?
- Semantic Versioning (x.y.z) - e.g., 3.15.0
- Two-component (x.y) - e.g., 2.1
- Calendar Versioning - e.g., 2026.01
支持的版本规范
| 规范 | 格式 | 标签示例 | 版本递增 |
|---|---|---|---|
| SemVer | x.y.z | v3.15.0、release-3.15.0 | major.minor.patch |
| 两段式 | x.y | v2.1、2.1 | major.minor |
| CalVer | YYYY.MM[.patch] | 2026.01、2026.01.1 | year.month[.patch] |
旧版项目(CLAUDE.md 中没有版本规范部分)
如果 CLAUDE.md 存在,但没有版本信息:
- 不要自行假设——从标签/变更日志中检测
- 如果检测到版本规范,可以建议将其添加到 CLAUDE.md:
Detected versioning: SemVer (x.y.z) with tag prefix 'release-' Want me to add this to CLAUDE.md for future reference?
输出格式
支持两种格式——根据现有 CHANGELOG.md 检测,或询问用户偏好。
格式 A:Keep a Changelog(版本使用 h2 标题)
# Changelog
## [Unreleased]
## [1.2.0] - 2026-01-29
### Added
- [#123]: New feature for plugin dependencies
### Changed
- [#456]: Improved performance of plugin loading
### Fixed
- [#234]: Resolved NPE when directory missing
格式 B:pf4j 风格(版本使用 h3 标题)
## Change Log
### [Unreleased][unreleased]
### [3.15.0] - 2026-01-29
#### Added
- [#123]: New feature for plugin dependencies
#### Changed
- [#456]: Improved performance of plugin loading
#### Fixed
- [#234]: Resolved NPE when directory missing
引用式链接(推荐)
使用引用式链接,让条目更简洁易读:
#### Fixed
- [#648]: Restore missing `module-info.class` in multi-release JAR
- [#625]: Fix exception handling inconsistency in `startPlugin()`
#### Added
- [#629]: Validate dependency state on plugin start
- [#633]: Allow customization of `PluginClassLoader` parent delegation
[#648]: https://github.com/user/repo/issues/648
[#633]: https://github.com/user/repo/pull/633
[#629]: https://github.com/user/repo/pull/629
[#625]: https://github.com/user/repo/pull/625
优点:
- 更易阅读(行内不包含冗长的 URL)
- 链接只需定义一次,可重复使用
- 更易编写和维护
版本比较链接
在底部添加比较链接,方便查看差异:
[unreleased]: https://github.com/user/repo/compare/release-3.15.0...HEAD
[3.15.0]: https://github.com/user/repo/compare/release-3.14.1...release-3.15.0
[3.14.1]: https://github.com/user/repo/compare/release-3.14.0...release-3.14.1
模式: [version]: https://github.com/{owner}/{repo}/compare/{previous-tag}...{current-tag}
章节顺序
根据现有文件调整,或使用以下默认顺序:
| 章节 | 适用情形 |
|---|---|
| Fixed | 错误修复 |
| Changed | 对现有功能的更改 |
| Added | 新功能 |
| Deprecated | 即将移除的功能 |
| Removed | 已移除的功能 |
| Security | 漏洞修复(CVE) |
注意:pf4j 使用 Fixed → Changed → Added → Removed。Keep a Changelog 使用 Added → Changed → Deprecated → Removed → Fixed → Security。
规则:如果现有文件中有顺序,则遵循该顺序。
将约定式提交映射到变更日志
| 提交类型 | 变更日志章节 |
|---|---|
| feat | Added |
| fix | Fixed |
| perf | Changed |
| refactor | Changed |
| build(deps) | Changed 或 Security(如果涉及 CVE) |
| BREAKING CHANGE | Changed(附加粗体说明) |
| deprecate | Deprecated |
工作流
-
检查是否已有 CHANGELOG.md
cat CHANGELOG.md | head -20检测格式(版本使用 h2 还是 h3、章节顺序、链接样式)。
-
确定版本范围
# Find last tag git describe --tags --abbrev=0 # List recent tags git tag --sort=-version:refname | head -5 -
获取自上次发布以来的提交
git log v3.14.1..HEAD --oneline -
提取问题/PR 引用 查找以下模式:
#123、fixes #123、closes #123、(#123) -
生成变更日志条目
- 按章节分组
- 使用引用式链接
- 添加版本比较链接
-
建议版本递增(根据检测到的版本规范)
SemVer(x.y.z):
- BREAKING CHANGE → Major(3.0.0 → 4.0.0)
- feat → Minor(3.14.0 → 3.15.0)
- 只有 fix → Patch(3.14.0 → 3.14.1)
两段式(x.y):
- BREAKING CHANGE → Major(2.0 → 3.0)
- feat/fix → Minor(2.1 → 2.2)
CalVer(YYYY.MM):
- 新月份 → 2026.01 → 2026.02
- 同月新发布 → 2026.01 → 2026.01.1
Token 优化
- 初步扫描使用
git log --oneline - 只有怀疑存在 BREAKING CHANGE 时才获取完整提交内容
- 复用文件中现有的链接定义
- 不要重新读取整个变更日志——只需在前面添加新章节
示例:完整工作流
输入: 用户说“为下一个版本生成变更日志”
步骤 1: 检查现有格式
head -30 CHANGELOG.md
→ 检测到 pf4j 风格(h3 版本标题,Fixed 排在首位)
步骤 2: 查找版本范围
git describe --tags --abbrev=0
→ release-3.15.0
步骤 3: 获取提交
git log release-3.15.0..HEAD --oneline
→ 找到 5 个提交
步骤 4: 生成条目
### [Unreleased][unreleased]
#### Fixed
- [#650]: Fix memory leak in extension factory
#### Changed
- [#651]: Rename `LegacyExtension*` to `IndexedExtension*`
#### Added
- [#652]: Add support for plugin priority ordering
步骤 5: 生成链接定义
[#652]: https://github.com/pf4j/pf4j/pull/652
[#651]: https://github.com/pf4j/pf4j/pull/651
[#650]: https://github.com/pf4j/pf4j/issues/650
步骤 6: 更新版本比较链接
[unreleased]: https://github.com/pf4j/pf4j/compare/release-3.15.0...HEAD
步骤 7: 建议版本
Suggested: 3.16.0 (minor - has new feature)
处理边缘情况
没有规范提交
使用原始消息列在“Changed”下:
#### Changed
- Updated plugin loading mechanism
- Refactored test utilities
安全修复
#### Security
- [#618], [#623]: Fix path traversal vulnerabilities in ZIP extraction
破坏性变更
#### Changed
- **BREAKING**: [#645] Renamed `LegacyExtension*` classes to `IndexedExtension*`
同一修复对应多个问题
- [#630], [#631]: Set `failedException` when plugin validation fails
与现有 CHANGELOG.md 集成
-
读取现有文件以检测:
- 标题级别(版本使用 ## 或 ###)
- 章节顺序
- 链接样式(引用式或内联式)
- 现有链接定义
-
在
[Unreleased]章节后插入新版本 -
合并链接定义——添加新的,保留现有的
-
更新
[unreleased]比较链接,使其指向新版本
快速参考
| 用户说 | 操作 |
|---|---|
| “generate changelog” | 自上一个标签以来的完整变更日志 |
| “changelog since v3.14” | 从指定版本开始 |
| “what's unreleased” | 预览未发布的变更 |
| “update changelog for 3.16” | 为指定版本生成并插入变更日志 |
| “add changelog entry for #123” | 单个问题条目 |