Files
Justin a94de92605 fix(release): harden manual release script (audit findings)
Two-subagent audit of scripts/release.sh found real gaps; fixed:

- HIGH: `--yes` broke a full release — mode was read from positional $2, so
  `release.sh X.Y.Z --yes` set mode="--yes" and hit the unknown-mode guard.
  Now all flags (--dry-run/--publish-only/--yes) are parsed positionally-
  independent and combine in any order; version is the first non-flag arg.
- MEDIUM: not resumable — a partial failure (e.g. tag pushed but release
  create failed) wedged the next run on "tag exists". Now idempotent: every
  step checks state first (skip bump if files already at NEW; verify an
  existing local/remote tag points at the intended commit before continuing;
  create the GitHub Release only if absent). Re-run resumes cleanly.
- MEDIUM: tagging off-main was only a soft warning. Now compares HEAD to
  origin/main and warns loudly (even under --yes) with both short-shas.
- LOW: a missing CHANGELOG.md killed the script under `set -e` before the
  notes fallback; now guarded. Placeholder "_describe changes_" notes are
  flagged.

Confirmation gate still precedes every write; --dry-run remains fully inert.
Verified via dry-run across all flag combos. CONTRIBUTING updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 15:34:16 -04:00
..