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
76%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./skills/changelog-generator/SKILL.mdThis 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]d41d8d9
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.