Automatic Changelog Generation¶
Complete guide to automatically generating changelogs from git commits.
Overview¶
Instead of manually writing changelog entries, we automatically generate them from git commit messages using Conventional Commits format.
Benefits: - ✅ Never forget to update changelog - ✅ Consistent formatting - ✅ Automatic categorization - ✅ Less manual work - ✅ Traceable to specific commits
Conventional Commits Format¶
All commits should follow this format:
Commit Types¶
| Type | Changelog Section | Description |
|---|---|---|
feat | ### Added | New features |
fix | ### Fixed | Bug fixes |
docs | ### Documentation | Documentation changes |
perf | ### Performance | Performance improvements |
refactor | ### Changed | Code refactoring |
test | ### Testing | Test updates |
build | ### Build System | Build system changes |
ci | ### CI/CD | CI/CD changes |
chore | ### Maintenance | Maintenance tasks |
style | ### Changed | Code style changes |
Examples¶
Feature:
git commit -m "feat(memory): add auto-extraction from git commits
Implemented LLM-powered extraction of decisions and experiences
from git commit messages and changed files.
Closes #123"
Bug Fix:
git commit -m "fix(api): resolve timeout issue in document processing
Increased timeout for large files from 60s to 300s.
Added progress reporting for long-running operations."
Breaking Change:
git commit -m "feat(api)!: change memory search API response format
BREAKING CHANGE: The search response now returns results in a
different structure for better consistency with other endpoints.
Before: { "memories": [...] }
After: { "data": [...], "total": 10, "page": 1 }
Documentation:
Chore:
Automatic Generation¶
During Version Bump (Recommended)¶
The bump-version.sh script automatically generates changelog:
# This command will:
# 1. Generate changelog from commits since last tag
# 2. Update version numbers
# 3. Create commit and tag
./scripts/bump-version.sh minor
What happens: 1. Script finds all commits since last tag (e.g., v0.7.0) 2. Parses each commit message 3. Groups by type (Added, Fixed, etc.) 4. Generates formatted changelog section 5. Inserts into docs/changelog.md after [Unreleased] 6. Proceeds with version bump
Manual Generation¶
Generate changelog without bumping version:
# Generate from latest tag to HEAD
python3 scripts/generate-changelog.py --update --version 0.8.0
# Generate from specific tag
python3 scripts/generate-changelog.py --from-tag v0.7.0 --update --version 0.8.0
# Preview without updating file
python3 scripts/generate-changelog.py --version 0.8.0
# Save to separate file
python3 scripts/generate-changelog.py --version 0.8.0 --output CHANGELOG_DRAFT.md
Generated Format¶
The script generates entries in Keep a Changelog format:
## [0.8.0] - 2025-01-20
### Added
- **memory**: Add auto-extraction from git commits
- **api**: Add new endpoint for batch memory operations
- Add support for Rust code parsing
### Fixed
- **api**: Resolve timeout issue in document processing
- **docker**: Fix volume mounting in minimal mode
### Changed
- **refactor**: Improve memory search performance
- Update dependencies to latest versions
### Documentation
- Add deployment guide for minimal mode
- Update API reference with new endpoints
Workflow Integration¶
Standard Release Workflow¶
# 1. Development - Use conventional commits
git commit -m "feat(api): add new feature X"
git commit -m "fix(core): resolve bug Y"
git push origin main
# 2. Ready to release
git checkout main
git pull origin main
# 3. Bump version (auto-generates changelog)
./scripts/bump-version.sh minor
# Output:
# === Version Bump Tool ===
# Current version: 0.7.0
# Bump type: minor
# New version: 0.8.0
#
# This will:
# 1. Generate changelog from git commits
# 2. Update version in pyproject.toml, src/__version__.py
# 3. Create a git commit
# 4. Create a git tag v0.8.0
#
# Continue? (y/N) y
#
# Generating changelog from commits...
# Processing 15 commits...
# ✓ Changelog generated and updated
# ✓ Version bumped successfully!
# 4. Review and push
git show # Review the commit
git push origin main
git push origin v0.8.0
Skip Changelog Generation¶
If you want to manually edit changelog:
# Bump version without auto-generating changelog
./scripts/bump-version.sh minor --no-changelog
# Then manually edit
vim docs/changelog.md
git add docs/changelog.md
git commit --amend --no-edit
Best Practices¶
1. Write Good Commit Messages¶
Good:
feat(memory): add conversation extraction
Implemented LLM-powered analysis of AI conversations to automatically
extract decisions, preferences, and experiences.
- Supports multiple conversation formats
- Configurable confidence threshold
- Auto-save option for high-confidence memories
Bad:
2. Use Conventional Format Consistently¶
# ✅ Good
feat: add new feature
fix: resolve bug
docs: update guide
# ❌ Bad
Added new feature
Fixed the bug
Updated some docs
3. Group Related Changes¶
# ✅ Good - Separate commits for separate concerns
git commit -m "feat(api): add memory export endpoint"
git commit -m "docs(api): document memory export API"
git commit -m "test(api): add tests for memory export"
# ❌ Bad - Everything in one commit
git commit -m "add memory export with docs and tests"
4. Use Scopes for Clarity¶
feat(api): ... # API changes
feat(memory): ... # Memory store changes
feat(docker): ... # Docker configuration
feat(docs): ... # Documentation system
5. Mark Breaking Changes¶
# Method 1: Use ! after type
feat(api)!: change response format
# Method 2: Use footer
feat(api): change response format
BREAKING CHANGE: The API now returns data in a different structure.
Customization¶
Add New Commit Types¶
Edit scripts/generate-changelog.py:
COMMIT_TYPE_MAP = {
"feat": "### Added",
"fix": "### Fixed",
"docs": "### Documentation",
# Add custom type
"security": "### Security",
}
Change Section Order¶
Edit scripts/generate-changelog.py:
preferred_order = [
"### ⚠️ Breaking Changes",
"### Security", # Add this
"### Added",
"### Fixed",
# ...
]
Custom Formatting¶
The script uses Python string formatting. Customize in format_changelog_entry():
# Current format:
# - **scope**: Subject
# Could change to:
# - [scope] Subject (abc123) # Include commit hash
Troubleshooting¶
No commits found¶
Problem: Script says "No commits found to process"
Solution:
# Check if you have tags
git tag
# If no tags, specify manually
python3 scripts/generate-changelog.py --from-tag "" --update --version 0.8.0
# Or process all commits
python3 scripts/generate-changelog.py --update --version 0.8.0
Commits not following format¶
Problem: Commits don't follow Conventional Commits
Solution: - Old commits: Manually edit changelog - Future commits: Follow the format - Mix approach: Auto-generate what you can, manually add the rest
Wrong version in changelog¶
Problem: Generated with wrong version number
Solution:
# Manually fix
vim docs/changelog.md
# Or regenerate
python3 scripts/generate-changelog.py --update --version 0.8.1
Want to edit generated changelog¶
Solution:
# Generate first
./scripts/bump-version.sh minor
# Review generated changelog
vim docs/changelog.md
# Edit as needed
# Amend the commit
git add docs/changelog.md
git commit --amend --no-edit
Migration from Manual Changelog¶
If you have existing manual changelog¶
The script will preserve existing content and insert new sections.
Steps: 1. Ensure docs/changelog.md has ## [Unreleased] section 2. Run generation - it will insert after Unreleased 3. Review and adjust if needed
Converting old commits¶
For retroactive changelog generation:
# Generate from beginning
python3 scripts/generate-changelog.py --from-tag "" --version 0.7.0 > TEMP_CHANGELOG.md
# Manually merge into docs/changelog.md
# Clean up and adjust as needed
Examples¶
Example 1: Feature Release¶
# Commits since v0.7.0:
# - feat(memory): add conversation extraction
# - feat(api): add export endpoint
# - fix(docker): resolve volume issue
# - docs: update deployment guide
./scripts/bump-version.sh minor
# Generated changelog:
## [0.8.0] - 2025-01-20
### Added
- **memory**: Add conversation extraction
- **api**: Add export endpoint
### Fixed
- **docker**: Resolve volume issue
### Documentation
- Update deployment guide
Example 2: Hotfix Release¶
# Critical bug fix
git commit -m "fix(api): resolve data corruption in memory export
Critical fix for issue where export could truncate large memories.
Added validation and error handling."
# Bump patch version
./scripts/bump-version.sh patch
# Generated:
## [0.7.1] - 2025-01-21
### Fixed
- **api**: Resolve data corruption in memory export
Example 3: Breaking Change Release¶
# Breaking API change
git commit -m "feat(api)!: standardize all response formats
BREAKING CHANGE: All API endpoints now return consistent response
structure with 'data', 'meta', and 'errors' fields.
See migration guide in docs/api/migration.md"
# Major version bump
./scripts/bump-version.sh major
# Generated:
## [1.0.0] - 2025-01-25
### ⚠️ Breaking Changes
- **api**: Standardize all response formats
### Added
- **api**: Standardize all response formats
Resources¶
Quick Reference¶
| Command | Description |
|---|---|
./scripts/bump-version.sh minor | Bump version + auto-generate changelog |
./scripts/bump-version.sh minor --no-changelog | Bump version without changelog |
python3 scripts/generate-changelog.py --update | Generate changelog only |
python3 scripts/generate-changelog.py --from-tag v0.7.0 | From specific tag |
python3 scripts/generate-changelog.py --output FILE | Save to file |
Commit Message Template¶
Save this as .gitmessage:
<type>(<scope>): <subject>
# <body>
# <footer>
# Type: feat|fix|docs|style|refactor|perf|test|build|ci|chore
# Scope: api|memory|docker|core|docs (optional)
# Subject: imperative mood, lowercase, no period
#
# Body: explain what and why (optional)
#
# Footer: breaking changes, issues (optional)
# BREAKING CHANGE: description
# Closes #123
Configure git to use it: