Skill v1.0.1
currentAutomated scan100/100+4 new
version: "1.0.1" name: release description: "[Maintainer workflow for the antigravity-booster repository only] Release a new version of antigravity-booster (bumps version, tags git, pushes, triggers npm publish)" license: MIT user-invocable: true metadata: version: 1.0.0 internal: true last-verified: 2026-07-21
Release
Use this skill to release a new version of antigravity-booster. It is plain git, npm and gh steps, so it runs the same in Claude Code, Codex and agy.
Arguments
- First positional argument: Version bump type — "patch", "minor", or "major". Defaults to "minor" if not specified.
Steps
- Determine the new version. Read the current version from
./package.json. Apply the requested semver bump (default "minor") to compute the new version number.
- Verify preconditions — all must pass before any changes are made:
a. Working tree is clean: ``bash git status --porcelain `` Must be empty. If not, abort and tell the user to commit or stash changes first.
b. On the main branch: ``bash git branch --show-current `` Must return main. If not, abort.
c. Up to date with remote: ``bash git fetch origin git status -uno `` Output must not contain "Your branch is behind". If it does, abort and tell the user to pull first.
d. repository.url is set in ./package.json: ``bash node -e "const p=JSON.parse(require('fs').readFileSync('package.json','utf8')); process.exit(p.repository?.url ? 0 : 1)" ` Must exit 0. If missing, abort and print: > **repository.url** is required for --provenance publishing. Add it to ./package.json: > "repository": { "type": "git", "url": "https://github.com/ORG/REPO.git" }`
e. No file: dependencies in ./package.json: ``bash grep -c '"file:' package.json ` Must return 0. If any file: deps are found, abort and print: > file: dependencies cannot be published to npm. Replace them with registry versions before releasing. > Found: (list each file:` dep and its key)
f. Tests pass: ``bash npm test `` Must exit 0. If tests fail, abort — do not proceed.
g. Build and generated artifacts verification: ``bash npm run build git status --porcelain --untracked-files=all dist/ vendor/ `` Must exit 0 and git status must be empty. If any dist/ or vendor/ files were modified or untracked, abort and inspect build artifacts first.
- Bump version and update changelog:
``bash npm version <patch|minor|major> --no-git-tag-version ` This atomically updates the "version" field in both ./package.json and ./package-lock.json. Also update ./plugin.json to match (lockstep integrity requirement): `bash node -e 'const fs = require("node:fs"); const p = "./plugin.json", j = JSON.parse(fs.readFileSync(p, "utf8")), v = JSON.parse(fs.readFileSync("./package.json", "utf8")).version; j.version = v; fs.writeFileSync(p, JSON.stringify(j, null, 2) + "\n");' ` Move the ## [Unreleased] entries in ./CHANGELOG.md under a new ## [X.Y.Z] — YYYY-MM-DD heading. Then regenerate reference documentation: `bash node website/scripts/gen-reference.mjs ``
- Commit the bump on a release branch. main is protected by the
main-protection ruleset (1 approving review + code-owner review), and its only bypass is pull_request mode — so a direct git push origin main is rejected for everyone, including admins. The bump has to land via a PR. ``bash git checkout -b release/vX.Y.Z git add package.json package-lock.json plugin.json CHANGELOG.md website/generated/*.mdx git commit -m "chore: bump version to X.Y.Z" git push -u origin release/vX.Y.Z gh pr create --title "chore: release X.Y.Z" --body "Version bump + changelog for X.Y.Z." ``
- Get the PR reviewed and merged. Wait for CI and an approval, then merge.
Do not tag before it lands: .github/workflows/publish.yml refuses to publish a tag that is not an ancestor of main, so a tag on an unmerged commit fails the release.
- Tag the merged commit on main and push the tag:
``bash git checkout main && git pull origin main # Confirm you are tagging the bump you just merged. node -p "require('./package.json').version" # must equal X.Y.Z git tag vX.Y.Z git push origin vX.Y.Z ` Tag creation is restricted by the **release tags** ruleset (refs/tags/v*`), which grants an always-bypass to the maintainer role — so this push succeeds for a maintainer and is refused for everyone else. That tag push is what triggers the publish.
- Confirm completion. Print a summary stating the released version
(was A.B.C, now X.Y.Z) and that tag vX.Y.Z was pushed to origin, then remind the user:
> GitHub Actions will publish to npm on tag push, but the job waits for > approval first: it runs under the npm-publish protected environment, > which requires a reviewer. Approve it under the repo's Actions tab. > > The publish job verifies the tag is an ancestor of main and that it > matches the version in ./package.json, then publishes with > --provenance --access public via npm OIDC trusted publishing (no > long-lived npm token). > > If the publish job fails with ENEEDAUTH, trusted publishing is not > configured for antigravity-booster on npmjs.com. See > docs/github-rulesets/README.md § "npm trusted publishing (OIDC)".