Turn a list of changes, commits, or PRs into clean release notes / a changelog entry. Use when asked to write release notes, a changelog, or a version announ...
Documents
Keep a Changelog
Try itMaintain CHANGELOG.md in Keep a Changelog 1.1.0 format. Use when the user asks to create a changelog, record recent changes or draft release notes, cut or tag a release, or audit an existing changelog — and before editing any CHANGELOG.md for another reason.
What it does
Maintain CHANGELOG.md in Keep a Changelog 1.1.0 format. Use when the user asks to create a changelog, record recent changes or draft release notes, cut or tag a release, or audit an existing changelog — and before editing any CHANGELOG.md for another reason.
The skill document
Keep a Changelog
A changelog is written for one reader: a human, mid-upgrade, deciding what this release means for them. Every rule below serves that reader.
Format rules
- The file opens with the header prose from the skeleton in references/template.md — it names the format and the versioning scheme the file follows.
## [Unreleased]always sits first, collecting changes for the next release.- Every released version has its own section, newest first:
## [X.Y.Z] - YYYY-MM-DD(ISO 8601 date). - Entries sit under
### Added/### Changed/### Deprecated/### Removed/### Fixed/### Security, in that order, listing only the categories that have entries:- Added — new features.
- Changed — changes in existing functionality.
- Deprecated — features that still work but are scheduled for removal.
- Removed — features removed in this release.
- Fixed — bug fixes.
- Security — vulnerability fixes.
- Version headings are markdown link references, resolved in a block at the foot of the file to compare URLs; the block covers every heading.
- A withdrawn release keeps its section, marked
## [1.0.1] - 2026-06-14 [YANKED], with a line saying why it was pulled.
Writing entries
An entry earns its place by being notable: the reader would notice the change or act on it. Internal refactors, CI tweaks, and invisible dependency bumps fall below the bar; security fixes are always above it.
- Write the change the reader experiences, in the reader's vocabulary: "Config paths may now be relative to the project root", not the commit title that produced it.
- Commits are raw material, never entries: translate each one, merge several into one notable change, split one that hides two.
- Deprecated is the reader's upgrade warning: name the replacement and, when known, the removal version.
- A breaking Changed entry says it breaks and names the migration step.
Create a changelog
- Copy the skeleton from references/template.md into
CHANGELOG.md. - List released versions from
git tag(fall back to version history in the package manifest); create a dated section per version, newest first. For a history deeper than a handful of versions, ask the user how far back to backfill. - Fill each section from
git log .., applying the Writing entries rules. - Write the link-reference block covering every heading.
Done when: the file matches the skeleton's shape, every version section has an ISO date and a resolving link reference, and ## [Unreleased] sits at the top.
Record changes
- Establish the range to cover: from the newest change already recorded (the latest version's tag, or the last commit that touched
CHANGELOG.mdif Unreleased has entries) toHEAD. - Walk
git logover that range commit by commit, judging each against the notable bar. - Write each notable change under its category in
## [Unreleased].
Done when: every commit in the range is accounted for — turned into an entry, folded into an existing entry, or judged below the notable bar.
Cut a release
- Choose the version, unless the user named one: any Removed or breaking Changed entry → MAJOR; else any Added, Changed, or Deprecated entry → MINOR; else PATCH.
- Rename
## [Unreleased]to## [X.Y.Z] -and open a fresh, empty## [Unreleased]above it. - Update the link-reference block:
[Unreleased]compares...HEAD; the new version compares....
Done when: an empty Unreleased sits at the top, the new section carries today's date and every former Unreleased entry, and both updated references resolve.
Audit a changelog
- Check every Format rule and every Writing entries rule against the file, top to bottom.
- Cross-check
git tagagainst version sections: a released version with no section is a violation — the reader mistakes the gap for "nothing changed". - Report violations grouped by rule, each with its concrete fix; apply the fixes when the request was to fix rather than to review.
Done when: every rule has been checked against every section, and each violation found is fixed or reported.
Related skills
Convert a git log, commit list, or release notes into a polished, user-facing changelog. Use when writing release notes, generating a CHANGELOG.md entry, or...
Generate polished changelogs and release notes from git history, PRs, and issues — auto-categorize features, fixes, and breaking changes
Draft release notes and changelog entries from a local Git repository. Use when the user asks to summarize commits, compare refs or tags, prepare release not...
Interact with GitHub via the gh CLI — issues, PRs, CI runs and repository health with auto-changelog and issue triage.
Analyze repository changes from the last release to the current revision and recommend the correct semantic version bump. Use when the user asks what version...