Files
SubMiner/docs/RELEASING.md
T
sudacode 27f5b2bb58 Polish changelog fragments with claude -p at release time
- Replace `renderGroupedChanges` with `polishFragmentsWithClaude` that pipes fragments through `claude -p --model sonnet` to merge related items, drop housekeeping noise, and produce user-facing release notes
- Internal fragments kept in CHANGELOG.md under a `<details>` collapse; dropped from GitHub release notes entirely
- CI no longer auto-runs `changelog:build` on tag-based releases — fails fast with a clear error if `changes/*.md` fragments are still pending; build locally and commit before tagging
- Add `runClaude` dep-injection seam to test surface; add failure-mode coverage (missing binary, empty output, missing headers, missing `<details>` wrapper)
- Delete implemented design doc; update `changes/README.md` and `docs/RELEASING.md` with claude CLI prerequisite and new workflow
2026-05-02 19:52:48 -07:00

4.9 KiB
Raw Blame History

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 https://claude.com/claude-code 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 <version> --date <yyyy-mm-dd>
    • 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 <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<version>.
  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 <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<version>.
  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 <details><summary>Internal changes</summary> 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 <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 versions 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.