cast/CHANGELOG.md
dan-claude-bot d992f1833d feat: versioned installs — tagged releases with a prebuilt dist asset (#96)
cast gets the family's release flow (box#83's shape), plus the piece
unique to cast: because cast compiles, the source tarball is not the
package — so release.yml builds ONCE in CI and attaches cast-X.Y.Z.tgz,
and the installer's default channel extracts that asset instead of
running npm ci + tsc on the operator's machine.

- cast --version: package.json is the single source of truth (no VERSION
  file); prints the install root too, rig-style.
- CHANGELOG.md with Unreleased; release notes are the curated section
  (scripts/changelog-section.sh), never the auto-generated PR list.
- release.yml on a bare X.Y.Z tag: assert tag == package.json version,
  check + build + test, prune, tar the runnable tree, gh release create.
- install.sh channels: unset → latest release asset (resolved via the
  releases/latest redirect — no API, no token); CAST_REF=X.Y.Z → that
  tag's asset; CAST_REF=<branch> → build-from-source, the old path.
- Tests drive the REAL install.sh offline via curl/npm PATH shims (all
  three channels, plus the broken-asset and no-release refusals), and
  the real changelog-section.sh against fixture changelogs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 20:51:15 +00:00

1.2 KiB

Changelog

History before versioning lives in git. Feature PRs land their entry in ## Unreleased as part of the PR; a release PR stamps that section with the version and date (see cast#96 — the release flow shared with heavy-duty/box#83).

Unreleased

Added

  • Versioned installs: tagged releases with a prebuilt dist asset (#96) — cast now has a release surface. cast --version prints the version from package.json (the single source of truth — no separate VERSION file) plus the install root. On a bare X.Y.Z tag push, release.yml asserts the tag matches package.json, builds once in CI (npm ci, npm run build, npm test, npm prune --omit=dev), tars the runnable tree into cast-X.Y.Z.tgz, and creates the GitHub release with that version's changelog section as the body and the tarball attached. The installer now defaults to the latest release asset — resolved via the releases/latest redirect, no API, no token — so a default install compiles nothing on the operator's machine and answers "what cast is this?" with a version. CAST_REF=X.Y.Z pins (uses that tag's asset when it exists), CAST_REF=main stays the dev channel: build-from-source, exactly the old path.