Changelog Generator Skill
Automatically generate changelogs from git commits following conventional commits, semantic versioning, and best practices.
Instructions
You are a changelog generation expert. When invoked:
- Analyze Commit History:
- Parse git commit messages
- Identify conventional commit types
- Group related changes
- Determine version bumps (major, minor, patch)
- Generate Changelog Entries:
- Follow Keep a Changelog format
- Categorize by change type
- Include breaking changes prominently
- Add relevant metadata (dates, versions, authors)
- Format Output:
- Use markdown formatting
- Create clear section headers
- Add links to commits and PRs
- Include migration guides for breaking changes
- Version Management:
- Suggest semantic version numbers
- Identify breaking changes
- Track deprecations
- Handle pre-release versions
Conventional Commit Types
- feat: New feature (minor version bump)
- fix: Bug fix (patch version bump)
- docs: Documentation changes
- style: Code style changes (formatting, etc.)
- refactor: Code refactoring
- perf: Performance improvements
- test: Test additions or changes
- build: Build system changes
- ci: CI/CD changes
- chore: Maintenance tasks
- revert: Revert previous changes
Breaking Change: Any commit with BREAKING CHANGE: in body or ! after type (major version bump)
Usage Examples
@changelog-generator
@changelog-generator --since v1.2.0
@changelog-generator --unreleased
@changelog-generator --version 2.0.0
@changelog-generator --format keep-a-changelog
@changelog-generator --include-authors
Changelog Formats
Keep a Changelog Format
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- New feature X for improved user experience
- Support for configuration option Y
### Changed
- Updated dependency Z to version 2.0
- Improved performance of data processing
### Deprecated
- Function `oldMethod()` - use `newMethod()` instead
### Removed
- Removed deprecated API endpoint `/api/v1/old`
### Fixed
- Fixed memory leak in cache implementation
- Corrected timezone handling in date formatter
### Security
- Fixed XSS vulnerability in user input handling
- Updated crypto library to address CVE-2024-1234
## [1.5.0] - 2024-01-15
### Added
- User authentication with OAuth2
- Export functionality for reports
- Dark mode theme support
### Changed
- Redesigned dashboard UI
- Optimized database queries
### Fixed
- Fixed bug in pagination logic
- Resolved CORS issues with API
## [1.4.2] - 2024-01-10
### Fixed
- Critical bug in payment processing
- Memory leak in WebSocket connections
### Security
- Patched authentication bypass vulnerability
## [1.4.1] - 2024-01-05
### Fixed
- Hotfix for broken deployment script
- Fixed typo in error messages
## [1.4.0] - 2024-01-01
### Added
- Real-time notifications
- File upload with drag and drop
- Advanced search filters
### Changed
- Migrated from REST to GraphQL
- Updated UI components library
### Deprecated
- Old REST API endpoints (will be removed in 2.0)
[Unreleased]: https://github.com/user/repo/compare/v1.5.0...HEAD
[1.5.0]: https://github.com/user/repo/compare/v1.4.2...v1.5.0
[1.4.2]: https://github.com/user/repo/compare/v1.4.1...v1.4.2
[1.4.1]: https://github.com/user/repo/compare/v1.4.0...v1.4.1
[1.4.0]: https://github.com/user/repo/releases/tag/v1.4.0
Automated Changelog Generation
Using Git Commits
#!/bin/bash
# generate-changelog.sh - Generate changelog from git commits
VERSION=${1:-"Unreleased"}
PREV_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
echo "# Changelog"
echo ""
echo "## [$VERSION] - $(date +%Y-%m-%d)"
echo ""
# Get commits since last tag
if [ -z "$PREV_TAG" ]; then
COMMITS=$(git log --pretty=format:"%s|||%h|||%an" --reverse)
else
COMMITS=$(git log ${PREV_TAG}..HEAD --pretty=format:"%s|||%h|||%an" --reverse)
fi
# Arrays for different categories
declare -a features=()
declare -a fixes=()
declare -a breaking=()
declare -a docs=()
declare -a chores=()
declare -a other=()
# Parse commits
while IFS='|||' read -r message hash author; do
case "$message" in
feat:*|feat\(*\):*)
features+=("- ${message#feat*: } ([${hash}](../../commit/${hash}))")
;;
fix:*|fix\(*\):*)
fixes+=("- ${message#fix*: } ([${hash}](../../commit/${hash}))")
;;
*BREAKING*|*\!:*)
breaking+=("- ${message} ([${hash}](../../commit/${hash}))")
;;
docs:*)
docs+=("- ${message#docs: } ([${hash}](../../commit/${hash}))")
;;
chore:*|build:*|ci:*)
chores+=("- ${message#*: } ([${hash}](../../commit/${hash}))")
;;
*)
other+=("- ${message} ([${hash}](../../commit/${hash}))")
;;
esac
done <<< "$COMMITS"
# Output sections
if [ ${#breaking[@]} -gt 0 ]; then
echo "### ⚠️ BREAKING CHANGES"
echo ""
printf '%s\n' "${breaking[@]}"
echo ""
fi
if [ ${#features[@]} -gt 0 ]; then
echo "### Added"
echo ""
printf '%s\n' "${features[@]}"
echo ""
fi
if [ ${#fixes[@]} -gt 0 ]; then
echo "### Fixed"
echo ""
printf '%s\n' "${fixes[@]}"
echo ""
fi
if [ ${#docs[@]} -gt 0 ]; then
echo "### Documentation"
echo ""
printf '%s\n' "${docs[@]}"
echo ""
fi
if [ ${#chores[@]} -gt 0 ]; then
echo "### Internal"
echo ""
printf '%s\n' "${chores[@]}"
echo ""
fi
if [ ${#other[@]} -gt 0 ]; then
echo "### Other Changes"
echo ""
printf '%s\n' "${other[@]}"
echo ""
fi
Using conventional-changelog
# Install
npm install -g conventional-changelog-cli
# Generate changelog
conventional-changelog -p angular -i CHANGELOG.md -s
# For first release
conventional-changelog -p angular -i CHANGELOG.md -s -r 0
# With specific version
conventional-changelog -p angular -i CHANGELOG.md -s --release-count 0 \
--tag-prefix v --preset angular
package.json configuration:
{
"scripts": {
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
"version": "npm run changelog && git add CHANGELOG.md"
},
"devDependencies": {
"conventional-changelog-cli": "^4.1.0"
}
}
Using standard-version
# Install
npm install -D standard-version
# Generate changelog and bump version
npx standard-version
# Preview without committing
npx standard-version --dry-run
# First release
npx standard-version --first-release
# Specific version
npx standard-version --release-as minor
npx standard-version --release-as 1.1.0
# Pre-release
npx standard-version --prerelease alpha
package.json:
{
"scripts": {
"release": "standard-version",
"release:minor": "standard-version --release-as minor",
"release:major": "standard-version --release-as major",
"release:alpha": "standard-version --prerelease alpha"
},
"standard-version": {
"types": [
{"type": "feat", "section": "Features"},
{"type": "fix", "section": "Bug Fixes"},
{"type": "chore", "hidden": true},
{"type": "docs", "section": "Documentation"},
{"type": "style", "hidden": true},
{"type": "refactor", "section": "Code Refactoring"},
{"type": "perf", "section": "Performance Improvements"},
{"type": "test", "hidden": true}
]
}
}
Using release-please (GitHub Action)
.github/workflows/release.yml:
name: Release
on:
push:
branches:
- main
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: google-github-actions/release-please-action@v3
id: release
with:
release-type: node
package-name: my-package
- uses: actions/checkout@v3
if: ${{ steps.release.outputs.release_created