Agent skill

Release To Crates

by imbue-ai in imbue-ai/offload

Cut a release of a Rust crate and publish to crates.io, with externally-gated merge and publish steps.

MITAuto-check passedDevelopment

Install Release To Crates

skills CLI
$ npx skills add imbue-ai/offload --skill release-to-crates -a claude-code

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

GitHub CLI
$ gh skill install imbue-ai/offload release-to-crates --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/imbue-ai/offload.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/release-to-crates .claude/skills/release-to-crates && 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-to-crates
GitHub stars
125
Token cost
~2.3k tokens
SKILL.md length
1,176 words
Files
1
Skills in repo
5
Repo updated
First seen
Licence
MIT

At a glance

Cut a release of a Rust crate and publish to crates.io, with externally-gated merge and publish steps.

  • Works in 9 steps: Prepare: clean tree on updated trunk,… → Commit the bump on a release branch → Push and open the PR → …
  • Development work in your project
  • SKILL.md covers When to use, Hard gates (do not skip), Detect the environment first and Step 1 — Prepare: clean tree…, plus 10 more sections
  • Calls git, gh and cargo; needs CARGO_REGISTRY_TOKEN

What it does

Release To Crates is an agent skill from imbue-ai/offload. Cut a release of a Rust crate and publish to crates.io, with externally-gated merge and publish steps.

Its SKILL.md is about 2.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. It works with Rust and Git. The repository describes itself as: Offload your test computation to ephemeral compute. The licence is MIT.

When your agent uses it

  • Development work in your project

Example prompts

  • “/release-to-crates”

Requirements

  • Python 3
  • A credential in CARGO_REGISTRY_TOKEN

Workflow steps

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

  1. Prepare: clean tree on updated trunk, reconcile versions
  2. Commit the bump on a release branch
  3. Push and open the PR
  4. Wait for CI to go green (merge gate)
  5. Merge (confirm with the human)
  6. Re-sync trunk and stage a clean publish revision
  7. Publish (publish gate)
  8. Tag a forge release
  9. Leave a clean repo

What it can do on your machine

Read from SKILL.md and the folder at commit d3675da. 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
    • glab

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

  • Network

    Links to these hosts (documentation or services it may open):

    • crates.io

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

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • CARGO_REGISTRY_TOKEN

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

Context cost

Release To Crates loads about 2.3k tokens when it runs. Until then it costs about 30 tokens; SKILL.md has 1,176 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~30
When it runs · the whole SKILL.md, loaded when a task matches
~2.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 imbue-ai/offload at commit d3675da, republished under its MIT licence (© imbue-ai). 1,176 words, ~2,324 tokens.

