From claudekit
Generates SemVer-compliant version bumps and changelog entries from git diffs. Use when cutting releases, tagging, or publishing with precise change summaries.
npx claudepluginhub duthaho/claudekit --plugin claudekitThis skill uses the workspace's default tool permissions.
A workflow for cutting a clean release: bump the version, write changelog
Plans and executes software releases: inventories git changes, applies semantic versioning, generates changelog and release notes, updates files, creates tags, and publishes to GitHub. Use before new versions.
Automates changelog generation from commits, PRs, and releases following Keep a Changelog format. Use for release workflows, generating release notes, or standardizing commit conventions.
Automates changelog generation from Git commits, PRs, and releases in Keep a Changelog format using Conventional Commits and Semantic Versioning for release workflows.
Share bugs, ideas, or general feedback.
A workflow for cutting a clean release: bump the version, write changelog
entries that reflect the actual diff, tag, publish. The skill exists because
the most common release-time failure isn't the publishing mechanism — it's the
changelog that says "various improvements" or "performance enhancements"
without naming what changed. Users reading the notes can't decide whether to
upgrade; engineers debugging six months later can't bisect on the release.
This skill enforces that the changelog is built from the diff, not from a
remembered list of features. Used after code-review-loop and before
publishing/tagging.
v1.2.0, v2.0.0-rc1, etc.)CHANGELOG.md after a feature merge in projects with a
rolling-changelog policyGoal: Pick the correct SemVer level.
Inputs: The set of changes since the last release.
Actions:
git log <last-tag>..HEAD --oneline.0.x.y), treat MINOR as breaking-allowed and
PATCH as the conservative bump. The 0.x.y SemVer license to break is real
but should still be exercised consciously.Output: The new version number, with the rationale: v1.2.0 → v1.3.0 (MINOR: added X feature, no breaking changes).
Goal: A CHANGELOG.md entry built from actual changes, not memory.
Inputs: The change list from Step 1.
Actions:
CHANGELOG.md. If it doesn't exist, create one following Keep a
Changelog (keepachangelog.com) format.## [<version>] - <YYYY-MM-DD>.### Added (new features)### Changed (changes to existing functionality)### Deprecated (features marked for removal)### Removed (deleted features)### Fixed (bug fixes)### Security (vulnerability fixes)Output: A CHANGELOG.md entry that reads like the diff, not like marketing
copy.
Goal: Bump the version where the package's tools look for it.
Inputs: The new version number from Step 1.
Actions:
package.json (Node)pyproject.toml / setup.py (Python)Cargo.toml (Rust)plugin.json / marketplace.json (Claude Code plugin)VERSION file (where applicable)__version__ constant, build banner), regenerate it.Output: All version manifests aligned to the new version.
Goal: One commit that captures the release.
Inputs: Updated manifests + updated CHANGELOG.
Actions:
Release v1.3.0 (MINOR) or follow project convention.Output: A single release commit on the release branch (or main, depending on the project's branching model).
Goal: Make the release discoverable to consumers.
Inputs: The release commit.
Actions:
git tag -a v1.3.0 -m "v1.3.0 (MINOR): added X feature".git push origin v1.3.0.Output: Tagged, published release. Tag matches the version; published artifact matches the tag.
Goal: Confirm consumers can actually consume the release.
Inputs: A published release.
Actions:
Output: A confirmation that the release works for a fresh consumer.
| Excuse | Why it sounds reasonable | Why it's wrong | What to do instead |
|---|---|---|---|
| "It's just a patch — I don't need to write changelog entries for every fix." | Patch releases are routine. Per-fix entries can feel like ceremony. | The changelog is a contract with consumers. A patch with no entries reads as "no notable changes" — but the consumer who runs npm update and gets a regression has no way to bisect on the release notes because the notes are empty. The 60 seconds of writing the entry buys hours of debuggability later. | Write one entry per fix. Even one line ("Fixed off-by-one in pagination — #234"). The cost is small; the value is durable. |
| "The diff is small — I can write the changelog from memory." | A small diff really is reconstructable from memory. | Memory drifts in even short timescales. The PR you wrote yesterday already has details (the exact behavior change, the constraint you handled) that aren't in your head today. The changelog written from memory says "improved X" instead of "X now respects Y under condition Z," which is the actual content the consumer needs. | Build the changelog from git log <last-tag>..HEAD. Even for small diffs. The 30 seconds of running the command and reading the commits is the discipline. |
| "Nobody reads changelogs anyway." | Some consumers really don't read changelogs. Auto-update bots upgrade silently. | "Nobody reads them" is true until someone debugs a regression and bisects on releases. The changelog is the bisect index. The empty changelog turns "which release introduced this?" into a manual diff comparison; the populated changelog turns it into a 30-second read. | Write the changelog for the future debugger, not for the casual reader. The audience is the engineer six months from now who needs to know what changed in v1.3.0. |
| "I'll bump the version after I publish — the registry will tell me what to use." | Some registries do auto-increment. Letting the tool decide feels efficient. | Auto-increment doesn't know your SemVer intent. A breaking change auto-bumped as PATCH ships under a version consumers will pick up by default — they get the breaking change without warning. The version is your communication; only you know what the changes mean. | Bump the version before publishing. Step 1 → Step 3 in this skill. The version reflects intent, not just sequence. |
| "I'll skip the post-release smoke check — CI tested everything." | CI does run the test suite. | CI tests the source tree, not the published artifact. A package that builds and tests fine in CI may publish broken because of a missing file in the package manifest, an unset environment variable in the publish step, or a registry-specific transformation that broke something. The smoke check on a fresh install catches the published-vs-source gap. | Run the smoke check (Step 6). Fresh container, install from registry, run the basic flow. 5 minutes; it catches the class of bugs CI cannot. |
| "I'll batch multiple unrelated fixes into one release commit." | Fewer commits is cleaner. | The release commit is the bisect target; a clean release commit (only the bump and changelog) is bisect-friendly. Mixing fixes into the release commit ties the release to the unrelated fixes — git revert of the release commit reverts the fixes too. | Land fixes in their own commits before the release. The release commit only contains the version bump and changelog. Atomic in Step 4 means atomic. |
| Checkpoint | Required artifact | What "no evidence" looks like |
|---|---|---|
| End of Step 1 | Version bump rationale: <old> → <new> (<level>: <reason>) | "Bumping the version." |
| End of Step 2 | Changelog entries built from git log output, not memory | "Various improvements." |
| End of Step 3 | All manifests show the same version | "Updated package.json." |
| End of Step 4 | An atomic release commit with only manifest + changelog changes | A release commit that also includes feature fixes. |
| End of Step 5 | Tag pushed; published artifact verified to match tag | "Tagged it." |
| End of Step 6 | Smoke check output from a fresh-install environment | "I'll trust it." |