mcpbeat

Ca Release

arbiterforge/ca-release

Cut a release the only sanctioned way — SemVer bump from the commit log, a CHANGELOG section, an annotated tag. Takes the declared target's name as its only argument. The only path to a version tag.

909 tokens
context cost
the whole folder, loaded on every use
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
138
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/arbiterForge/codeArbiter --skill ca-release

The instruction itself

6 sections, as written by the author

$ca-release — tagged release

The only permitted path to a version tag. A release is a deployment-readiness assertion: the codebase at this SHA satisfies the bar for shipping. $ca-release aggregates existing compliance — it does not duplicate it.

Flow

Routes to the release skill, which resolves everything about the release from the project's declared target file, <project-root>/.codearbiter/release-targets.md — the tag prefix, the manifests, the changelog, the payload scope, and the optional checks. Nothing about any target is written here.

$ca-release takes the target's name as its only argument. When the declared file names exactly one target, a bare $ca-release uses it; when it names more, the argument is required and the skill STOPs rather than guessing. A project with no declared file at all enters the skill's own back-fill lane, which proposes a row and writes nothing without explicit confirmation.

  • Pre-flight — declared row resolved, working tree clean, not on the default branch, suite green, no blocking [CONFIRM-NN] open. Resolve LAST_TAG within that target's own tag series and scope the commit window to the row's declared payload, so a sibling target's commit never bumps this one or lands in its changelog.
  • Version — classify the window by Conventional Commits type and apply the highest-precedence bump, against a base that accounts for both the last tag and every declared manifest. Every bumping commit must carry a CHANGELOG: footer; a missing one BLOCKs and is never auto-filled.
  • Surfaces — roll the section into the declared changelog, update every declared manifest, and run the row's declared pre-tag checks. Those checks are check-only: one that mutates the tree BLOCKs.
  • Tag — commit the release edits, then compose the annotated tag. Never push it or publish a Release without explicit user authorization — publication is a separate decision.

Arguments

  • [target] — the name of a row in the declared target file (e.g. the name in [ca]). Optional only when exactly one target is declared. An unrecognised name STOPs; it is never resolved to a guess.

There are no version, --auto, or --dry-run arguments. The version is always derived from the commit log and the declared manifests — supplying one by hand is the thing this lane exists to prevent.

Routes to

release (${CLAUDE_PLUGIN_ROOT}/routines/release/SKILL.md), which is authoritative for the phase contents and gates summarized above.

When NOT to use

  • Tagging an in-progress branch → land work first via $ca-feature / $ca-fix.
  • Pushing an already-composed tag → that is a separate user-authorized step.
  • A changelog only → it is a phase output, not a standalone deliverable.
  • Creating a declared target file ahead of a release → that is context-creation's job, or the skill's back-fill lane at release time.

Hard gate

MUST NOT compose a tag on a red suite. MUST NOT guess the version — it is derived from the commit log and the declared manifests. MUST NOT auto-fill a missing CHANGELOG: footer. MUST NOT resolve an unrecognised or ambiguous target to a guess. MUST NOT write to the default branch or force-push. MUST NOT push the tag or publish a Release without explicit user authorization. Any BLOCK may be bypassed only via $ca-override.

How to use it

Copy the folder

Take arbiterforge/ca-release from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.