Skip to content
Back to skills

Release

ASecurity

Cut a bnot release — compute next version, push main, and create a GitHub release that triggers the build/sign/notarize workflow.

  • 10 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 26, 2026
developmentgobashrailsgit

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add ababol/bnot --skill release --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Release?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Release
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/ababol-release/badge)](https://www.skillsdirectory.com/skills/ababol-release)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: release
description: Cut a bnot release — compute next version, push main, and create a GitHub release that triggers the build/sign/notarize workflow.
disable-model-invocation: true
argument-hint: "[patch|minor|major|x.y.z]   # omit for patch bump"
allowed-tools: Bash(gh:*), Bash(git:*)
---

Cut a new bnot release. The user invoked `/release $ARGUMENTS`.

## How bnot releases work

The release is triggered by creating a GitHub Release (`gh release create`) with a semver tag. The `release.yml` workflow fires on `release: created`, reads the version from the tag, writes it into `apps/desktop/tauri.conf.json` and `apps/desktop/Cargo.toml` **inside the runner only** (not committed back), then builds, signs, notarizes, and uploads the universal `.app` + DMG + updater artifacts.

**Never bump version strings in the repo.** The workflow owns them.

## Steps

### 1. Pre-flight checks (fail fast)

Run these in parallel, then report any failures and stop:

- `git rev-parse --abbrev-ref HEAD` — must be `main`. If not, stop and ask.
- `git status --porcelain` — must be empty (no dirty working tree). If dirty, stop and tell the user to commit or stash first. Do NOT auto-commit.
- `git log origin/main..HEAD --oneline` — capture the unpushed commits; they're the release payload.
- `gh auth status` — must be authenticated. If not, stop.

### 2. Compute the next version

Get the latest release tag:

```
gh release list --limit 1 --json tagName,isDraft,isPrerelease
```

Strip the leading `v` to get the base version (e.g., `v0.1.16` → `0.1.16`). Then apply `$ARGUMENTS`:

- empty / `patch` → bump patch (`0.1.16` → `0.1.17`)
- `minor` → bump minor, reset patch (`0.1.16` → `0.2.0`)
- `major` → bump major, reset minor+patch (`0.1.16` → `1.0.0`)
- `x.y.z` (exact semver) → use as-is

Validate the final version against `^[0-9]+\.[0-9]+\.[0-9]+$` — the workflow rejects non-semver tags. If `$ARGUMENTS` is none of the above, stop and ask.

Check the tag doesn't already exist on remote:

```
git ls-remote --tags origin "refs/tags/v$VERSION"
```

If it returns anything, stop — the tag already exists.

### 3. Confirm with the user

State in one line: "Cutting `vX.Y.Z` from `main` at `<short-sha>` with N commits since `vPREVIOUS`." Show the commit subjects (one line each). Then ask for confirmation before pushing. In auto mode, proceed if there are no red flags; otherwise still ask.

### 4. Push main

```
git push origin main
```

Must succeed before creating the release, or the workflow would check out code without the commits being released.

### 5. Create the release (this triggers the workflow)

```
gh release create "v$VERSION" --title "v$VERSION" --generate-notes --target main
```

`--generate-notes` fills the body from PRs/commits since the previous tag. `--target main` pins the tag to the pushed HEAD.

### 6. Report back

Print the release URL from `gh release view "v$VERSION" --json url -q .url` and mention that the workflow is running — direct the user to `gh run list --workflow=release.yml --limit=1` or the Actions tab to watch it. Do NOT poll the workflow unless the user asks.

## Guardrails

- Do NOT edit `version` fields in `apps/desktop/tauri.conf.json`, `packages/sidecar/package.json`, `apps/desktop/Cargo.toml`, or `packages/bridge/Cargo.toml`. The workflow handles it.
- Do NOT `git tag` locally — `gh release create` creates the tag on the remote as part of the release.
- Do NOT `--force` push or reuse an existing tag.
- If any step fails, stop and surface the error — don't try to "fix forward" into a half-released state.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.