Download SKILL.mdSave it as .claude/skills/release-to-crates/SKILL.md (or your agent's skills folder).
name
release-to-crates
description
Cut a release of a Rust crate and publish to crates.io, with externally-gated merge and publish steps.
<!-- Generated by rust-bucket v0.9.7. DO NOT EDIT BY HAND. -->

Make the version-bump edits directly. A release bump is a mechanical release-engineering operation, not feature work, so it does not need to be routed through whatever feature-delegation process the repo otherwise follows.

When to use

  • The user asks to cut a release, bump the crate version, and/or publish to crates.io.
  • Default the bump to patch for a non-breaking change. For a breaking change, choose minor/major per semver, then confirm the chosen level with the user before proceeding.

Hard gates (do not skip)

  1. Merge gate — never merge the release PR without green CI; confirm with the user before merging unless they have explicitly pre-authorized an auto-merge.
  2. Publish gate — cargo publish is irreversible: a crates.io version can never be re-uploaded or reused. Always run cargo publish --dry-run first, and only publish from a revision whose Cargo.toml version is confirmed not yet on crates.io.

Detect the environment first

These three facts drive every branching step below:

  • VCS: if .jj/ exists → this is a colocated jujutsu/git repo; use jj for all commits/bookmarks/push, since raw git commands can corrupt jj state. Otherwise use plain git.
  • Forge CLI: GitHub → gh. GitLab → glab. If the required forge CLI is not on PATH, stop and ask the human — do not improvise a web/manual flow.
  • Crate name: read name from [package] in Cargo.toml.

Step 1 — Prepare: clean tree on updated trunk, reconcile versions

  1. Ensure a clean working copy.
    • jj: jj st shows no changes; @ is empty (or run jj new).
    • git: git status clean.
  2. Update trunk from the remote.
    • jj: jj git fetch; confirm main == main@origin.
    • git: git switch main && git pull --ff-only.
  3. Establish the two sources of truth and assert they agree:
    • Local: version under [package] in Cargo.toml.
    • Published: query the registry (needs a User-Agent):
      bash
      curl -s -H "User-Agent: <crate>-release (<you@example.com>)" \
        https://crates.io/api/v1/crates/<crate> \
        | python3 -c "import sys,json; print(json.load(sys.stdin)['crate']['max_version'])"
      (A brand-new crate returns no crate object — treat as "never published".)
    • If Cargo.toml version != crates.io max_version, stop and report — the repo is in an unexpected state (a prior release was half-finished or the tree is stale).
  4. Compute the next version (patch by default) and the branch name. Naming convention: <user>/bump-version-v<new-version> (e.g. danver/bump-version-v0.9.9).

Step 2 — Commit the bump on a release branch

  1. Create the revision/bookmark with a message up front.
    • jj: jj desc -m "Bump version to <new>" (add a body explaining the bump); then edit, then jj bookmark create <user>/bump-version-v<new> -r @.
    • git: git switch -c <user>/bump-version-v<new>.
  2. Edit Cargo.toml: set version = "<new>".
  3. Regenerate the lock file: run cargo build. This updates the crate's own entry in Cargo.lock (easy to forget; the published package must carry a consistent lockfile).
  4. Review the diff — it should touch only Cargo.toml and Cargo.lock, both just the version line. jj diff --git / git diff.
  5. Commit message: imperative subject Bump version to <new>, no trailing period, no Conventional-Commits prefix; optional body noting it's a non-breaking patch release.

Step 3 — Push and open the PR

  • Push the branch:
    • jj: jj git push -b <bookmark> --allow-new (new bookmarks need --allow-new).
    • git: git push -u origin <branch>.
  • Open the PR via the forge CLI:
    bash
    gh pr create --base main --head <branch> --title "Bump version to <new>" \
      --body "Patch release of \`<crate>\`. Non-breaking; bumps Cargo.toml and Cargo.lock
              from <old> to <new> in preparation for publishing to crates.io.
              Last published version: <old>."

Step 4 — Wait for CI to go green (merge gate)

  • Watch checks until they complete; the watch exits non-zero if any fail:
    bash
    gh pr checks <pr> --watch --interval 30
  • Confirm the final state is mergeable:
    bash
    gh pr view <pr> --json state,mergeable,mergeStateStatus
  • If any check fails: stop, report the failing check, and do not merge.

Step 5 — Merge (confirm with the human)

  • Unless the user pre-authorized auto-merge, confirm before merging.
  • Merge matching the repo's history style (this repo uses merge commits):
    bash
    gh pr merge <pr> --merge
  • Verify state=MERGED.

Step 6 — Re-sync trunk and stage a clean publish revision

  • Pull the merged trunk:
    • jj: jj git fetch; then jj new main -m "Publish <crate> <new> to crates.io".
    • git: git switch main && git pull --ff-only.
  • Sanity-check: grep '^version' Cargo.toml shows <new> (the merge brought the bump in).

Step 7 — Publish (publish gate)

  1. Dry run — validates packaging and runs the verification build without uploading:
    bash
    cargo publish --dry-run
    Warnings about test files "not included in the published package" are benign when those tests are excluded by the include list in Cargo.toml.
  2. If the dry run is clean, publish for real:
    bash
    cargo publish
    (Requires a crates.io token: cargo login, or CARGO_REGISTRY_TOKEN in the env.)
  3. Verify it went live: re-query the registry and confirm max_version == <new>.
Show full SKILL.md (486 more words)Show less

Step 8 — Tag a forge release

Publishing to crates.io does not create a git tag or a forge (GitHub/GitLab) release — do this explicitly so the version is reflected in the repo's history.

  1. Pick the tag: convention is v<new> (e.g. v0.9.6). Target the merged trunk commit that carries the new version (main HEAD from Step 6), referenced by its full SHA.
  2. Decide the notes' scope. List existing tags (git tag -l | sort -V) and find the most recent one that actually has a forge release. If earlier published versions were never tagged, scope the changelog from the last released tag and say so in the body, so the skipped versions are not lost.
  3. Draft a title (<Crate> <new>) and notes (group commits since that tag by theme; end with a compare/<lasttag>...v<new> changelog link). Write the body to a file and pass it with --notes-file to avoid shell-quoting issues.
  4. Create the release via the forge CLI — this creates the tag on the remote directly:
    bash
    gh release create v<new> --target <main-sha> --title "<Crate> <new>" \
      --notes-file <notes-file> --latest
  5. Verify: gh release view v<new> shows draft=false, the expected targetCommitish, and the tag (git ls-remote --tags origin v<new>) points at <main-sha>.

Note for jj repos: gh release create creates the tag on the GitHub side, so it does not touch local jj/git refs and is safe to run from a colocated repo.

Step 9 — Leave a clean repo

  • jj: abandon the now-empty publish revision so trunk is the head with a fresh empty @: jj abandon @ (publishing changes no tracked files). Confirm jj st is clean.
  • git: nothing to commit; ensure git status is clean.

Provider seams (for the skill abstraction)

Each step maps to a swappable provider so the skill can support other stacks:

ConcernGitHub + jj (this run)git-only / GitLab variant
Commit/branchjj desc + jj bookmark creategit switch -c
Pushjj git push -b … --allow-newgit push -u origin …
Open PR/MRgh pr createglab mr create
CI gategh pr checks --watchglab ci status / pipeline poll
Mergegh pr merge --mergeglab mr merge
Version truthCargo.toml ↔ crates.io APIsame
Publishcargo publish (+ --dry-run)same
Tag releasegh release create v<new>glab release create v<new>

Pitfalls learned in the first manual run

  • The crates.io API returns 200 with an error body if you omit a User-Agent; always send one.
  • jj bookmarks do not auto-advance; create/move the bookmark to @ before pushing.
  • New jj bookmarks require --allow-new on push.
  • Forgetting cargo build leaves Cargo.lock's own package entry stale.
  • A crates.io version is permanent — the --dry-run pre-flight is mandatory, not optional.
  • Two irreversible gates need explicit handling: the merge and the publish.
  • cargo publish does not tag the repo; the forge release (Step 8) is a separate step.
  • A version can be live on crates.io yet have no forge tag — check git tag -l before scoping release notes so a previously-published-but-untagged version is not skipped.

© imbue-ai, 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 .agents/skills/release-to-crates of imbue-ai/offload.

Open the folder on GitHubat commit d3675da

Compare with similar skills

Release To Crates 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 To Crates compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Release To Crates this skillimbue-ai/offload125—~2.3kAutomated safety check: PassMIT
Worktrunk Tend CI Guidancemax-sixty/worktrunk9.2k—~6.4kAutomated safety check: PassCustom licence
Worktrunk Release Workflowmax-sixty/worktrunk9.2k—~7.5kAutomated safety check: PassCustom licence
RustPython Stdlib UpgradeRustPython/RustPython22k—~876Automated safety check: PassMIT
BrDicklesworthstone/beads_rust1.1k—~2.7kAutomated safety check: PassMIT
Debug Tuitrasta298/keifu810—~1.3kAutomated safety check: PassMIT

Similar skills

  • Worktrunk Tend CI Guidance

    max-sixty/worktrunk

    Adds Worktrunk-specific rules to the tend CI workflows: Codecov polling, Rust test commands, labels and review criteria for pull requests handled in CI.

    9.2k GitHub stars~6.4k tokensUpdated today
    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.2k GitHub stars~7.5k tokensUpdated today
    DevelopmentAuto-check passed
  • RustPython Stdlib Upgrade

    RustPython/RustPython

    Upgrades a Python standard library module from CPython into RustPython with update_lib, then triages and marks the tests that still fail.

    22k GitHub stars~876 tokensUpdated today
    DevelopmentAuto-check passed
  • Br

    Dicklesworthstone/beads_rust

    Official skill for beadsrust (br), a local-first, dependency-aware issue tracker for AI agents.

    1.1k GitHub stars~2.7k tokensUpdated today
    DevelopmentAuto-check passed
  • Debug Tui

    trasta298/keifu

    Drive and debug the real keifu TUI autonomously via its remote-control debug server (--debug-listen) — launch headlessly, inject keys/mouse, dump the rendered screen as text, and inspect app state.

    810 GitHub stars~1.3k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Worktrunk CLI Output Rules

    max-sixty/worktrunk

    CLI output standards for worktrunk: message functions, ANSI color nesting and the shell integration that changes directory after the wt command exits.

    9.2k GitHub stars~12k tokensUpdated today
    DevelopmentAuto-check passed

More from imbue-ai/offload

  • Offload

    imbue-ai/offload

    Activate when you see offload.toml in a repo, offload referenced in build targets (justfile, Makefile, scripts), or when you need to run a large test suite in parallel.

    125 GitHub stars~3.1k tokensUpdated 15 days ago
    Auto-check passed
  • Deburr Edge Cases

    imbue-ai/offload

    Strip AI-codegen cruft from a branch — defensive checks the type system should make unrepresentable, redundant validation, speculative abstraction, no-op wrappers — while preserving load-bearing…

    125 GitHub stars~2.5k tokensUpdated 15 days ago
    Auto-check passed
  • Offload Benchmark

    imbue-ai/offload

    Run local vs Offload benchmarks for mng and sculptor, then update the Benchmarks section of the Offload README.

    125 GitHub stars~2.6k tokensUpdated 15 days ago
    Auto-check passed
  • Offload Onboard

    imbue-ai/offload

    Onboard a repository to use Offload for parallel test execution on Modal.

    125 GitHub stars~7.2k tokensUpdated 15 days ago
    Auto-check: notes

Works with

Categories

Questions about Release To Crates

What does Release To Crates do?

Cut a release of a Rust crate and publish to crates.io, with externally-gated merge and publish steps. Release To Crates is an agent skill from imbue-ai/offload.io, with externally-gated merge and publish steps.

When should I use Release To Crates?

Release To Crates fits situations like: development work in your project.

How do I install Release To Crates in Claude Code?

Run `npx skills add imbue-ai/offload --skill release-to-crates -a claude-code`. Or copy the skill folder (.agents/skills/release-to-crates in imbue-ai/offload) into .claude/skills/release-to-crates in your project. Claude Code loads it when a task matches its description.

How do I install Release To Crates in Codex?

Run `npx skills add imbue-ai/offload --skill release-to-crates -a codex`. Or copy the skill folder (.agents/skills/release-to-crates in imbue-ai/offload) into .agents/skills/release-to-crates in your project. Codex loads it when a task matches its description.

Can I use Release To Crates 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 imbue-ai/offload --skill release-to-crates -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-to-crates, .gemini/skills/release-to-crates, .github/skills/release-to-crates and .opencode/skills/release-to-crates in your project.

What does Release To Crates need to run?

Going by SKILL.md and its folder, Release To Crates needs the command-line tools its instructions call (git, gh, cargo and glab) and credentials named CARGO_REGISTRY_TOKEN. Our summary lists: Python 3; A credential in CARGO_REGISTRY_TOKEN.

Does Release To Crates access the network?

SKILL.md names 1 domain. As links in the text: crates.io. This is read from the text; nothing was executed.

Is Release To Crates 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 To Crates use?

Release To Crates is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Release To Crates use?

About 2.3k tokens (SKILL.md is roughly 9.3k 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 To Crates?

Skills that share tags, products or a category with Release To Crates: Worktrunk Tend CI Guidance (max-sixty/worktrunk, 9.2k stars), Worktrunk Release Workflow (max-sixty/worktrunk, 9.2k stars), RustPython Stdlib Upgrade (RustPython/RustPython, 22k stars) and Br (Dicklesworthstone/beads_rust, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Release To Crates?

imbue-ai (a GitHub organization) maintains it in imbue-ai/offload, which has 125 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on September 25, 2026.

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