# Releasing ## Prerequisites - `claude` (Claude Code CLI) installed, on `PATH`, and authenticated. `changelog:build` and `changelog:prerelease-notes` invoke `claude -p --model sonnet` to merge and rewrite `changes/*.md` fragments into a polished, user-facing release body. Either OAuth login (`claude /login`) or `ANTHROPIC_API_KEY` works. Install from if you don't already have it. ## Stable Release 1. Confirm `main` is green: `gh run list --workflow CI --limit 5`. 2. Confirm release-facing docs are current: `README.md`, `changes/*.md`, and any touched `docs-site/` pages/config examples. 3. Run `bun run changelog:lint`. 4. Bump `package.json` to the release version. 5. Build release metadata before tagging (this calls `claude -p` locally): `bun run changelog:build --version --date ` - The polished `CHANGELOG.md` and `release/release-notes.md` are committed before tagging. Release CI no longer auto-builds the changelog; it fails fast if `changes/*.md` fragments are still present on a tag-based run. 6. Review `CHANGELOG.md` and `release/release-notes.md`. Edit by hand if Claude missed something — the committed Markdown is what ships. 7. Run release gate locally: `bun run changelog:check --version ` `bun run verify:config-example` `bun run typecheck` `bun run test:fast` `bun run test:env` `bun run build` 8. If `docs-site/` changed, also run: `bun run docs:test` `bun run docs:build` 9. Commit release prep. 10. Tag the commit: `git tag v`. 11. Push commit + tag. ## Prerelease 1. Confirm release-facing docs and pending `changes/*.md` fragments are current. 2. Run `bun run changelog:lint`. 3. Bump `package.json` to the prerelease version, for example `0.11.3-beta.1` or `0.11.3-rc.1`. 4. Run the prerelease gate locally (this calls `claude -p` locally): `bun run changelog:prerelease-notes --version ` `bun run verify:config-example` `bun run typecheck` `bun run test:fast` `bun run test:env` `bun run build` 5. Commit the prerelease prep. Do not run `bun run changelog:build`. 6. Tag the commit: `git tag v`. 7. Push commit + tag. Prerelease tags publish a GitHub prerelease only. They do not update `CHANGELOG.md`, `docs-site/changelog.md`, or the AUR package, and they do not consume `changes/*.md` fragments. The final stable release is still the point where `bun run changelog:build` consumes fragments into `CHANGELOG.md` and regenerates stable release notes. Notes: - Versioning policy: SubMiner stays 0-ver. Large or breaking release lines still bump the minor number (`0.x.0`), not `1.0.0`. Example: the next major line after `0.6.5` is `0.7.0`. - Supported prerelease channels are `beta` and `rc`, with versions like `0.11.3-beta.1` and `0.11.3-rc.1`. - Pass `--date` explicitly when you want the release stamped with the local cut date; otherwise the generator uses the current ISO date, which can roll over to the next UTC day late at night. - `changelog:check` now rejects tag/package version mismatches. - `changelog:prerelease-notes` also rejects tag/package version mismatches and writes `release/prerelease-notes.md` without mutating tracked changelog files. - `changelog:build` generates `CHANGELOG.md` + `release/release-notes.md` (both polished by `claude -p`) and removes the released `changes/*.md` fragments. The CHANGELOG keeps internal notes inside a `
Internal changes` collapse; the release notes drop them entirely. - The release workflow no longer auto-runs `changelog:build`. If pending `changes/*.md` fragments are present on a tag-based run, CI exits with a clear `::error::` pointing at the local fix. Run `bun run changelog:build --version ` locally, commit the polished output, then tag. - Do not tag while `changes/*.md` fragments still exist. - Prerelease tags intentionally keep `changes/*.md` fragments in place so multiple prereleases can reuse the same cumulative pending notes until the final stable cut. - If you need to repair a published release body (for example, a prior version’s section was omitted), regenerate notes from `CHANGELOG.md` and re-edit the release with `gh release edit --notes-file`. - Prerelease tags are handled by `.github/workflows/prerelease.yml`, which always publishes a GitHub prerelease with all current release platforms and never runs the AUR sync job. - Tagged release workflow now also attempts to update `subminer-bin` on the AUR after GitHub Release publication. - AUR publish is best-effort: the workflow retries transient SSH clone/push failures, then warns and leaves the GitHub Release green if AUR still fails. Follow up with a manual `git push aur master` from the AUR checkout when needed. - Required GitHub Actions secret: `AUR_SSH_PRIVATE_KEY`. Add the matching public key to your AUR account before relying on the automation.