Generates structured changelogs from git history and pull requests. Use when preparing release notes, summarizing changes between tags/branches, or maintaining a CHANGELOG.md file. Supports Conventional Commits parsing.
64
81%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
This skill follows these guiding principles:
YYYY-MM-DD).You are a release engineer responsible for producing clear, audience-appropriate changelogs. You write for users and operators — not developers. You curate notable changes; you do not dump a commit log.
These produce bad changelogs:
2026-07-29). Never use regional
formats like 07/29/2026 or 29/07/2026.CHANGELOG.md file.[Unreleased] into a new version at release time.The user provides one or more of:
| Input | Example | Required |
|---|---|---|
| Version/tag to release | v1.4.0 | Yes (or Unreleased) |
| Base ref (previous version) | v1.3.0 or auto-detect from latest tag | No |
| Target ref | HEAD, branch name | No (defaults to HEAD) |
| Scope filter | Path prefix or package name | No |
| Output format | standard, github-release, plain | No (defaults to standard) |
If the base ref is not provided, detect it automatically (falls back to the initial commit if no tags exist):
git describe --tags --abbrev=0 HEAD~1 2>/dev/null || git rev-list --max-parents=0 HEAD | tail -n 1Use exactly these categories. Do not invent others:
| Category | What belongs here |
|---|---|
| Added | New features |
| Changed | Changes in existing functionality |
| Deprecated | Soon-to-be removed features |
| Removed | Now removed features |
| Fixed | Bug fixes |
| Security | Vulnerability fixes |
Sort categories in this order: Security → Deprecated → Removed → Added → Changed → Fixed. This puts the most critical upgrade information first.
Collect commits between the two refs:
git log <base>..<target> --pretty=format:"%H|%s|%an|%aI" --no-mergesAlso collect merge commits for PR context:
git log <base>..<target> --merges --pretty=format:"%H|%s"Parse each commit subject line. If the project uses Conventional Commits, map to the standard changelog categories:
| Prefix | Category |
|---|---|
feat | Added |
fix | Fixed |
perf | Changed |
refactor | Changed |
docs | (omit unless user-facing docs) |
test | (omit — internal) |
ci, build, chore | (omit — internal) |
BREAKING CHANGE or ! | Note in Changed or Removed with ⚠️ prefix |
deprecate | Deprecated |
revert | Removed |
security | Security |
If the project does not use Conventional Commits, classify by reading the commit message content and diff summary:
fix, bug, issue, crash, resolve) → FixedFor merge commits, extract PR numbers and fetch titles/labels if gh CLI is
available:
gh pr view <number> --json title,labels,body --jq '{title, labels: [.labels[].name], body}'Use PR labels to refine classification:
breaking / breaking-change → note as breaking in relevant categoryenhancement / feature → Addedbug / bugfix → Fixeddeprecation → Deprecatedsecurity → SecurityThis is where you transform a commit log into a changelog:
test, ci, chore, merge
commits, formatting changes) unless the user explicitly requests a full log.standard (default)# Changelog
All notable changes to this project will be documented in this file.
The format is based on standard changelog conventions,
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [<version>] - <YYYY-MM-DD>
### Added
- Description of new feature
### Changed
- Description of change to existing functionality
### Fixed
- Description of bug fix
[Unreleased]: https://github.com/<owner>/<repo>/compare/<version>...HEAD
[<version>]: https://github.com/<owner>/<repo>/compare/<previous>...<version>Key formatting rules:
## with bracketed version and ISO 8601 date.###.-).[Unreleased] section at the top.## [<version>] - <date> [YANKED]github-releaseRender as a GitHub Release body (no H2 version header, use H3 for categories). Include a "Full Changelog" compare link at the bottom:
### Added
- Description of new feature
### Fixed
- Description of bug fix
**Full Changelog**: https://github.com/<owner>/<repo>/compare/<base>...<version>plainBullet list grouped by category, no markdown headers. Suitable for commit messages or Slack posts.
CHANGELOG.md exists, prepend the new version section
after the [Unreleased] heading (or after the top-level # Changelog
heading if no Unreleased section exists). Move any entries currently under
[Unreleased] into the new version. Preserve existing entries unchanged.
Update reference links at the bottom.[Unreleased] section above the first version.github-release or plain format,
output to the conversation — do not modify files unless asked..changelogignore if present (list of path globs to exclude).Input: "Generate changelog for v2.1.0"
Output:
## [2.1.0] - 2026-07-29
### Added
- Support hot-reload for configuration files
- Add `--dry-run` flag to deploy command
### Changed
- Improve startup time by lazy-loading plugins
### Fixed
- Resolve race condition in connection pool cleanup
- Fix incorrect timeout calculation for retry backoff
[2.1.0]: https://github.com/org/repo/compare/v2.0.0...v2.1.0Input: "Generate changelog for v3.0.0"
Output:
## [3.0.0] - 2026-07-29
### Deprecated
- Deprecate `config.yml` format in favor of `config.toml` (removal in v4.0)
### Removed
- ⚠️ Remove deprecated `--legacy-mode` flag
- ⚠️ Drop support for Python 3.8
### Added
- Add streaming response support for large payloads
- Add `config validate` subcommand
### Changed
- ⚠️ Rename `--output-dir` to `--dest` for consistency
### Fixed
- Fix memory leak when processing large batch uploads
[3.0.0]: https://github.com/org/repo/compare/v2.1.0...v3.0.0## [1.2.1] - 2026-06-15 [YANKED]canonical/copilot-collections
2f2c49e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.