agentleFS
nrjdalalnrjdalal/zerostarter/.agents/skills/release/SKILL.md

release

Skill65 starsChanged 15 days agoMITView on GitHub

Cut a production release by promoting canary to main. Use when asked to cut, ship, or publish a release, tag a version, or push canary to production.

196 other projects use a version of this.

Adopted by

Most recently taken up by

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.
  • MicrosoftSkill

    create-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

  • GrinvSkill

    changelog-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

  • GrinvSkill

    docs-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 AzureSkill

    component-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 AzureSkill

    documentation-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-devSkill

    launch-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

The file

We split this skill into the rules it gives an agent

3 rules. 0 are common, 2 are distinctive, and 1 is very specific to this project.

  • 0

    Common

    Most of the 186 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Every PR meant for this release is squash-merged into canary.

    line 34
  2. Distinctive:

    If it is missing (canary just became ahead, or the workflow has not run yet), trigger it and re-list:

    line 50
  3. Distinctive:

    Backfill is automatic: If a prior run pushed the commit and tag but died before publishing, the next run recreates the missing GitHub …

    line 88

“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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Release

Releases ship by promoting canary to main. The release number is decided before the merge by .github/workflows/auto-canary-into-main.yml; everything after it (changelog, tag, GitHub release) is automated by .github/workflows/auto-release.yml, and .github/workflows/cli-release.yml publishes the CLI, from the tag once the release is cut and as a canary prerelease on pushes before it; cutting a release is one deliberate merge, because main deploys to production.

How it works

  • Work reaches canary through squash-merged PRs (canary is the default branch).
  • Every push to canary runs auto-canary-into-main.yml, which opens (or reuses) a draft PR canary -> main titled ci(release): 🚀 merge canary into main, and then moves the root package.json version forward to what the window has earned so far (bun run release:version --write: changelogen's bump applied to the last tag's version, kept if the tree is already ahead), committing ci(version): bump to vX.Y.Z when it moves. It skips when main is missing or canary is not ahead of it.
  • Merging that PR into main with a merge commit fires auto-release.yml (trigger: a PR into main whose head branch is canary, merged). It then, working on canary:
    • takes the version from the tree (bun run release:version prints the decision: the larger of the tree and what the window earned from the last tag) and runs changelogen from the last v* tag for the changelog section,
    • regenerates .github/assets/graph-build.svg from a fresh production build,
    • commits ci(changelog): update changelog and bump version directly to canary,
    • tags vX.Y.Z at the merge boundary and pushes branch + tag atomically,
    • publishes a GitHub release whose notes mirror the changelog section.

The notes are derived after the merge; the version is already in the tree, so main and production carry the released number on the merge itself.

Versioning

  • Default: the bump changelogen computes from the window's commits, applied to the last tag's version: at 0.x a feature is a patch (0.1.7 -> 0.1.8) and a breaking commit a minor; past 1.0 the usual semver. The draft-PR workflow writes it into package.json on every human push to canary (ci(version): bump to vX.Y.Z), so previews show the upcoming number and production shows it on the release merge. A missing tag counts as v0.0.0, which is a fresh fork's first window.
  • To ship a chosen version (for example a minor 0.2.0): hand-set version in the root package.json on canary before cutting the release. It stays as long as it is ahead of what the window earns; a breaking window lifts a smaller pin to the minor it earns. A tree below the last tag stops both workflows loudly (package.json is at X, below the last release vY), and a version equal to the last tag is treated as untouched.
  • The changelog drops ci-type commits (changelog.config.json). A release needs at least one commit that is neither ci(changelog) nor ci(version) and at least one - entry in the new section, or auto-release no-ops (No releasable changelog content).

Cutting a release

1. Confirm the content is on canary

Every PR meant for this release is squash-merged into canary. Check nothing that should ship is still open:

gh pr list --base canary --state open

2. (Optional) Pin the version

For anything bigger than the window earns, set version in the root package.json on canary first, via a normal PR, ahead of the last v* tag. Otherwise skip this: the tree already holds the number the window has earned.

3. Find the release PR

gh pr list --head canary --base main --state open

If it is missing (canary just became ahead, or the workflow has not run yet), trigger it and re-list:

gh workflow run auto-canary-into-main.yml --ref canary

4. Merge to production

Mark it ready, let its build run, and merge with a merge commit (never squash). This is the production action; do it only on the user's explicit go-ahead.

gh pr ready <n>
# the head was pushed by the workflow, so GitHub holds that commit's build for approval instead of running it
RUN=$(gh run list --branch canary --workflow auto-check-build.yml --json databaseId,conclusion,headSha \
  --jq "[.[] | select(.headSha == \"$(gh pr view <n> --json headRefOid --jq .headRefOid)\")][0] | select(.conclusion == \"action_required\") | .databaseId")
[ -n "$RUN" ] && gh api -X POST "repos/{owner}/{repo}/actions/runs/$RUN/approve" && gh run watch "$RUN" --exit-status
gh pr review <n> --approve
gh pr merge <n> --merge

When the release PR's head is a commit the workflow pushed, the ci(version) bump or the changelog commit, its pull_request build lands as action_required and never runs on its own, and without it the PR merges with no build check at all. Approving the run starts it. When the last push was a human merge that moved no version, the head is that merge, the build runs by itself, and the lookup above finds nothing to approve. Wait for it to pass before merging: the merge state reads CLEAN once it does. If canary moves while the release PR is open, the new head brings a new held run and a stale approval, so approve both again.

5. Verify

gh run list --workflow=auto-release.yml -L 1     # wait for success
gh release list -L 1                             # new vX.Y.Z, marked Latest

The ci(changelog): ... commit and the new tag land on canary, so pull canary to pick them up. Production deploys from main. Done when the vX.Y.Z tag exists, the GitHub release is published as latest, and production serves the new build.

Notes

  • Merge method is load-bearing. canary PRs squash; the canary -> main release PR merges with a merge commit so main keeps shared history with canary and future release diffs stay clean. The main ruleset enforces this.
  • The version bump is a token push. The draft-PR workflow pushes ci(version) with the workflow token, which starts no further workflows: no loop, and the bump commit carries no checks of its own until the next human merge. main's ruleset asks for a review, not status checks, so a window with a single PR still releases; a fork that requires status checks on main sees its release PR wait for one more merge.
  • The CLI publishes through npm Trusted Publishing. npm trusts cli-release.yml in this repo through id-token: write (OIDC); there is no NPM_TOKEN secret, so never add one back. When a release's publish leg fails, gh workflow run cli-release.yml --ref canary publishes the latest tag's version; a re-run of the failed run replays the workflow file it started with.
  • Never tag or push a release by hand. auto-release owns tagging and the atomic branch + tag push; a hand-cut tag collides and fails the next run.
  • The changelog commit lands on canary directly, not through a PR (it is mechanical, generated from already-reviewed PR titles). Pull canary after a release.
  • Backfill is automatic. If a prior run pushed the commit and tag but died before publishing, the next run recreates the missing GitHub release instead of double-bumping.
  • A window of only chore(deps) commits cannot release. changelogen hardcodes dropping non-breaking chore(deps) from the changelog (beyond what changelog.config.json can override), so the new section has no entries and auto-release no-ops with No releasable changelog content. Title dependency refreshes build(deps) (the gh-commit skill carries the rule), or land a releasable commit in the same window and re-run.

Download now (ZIP)

Does 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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.