Skip to main content
skill CX Codex

generate-release-notes — Claude Code skill: release notes from git

Turns your commit history into release notes or a changelog entry, following the Conventional Commits spec. Handy right before you tag a release.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add donnfelker/donnfelker-plugin-marketplace --skill generate-release-notes -a claude-code
Open on GitHub

What generate-release-notes does

The skill reads git log and parses commit messages written in Conventional Commits style — feat:, fix:, docs: and the rest. Parsed commits get grouped into sections: Features, Bug Fixes, Performance Improvements, and so on. Anything marked as a breaking change lands in a BREAKING CHANGES block at the top, and commits that don't match the format end up under Other Changes.

The workflow runs in seven steps. First it asks what you want: a RELEASE_NOTES.md, an entry prepended to CHANGELOG.md, or both. Then it picks the commit range — the default is from the latest tag to HEAD, but you can pass your own, like v1.0.0..v2.0.0. Parsing is done by scripts/parse-commits.sh, which prints one block per commit with COMMIT, TYPE, SCOPE, BREAKING, DESCRIPTION, BODY and FOOTERS fields. For the version number it suggests a SemVer bump: a breaking change means MAJOR, any feat means MINOR, only fix and similar means PATCH.

No tags in the repo? Then you name the range yourself or accept all commits. And the bigger catch: without Conventional Commits there is nothing to parse. The skill warns you and offers to list raw commit messages instead. That is worth checking against how your team actually writes commits.

What it helps with

  • build release notes for a new tag from commit history
  • prepend a fresh entry to CHANGELOG.md without touching older ones
  • pull every breaking change into its own section
  • suggest the next version number by SemVer rules
  • sort commits into Features, Bug Fixes and the other sections

Example prompts for the agent

  • generate release notes since the last tag up to HEAD
  • write a changelog for the range v1.0.0..v2.0.0
  • prepare release notes and a changelog, version 2.0.0

How to install generate-release-notes

1Skills CLI (Vercel)

npx skills add donnfelker/donnfelker-plugin-marketplace --skill generate-release-notes -a claude-code

2Manually: put the files in place

~/.claude/skills/generate-release-notes/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/generate-release-notes/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about generate-release-notes

How do I install generate-release-notes in Claude?

Run npx skills add donnfelker/donnfelker-plugin-marketplace --skill generate-release-notes -a claude-code. It installs to ~/.claude/skills/generate-release-notes/SKILL.md.

What does generate-release-notes do?

It parses commit messages that follow Conventional Commits and formats them into release notes or a changelog entry. Sections keep a fixed order and breaking changes are lifted to the top.

What do my commits need to look like?

They should follow Conventional Commits, with prefixes such as feat: and fix:. If they don't, the skill warns you and offers to list the raw messages instead.

Source text

SKILL.md · MIT
---
name: generate-release-notes
description: This skill should be used when the user asks to "generate release notes", "generate changelog", "create release notes", "write changelog", "what changed since last release", "prepare release notes", "update changelog", or "summarize changes from git history". Parses conventional commit messages to produce categorized, well-formatted release notes or changelog entries.
---

# Release Notes Generator

Generate release notes and changelogs by parsing conventional commit messages from git log history. Commits following the Conventional Commits specification (feat:, fix:, docs:, etc.) are categorized, grouped, and formatted into professional markdown output.

## Workflow

### Step 1: Determine Output Type

Ask the user what they need:

- **Release Notes** — a single release summary written to `RELEASE_NOTES.md`
- **Changelog** — append to an existing `CHANGELOG.md` (or create one)
- **Both** — generate both files

### Step 2: Determine Commit Range

Identify which commits to include. Two approaches:

**Since last tag (default):**
The parser script automatically detects the latest tag and uses `<tag>..HEAD` when no range is provided. To confirm the range with the user before generating, run `git describe --tags --abbrev=0` to display the latest tag.

**Custom range:**
Accept a user-specified range like `v1.0.0..v2.0.0` or `v1.0.0..HEAD` and pass it as the first argument to the parser script.

If no tags exist, ask the user for a range or default to all commits (the script handles this automatically).

### Step 3: Parse Commits

Run the parser script to extract structured commit data. The `${CLAUDE_PLUGIN_ROOT}` variable is set automatically by Claude Code when the plugin is installed:

```bash
bash ${CLAUDE_PLUGIN_ROOT}/skills/generate-release-notes/scripts/parse-commits.sh [<range>]
```

The script outputs one block per commit with fields: `COMMIT`, `TYPE`, `SCOPE`, `BREAKING`, `DESCRIPTION`, `BODY`, `FOOTERS`.

### Step 4: Categorize and Format

Group parsed commits by type into sections using this mapping:

| Type | Section Heading |
|------|----------------|
| feat | Features |
| fix | Bug Fixes |
| perf | Performance Improvements |
| refactor | Code Refactoring |
| docs | Documentation |
| style | Styles |
| test | Tests |
| build | Build System |
| ci | Continuous Integration |
| chore | Chores |
| revert | Reverts |

**Ordering:** List sections in the order shown above. Within each section, list entries alphabetically by scope (ungrouped entries last).

**Breaking changes:** Collect all commits with `BREAKING:yes` into a dedicated "BREAKING CHANGES" section at the top, regardless of their type. These also appear in their normal type section.

**Scope grouping:** When multiple commits share a scope, group them under a bold scope label.

**Commits with type "other":** Collect into an "Other Changes" section at the bottom. These are commits that do not follow the conventional commit format.

### Step 5: Determine Version

If the user provides a version number, use it. Otherwise, suggest a version based on SemVer rules:

- Any `BREAKING:yes` commit → suggest MAJOR bump
- Any `feat` commit → suggest MINOR bump
- Only `fix`, `docs`, `style`, etc. → suggest PATCH bump

Read the latest tag to determine the current version and calculate the next version. Present the suggestion and let the user confirm or override.

### Step 6: Write Output

**Release Notes** → Write to `RELEASE_NOTES.md` (overwrite previous content).

**Changelog** → Prepend new version entry to `CHANGELOG.md`. If the file does not exist, create it with a header. Preserve all existing entries below the new one.

Consult `references/formats.md` for the exact output templates.

### Step 7: Summary

After writing, display:
- Version number used
- Number of commits processed
- Breakdown by category (e.g., "3 features, 2 bug fixes, 1 breaking change")
- File(s) written

## Handling Edge Cases

**No conventional commits found:** Warn the user that no parseable commits were found. Offer to list raw commit messages instead.

**Mixed conventional and non-conventional:** Process conventional commits normally, list non-conventional commits under "Other Changes."

**Empty range:** If the range produces no commits, inform the user and suggest checking the range.

**Monorepo with scopes:** When scopes map to packages/modules, offer to group by scope as top-level sections instead of by type.

## Additional Resources

### Reference Files

For detailed output format templates and examples, consult:
- **`references/formats.md`** — Complete output templates for release notes and changelog, with examples of each section type

### Scripts

- **`scripts/parse-commits.sh`** — Parses git log into structured commit data. Accepts an optional range argument. Handles conventional commit parsing, scope extraction, breaking change detection, and footer parsing.

© donnfelker · MIT · donnfelker/donnfelker-plugin-marketplace

Similar skills

All skills for Git and GitHub →

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor