Claude-skill-registry changelog-update
Generate changelog entries from commits for any project type
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/changelog-update" ~/.claude/skills/majiayu000-claude-skill-registry-changelog-update-b466f0 && rm -rf "$T"
skills/data/changelog-update/SKILL.mdChangelog Update
Purpose
Generates changelog entries from git commits, categorizes changes into Added/Changed/Fixed/Breaking sections following configurable changelog format (default: keep-a-changelog), and updates or creates the changelog file for any project type.
Input Context
Requires:
- Project Configuration: Output from
skilldetect-project-type - Version: New version number (e.g., "1.2.0")
- Custom Message (optional): User-provided commit message overrides auto-generation
- Last Tag: Git tag of previous release (optional)
Workflow
1. Load Changelog Configuration
Use configuration from
detect-project-type:
- Path to changelog file (default:changelog_file
)CHANGELOG.md
- Format to use (default:changelog_format
)keep-a-changelog
- For finding commits since last tagtag_pattern
2. Determine Changelog File Path
Use
changelog_file from configuration:
changelog_file="CHANGELOG.md" # from config, can be: # - CHANGELOG.md (standard) # - HISTORY.md (alternative) # - CHANGES.rst (Python projects) # - NEWS.md (GNU projects) # - {package}/CHANGELOG.md (monorepos)
Check if file exists. If not, create with initial structure based on 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/).
3. Gather Commits
Get commits since last release tag:
if [ -n "$last_tag" ]; then git log ${last_tag}..HEAD --oneline --no-merges else # First release - get all commits git log --oneline --no-merges fi
For monorepo projects, optionally filter commits by package directory:
# Filter commits that touched this package only git log ${last_tag}..HEAD --oneline --no-merges -- packages/my-lib/
3. Categorize Commits
Parse each commit message and categorize:
Added (new features):
orfeat:feat(scope):- Commit messages starting with "add", "create", "implement"
Changed (modifications to existing features):
- Commit messages starting with "update", "modify", "change", "refactor"
prefixrefactor:
Fixed (bug fixes):
orfix:fix(scope):- Commit messages starting with "fix", "correct", "resolve"
Breaking Changes:
in bodyBREAKING CHANGE:
after type (e.g.,!
)feat!:- Extract breaking change description from body
Uncategorized:
- Other types (
,chore:
,docs:
,test:
) → skip or place in "Changed"style:
4. Format Changelog Entry
Generate entry following this format:
## Version {version} - {date} ### Breaking Changes - Description of breaking change 1 - Description of breaking change 2 ### Added - New feature description 1 - New feature description 2 ### Changed - Change description 1 - Change description 2 ### Fixed - Bug fix description 1 - Bug fix description 2
Formatting rules:
- Date format: YYYY-MM-DD (use today's date)
- Strip conventional commit prefixes from descriptions
- Capitalize first letter of each entry
- Remove trailing periods
- Skip empty sections
- If custom message provided, use it for the entire entry
5. Insert Entry into Changelog
Read existing changelog file, parse structure, and insert new entry:
- Place after the file header (before any existing version entries)
- Preserve all existing entries unchanged
- Maintain consistent formatting (2 blank lines between versions)
6. Generate Commit Message
Create a commit message from the changelog content:
Release {scope} v{version} {changelog-entry-body} Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Output Format
Return:
{ "changelog_path": "plugins/daily-carry/CHANGELOG.md", "new_entry": "## Version 1.2.0 - 2026-01-12\n\n### Added\n- New deployment skill\n\n### Fixed\n- Version detection logic", "commit_message": "Release plugin:daily-carry v1.2.0\n\nAdded:\n- New deployment skill\n\nFixed:\n- Version detection logic\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>", "categories": { "added": 1, "changed": 0, "fixed": 1, "breaking": 0 }, "file_created": false }
Examples
Example 1: Feature and Fix Commits
Input:
- Scope:
plugin:daily-carry - Version:
1.2.0 - Last tag:
daily-carry-v1.1.0
Commits:
feat: add deploy-otterstack command fix: correct git push error handling docs: update README with examples
Generated Entry:
## Version 1.2.0 - 2026-01-12 ### Added - Add deploy-otterstack command ### Fixed - Correct git push error handling
Output:
{ "changelog_path": "plugins/daily-carry/CHANGELOG.md", "new_entry": "## Version 1.2.0 - 2026-01-12\n\n### Added\n- Add deploy-otterstack command\n\n### Fixed\n- Correct git push error handling", "commit_message": "Release plugin:daily-carry v1.2.0\n\nAdded:\n- Add deploy-otterstack command\n\nFixed:\n- Correct git push error handling\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>", "categories": { "added": 1, "changed": 0, "fixed": 1, "breaking": 0 }, "file_created": false }
Example 2: Breaking Change
Input:
- Scope:
marketplace - Version:
2.0.0
Commits:
feat!: change marketplace schema structure BREAKING CHANGE: marketplace.json now requires plugins array with explicit versions
Generated Entry:
## Version 2.0.0 - 2026-01-12 ### Breaking Changes - marketplace.json now requires plugins array with explicit versions ### Added - Change marketplace schema structure
Example 3: Custom Message Override
Input:
- Scope:
variants - Version:
1.2.0 - Custom message: "Update Android and TypeScript variants with new git workflow patterns"
Generated Entry:
## Version 1.2.0 - 2026-01-12 - Update Android and TypeScript variants with new git workflow patterns
Commit Message:
Release variants v1.2.0 Update Android and TypeScript variants with new git workflow patterns Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Example 4: First Release (No Commits to Parse)
Input:
- Scope:
plugin:new-plugin - Version:
1.0.0 - No last tag
Generated Entry:
## Version 1.0.0 - 2026-01-12 ### Added - Initial release of new-plugin
Error Handling
- Git errors: Return error if git log fails
- File write errors: Return error if changelog file cannot be written
- Invalid date: Use current system date as fallback
- Empty commits: Generate minimal entry with "Initial release" or "Version bump"
Integration Notes
This skill is invoked by the
/release command in Phase 3. The command will:
- Display the generated changelog entry
- Allow user to edit before finalizing
- Use the commit message for git operations in Phase 6