Agent skill

Release Procedure

by xberg-io in xberg-io/alef

Cut, tag, and publish an alef release end-to-end. An agent skill from xberg-io/alef.

MITAuto-check passedDevelopment

Install Release Procedure

skills CLI
$ npx skills add xberg-io/alef --skill release-procedure -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install xberg-io/alef release-procedure --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/xberg-io/alef.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.ai-rulez/skills/release-procedure .claude/skills/release-procedure && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
release-procedure
GitHub stars
100
Token cost
~3k tokens
SKILL.md length
1,434 words
Files
1
Skills in repo
6
Repo updated
First seen
Licence
MIT

At a glance

Cut, tag, and publish an alef release end-to-end. An agent skill from xberg-io/alef.

  • Works in 10 steps: Pre-flight → Update CHANGELOG.md → Set the version via Taskfile → …
  • Tasks that involve Changelog and release notes
  • SKILL.md covers When to apply, Hard rules, Procedure and Anti-patterns, plus 1 more section
  • Calls git, gh and cargo; reaches index.crates.io

What it does

Release Procedure is an agent skill from xberg-io/alef. Cut, tag, and publish an alef release end-to-end. Use this skill any time the user asks for a release, a version bump, a hotfix tag, or a CHANGELOG roll-up in this repo. Covers the full pipeline: changelog, version sync via Taskfile, Cargo.toml verification, poly lint pass, atomic commit (no AI signatures, no --no-verify when avoidable), git tag, and gh release create (not just a tag).

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Changelog and release notes and Linting and formatting. It works with Rust and Git. The repository describes itself as: Generate fully-typed, lint-clean language bindings for Rust libraries across 16 languages. The licence is MIT.

When your agent uses it

  • Tasks that involve Changelog and release notes
  • Tasks that involve Linting and formatting

Example prompts

  • “/release-procedure”

Workflow steps

10 steps, taken from the step headings in SKILL.md.

  1. Pre-flight
  2. Update CHANGELOG.md
  3. Set the version via Taskfile
  4. Lint pass
  5. Tests for changed behavior
  6. Commit
  7. Tag and publish
  8. Verify
  9. Downstream pins
  10. Local install and cleanup (optional)

What it can do on your machine

Read from SKILL.md and the folder at commit fc04366. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • gh
    • cargo
    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • index.crates.io

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Release Procedure loads about 3k tokens when it runs. Until then it costs about 102 tokens; SKILL.md has 1,434 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~102
When it runs · the whole SKILL.md, loaded when a task matches
~3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from xberg-io/alef at commit fc04366, republished under its MIT licence (© xberg-io). 1,434 words, ~3,032 tokens.

