Agent skill · Documentation

release

The single permitted path to a version tag, for any target declared in the project's .codearbiter/release-targets.md. Routed to when the user invokes /release on a non-default branch with a green suite. Takes the declared target as its one argument, derives the SemVer bump from Conventional-Commits history since that target's last tag, rolls the commits into that target's CHANGELOG, writes an annotated tag in that target's namespace, and on authorization publishes it as a GitHub Release with the changelog section as its notes. A release commit, if needed, routes through commit-gate; the tag an

arbiterForgegithub.com/arbiterForgeGitHub ↗
claude-codecodexAGPL-3.0
Install
npx skills add arbiterForge/codeArbiter --skill release --agent claude-code

Same command for any agent — swap --agent for codex, cursor, copilot.

Facts
Files in the skill folder: 1
SKILL.md size: 79 KB
Bundled scripts: none
Path: core/surface/skills/release/SKILL.md
Open the folder on GitHub →
Where it comes from
Stars: 138 · +1 this week
Language: Python

Weekly change comes from our own snapshots, not the repository page — it measures attention, not adoption.

Review
written from the skill's own SKILL.md · Aug 5, 2026

What it does

Derives a version bump for a chosen release target from the commit history since that target's last tag, updates the target's changelog, creates a tag within the target's namespace, and, upon explicit authorization, publishes a GitHub Release with the changelog as notes. It requires exactly one argument—the target name—and enforces that if multiple targets exist, a target must be provided. If no target is provided for a single-target project, it uses the declared single target mechanically. The process uses a shared helper to read the declared release targets, resolve the target row, and obtain fields such as tag prefix, changelog, manifest, and payload. Commands and helper scripts are invoked exactly as specified, with an interpreter resolution step to choose between python3 and python, and with careful handling to avoid executing row-provided values until after human authorization. The flow emphasizes reading a single row per target and explicitly avoiding per-target prose or inline evaluation of the row values. If the target is unrecognized, the operation stops; missing declared files trigger a back-fill path rather than an outright failure. The interpreter and helper invocations are designed to work across POSIX environments, with noted caveats for Windows hosts.

How it works

  • The skill reads the declared targets from {{PROJECT_DIR}}/.codearbiter/release-targets.md to determine available targets.
  • It resolves the target to a row via the helper: TAG_PREFIX=$("$PY" "{{PLUGIN_ROOT}}/hooks/_releaselib.py" tag-prefix $TARGET) and reads fields using show-row with --field (e.g., CHANGELOG, MANIFEST, PAYLOAD, ARTIFACTS, REBUILD, PRE_TAG, etc.).
  • It derives the version bump by inspecting the Conventional-Commits history since the target's last tag, and updates the target's CHANGELOG accordingly.
  • It writes an annotated tag in the target's namespace using the resolved TAG_PREFIX and the derived version.
  • It, upon explicit authorization, publishes a GitHub Release with the target’s changelog notes. The tag and Release are not published without authorization.
  • It enforces that if more than one target is declared, the user must specify the target; otherwise, it STOPs and asks for clarification. It resolves the omitted-single-target case mechanically by listing targets first, then proceeding.
  • It includes a detailed interpreter resolve mechanism to choose between python3 and python and uses a consistent invocation pattern: "$PY" "{{PLUGIN_ROOT}}/hooks/<script>" <args>.
  • It handles potential Windows-specific issues by documenting that Windows-hosted rows may require concrete interpreters in pre-tag, rebuild, and generate rows, and notes Windows shell behavior for subprocesses.

When to use it

  • When you want to create a new release tag for a specific declared target on a non-default branch with a green test suite, using the target’s designated namespace and changelog.
  • When a project declares multiple release targets and you need to specify which one to release for the next version.

What it can touch

  • The release target’s namespace for the tag and the corresponding GitHub Release notes.
  • The target’s CHANGELOG, MANIFEST, GENERATED_MANIFEST, and other related fields as read from the target row via show-row, and any commands defined in PRE_TAG, REBUILD, GENERATE, etc., for that target’s row.

Caveats

  • A row that is not declared or unrecognized TARGET halts the operation; missing or malformed declared files trigger back-fill or parse errors rather than guesses.
  • Windows hosting introduces interpreter considerations: Windows-hosted rows must keep a concrete interpreter in pre-tag, rebuild, and generate commands; using "$PY" may fail under cmd.exe.
  • The release requires explicit authorization to publish the tag and GitHub Release; the tag and Release are never published without authorization.
  • There may be multiple manifests; all manifests must be asserted to equal the derived version.
From the SKILL.md

# release The single permitted path to a version tag. Routed to when the user invokes `/release [target]`. Derive the bump from the commit log, update the changelog, tag — nothing more. **One command, any number of declared targets.** A project declares one or more release targets in `{{PROJECT_DIR}}/.codearbiter/release-targets.md` (grammar and parser contract: `{{PLUGIN_ROOT}}/hooks/_releaselib.py`'s module docstring). `/release` takes the target's name as its only argument. When `$TARGET` is omitted and the declared file names exactly one target, that target is used — a single-target project's bare `/release` behaves exactly as it always has. When more than one target is declared, `$TARGET` is required; STOP and ask rather than guessing which one a bare invocation meant. **Resolve the omitted-single-target case mechanically, never by assumption** (MEDIUM, adversarial review 2026-07-31: `tag-prefix` itself takes `$TARGET` as a REQUIRED positional argument and has no way to express "the implicit one", so naming it here was not itself enough — the mechanical step that turns an omitted target into a concrete name before `tag-prefix` is ever called has to be spelled out too): run `"$

What's inside
Steps it walks through
  1. Targets
  2. Back-fill (no declared file yet)
  3. Pre-flight
  4. Phase 1 — Version & changelog · gate: BLOCK
  5. Phase 2 — Tag & report · gate: BLOCK
  6. Phase 3 — Publish · gate: STOP
  7. Recovering from a bad release
  8. Hard rules
Commands it runs
mkdir -p "$(git rev-parse --show-toplevel)/.codearbiter/.markers"
touch "$(git rev-parse --show-toplevel)/.codearbiter/.markers/release-targets-authoring"
rm -f "$(git rev-parse --show-toplevel)/.codearbiter/.markers/release-targets-authoring"
git status --porcelain -- :/ ':(exclude,top).codearbiter/gate-events.log' ':(exclude,top).codearbiter/.markers/'
More from codeArbiter
All skills →
About this skill
What does the release skill do?

The single permitted path to a version tag, for any target declared in the project's .codearbiter/release-targets.md. Routed to when the user invokes /release on a non-default branch with a green suite. Takes the declared target as its one argument, derives the SemVer bump from Conventional-Commits history since that target's last tag, rolls the commits into that target's CHANGELOG, writes an annotated tag in that target's namespace, and on authorization publishes it as a GitHub Release with the changelog section as its notes. A release commit, if needed, routes through commit-gate; the tag an

How do I install it?

Run `npx skills add arbiterForge/codeArbiter --skill release --agent claude-code` — it drops the skill into your project so the agent can pick it up. Swap the --agent value for codex, cursor or copilot if you use one of those.

Where does this skill come from?

From arbiterForge/codeArbiter, a repository with 138 stars. We read it straight from the repository tree rather than a submitted listing, so what you see here is what is actually published.

Is a popular skill a good skill?

Not necessarily. Stars measure attention, not adoption — a repository can trend for a week and be abandoned. That is why we show the weekly change from our own snapshots next to the total, instead of a single flattering number.

Keep going