java/src/main/resources/targets/claude/skills/core/ops/x-release-changelog/SKILL.md
Generates CHANGELOG.md from Conventional Commits history. Parses git log, groups by commit type, maps to Keep a Changelog sections (Added, Changed, Fixed, etc.), and performs incremental updates preserving existing entries.
npx skillsauth add edercnj/claude-environment x-release-changelogInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generates or updates CHANGELOG.md for {{PROJECT_NAME}} following the Keep a Changelog specification, automatically parsing Conventional Commits from git history.
/x-release-changelog — generate changelog for unreleased changes/x-release-changelog v1.2.0 — generate changelog for version v1.2.0/x-release-changelog --unreleased — only unreleased changes since last tag/x-release-changelog --full — regenerate entire changelog from all tags| Parameter | Required | Description |
|-----------|----------|-------------|
| Version tag | No | Target version (e.g., v1.2.0). Defaults to unreleased. |
| --unreleased | No | Generate only unreleased changes since last tag |
| --full | No | Regenerate entire changelog from all tags |
1. DETECT -> Determine version range from tags
2. PARSE -> Extract commits in range, parse Conventional Commits
3. GROUP -> Map commit types to Keep a Changelog sections
4. GENERATE -> Create or update CHANGELOG.md (incremental)
5. REPORT -> Summary of entries added
# List all version tags, sorted by version
git tag --list 'v*' --sort=-v:refname
# Determine range based on argument
# If version tag given: previous_tag..version_tag
# If --unreleased: latest_tag..HEAD
# If --full: process all tags
# If no argument: latest_tag..HEAD (same as --unreleased)
Determine previous tag:
# Get the tag before the target version
git describe --tags --abbrev=0 HEAD~1 2>/dev/null || echo "INITIAL"
# Extract commits in range with full metadata
git log {previous_tag}..{target} --format="%H|%s|%b|%an|%ai" --no-merges
Parse each commit subject as Conventional Commit:
<type>(<scope>): <description>
Extract:
BREAKING CHANGE: in body or ! after type| Commit Type | Changelog Section | Notes |
|-------------|------------------|-------|
| feat | Added | New features |
| fix | Fixed | Bug fixes |
| refactor | Changed | Code changes that neither fix a bug nor add a feature |
| perf | Changed | Performance improvements |
| docs | Documentation | Non-standard section, optional |
| chore | Maintenance | Non-standard section, optional |
| build, ci | (skip) | Not user-facing |
| test | (skip) | Not user-facing |
| style | (skip) | Not user-facing |
| BREAKING CHANGE | Breaking Changes | Highlighted at top of version |
| deprecate | Deprecated | Deprecated features |
| revert | Removed | Reverted features |
If CHANGELOG.md does not exist, create it:
# 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.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- {feat entries}
### Changed
- {refactor/perf entries}
### Fixed
- {fix entries}
If CHANGELOG.md exists, insert new version section:
## [Unreleased] section or after header)## [{version}] - YYYY-MM-DD
[Unreleased] section (clear entries that moved to the new version)Entry format:
- {description} ([#{PR_number}]({PR_url})) — if PR linkable
- {description} ({commit_hash_short}) — if no PR
Grouping within version:
CHANGELOG.md updated:
Version: {version or Unreleased}
Entries: {count}
Sections: Added ({n}), Changed ({n}), Fixed ({n})
Range: {from_tag}..{to_ref}
At the bottom of the CHANGELOG, maintain comparison links:
[unreleased]: https://github.com/{owner}/{repo}/compare/{latest_tag}...HEAD
[1.2.0]: https://github.com/{owner}/{repo}/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/{owner}/{repo}/compare/v1.0.0...v1.1.0
| Scenario | Action | |----------|--------| | No tags found | Use all commits from initial commit | | No Conventional Commits in range | Report "No conventional commits found in range" | | Commit doesn't follow convention | Skip with warning | | CHANGELOG.md has unexpected format | Append new section at the end with warning | | Version tag already in CHANGELOG | Skip with "Version already documented" |
| Skill | Relationship | Context |
|-------|-------------|---------|
| x-release | called-by | Invoked during release Step 5 for changelog generation |
| x-git-push | reads | Parses Conventional Commits format from git log |
development
Documentation freshness gate: validates 6 dimensions (readme, api, adr, etc.) per PR.
testing
Conditional dep-policy gate: CVEs, licenses, versions, freshness; SARIF + report.
documentation
Incrementally updates the service or system architecture document; never regenerative.
development
Scans code and git history for leaked credentials, API keys, and tokens; SARIF output.