Download SKILL.mdSave it as .claude/skills/release-procedure/SKILL.md (or your agent's skills folder).
name
release-procedure
description
Cut, tag, and publish an alef release end-to-end. Use this skill any time the user asks for a release, a version bump, a hotfix tag, or a CHANGELOG roll-up in this repo. Covers the full pipeline: changelog, version sync via Taskfile, Cargo.toml verification, poly lint pass, atomic commit (no AI signatures, no --no-verify when avoidable), git tag, and `gh release create` (not just a tag).
license
MIT

Alef Release Procedure

Cut a new alef version with a verifiable, reproducible procedure. Skip no step. Every release step has a concrete verification — never assume; always check.

When to apply

  • User asks to cut/release/publish a new version
  • User asks to bump alef version
  • After a stack of fix/feat commits that need a version cycle
  • After a breaking change is committed (must bump MINOR pre-1.0, MAJOR otherwise)
  • When consumer repos need a new pin

Hard rules

  1. Always update CHANGELOG.md — every release has a dated heading and one bullet per user-visible change. Move entries from [Unreleased] into the new version section. Group under ### Added, ### Changed (BREAKING), ### Fixed, ### Removed. Never tag a version with an empty section.
  2. Always run poly fmt --fix . then poly lint . to fix lint/format issues before publishing. Re-stage anything the formatter rewrites. Only commit with --no-verify if a hook is genuinely broken in a way unrelated to the change — and then file an issue.
  3. No AI signatures in commit messages, tag messages, or release notes. No Co-Authored-By: Claude, no Generated by .... Never.
  4. Atomic commits — chore(release): X.Y.Z carries only the version bump and changelog roll. Code fixes live in their own commits, merged before the release commit.
  5. Add tests for any fix that changed behavior. A release that includes a fix without a regression test is a release that will regress.
  6. Use the Taskfile for version setting — never hand-edit Cargo.toml, alef.toml, src/core/template_versions.rs, or schemas/alef.schema.json. task set-version rewrites all four in lockstep.
  7. Publish with gh release create — a bare git tag is not a release. The Publish workflow triggers on release: types: [published], so the GitHub release is literally what runs cargo publish; a tag push alone runs nothing at all. This is not theoretical: v0.55.2 and v0.55.3 were tagged and pushed with no release created, and neither ever reached crates.io. Alef ships as a single crate, so one release means exactly one cargo publish — no multi-crate sequencing, no index propagation race.

Procedure

0. Pre-flight
bash
git status              # working tree clean (or only release-prep diffs)
git fetch origin        # inspect freshness without rewriting local commits

If the release branch has diverged from its upstream, stop and ask how to reconcile it. Do not rebase or merge after committing unless the user explicitly asks for it.

1. Update CHANGELOG.md
  • Open CHANGELOG.md.
  • Move every bullet under ## [Unreleased] into a new section ## [X.Y.Z] - YYYY-MM-DD (today's date, ISO format).
  • Re-create an empty ## [Unreleased] heading at the top.
  • If the release contains anything tagged ! (breaking) in commit messages, surface it under ### Changed (BREAKING) with explicit migration guidance.
  • Verify no entries are lost: git diff CHANGELOG.md should show only adds in the new section + the moved bullets.
  • When folding scratchpad or agent-drafted bullets into a section, strip every heading line from the source first — write plain bullets only, never nested #/## lines. A stray heading from a pasted source reparents everything below it under the wrong version. Before and after any CHANGELOG edit, grep -c '^## \[' must be unchanged and grep -c '^# ' must be exactly 1 (the file's single top-level title).
  • poly fmt --fix CHANGELOG.md has previously demoted every heading below the first (rumdl's autofix for a second level-1 heading treats it as a title and reparents everything that follows). poly.toml's [fmt.markdown.rumdl] disable already includes "MD025" as the guard — do not remove it. Re-run the grep -c '^## \[' / grep -c '^# ' check after any poly fmt pass over this file regardless.
2. Set the version via Taskfile
bash
task set-version -- X.Y.Z           # bumps Cargo.toml, alef.toml, ALEF_REV; regenerates
                                    # schemas/alef.schema.json; runs cargo update

The set-version task is the only sanctioned way to bump versions in this repo. It rewrites Cargo.toml (package.version), alef.toml (alef_version), and src/core/template_versions.rs::ALEF_REV, regenerates schemas/alef.schema.json (cargo run -- schema --schema-version), then runs cargo update — all in one shot. Never hand-edit any of these — they must stay in lockstep. The regenerated schema shows up in the release diff (its $id and version both carry the new version); that is expected output, not drift.

After the task finishes, verify:

bash
grep -E '^version' Cargo.toml                       # package version
grep -E '^alef_version' alef.toml                   # alef.toml mirror
grep ALEF_REV src/core/template_versions.rs        # template version pin
grep '"version"' schemas/alef.schema.json           # regenerated schema

All four must match X.Y.Z (the ALEF_REV line and the schema $id both include a leading v).

3. Lint pass
bash
poly fmt --fix .
poly lint .

Re-stage any files the formatter rewrote. If a lint fails for a real reason, fix that reason — never bypass with --no-verify to push past a lint failure.

4. Tests for changed behavior

For every fix: or feat: rolled into this release, confirm there is a test that would have caught the bug or covers the new surface. Add the test now if missing — release commit goes on top.

5. Commit
bash
git add -A
git commit -m "chore(release): X.Y.Z"

The commit subject is exactly chore(release): X.Y.Z. No body unless the release is large enough to warrant a summary; never add AI attribution.

If gitfluff or another commit-msg hook rewrites the subject in an unhelpful way, prefer fixing the hook config over --no-verify. When the user has explicitly authorized --no-verify for this run, document which hooks were skipped in the release notes.

6. Tag and publish

Push main before tagging. Tagging first and pushing second means a rebase or a rejected push after the tag exists leaves the tag pointing at a commit origin/main never contains — --force-with-lease does not work on tags, so recovering means deleting and recreating the tag. Push main, confirm it landed, then tag against the now-confirmed commit:

bash
git push origin main
git tag -a vX.Y.Z -m "vX.Y.Z"
git push origin vX.Y.Z

Then create the GitHub release — this is the part most likely to be skipped and the most important:

bash
gh release create vX.Y.Z \
  --title "vX.Y.Z" \
  --notes-from-tag \
  --verify-tag

If the changelog entry is rich enough to use as release notes, replace --notes-from-tag with --notes-file <(awk '/^## \[X.Y.Z\]/,/^## \[/' CHANGELOG.md | head -n -1) or build a small notes file from the new CHANGELOG section.

For pre-releases (RC, beta), add --prerelease.

Show full SKILL.md (538 more words)Show less
7. Verify

The release object existing is not proof the crate shipped — verify the registry, not just the GitHub release:

bash
gh release view vX.Y.Z                                  # release exists with notes
git ls-remote --tags origin vX.Y.Z                       # tag pushed
gh run list --workflow=publish.yaml --json databaseId,status,conclusion -L 5
gh run view <run-id> --json jobs \
  --jq '.jobs[] | select(.name | test("crates")) | {name, conclusion}'
curl -sI -H 'User-Agent: alef-release (contact: <maintainer email>)' \
  https://index.crates.io/al/ef/alef | head -1     # 200 if the version is on the index

Notes:

  • A failed publish job may still have published (e.g. it failed on a later step after cargo publish already succeeded) — check the crates.io index before assuming a red run means nothing shipped, and before re-running.
  • A skipped job in the run is not the same as a passing one — a publish run that reports overall success while a job inside it was skipped can still mean the crate never moved. Read individual job conclusions, not just the run's headline status.
  • If a run must be retried, gh run rerun --failed <run-id> re-runs only the failed jobs; confirm which ones actually need it first.
  • If none of the above resolve, redo the failed step — do not move on.
8. Downstream pins

For any consumer repo that pins this version, open a follow-up PR that bumps the pin. Don't bundle that into the release commit.

9. Local install and cleanup (optional)

To pick up the release locally, cargo install --path . --force from the repo root (see the local-alef-install rule — never cargo install alef from crates.io for testing a pre-release change). Then task clean (cargo clean + rm -rf .alef/) to reclaim space once the release artifacts are no longer needed.

Anti-patterns

  • Tagging without a gh release create — the crate is never published at all. Publish fires on release: published, not on the tag. This silently lost v0.55.2 and v0.55.3; both are tagged on origin and absent from crates.io.
  • Empty ## [Unreleased] rolled forward to a new version section.
  • Hand-editing version = "..." in Cargo.toml, alef_version in alef.toml, or ALEF_REV in src/core/template_versions.rs instead of using task set-version.
  • Fix commits with no test added.
  • --no-verify to skip a real lint failure.
  • AI attribution in commit/tag/release text.
  • Squashing release prep with code fixes — keep chore(release): X.Y.Z atomic.
  • Treating a green publish run as proof of a shipped crate without checking for a skipped job inside it.
  • Re-running a failed publish job without first checking whether it already published — a second cargo publish for the same version fails loudly, but the confusion it causes is avoidable.
  • Tagging before pushing main (see step 6) — recovering from a stranded tag means delete-and-recreate, not --force-with-lease.
  • Chasing a Publish run stuck in queued as a code bug — this is commonly account-wide runner capacity, not this repo. Report it once with the run link; if it is genuinely wedged rather than merely slow, gh run cancel --force-cancel <run-id> before retrying (cancel alone can leave a queued run deadlocked).

Quick reference

StepCommandWhat it verifies
Pre-flightgit status && git fetch originClean tree + remote state
Changelogmanual edit of CHANGELOG.mdEvery change is documented
Versiontask set-version -- X.Y.Z then grep -E '^version' Cargo.tomlCrate version updated
Lintpoly fmt --fix . && poly lint .Lint clean
Commitgit commit -m "chore(release): X.Y.Z"Atomic release commit
Push maingit push origin mainTag will land on a commit origin/main actually has
Taggit tag -a vX.Y.Z -m "vX.Y.Z" && git push origin vX.Y.ZTag exists remotely
Publishgh release create vX.Y.Z --notes-from-tag --verify-tagGitHub release exists
Verifygh run view <run-id> --json jobs --jq '...test("crates")...' + crates.io index curlCrate actually shipped, not just the release object

© xberg-io, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .ai-rulez/skills/release-procedure of xberg-io/alef.

Open the folder on GitHubat commit fc04366

Compare with similar skills

Release Procedure next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Release Procedure compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Release Procedure this skillxberg-io/alef100—~3kAutomated safety check: PassMIT
Releasexin2017338/lynx-proxy502—~1.1kAutomated safety check: PassMIT
Worktrunk Release Workflowmax-sixty/worktrunk9.1k—~6.9kAutomated safety check: PassCustom licence
PR Pushicebear0828/codex-proxy1.8k—~2.2kAutomated safety check: NotesCustom licence
PR Pushicebear0828/codex-proxy1.8k—~2.3kAutomated safety check: NotesCustom licence
Prepare Releasefrozenlib/parse-display193—~1.3kAutomated safety check: PassApache-2.0

Similar skills

  • Release

    xin2017338/lynx-proxy

    Publish a new release version of Lynx Proxy. An agent skill from xin2017338/lynx-proxy.

    502 GitHub stars~1.1k tokensUpdated 24 days ago
    DevelopmentAuto-check passed
  • Worktrunk Release Workflow

    max-sixty/worktrunk

    Walks a maintainer through cutting a Worktrunk release: sync the release branch, pass two test gates, review the changes, then publish.

    9.1k GitHub stars~6.9k tokensUpdated today
    DevelopmentAuto-check passed
  • PR Push

    icebear0828/codex-proxy

    Package the current working changes into a standards-compliant codex-proxy pull request: branch hygiene, commit message linting, CHANGELOG prompt, conventional commit, push, and gh pr create against…

    1.8k GitHub stars~2.2k tokensUpdated today
    DevelopmentAuto-check: notes
  • PR Push

    icebear0828/codex-proxy

    Package the current working changes into a standards-compliant codex-proxy pull request: branch hygiene, commit message linting, CHANGELOG prompt, conventional commit, push, and gh pr create against…

    1.8k GitHub stars~2.3k tokensUpdated today
    DevelopmentAuto-check: notes
  • Prepare Release

    frozenlib/parse-display

    Prepare parse-display release changes before publishing with a Rust Cargo script when nightly Cargo is available.

    193 GitHub stars~1.3k tokensUpdated 4 days ago
    DevelopmentAuto-check passed
  • Leanspec Development

    codervisor/leanspec

    Development workflows, commands, publishing, CI/CD, changelog management, and contribution guidelines for LeanSpec.

    296 GitHub stars~2.5k tokensUpdated 4 mo ago
    DevelopmentAuto-check passed

More from xberg-io/alef

  • Alef

    xberg-io/alef

    Use Alef correctly for Rust-to-polyglot binding generation. An agent skill from xberg-io/alef.

    100 GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Binding Audit

    xberg-io/alef

    Audit bindings for coverage gaps — verify every public Rust item is exposed across all generated language bindings.

    100 GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • Jinja Codegen

    xberg-io/alef

    Mechanics of alef's Minijinja template system: which templateenv module to call, how to register a template, inline-template rules, and engine settings.

    100 GitHub stars~735 tokensUpdated today
    Auto-check passed
  • Regen Audit

    xberg-io/alef

    Treat running alef generate/alef all/alef verify in a consumer repo as an audit, not a build step.

    100 GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Alef's dominant defect shape: two components read the same config or IR and act on it differently.

    100 GitHub stars~1.1k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Release Procedure

What does Release Procedure do?

Cut, tag, and publish an alef release end-to-end. An agent skill from xberg-io/alef. Release Procedure is an agent skill from xberg-io/alef. Cut, tag, and publish an alef release end-to-end.

When should I use Release Procedure?

Release Procedure fits situations like: tasks that involve Changelog and release notes; tasks that involve Linting and formatting.

How do I install Release Procedure in Claude Code?

Run `npx skills add xberg-io/alef --skill release-procedure -a claude-code`. Or copy the skill folder (.ai-rulez/skills/release-procedure in xberg-io/alef) into .claude/skills/release-procedure in your project. Claude Code loads it when a task matches its description.

How do I install Release Procedure in Codex?

Run `npx skills add xberg-io/alef --skill release-procedure -a codex`. Or copy the skill folder (.ai-rulez/skills/release-procedure in xberg-io/alef) into .agents/skills/release-procedure in your project. Codex loads it when a task matches its description.

Can I use Release Procedure in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add xberg-io/alef --skill release-procedure -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/release-procedure, .gemini/skills/release-procedure, .github/skills/release-procedure and .opencode/skills/release-procedure in your project.

What does Release Procedure need to run?

Going by SKILL.md and its folder, Release Procedure needs the command-line tools its instructions call (git, gh, cargo and curl).

Does Release Procedure access the network?

SKILL.md names 1 domain. In commands or code: index.crates.io; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Release Procedure safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Release Procedure use?

Release Procedure is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Release Procedure use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Release Procedure?

Skills that share tags, products or a category with Release Procedure: Release (xin2017338/lynx-proxy, 502 stars), Worktrunk Release Workflow (max-sixty/worktrunk, 9.1k stars), PR Push (icebear0828/codex-proxy, 1.8k stars) and PR Push (icebear0828/codex-proxy, 1.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Release Procedure?

xberg-io (a GitHub organization) maintains it in xberg-io/alef, which has 100 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on October 9, 2026.

Source: xberg-io/alef on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.