Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Automate changelog generation from commits, PRs, and releases following Keep a Changelog format. Use when setting up release workflows, generating release notes, or standardizing commit conventions.
.claude/skills/dicklesworthstone-changelog-automation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 121% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 121% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 136% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 188% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 268% | 0% |
Patterns and tools for automating changelog generation, release notes, and version management following industry standards.
markdown# 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 - New feature X ## [1.2.0] - 2024-01-15 ### Added - User profile avatars - Dark mode support ### Changed - Improved loading performance by 40% ### Deprecated - Old authentication API (use v2) ### Removed - Legacy payment gateway ### Fixed - Login timeout issue (#123) ### Security - Updated dependencies for CVE-2024-1234 [Unreleased]: https://github.com/user/repo/compare/v1.2.0...HEAD [1.2.0]: https://github.com/user/repo/compare/v1.1.0...v1.2.0
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]| Type | Description | Changelog Section | | ---------- | ---------------- | ------------------ | | feat | New feature | Added | | fix | Bug fix | Fixed | | docs | Documentation | (usually excluded) | | style | Formatting | (usually excluded) | | refactor | Code restructure | Changed | | perf | Performance | Changed | | test | Tests | (usually excluded) | | chore | Maintenance | (usually excluded) | | ci | CI changes | (usually excluded) | | build | Build system | (usually excluded) | | revert | Revert commit | Removed |
MAJOR.MINOR.PATCH
MAJOR: Breaking changes (feat! or BREAKING CHANGE)
MINOR: New features (feat)
PATCH: Bug fixes (fix)bash# Install tools npm install -D @commitlint/cli @commitlint/config-conventional npm install -D husky npm install -D standard-version # or npm install -D semantic-release # Setup commitlint cat > commitlint.config.js << 'EOF' module.exports = { extends: ['@commitlint/config-conventional'], rules: { 'type-enum': [ 2, 'always', [ 'feat', 'fix', 'docs', 'style', 'refactor', 'perf', 'test', 'chore', 'ci', 'build', 'revert', ], ], 'subject-case': [2, 'never', ['start-case', 'pascal-case', 'upper-case']], 'subject-max-length': [2, 'always', 72], }, }; EOF # Setup husky npx husky init echo "npx --no -- commitlint --edit \$1" > .husky/commit-msg
javascript// .versionrc.js module.exports = { types: [ { type: "feat", section: "Features" }, { type: "fix", section: "Bug Fixes" }, { type: "perf", section: "Performance Improvements" }, { type: "revert", section: "Reverts" }, { type: "docs", section: "Documentation", hidden: true }, { type: "style", section: "Styles", hidden: true }, { type: "chore", section: "Miscellaneous", hidden: true }, { type: "refactor", section: "Code Refactoring", hidden: true }, { type: "test", section: "Tests", hidden: true }, { type: "build", section: "Build System", hidden: true }, { type: "ci", section: "CI/CD", hidden: true }, ], commitUrlFormat: "{{host}}/{{owner}}/{{repository}}/commit/{{hash}}", compareUrlFormat: "{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}", issueUrlFormat: "{{host}}/{{owner}}/{{repository}}/issues/{{id}}", userUrlFormat: "{{host}}/{{user}}", releaseCommitMessageFormat: "chore(release): {{currentTag}}", scripts: { prebump: "echo \"Running prebump\"", postbump: "echo \"Running postbump\"", prechangelog: "echo \"Running prechangelog\"", postchangelog: "echo \"Running postchangelog\"", }, };
json// package.json scripts { "scripts": { "release": "standard-version", "release:minor": "standard-version --release-as minor", "release:major": "standard-version --release-as major", "release:patch": "standard-version --release-as patch", "release:dry": "standard-version --dry-run" } }
javascript// release.config.js module.exports = { branches: [ "main", { name: "beta", prerelease: true }, { name: "alpha", prerelease: true }, ], plugins: [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", [ "@semantic-release/changelog", { changelogFile: "CHANGELOG.md", }, ], [ "@semantic-release/npm", { npmPublish: true, }, ], [ "@semantic-release/github", { assets: ["dist/**/*.js", "dist/**/*.css"], }, ], [ "@semantic-release/git", { assets: ["CHANGELOG.md", "package.json"], message: "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}", }, ], ], };
yaml# .github/workflows/release.yml name: Release on: push: branches: [main] workflow_dispatch: inputs: release_type: description: "Release type" required: true default: "patch" type: choice options: - patch - minor - major permissions: contents: write pull-requests: write jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - uses: actions/setup-node@v4 with: node-version: "20" cache: "npm" - run: npm ci - name: Configure Git run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - name: Run semantic-release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} run: npx semantic-release # Alternative: manual release with standard-version manual-release: if: github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: "20" - run: npm ci - name: Configure Git run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - name: Bump version and generate changelog run: npx standard-version --release-as ${{ inputs.release_type }} - name: Push changes run: git push --follow-tags origin main - name: Create GitHub Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ steps.version.outputs.tag }} body_path: RELEASE_NOTES.md generate_release_notes: true
toml# cliff.toml [changelog] header = """ # Changelog All notable changes to this project will be documented in this file. """ body = """ {% if version %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [Unreleased] {% endif %}\ {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} - {% if commit.scope %}**{{ commit.scope }}:** {% endif %}\ {{ commit.message | upper_first }}\ {% if commit.github.pr_number %} ([#{{ commit.github.pr_number }}](https://github.com/owner/repo/pull/{{ commit.github.pr_number }})){% endif %}\ {% endfor %} {% endfor %} """ footer = """ {% for release in releases -%} {% if release.version -%} {% if release.previous.version -%} [{{ release.version | trim_start_matches(pat="v") }}]: \ https://github.com/owner/repo/compare/{{ release.previous.version }}...{{ release.version }} {% endif -%} {% else -%} [unreleased]: https://github.com/owner/repo/compare/{{ release.previous.version }}...HEAD {% endif -%} {% endfor %} """ trim = true [git] conventional_commits = true filter_unconventional = true split_commits = false commit_parsers = [ { message = "^feat", group = "Features" }, { message = "^fix", group = "Bug Fixes" }, { message = "^doc", group = "Documentation" }, { message = "^perf", group = "Performance" }, { message = "^refactor", group = "Refactoring" }, { message = "^style", group = "Styling" }, { message = "^test", group = "Testing" }, { message = "^chore\\(release\\)", skip = true }, { message = "^chore", group = "Miscellaneous" }, ] filter_commits = false tag_pattern = "v[0-9]*" skip_tags = "" ignore_tags = "" topo_order = false sort_commits = "oldest" [github] owner = "owner" repo = "repo"
bash# Generate changelog git cliff -o CHANGELOG.md # Generate for specific range git cliff v1.0.0..v2.0.0 -o RELEASE_NOTES.md # Preview without writing git cliff --unreleased --dry-run
toml# pyproject.toml [tool.commitizen] name = "cz_conventional_commits" version = "1.0.0" version_files = [ "pyproject.toml:version", "src/__init__.py:__version__", ] tag_format = "v$version" update_changelog_on_bump = true changelog_incremental = true changelog_start_rev = "v0.1.0" [tool.commitizen.customize] message_template = "{{change_type}}{% if scope %}({{scope}}){% endif %}: {{message}}" schema = "<type>(<scope>): <subject>" schema_pattern = "^(feat|fix|docs|style|refactor|perf|test|chore)(\\(\\w+\\))?:\\s.*" bump_pattern = "^(feat|fix|perf|refactor)" bump_map = { "feat" = "MINOR", "fix" = "PATCH", "perf" = "PATCH", "refactor" = "PATCH" }
bash# Install pip install commitizen # Create commit interactively cz commit # Bump version and update changelog cz bump --changelog # Check commits cz check --rev-range HEAD~5..HEAD
markdown## What's Changed ### 🚀 Features {{ range .Features }} - {{ .Title }} by @{{ .Author }} in #{{ .PR }} {{ end }} ### 🐛 Bug Fixes {{ range .Fixes }} - {{ .Title }} by @{{ .Author }} in #{{ .PR }} {{ end }} ### 📚 Documentation {{ range .Docs }} - {{ .Title }} by @{{ .Author }} in #{{ .PR }} {{ end }} ### 🔧 Maintenance {{ range .Chores }} - {{ .Title }} by @{{ .Author }} in #{{ .PR }} {{ end }} ## New Contributors {{ range .NewContributors }} - @{{ .Username }} made their first contribution in #{{ .PR }} {{ end }} **Full Changelog**: https://github.com/owner/repo/compare/v{{ .Previous }}...v{{ .Current }}
markdown# Release v2.1.0 - January 15, 2024 ## Summary This release introduces dark mode support and improves checkout performance by 40%. It also includes important security updates. ## Highlights ### 🌙 Dark Mode Users can now switch to dark mode from settings. The preference is automatically saved and synced across devices. ### ⚡ Performance - Checkout flow is 40% faster - Reduced bundle size by 15% ## Breaking Changes None in this release. ## Upgrade Guide No special steps required. Standard deployment process applies. ## Known Issues - Dark mode may flicker on initial load (fix scheduled for v2.1.1) ## Dependencies Updated | Package | From | To | Reason | | ------- | ------- | ------- | ------------------------ | | react | 18.2.0 | 18.3.0 | Performance improvements | | lodash | 4.17.20 | 4.17.21 | Security patch |
bash# Feature with scope feat(auth): add OAuth2 support for Google login # Bug fix with issue reference fix(checkout): resolve race condition in payment processing Closes #123 # Breaking change feat(api)!: change user endpoint response format BREAKING CHANGE: The user endpoint now returns `userId` instead of `id`. Migration guide: Update all API consumers to use the new field name. # Multiple paragraphs fix(database): handle connection timeouts gracefully Previously, connection timeouts would cause the entire request to fail without retry. This change implements exponential backoff with up to 3 retries before failing. The timeout threshold has been increased from 5s to 10s based on p99 latency analysis. Fixes #456 Reviewed-by: @alice
! or footer| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-13 | pass→pass | 9,040 | 6,185 | -32% | 1 | 1 | 0% | 1,339 | 5,065 | +278% | 0 | 0 | — |
case-01 | pass→pass | 10,499 | 27,097 | +158% | 1 | 1 | 0% | 1,906 | 5,933 | +211% | 0 | 0 | — |
case-02 | fail→pass | 17,725 | 19,977 | +13% | 1 | 1 | 0% | 3,663 | 8,111 | +121% | 0 | 0 | — |
case-03 | fail→fail | 11,454 | 9,300 | -19% | 1 | 1 | 0% | 1,918 | 5,992 | +212% | 0 | 0 | — |
case-14 | pass→pass | 8,545 | 6,841 | -20% | 1 | 1 | 0% | 1,397 | 5,229 | +274% | 0 | 0 | — |
case-04 | pass→pass | 11,065 | 10,775 | -3% | 1 | 1 | 0% | 2,018 | 5,832 | +189% | 0 | 0 | — |
case-05 | pass→pass | 9,030 | 8,331 | -8% | 1 | 1 | 0% | 2,029 | 5,800 | +186% | 0 | 0 | — |
case-06 | fail→pass | 14,668 | 8,664 | -41% | 1 | 1 | 0% | 2,586 | 5,703 | +121% | 0 | 0 | — |
case-07 | pass→pass | 9,090 | 8,389 | -8% | 1 | 1 | 0% | 1,549 | 5,478 | +254% | 0 | 0 | — |
case-08 | fail→pass | 14,857 | 9,388 | -37% | 1 | 1 | 0% | 2,532 | 5,974 | +136% | 0 | 0 | — |
case-09 | pass→pass | 10,851 | 4,603 | -58% | 1 | 1 | 0% | 1,834 | 4,934 | +169% | 0 | 0 | — |
case-10 | pass→pass | 15,040 | 15,228 | +1% | 1 | 1 | 0% | 3,154 | 6,477 | +105% | 0 | 0 | — |
case-11 | fail→pass | 9,831 | 7,676 | -22% | 1 | 1 | 0% | 1,904 | 5,476 | +188% | 0 | 0 | — |
case-12 | fail→pass | 9,413 | 5,796 | -38% | 1 | 1 | 0% | 1,340 | 4,927 | +268% | 0 | 0 | — |
case-15 | pass→pass | 10,570 | 6,406 | -39% | 1 | 1 | 0% | 1,588 | 5,274 | +232% | 0 | 0 | — |
case-16 | fail→fail | 9,687 | 8,958 | -8% | 1 | 1 | 0% | 1,774 | 5,880 | +231% | 0 | 0 | — |
case-17 | fail→fail | 15,460 | 14,460 | -6% | 1 | 1 | 0% | 2,271 | 6,220 | +174% | 0 | 0 | — |
case-18 | fail→pass | 8,415 | 4,714 | -44% | 1 | 1 | 0% | 1,739 | 4,979 | +186% | 0 | 0 | — |
case-19 | pass→pass | 20,624 | 19,694 | -5% | 1 | 1 | 0% | 3,167 | 7,135 | +125% | 0 | 0 | — |
case-20 | pass→pass | 17,010 | 14,112 | -17% | 1 | 1 | 0% | 2,737 | 6,954 | +154% | 0 | 0 | — |
case-21 | pass→pass | 13,568 | 14,305 | +5% | 1 | 1 | 0% | 1,996 | 6,051 | +203% | 0 | 0 | — |
case-22 | pass→pass | 12,474 | 9,104 | -27% | 1 | 1 | 0% | 1,964 | 5,813 | +196% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.