Changelogator
Generate a structured changelog from git commits following Keep a Changelog format.
By default, output the changelog in chat for the user to review — do not write to CHANGELOG.md unless the user explicitly asks.
Workflow
- Find the last tag:
git tag --sort=-v:refname | head -1
- Retrieve commits:
git log <tag>..HEAD --format="---COMMIT---%n%H%n%s%n%b" --reverse (if no tag, use git log --format="---COMMIT---%n%H%n%s%n%b" --reverse)
- Parse each commit subject using the format below
- Classify into changelog categories using the mapping table
- Detect breaking changes:
! after type (e.g., feat!) or BREAKING CHANGE in body
- Suggest semver bump based on the rules below
- Write a summary paragraph: 2–3 sentences, plain language, user-focused — highlight the most impactful changes, skip internal/technical ones
- Build GitHub compare URL:
git remote get-url origin + strip .git + append /compare/<prev-tag>...<new-tag> (only if remote is a GitHub URL)
- Generate the markdown changelog
- Output in chat for validation
Commit Format
Expected format (from commitor):
<emoji> <type>(<scope>): <description> (<TASK-XXX>)
Parse using these parts:
- Emoji: leading Unicode emoji
- Type: word after emoji (
feat, fix, patch, etc.)
- Scope: optional, inside parentheses after type
- Breaking:
! between type/scope and :
- Description: text after
:
- Task number: optional, inside parentheses at end of subject
Category Mapping
Map commit types to changelog categories (consistent with commitor):
| Changelog Category |
Emoji |
Commit Types |
| Breaking |
⚠️ |
any type with ! |
| Added |
✨ |
feat |
| Changed |
🔨 |
patch, style, perf, data |
| Fixed |
🐛 |
fix, security |
| Removed |
🔥 |
remove |
| Technical |
⚙️ |
docs, refactor, test, ai, config, build |
wip commits are excluded from changelogs — they don't represent releasable changes.
Localization
When generating in French, use these category names:
| English |
French |
| Breaking |
Critique |
| Added |
Ajouté |
| Changed |
Changé |
| Fixed |
Corrigé |
| Removed |
Supprimé |
| Technical |
Technique |
| Contributors |
Contributeurs |
| GitHub compare |
Comparer sur GitHub |
Semver Rules
Suggest a version bump based on the most significant change:
| Condition |
Bump |
Any breaking change (! or body) |
Major |
Any feat commit |
Minor |
| Everything else (fix, patch, etc.) |
Patch |
Apply to the last tag version. If no tag exists, suggest v0.1.0.
Output Template
## vX.Y.Z - YYYY-MM-DD
<2–3 sentence summary of release highlights>
**GitHub compare:** https://github.com/{owner}/{repo}/compare/{prev-tag}...vX.Y.Z
### ✨ Added
- **scope**: description
- description without scope
### 🔨 Changed
- **scope**: description
### 🐛 Fixed
- description
### 🔥 Removed
- description
### ⚙️ Technical
- description
Output Rules
- Rewrite descriptions — do not copy commit subjects verbatim. Rephrase into clear, human-readable sentences. Use backticks for code references (skill names, commands, files, config keys). Capitalize the first word.
- Omit empty categories — only show categories that have commits
- Scope as bold prefix when present:
- **scope**: description
- No scope: just
- description
- Skip merge commits — ignore subjects starting with
Merge
- Include task numbers when present:
- **scope**: description (TASK-123)
- Language: English by default; if the existing
CHANGELOG.md or commits are in another language, match that language
- Summary paragraph: 2–3 sentences, plain language, user-focused. Highlight the most impactful user-facing changes; skip
wip, build, refactor, test, docs. End with a short transition if there are minor fixes (e.g., "Plus, a set of fixes.")
Edge Cases
- No tag found: use all commits and suggest
v0.1.0
- No commits since tag: output "No changes since
<tag>."
- Unrecognized format: classify under "Other" with the full subject as description
- Multiple breaking changes: still one major bump, list all in a
### ⚠️ Breaking Changes section at the top
Example
Input commits (from git log v1.2.0..HEAD):
✨ feat(auth): add OAuth2 login with Google (NTT-128)
🐛 fix(exports): prevent duplicate rows in CSV export
🔨 patch(ui): improve loading spinner animation
♻️ refactor: simplify database connection pooling
🔥 remove(api): drop deprecated v1 endpoints
Output:
## v1.3.0 - 2026-02-12
This release brings Google OAuth2 login, making it easier to get started without a password. The deprecated v1 API endpoints have been removed — make sure to migrate to v2 before upgrading. Plus, a set of fixes and UI polish.
**GitHub compare:** https://github.com/owner/repo/compare/v1.2.0...v1.3.0
### ✨ Added
- **auth**: `OAuth2` login with Google provider (NTT-128)
### 🔨 Changed
- **ui**: Improve the loading spinner animation
### 🐛 Fixed
- **exports**: Fix duplicate rows appearing in CSV exports
### 🔥 Removed
- **api**: Drop deprecated `v1` API endpoints
### ⚙️ Technical
- Simplify database connection pooling
Suggested version: v1.3.0 (minor bump — contains new feature)
1---2name: changelogator3description: Generate a changelog from git commits. Use when the user asks to generate a changelog, prepare release notes, summarize commits, prepare a release, suggest a version bump, or review changes since last tag. Also use when the user mentions "changelog", "release notes", "what changed", "version bump", or "semver".4---56# Changelogator78Generate a structured changelog from git commits following [Keep a Changelog](https://keepachangelog.com/) format.910**By default**, output the changelog in chat for the user to review — do **not** write to `CHANGELOG.md` unless the user explicitly asks.1112## Workflow13141. **Find the last tag**: `git tag --sort=-v:refname | head -1`152. **Retrieve commits**: `git log <tag>..HEAD --format="---COMMIT---%n%H%n%s%n%b" --reverse` (if no tag, use `git log --format="---COMMIT---%n%H%n%s%n%b" --reverse`)163. **Parse** each commit subject using the format below174. **Classify** into changelog categories using the mapping table185. **Detect breaking changes**: `!` after type (e.g., `feat!`) or `BREAKING CHANGE` in body196. **Suggest semver bump** based on the rules below207. **Write a summary paragraph**: 2–3 sentences, plain language, user-focused — highlight the most impactful changes, skip internal/technical ones218. **Build GitHub compare URL**: `git remote get-url origin` + strip `.git` + append `/compare/<prev-tag>...<new-tag>` (only if remote is a GitHub URL)229. **Generate** the markdown changelog2310. **Output in chat** for validation2425## Commit Format2627Expected format (from commitor):2829```30<emoji> <type>(<scope>): <description> (<TASK-XXX>)31```3233Parse using these parts:34- **Emoji**: leading Unicode emoji35- **Type**: word after emoji (`feat`, `fix`, `patch`, etc.)36- **Scope**: optional, inside parentheses after type37- **Breaking**: `!` between type/scope and `:`38- **Description**: text after `: `39- **Task number**: optional, inside parentheses at end of subject4041## Category Mapping4243Map commit types to changelog categories (consistent with commitor):4445| Changelog Category | Emoji | Commit Types |46| ------------------ | ----- | -------------------------------- |47| Breaking | ⚠️ | any type with `!` |48| Added | ✨ | feat |49| Changed | 🔨 | patch, style, perf, data |50| Fixed | 🐛 | fix, security |51| Removed | 🔥 | remove |52| Technical | ⚙️ | docs, refactor, test, ai, config, build |5354> `wip` commits are excluded from changelogs — they don't represent releasable changes.5556## Localization5758When generating in French, use these category names:5960| English | French |61| --------- | --------- |62| Breaking | Critique |63| Added | Ajouté |64| Changed | Changé |65| Fixed | Corrigé |66| Removed | Supprimé |67| Technical | Technique |68| Contributors | Contributeurs |69| GitHub compare | Comparer sur GitHub |7071## Semver Rules7273Suggest a version bump based on the most significant change:7475| Condition | Bump |76| ----------------------------------- | ----- |77| Any breaking change (`!` or body) | Major |78| Any `feat` commit | Minor |79| Everything else (fix, patch, etc.) | Patch |8081Apply to the last tag version. If no tag exists, suggest `v0.1.0`.8283## Output Template8485```markdown86## vX.Y.Z - YYYY-MM-DD8788<2–3 sentence summary of release highlights>8990**GitHub compare:** https://github.com/{owner}/{repo}/compare/{prev-tag}...vX.Y.Z9192### ✨ Added93- **scope**: description94- description without scope9596### 🔨 Changed97- **scope**: description9899### 🐛 Fixed100- description101102### 🔥 Removed103- description104105### ⚙️ Technical106- description107```108109## Output Rules110111- **Rewrite descriptions** — do not copy commit subjects verbatim. Rephrase into clear, human-readable sentences. Use backticks for code references (skill names, commands, files, config keys). Capitalize the first word.112- **Omit empty categories** — only show categories that have commits113- **Scope as bold prefix** when present: `- **scope**: description`114- **No scope**: just `- description`115- **Skip merge commits** — ignore subjects starting with `Merge`116- **Include task numbers** when present: `- **scope**: description (TASK-123)`117- **Language**: English by default; if the existing `CHANGELOG.md` or commits are in another language, match that language118- **Summary paragraph**: 2–3 sentences, plain language, user-focused. Highlight the most impactful user-facing changes; skip `wip`, `build`, `refactor`, `test`, `docs`. End with a short transition if there are minor fixes (e.g., "Plus, a set of fixes.")119120## Edge Cases121122- **No tag found**: use all commits and suggest `v0.1.0`123- **No commits since tag**: output "No changes since `<tag>`."124- **Unrecognized format**: classify under "Other" with the full subject as description125- **Multiple breaking changes**: still one major bump, list all in a `### ⚠️ Breaking Changes` section at the top126127## Example128129**Input commits** (from `git log v1.2.0..HEAD`):130131```132✨ feat(auth): add OAuth2 login with Google (NTT-128)133🐛 fix(exports): prevent duplicate rows in CSV export134🔨 patch(ui): improve loading spinner animation135♻️ refactor: simplify database connection pooling136🔥 remove(api): drop deprecated v1 endpoints137```138139**Output**:140141```markdown142## v1.3.0 - 2026-02-12143144This release brings Google OAuth2 login, making it easier to get started without a password. The deprecated v1 API endpoints have been removed — make sure to migrate to v2 before upgrading. Plus, a set of fixes and UI polish.145146**GitHub compare:** https://github.com/owner/repo/compare/v1.2.0...v1.3.0147148### ✨ Added149- **auth**: `OAuth2` login with Google provider (NTT-128)150151### 🔨 Changed152- **ui**: Improve the loading spinner animation153154### 🐛 Fixed155- **exports**: Fix duplicate rows appearing in CSV exports156157### 🔥 Removed158- **api**: Drop deprecated `v1` API endpoints159160### ⚙️ Technical161- Simplify database connection pooling162```163164Suggested version: **v1.3.0** (minor bump — contains new feature)