# changelog > Generate changelogs from git history. Use when the user asks to create a changelog, release notes, or summarize changes between tags, branches, or date ranges. Triggers on 'changelog', 'release notes', 'what changed', 'diff summary'. - Author: Ben Arent - Repository: benarent/claude-config - Version: 20260205210025 - Stars: 0 - Forks: 0 - Last Updated: 2026-02-06 - Source: https://github.com/benarent/claude-config - Web: https://mule.run/skillshub/@@benarent/claude-config~changelog:20260205210025 --- --- name: changelog description: "Generate changelogs from git history. Use when the user asks to create a changelog, release notes, or summarize changes between tags, branches, or date ranges. Triggers on 'changelog', 'release notes', 'what changed', 'diff summary'." --- # Changelog Generator Generate structured changelogs from git commit history using conventional commits. ## Usage ``` /changelog # since last tag /changelog v1.2.0..v1.3.0 # between tags /changelog --since="2 weeks ago" # date range /changelog main..feature-branch # branch diff ``` ## Workflow ### Step 1: Determine Range Parse user input to determine the git range: ```bash # Default: last tag to HEAD LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") if [ -n "$LAST_TAG" ]; then RANGE="$LAST_TAG..HEAD" else RANGE="HEAD~50..HEAD" # fallback: last 50 commits fi # User-specified range RANGE="v1.2.0..v1.3.0" # Date-based git log --after="2025-01-01" --before="2025-02-01" --oneline ``` ### Step 2: Extract Commits ```bash # Get conventional commit log with authors git log $RANGE --pretty=format:"%h|%s|%an|%ad" --date=short # Include PR numbers if available git log $RANGE --pretty=format:"%h|%s|%an" --grep="(#[0-9]*)" ``` ### Step 3: Categorize Group commits by conventional commit prefix: | Prefix | Category | Emoji | |--------|----------|-------| | `feat:` | Features | n/a | | `fix:` | Bug Fixes | n/a | | `perf:` | Performance | n/a | | `refactor:` | Refactoring | n/a | | `docs:` | Documentation | n/a | | `test:` | Tests | n/a | | `ci:` | CI/CD | n/a | | `chore:` | Maintenance | n/a | | `BREAKING CHANGE` | Breaking Changes | n/a | Commits without conventional prefix: categorize by analyzing the message. ### Step 4: Enrich For each commit, optionally: - Link PR numbers: `#123` -> `[#123](https://github.com/org/repo/pull/123)` - Link issues: `fixes #456` -> `[#456](https://github.com/org/repo/issues/456)` - Get PR title if commit message is a merge commit - Attribute contributors Detect repo origin for links: ```bash REMOTE_URL=$(git remote get-url origin 2>/dev/null) ``` ### Step 5: Generate Output **Default format: Markdown** ```markdown # Changelog ## [v1.3.0] - 2025-02-05 ### Breaking Changes - Description of breaking change (#PR) ### Features - Add user authentication flow (#123) - @author - Support batch processing for imports (#124) - @author ### Bug Fixes - Fix race condition in session handler (#125) - @author ### Performance - Optimize database query for user lookup (#126) - @author ### Contributors @author1, @author2, @author3 ``` ## Options | Flag | Effect | |------|--------| | `--format=md` | Markdown (default) | | `--format=json` | JSON output | | `--format=slack` | Slack-friendly format | | `--no-links` | Skip PR/issue linking | | `--no-authors` | Omit contributor attribution | | `--breaking-only` | Only show breaking changes | | `--include-merge` | Include merge commits (excluded by default) | ## Slack Format When `--format=slack` or user asks for Slack-friendly output: ``` *Release v1.3.0* (2025-02-05) *Breaking Changes* - Description of breaking change () *Features* - Add user authentication flow () *Bug Fixes* - Fix race condition in session handler () ``` ## JSON Format ```json { "version": "v1.3.0", "date": "2025-02-05", "range": "v1.2.0..v1.3.0", "categories": { "breaking": [], "features": [], "fixes": [], "performance": [], "other": [] }, "contributors": [], "stats": { "total_commits": 42, "files_changed": 87, "insertions": 1234, "deletions": 567 } } ``` ## Edge Cases - **No tags exist**: Use commit count or date range, warn user - **Non-conventional commits**: Best-effort categorization from message content - **Monorepo**: If user specifies a path, scope with `git log -- path/` - **Squash merges**: Parse PR title from squash commit message - **Co-authored commits**: Extract `Co-authored-by` trailers