feat(release): semantic-release versioning + self-update v-prefix fix (spec 25) - #79
Merged
Conversation
Design the four newly requested features as spec-quality docs: - 22 interactive `init` wizard (workspace + shared services) - 23 interactive template & Dockerfile authoring (TUI) - 24 `.env` ingestion -> secrets/vars (no more committed .env) - 25 release automation + 0.x conventional-commit versioning All TUIs are Bubble Tea v2 + the Charm plugin stack (bubbles/lipgloss/huh v2, CGO-free) behind one shared internal/prompt theme, each with a --json/flag fallback. Wire them into FEATURES (#14-17) and a new ROADMAP M8 beta-DX lane that stays on the 0.x line (next release v0.2.0, never an automated 1.0.0). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… v-prefix bug
Implements spec 25's thin slice (the v0.2.0 gate):
- .svu.yaml (v0:true): keeps BETA on the 0.x line (a BREAKING change bumps the
MINOR, never 1.0.0).
- .github/workflows/tag.yml: push-to-main -> `svu next --v0` (pinned v3.4.1) ->
push a v* tag, gated on an owner-provisioned RELEASE_TOKEN (absent = kill
switch) with a CI v0.* guard, which fires the unchanged release.yml/goreleaser.
- .github/workflows/pr-title.yml: pure-shell conventional-commit PR-title lint
(squash-merge makes the PR title the commit svu reads).
- .goreleaser.yaml: grouped changelog (Features/Bug fixes/Performance) under
`use: github`, and the load-bearing ldflags fix Version=v{{.Version}}.
The ldflags fix is a real regression, not cosmetic: goreleaser's {{.Version}} is
v-stripped ("0.2.0"), which golang.org/x/mod/semver rejects, so internal/
selfupdate.IsDevBuild() returns true for a real release -> the update notifier
and `self update` silently treat it as a dev build and never fire. Verified
against the real code: IsDevBuild("0.2.0")=true vs IsDevBuild("v0.2.0")=false;
goreleaser snapshot now stamps v0.1.1-dev-<sha>.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Per owner decision, drop the two-workflow + RELEASE_TOKEN (PAT/App token) split in favor of ONE release.yml that computes -> tags -> releases in a single job using the built-in GITHUB_TOKEN. Rationale: contents:write lets a workflow push a tag, but a tag pushed with GITHUB_TOKEN does NOT re-trigger another workflow (GitHub's recursion guard) -- so the only way to avoid a separate token is to run tag-compute and goreleaser in the same job, never depending on a re-trigger. - Remove .github/workflows/tag.yml. - Rewrite .github/workflows/release.yml: triggers on push:main (svu compute + 0.x guard + tag, gated on the RELEASE_ENABLED repo *variable*) AND on push of a v* tag (a human hand-cut release) AND workflow_dispatch; goreleaser runs once, guarded by github.ref so the two paths never double-release. - Kill-switch is now the RELEASE_ENABLED repo variable (no secret to rotate); default unset = compute + log, never release. - Update spec 25 / FEATURES #17 / ROADMAP M8.0 to the no-token design. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ships the release-automation thin slice (spec 25 / FEATURES #17 — the v0.2.0 gate) and lands the four new feature specs 22–25 designed in this session.
How releases work (single workflow, no token)
One
release.ymldoes everything with the built-inGITHUB_TOKEN— no PAT/App token to manage:main→svu next --v0→ 0.x guard → (gated on theRELEASE_ENABLEDrepo variable)git tag+goreleaser releasein the same job.v*tag by hand → skips svu, runs goreleaser directly (manual release, ungated).workflow_dispatch→ manual trigger of the automated path.Why one job:
contents: writelets a workflow push a tag, but a tag pushed withGITHUB_TOKENdoes not re-trigger another workflow (GitHub's recursion guard). Folding compute + release into one job is what removes the need for a separate token. The old two-workflowtag.yml+RELEASE_TOKENapproach was dropped.Kill-switch: the
RELEASE_ENABLEDrepo variable (default off = compute + log, never release). No secret to rotate.Pieces
.svu.yamlv0:true— BETA stays 0.x (BREAKING → minor, never 1.0.0)..github/workflows/release.yml— rewritten single-job pipeline (above),svupinnedv3.4.1, CIv0.*guard..github/workflows/pr-title.yml— pure-shell conventional-commit PR-title lint..goreleaser.yaml— grouped changelog (Features / Bug fixes / Performance) + the ldflags v-prefix fix..envingestion · release automation; all TUIs are Bubble Tea v2 + Charm (bubbles/lipgloss/huhv2). Wired into FEATURES (feat(secrets): S1 — secret:// core (parser, Provider iface, registry, batched Resolve) #14–17) + a ROADMAP M8 beta-DX lane (stays 0.x).The load-bearing fix
goreleaser's
{{.Version}}is the tag with thevstripped (0.2.0).x/mod/semverrequires the leadingv, sointernal/selfupdate.IsDevBuild()(returns!semver.IsValid(v)) treats a real release as a dev build → the v0.1.0 update notifier +self updateare silently dead. Fix: stampVersion=v{{ .Version }}(archivename_templatestays v-stripped, matchingassetName'sTrimPrefix).Verified against the real code:
goreleaser checkpasses; a snapshot build now stampsv0.1.1-dev-<sha>.Set the kill-switch on, then trigger:
svu next --v0computesv0.2.0from the M2–M7 history. Only ever pushv*semver tags.Specs 22–24 are design-only; their implementation is the M8 lane (build order: this PR first, then init → template → env-ingest).
🤖 Generated with Claude Code