agentleFS
cachewraithcachewraith/cachewraith-skills/skills/release-version/SKILL.md

release-version

Skill0 starsChanged 8 days agoMITView on GitHub

Bump a project's version, update the changelog, tag the release, and push it, in whatever ecosystem the project uses (Node, Python, Rust, Go, PHP, Ruby, Java, .NET, Dart, Elixir, Claude Code and Codex plugins). Invoke when the user asks to bump, release, or cut a version, tag a release, or prepare a changelog for one. Skip when they only want an ordinary commit (use checkout-commit) or want the package published to a registry.

  • Commits and pushes

We split this skill into the rules it gives an agent

8 rules. 0 are common, 6 are distinctive, and 2 are very specific to this project.

  • 0

    Common

    Most of the 7 edited versions we read keep these.

  • 6

    Distinctive

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  • could be automatic: a setting could enforce it
  1. Distinctive:

    Read the real changes since the last tag, not the last commit alone:

    line 46
  2. Distinctive:

    Run the native command, then verify nothing stale is left:

    line 67
  3. Very specific:

    If the project has a CHANGELOG.md, add an entry in the format already there — match it exactly rather than importing Keep a Changelog into …

    line 77
  4. Distinctive:

    Write entries for the user of the package, from the diff, not from commit subjects.

    line 81
  5. Distinctive:

    No changelog in the repo? Don't create one uninvited — mention it as an option.

    line 85
  6. Distinctive:

    Run the test suite before tagging.

    line 89
  7. Very specific:

    Never --force, and never move a tag that is already on the remote — a version someone may have installed does not get redefined.

    line 115
  8. Distinctive:

    If the working tree was dirty with unrelated work when you started, say so and stop before committing — a release commit that sweeps in …

    line 127

“Common” is measured: kept by at least 6 in 10 of the 7 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Release Version

Bump the version everywhere it lives, record what changed, tag it. Stop before publishing.

1. Find where the version lives

Detect the ecosystem rather than assuming one. Use the native tool where there is one — it keeps lockfiles and metadata in sync, which hand-editing does not.

EcosystemVersion lives inNative bump
Nodepackage.json + lockfilenpm version <bump> --no-git-tag-version
Pythonpyproject.toml, often also __init__.py / _version.pyuv version --bump <bump>, poetry version <bump>, hatch version <bump>
RustCargo.toml + Cargo.lockcargo set-version <version>
Gonothing in-tree — the git tag is the versiontag vX.Y.Z; major ≥ 2 also needs /vN on the module path
PHPcomposer.json (often absent by design; the tag is canonical)tag
Rubylib/**/version.rb or the gemspecedit, then bundle install to refresh Gemfile.lock
Java<version> in pom.xml, or build.gradlemvn versions:set -DnewVersion=<version>
.NET<Version> in *.csprojedit
Dart / Flutterpubspec.yamledit
Elixirmix.exsedit
Claude Code plugin.claude-plugin/plugin.jsonclaude plugin tag --push
Codex plugin.codex-plugin/plugin.json (or a root plugin.json)edit; keep it equal to .claude-plugin/plugin.json when both exist, and commit it before claude plugin tag runs

Not listed, or a project that keeps the version in several places? Grep the current version string across tracked files and treat every hit as a candidate:

git grep -nF 1.2.3 -- . ':!*.lock' ':!CHANGELOG*'   # the current version

Docs, README badges, Helm Chart.yaml, CITATION.cff, Dockerfiles, and constants files all hide copies. A release that updates the manifest and misses __version__ ships a package that lies about itself.

Monorepo with several packages? Bump only what actually changed, and say which. Ask before bumping them all in lockstep unless the repo clearly already does that.

2. Choose the bump

Read the real changes since the last tag, not the last commit alone:

git describe --tags --abbrev=0 && git log $(git describe --tags --abbrev=0)..HEAD --oneline

Semver, decided by what a consumer experiences:

  • major — a breaking change: removed or renamed public API, changed defaults, changed output format, raised the minimum runtime.
  • minor — new capability, backwards compatible.
  • patch — fix, docs, internals; nothing a caller must react to.

Below 1.0.0, breaking changes conventionally land in minor (0.4.0 → 0.5.0). Say which rule you applied and why, in one line — a bump the user disagrees with is cheap to fix before the tag and expensive after.

Pre-release? 1.2.0-rc.1, and remember most registries treat it as non-default.

3. Apply it

Run the native command, then verify nothing stale is left:

git grep -nF "<old version>" -- . ':!CHANGELOG*'

Lockfiles must be regenerated by their own tool, never edited by hand.

4. Changelog

If the project has a CHANGELOG.md, add an entry in the format already there — match it exactly rather than importing Keep a Changelog into a repo that doesn't use it. New section at the top, version and ISO date, grouped by Added / Changed / Fixed / Removed.

Write entries for the user of the package, from the diff, not from commit subjects. "Bump deps" is not an entry; "requires Node 20" is. Breaking changes get their own callout with the migration step.

No changelog in the repo? Don't create one uninvited — mention it as an option.

5. Verify, then tag

Run the test suite before tagging. A pushed tag is effectively permanent; a broken one gets re-cut as a new version, never moved.

git commit -am "chore(release): v1.2.0"     # or the repo's existing convention
git tag -a v1.2.0 -m "v1.2.0"

Match the repo's existing tag style — check git tag --list | tail. Common forms are v1.2.0, bare 1.2.0, and package@1.2.0 in monorepos. Go requires the v. Claude Code plugins use claude plugin tag, which writes {name}--v{version} and checks that plugin.json and the marketplace entry agree. It tags HEAD, so every other version file — a .codex-plugin/plugin.json included — must already be in the release commit. Without the claude CLI (in Codex, say), check that agreement yourself and create the same {name}--v{version} tag with git tag -a.

6. Push

Push the release commit and the tag — in a sandbox without network (Codex's default), with network access approved:

git push origin HEAD
git push origin v1.2.0        # or: git push --follow-tags

Never --force, and never move a tag that is already on the remote — a version someone may have installed does not get redefined. If the tag exists, cut the next version.

Pushing a tag often triggers release CI that builds and publishes. Say so in the report so the user knows what the push set in motion.

Publishing directly to a registry is a separate ask: no npm publish, cargo publish, twine upload, or gh release create unless the user requests it by name.

Report the new version, the files changed, the tag, the commit SHA, and where it was pushed.

If the working tree was dirty with unrelated work when you started, say so and stop before committing — a release commit that sweeps in someone's half-finished change is worse than a delayed release.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.