
Changelog Generator
Turn Conventional Commits between tags into Keep a Changelog release notes and lint commit subjects before you cut a semver release in CI.
Install
npx skills add https://github.com/alirezarezvani/claude-skills --skill changelog-generatorWhat is this skill?
- generate_changelog.py parses git ranges, infers semver bump, and renders markdown or JSON with optional file prepend
- commit_linter.py validates commit subjects against Conventional Commits with strict text output for CI gates
- Keep a Changelog section ordering: Security, Added, Changed, Deprecated, Removed, Fixed
- References for CI integration, formatting rules, and monorepo strategies
- One bullet per user-visible change with migration notes called out for breaking changes
Adoption & trust: 541 installs on skills.sh; 17.5k GitHub stars; 3/3 security scanners passed (skills.sh audits).
Recommended Skills
Journey fit
Release notes and commit discipline belong on the Ship shelf where you prepare safe, communicable launches—even though the same scripts run in ongoing Operate release cadence. Launch subphase covers user-visible release communication; changelog generation is the artifact buyers and users read on ship day.
Common Questions / FAQ
Is Changelog Generator safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Changelog Generator
# Changelog Generator Automates release notes from Conventional Commits with Keep a Changelog output and strict commit linting. Designed for CI-friendly release workflows. ## Quick Start ```bash # Generate entry from git range python3 scripts/generate_changelog.py \ --from-tag v1.2.0 \ --to-tag v1.3.0 \ --next-version v1.3.0 \ --format markdown # Lint commit subjects python3 scripts/commit_linter.py --from-ref origin/main --to-ref HEAD --strict --format text ``` ## Included Tools - `scripts/generate_changelog.py`: parse commits, infer semver bump, render markdown/JSON, optional file prepend - `scripts/commit_linter.py`: validate commit subjects against Conventional Commits rules ## References - `references/ci-integration.md` - `references/changelog-formatting-guide.md` - `references/monorepo-strategy.md` ## Installation ### Claude Code ```bash cp -R engineering/changelog-generator ~/.claude/skills/changelog-generator ``` ### OpenAI Codex ```bash cp -R engineering/changelog-generator ~/.codex/skills/changelog-generator ``` ### OpenClaw ```bash cp -R engineering/changelog-generator ~/.openclaw/skills/changelog-generator ``` # Changelog Formatting Guide Use Keep a Changelog section ordering: 1. Security 2. Added 3. Changed 4. Deprecated 5. Removed 6. Fixed Rules: - One bullet = one user-visible change. - Lead with impact, not implementation detail. - Keep bullets short and actionable. - Include migration note for breaking changes. # CI Integration Examples ## GitHub Actions ```yaml name: Changelog Check on: [pull_request] jobs: changelog: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: python3 engineering/changelog-generator/scripts/commit_linter.py \ --from-ref origin/main --to-ref HEAD --strict ``` ## GitLab CI ```yaml changelog_lint: image: python:3.12 stage: test script: - python3 engineering/changelog-generator/scripts/commit_linter.py --to-ref HEAD --strict ``` # Monorepo Changelog Strategy ## Approaches | Strategy | When to use | Tradeoff | |----------|-------------|----------| | Single root changelog | Product-wide releases, small teams | Simple but loses package-level detail | | Per-package changelogs | Independent versioning, large teams | Clear ownership but harder to see full picture | | Hybrid model | Root summary + package-specific details | Best of both, more maintenance | ## Commit Scoping Pattern Enforce scoped conventional commits to enable per-package filtering: ``` feat(payments): add Stripe webhook handler fix(auth): handle expired refresh tokens chore(infra): bump base Docker image ``` **Rules:** - Scope must match a package/directory name exactly - Unscoped commits go to root changelog only - Multi-package changes get separate scoped commits (not one mega-commit) ## Filtering for Package Releases ```bash # Generate changelog for 'payments' package only git log v1.3.0..HEAD --pretty=format:'%s' | grep '^[a-z]*\(payments\)' | \ python3 scripts/generate_changelog.py --next-version v1.4.0 --format markdown ``` ## Ownership Model - Package maintainers own their scoped changelog - Platform/infra team owns root changelog - CI enforces scope presence on all commits touching package directories - Root changelog aggregates breaking changes from all packages for visibility #!/usr/bin/env python3 """Lint commit messages against Conventional Commits. Input sources (priority order): 1) --input file (one commit subject per line) 2) stdin lines 3) git range via --from-ref/--to-ref Use --strict for non-zero exit on violations. """ import argparse import json import re import subprocess import sys from dataclasses import dataclass, asdict from pathlib import Path from typing import List, Optional CONVENTIONAL_RE = re.compile( r"^(feat|fix|perf|refactor|docs|test|build|ci|chore|security|deprecated|remove)" r"(\([a-z0-9._/-]+\))?(!)?:\s+.{1,120}$" ) class CLIError(Exception): """Raised for expected