release
Skill2 starsChanged 39 days agoBSD-3-ClauseView on GitHub
Automates the release process for this Rust project and its VS Code extension. Use when creating a new release, preparing a version bump, or publishing to GitHub/crates.io/the extension registries. Triggers on terms like "release", "publish", "version bump", "create tag".
- Commits and pushes
196 other projects use a version of this.
Adopted by
Most recently taken up by
- BlockRunAI/ClawRoutertheir own version, first seen Nov 11, 2026
- Yeachan-Heo/oh-my-claudecodetheir own version, first seen Nov 9, 2026
- zxcvbn-ts/zxcvbntheir own version, first seen Nov 9, 2026
- TechbeeAT/jtxBoardtheir own version, first seen Nov 9, 2026
- ddnexus/pagytheir own version, first seen Nov 9, 2026
- zerx-lab/FluxDowntheir own version, first seen Nov 9, 2026
Used with
Projects with it also use create-agent-adapter, changelog-style and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
MicrosoftSkillcreate-agent-adapter
Technical guide for creating a new Paperclip agent adapter. Use when building a new adapter package, adding support for a new AI coding tool (e.g. a new CLI agent, API-based agent, or custom process), or when modifying the adapter system. Covers the required interfaces, module structure, registration points, and conventions derived from the existing claude-local and codex-local adapters.
Also in 5 projects that use this
GrinvSkillchangelog-style
Turn a commit range into CHANGELOG.md entries following common-changelog style. Use when finishing a PR or cutting a release, to write/fix the [Unreleased] section's entries — moving [Unreleased] under a new dated version heading is a separate, automated step (see the release skill / scripts/sync-version.ts), not this skill's job.
Also in 4 projects that use this
GrinvSkilldocs-consistency-check
Check README/manifest.json/server.json/CHANGELOG.md/AGENTS.md and docs/*.md for drift against the actual registered tools and source. Use after adding, renaming, or removing a tool, or as part of a live-audit pass.
Also in 4 projects that use this
Microsoft AzureSkillcomponent-release
Prepares a verifiable Agent Landing Zone UI release. Use for release branches, VERSION, changelog entries, tags, release notes, and compatibility evidence; never publish without explicit human approval.
Also in 4 projects that use this
Microsoft AzureSkilldocumentation-consistency
Keeps AI Landing Zone contributor, user, and operator documentation aligned with shipped Bicep behavior. Use for parameters, defaults, outputs, topology, deployment flow, operations, or releases.
Also in 8 projects that use this
rivet-devSkilllaunch-graphics
Generate agentOS marketing/launch graphics (launch & social heroes, code-snippet cards) from the committed generators in docs-internal/graphics. Use when asked to make, update, or render an agentOS launch image, social image, "agentOS Apps" graphic, or technical code-snippet image.
Also in 3 projects that use this
- +3 more from Grinv
Other versions196 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 196
- paperclipai/paperclip★ 114ksame name
- modelcontextprotocol/servers★ 92ksame name
- remotion-dev/remotion★ 72ksame name
- traefik/traefik★ 65ksame name
- usememos/memos★ 64ksame name
- tw93/Pake★ 64ksame name
- amruthpillai/reactive-resume★ 46ksame name
- reactive-resume/reactive-resume★ 46ksame name
- AmruthPillai/Reactive-Resume★ 45ksame name
- Yeachan-Heo/oh-my-claudecode★ 41ksame name
186 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository15 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- changelogSkill
- commit-twiddleSkill
- format-tableSkill
- update-adr-inventorySkill
- update-snapshotsSkill
- version-bumpSkill
- changelogSkill
- commit-twiddleSkill
- format-tableSkill
- releaseSkill
- update-adr-inventorySkill
- update-snapshotsSkill
- version-bumpSkill
The file
We split this skill into the rules it gives an agent
10 rules. 0 are common, 6 are distinctive, and 4 are very specific to this project.
0
Common
Most of the 186 edited versions we read keep these.
6
Distinctive
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 13
Commit hashes change on merge: Create tags only after the merge, on the rebased commits found by subject on origin/main.
- Very specific: line 27
Read them from origin/main, not the local checkout, which may be behind:
- Distinctive: line 66
Update any docs that are outdated before proceeding.
- Distinctive: line 76
Read the rendered section.
- Very specific: line 93
Use a subshell so later steps run from the repository root.
- Very specific: line 260
Only the host's own asset can be run.
- Distinctive: line 286
Do not block on this — it's an out-of-band manual step the human performs after the automated release lands.
- Distinctive: line 362
If the crate was published and must no longer be selected by Cargo, yank that version:
- Distinctive: line 368
If the GitHub release itself must go:
- Distinctive: line 374
Delete a tag only when its workflows failed before anything reached a registry, and then only to push the corrected one:
“Common” is measured: kept by at least 6 in 10 of the 186 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.
Files
Automated Release Skill
This skill performs the complete end-to-end release process for omni-dev, from version bump to verified publication. docs/RELEASE.md is the canonical description; keep the two in sync.
Ground Rules
mainis protected and merges through a merge queue that rebases. Release preparation goes through a pull request. Nevergit push origin main, nevergh pr merge --admin.- Commit hashes change on merge. Create tags only after the merge, on the rebased commits found by subject on
origin/main. Never tag a local commit. - Two artefacts, two commits, two tags. The crate (
vX.Y.Z,Cargo.toml,CHANGELOG.md) and the VS Code extension (vscode-vA.B.C,editors/vscode/package.json,editors/vscode/CHANGELOG.md) are versioned independently. A release normally cuts both; skip one only if it has nothing new since its last tag.
Execution Steps
Phase 1: Preparation
- Verify Clean State
Abort if working directory is not clean.git status --porcelain - Get Current Versions
Read them from
origin/main, not the local checkout, which may be behind:git fetch origin main git show origin/main:Cargo.toml | grep -m1 '^version = ' | sed 's/version = "\(.*\)"/\1/' git show origin/main:editors/vscode/package.json | jq -r .version - Get the Last Release Tag per Artefact
A bare
git describe --tagsreturns whichever tag is nearest, which may be the other artefact's, andv*also matchesvscode-v*:git describe --tags --abbrev=0 --match 'v*' --exclude 'vscode-*' origin/main # crate git describe --tags --abbrev=0 --match 'vscode-v*' origin/main # extension - Analyze Changes Since Last Release
git log --oneline vPREV..origin/main git log --oneline vscode-vPREV..origin/main -- editors/vscode - Determine Version Bump (for each artefact that ships)
- MAJOR: Breaking changes after 1.0 (removed APIs, changed signatures)
- MINOR: New features (new commands, flags, integrations), or breaking changes before 1.0
- PATCH: Bug fixes, docs, refactoring
- Cut a Release Branch from the current
origin/main(a separate worktree is fine):git switch -c release/vX.Y.Z origin/main
Phase 2: Documentation & Changelog Review
Check if Docs Need Updates Review documentation for accuracy against new features:
docs/RELEASE.md- Release process still accurate?README.md- Features and examples up to date?AGENTS.md- AI guidance still relevant?.agents/skills/- Skills reflect current workflows?
Update any docs that are outdated before proceeding.
- Assemble CHANGELOG.md (crate) from the fragments in
changelog.d/(#2213; seechangelog.d/README.md)- Reconcile the fragments against
git log --oneline vPREV..origin/main: a commit with a user-visible effect and no fragment (a wrongChangelog: nonetrailer) gets one now. - Preview, then write the section:
It addspython3 scripts/changelog.py collect --component crate --version X.Y.Z --dry-run python3 scripts/changelog.py collect --component crate --version X.Y.Z## [X.Y.Z] - <today>under an empty## [Unreleased](sections Added, Changed, Deprecated, Removed, Fixed, Security, CI/CD, Documentation; entries by issue number), updates the compare links at the bottom, and deletes the consumed fragments. The first release after #2213 also carries the hand-written[Unreleased]text into the section verbatim. - Read the rendered section; the release commit is the one place the changelog is edited by hand.
- Reconcile the fragments against
- Assemble editors/vscode/CHANGELOG.md (extension) from
changelog.d/vscode/- Both registries render a Changelog tab from it, so every published version needs an entry.
- Reconcile against
git log --oneline vscode-vPREV..origin/main -- editors/vscodeandls changelog.d/vscode/. python3 scripts/changelog.py collect --component vscode --version A.B.C(preview with--dry-runfirst). This changelog has no compare links.
Phase 3: Version Update
- Update Cargo.toml
- Change
version = "X.Y.Z"to new version (building in Phase 4 refreshesCargo.lock)
- Change
- Update the Extension Version (bumps
package.jsonand the two omni-dev entries inpackage-lock.json, not dependency ranges)
Use a subshell so later steps run from the repository root.(cd editors/vscode && npm version A.B.C --no-git-tag-version --ignore-scripts --allow-same-version) git diff --stat -- editors/vscode # expect only package.json and package-lock.json, at most 3 changed lines--allow-same-versioncovers apackage.jsona feature commit already bumped: without it npm stops atVersion not changedand the stale lockfile entries are never repaired.
Phase 4: Quality Checks
- Run Crate Quality Checks
Abort if any check fails.cargo build --release cargo test cargo clippy -- -D warnings cargo fmt --all -- --check - Run Extension Checks
Abort if any check fails.(cd editors/vscode && npm ci && npm run typecheck && npm run build && npm test && npm run package) - Check the Extension's Publish Tokens
The Marketplace and Open VSX are published independently, so an expired token fails the run without keeping the release from the other registry (
vscode-v0.9.0,v0.10.0andv0.11.0all failed at the Marketplace step with an expiredVSCE_PAT). If a token is available in the environment, verify it; never print it and never read credential files to find one:VSCE_PAT=<token> npx @vscode/vsce verify-pat rust-works OVSX_PAT=<token> npx ovsx verify-pat rust-worksgh secret listshows only when a secret was set, not whether it works. If a token cannot be verified or fails, tell the user before tagging the extension and carry on with the crate if they agree.
Phase 5: Commit, Pull Request and Merge Queue
- Commit the Crate Release
The subject must keep this exact form: Phase 6 finds the rebased commit by it.git add -A -- Cargo.toml Cargo.lock CHANGELOG.md changelog.d ':!changelog.d/vscode' git commit -m "$(cat <<'EOF' chore(release): prepare release vX.Y.Z - Update version from PREV to X.Y.Z - Assemble CHANGELOG.md from the changelog.d fragments EOF )" - Commit the Extension Release
git add editors/vscode/package.json editors/vscode/package-lock.json editors/vscode/CHANGELOG.md && git add -A -- changelog.d/vscode git commit -m "$(cat <<'EOF' chore(release): prepare vscode extension release vA.B.C - Update version from PREV to A.B.C in package.json and package-lock.json - Assemble the extension CHANGELOG.md from the changelog.d/vscode fragments EOF )" - Open the Pull Request and Enqueue It
omni-dev git commit message lint origin/main..HEAD git push -u origin release/vX.Y.Z gh pr create --title "chore(release): prepare release vX.Y.Z and vscode extension vA.B.C" --body "Release preparation." gh pr checks --watch gh pr merge <PR> # enqueues; never --admin - Wait for the Merge
Poll untilgh pr view <PR> --json state,mergeCommitstateisMERGED. Ifmainmoved and the branch now conflicts, rebase the branch ontoorigin/main, resolve it, push and enqueue again. If the queue ejects the entry, fix the failing check on the branch and re-enqueue.
Phase 6: Tag the Rebased Commits
- Locate the Commits as They Landed on
mainPhases 6 and 7 each have a crate half and an extension half; do only the halves for the artefacts being released. The dots are escaped because--greptakes a regular expression:
Abort if a lookup you need is empty. If a fix had to land after the release commit, tag the fix's hash instead: it carries the correct files, and the subject lookup would return the original commit.git fetch origin main CRATE=$(git log origin/main --format=%H -1 --grep='^chore(release): prepare release vX\.Y\.Z$') EXT=$(git log origin/main --format=%H -1 --grep='^chore(release): prepare vscode extension release vA\.B\.C$') - Create Annotated Tags on Those Commits (not on
HEAD)git tag -a vX.Y.Z -m "Release version X.Y.Z <summary of key changes> " "$CRATE" git tag -a vscode-vA.B.C -m "VS Code extension A.B.C <summary of key changes> " "$EXT" - Verify the Tagged Commits Before Pushing
release.ymldoes not compare the tag withCargo.toml, so verify locally while a bad tag can still be deleted:
On any failure,# On main git merge-base --is-ancestor vX.Y.Z origin/main && echo ok git merge-base --is-ancestor vscode-vA.B.C origin/main && echo ok # Versions at the tag: all must read the new version git show vX.Y.Z:Cargo.toml | grep -m1 '^version = ' git show vX.Y.Z:Cargo.lock | grep -A1 '^name = "omni-dev"$' git show vscode-vA.B.C:editors/vscode/package.json | jq -r .version git show vscode-vA.B.C:editors/vscode/package-lock.json | jq -r '.version, .packages[""].version' # Nothing left under [Unreleased] at either tag: both must print nothing git show vX.Y.Z:CHANGELOG.md | awk '/^## \[Unreleased\]/{f=1;next} /^## \[/{f=0} f && NF' git show vscode-vA.B.C:editors/vscode/CHANGELOG.md | awk '/^## \[Unreleased\]/{f=1;next} /^## \[/{f=0} f && NF'git tag -d <tag>, fix it in a follow-up pull request and start again from Phase 5. Do not push a bad tag. - Push the Tags
git push origin vX.Y.Z vscode-vA.B.C # only the tags you created
Phase 7: Monitor CI Release
- Wait for the Release Workflows
Poll the GitHub Actions workflows until completion:
# Get the run ID for the workflow triggered by each tag gh run list --workflow=release.yml --branch=vX.Y.Z --limit=1 --json databaseId,status,conclusion gh run list --workflow=vscode-extension-release.yml --branch=vscode-vA.B.C --limit=1 --json databaseId,status,conclusion - Poll Until Complete
Loop with 30-second intervals:
gh run view <run_id> --json status,conclusionstatus: "completed"+conclusion: "success"= Successstatus: "completed"+conclusion: "failure"= Failed (show logs)status: "in_progress"orstatus: "queued"= Keep polling
- On Failure: Show Logs
For an extension run that failed at a publish step (typically an expiredgh run view <run_id> --log-failedVSCE_PAT), the other registry was still attempted. Tell the user to renew the secret, then re-run on the same tag;--skip-duplicateleaves a registry that already has the version alone:gh run rerun <run_id> --failed
Phase 8: Verification
- Verify GitHub Release
Expectgh release view vX.Y.Z --json assets --jq '.assets[].name'omni-dev-linux.tar.gz,omni-dev-linux-arm64.tar.gz,omni-dev-macos-arm64.tar.gzandomni-dev-windows.zip. A missing asset means a matrix leg failed, andpublish-cratesis blocked with it. After a transient failure (runner outage, network)gh run rerun <run_id> --failedrecovers it, aftergh release delete-asset vX.Y.Z <asset-name>if the upload then reports the asset already exists. A defect in the code or the workflow needs a patch release, because a re-run uses the tag's commit. Do not continue without the asset. - Verify crates.io Publication
cargo search omni-dev --limit 1 - Verify the Released Binary Reports the New Version
The short SHA's length varies with the machine that built the binary, so compare by prefix. Only the host's own asset can be run. Extract each of the others the same way and rund=$(mktemp -d) gh release download vX.Y.Z --pattern 'omni-dev-macos-arm64.tar.gz' --dir "$d" # pick the host platform's asset tar xzf "$d/omni-dev-macos-arm64.tar.gz" -C "$d" "$d/omni-dev" --version # omni-dev X.Y.Z (<short sha> <date>) git rev-parse 'vX.Y.Z^{commit}' # full SHA; it must start with <short sha>file "$d/omni-dev"to confirm the architecture its name claims, notablyomni-dev-linux-arm64.tar.gz(ELF 64-bit ... ARM aarch64) againstomni-dev-linux.tar.gz(x86-64). - Verify the Extension
The workflow's publish steps are the evidence: both
Publish to VS Code MarketplaceandPublish to Open VSXmust be green, not skipped. Open VSX can be read back; the Marketplace cannot be relied on, since read APIs lag a publish andvsce showcan answernot foundfor a live extension:curl -s https://open-vsx.org/api/rust-works/omni-dev/latest | jq -r .version - Report Success
Display:
- New crate and extension versions
- GitHub release URL
- crates.io URL
- Registry status for the extension
- Changelog summary
Phase 9: Manual Glama Listing Update
Prompt the User to Update Glama The Glama MCP listing pins its Docker build to a specific commit SHA and only rebuilds when that SHA is bumped. This step is a web-UI action that cannot be automated from here.
Display to the user:
- The short release SHA:
git rev-parse --short 'vX.Y.Z^{commit}'(the^{commit}matters: the tag is annotated, so the bare tag name returns the tag object's hash, not a commit) - The admin URL: https://glama.ai/mcp/servers/rust-works/omni-dev/admin/dockerfile
- A pointer to the procedure:
docs/glama-listing.md
Do not block on this — it's an out-of-band manual step the human performs after the automated release lands.
- The short release SHA:
Error Handling
| Error | Action |
| Dirty working directory | Abort with message to commit/stash changes |
| Quality check fails | Abort with specific failure details |
Direct push to main rejected | Expected: main is protected. Use the pull request and merge queue |
| Queue ejects the entry | Show the failing check, fix on the release branch, re-enqueue |
| Tag verification fails | Delete the local tag, fix via a follow-up PR; never push a bad tag |
| CI workflow fails | Show failed job logs, suggest fixes |
| Registry publish fails | Other registry still attempted; renew the token, gh run rerun --failed |
| Timeout (>15 min) | Provide manual verification commands |
Polling Configuration
- Initial delay: 10 seconds (allow workflow to start)
- Poll interval: 30 seconds
- Timeout: 15 minutes
- Max polls: 30
CI Workflows Triggered
Pushing a v* tag triggers (the !vscode-* exclusion keeps the extension's tags out of both):
| Workflow | Purpose |
ci.yml | Tests, linting, Windows build (Coverage is skipped on tags, #1289) |
release.yml | GitHub release, binaries, crates.io publish |
Pushing a vscode-v* tag triggers:
| Workflow | Purpose |
vscode-extension-release.yml | Verify tag, build/test/package, publish to both registries |
Important Notes
- Do NOT manually run
gh release create- CI handles this automatically - The release workflow creates the GitHub release from the tag
- Cross-platform binaries (Linux, macOS, Windows) are built and attached
- crates.io publication uses
CARGO_REGISTRY_TOKENsecret - Extension publication uses the
VSCE_PATandOVSX_PATsecrets; each registry is skipped if its token is unset - The coverage action (
action-works/patchcov-action) installs patchcov independently of omni-dev releases. Changes to coverage behavior require a published patchcov version; an omni-dev release does not unblock them
Commands Reference
# Check workflow status
gh run list --workflow=release.yml --limit=5
gh run list --workflow=vscode-extension-release.yml --limit=5
# Watch workflow in real-time
gh run watch <run_id>
# View workflow logs
gh run view <run_id> --log
# View failed job logs only
gh run view <run_id> --log-failed
# Re-run only the failed jobs on the same tag
gh run rerun <run_id> --failed
# Verify release
gh release view vX.Y.Z
# Check crates.io
cargo search omni-dev --limit 1Failed Release Recovery
If the release has already been published, keep its tag and commit as a record of the published version. Correct the problem on main through a pull request, then prepare a new patch release following docs/RELEASE.md. Do not blindly revert the branch tip: another commit may have landed since, and a direct push to main is rejected. A registry will not take the same version twice, so the extension is fixed forward the same way.
If the crate was published and must no longer be selected by Cargo, yank that version:
cargo yank --version X.Y.ZIf the GitHub release itself must go:
gh release delete vX.Y.Z --yesDelete a tag only when its workflows failed before anything reached a registry, and then only to push the corrected one:
git tag -d vX.Y.Z
git push --delete origin vX.Y.ZDoes it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
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.

