| id | 164 |
|---|---|
| title | GitHub-UI-triggered releases and a split website deploy |
| status | ✅ |
| summary | Trigger tool releases from the Actions "Run workflow" UI (workflow_dispatch + one release-environment approval) instead of a manually pushed tag, and split the mdsmith.dev deploy into its own workflow so docs-only changes ship the site without a tool release. |
| model | |
| depends-on |
Let a maintainer cut a tool release from the GitHub Actions UI with one approval. Keep the draft-first immutable release flow. Deploy the website independently of the tool. A docs change then ships the site but not the binaries.
release.yml triggered only on a pushed
v* tag. The GitHub Releases UI could not
drive it: a draft release never creates a
tag, so no push event fired. The pipeline
also owns the release object — it creates a
draft, uploads every asset, then flips it
to published — so an externally created
release would collide with that flow.
Decision (user): keep immutability and the
OIDC hardening; switch the trigger to
workflow_dispatch with a version input,
gated by the existing release
environment. That is one UI action plus one
environment approval. The release job now
creates the tag itself
(tag_name + target_commitish).
Asymmetry the user asked for:
- A tool release also deploys the website.
- A docs/website change deploys only the website — no tool release, no approval, no version bump.
So the website deploy moves out of
release.yml. It lives in its own
pages.yml, a reusable workflow. It runs
on push to main under docs/** and
website/**. release.yml also calls it,
so a tool release still ships the site.
Security note: workflow_dispatch changes
the OIDC ref claim. It goes from
refs/tags/v* to refs/heads/<branch>.
So the npm/PyPI Trusted Publisher pin
changes. So does the release environment
deployment rule. The primary pin still
holds: environment=release plus the
required reviewer. release.md documents
this.
release.yml: replace thepush: tagstrigger withworkflow_dispatch(a requiredversioninput). Add apreflightjob that validates the input shape (read via env, not template expansion) and carries the&release_repo_trigger_okanchor;buildandvscodedepend on it.release.ymlrelease job: settag_nameandtarget_commitishon theaction-gh-releasestep so the tag is created by the workflow.- Add
.github/workflows/pages.yml: a reusable +push-on-main(docs/**,website/**) workflow that builds and deploys mdsmith.dev. It resolves the site version from the caller input or the latestv*tag. release.yml: drop thepages-deployjob; add apagesjob that callspages.ymlwith the release version so a tool release still deploys the site.- Docs: update
release.md(triggering, topology, Trusted PublisherRef, environment table, operational checklist),release-tooling.md(subcommand invokers), andgithub-releases.md. - Run
mdsmith fixso the CLAUDE.md and docs catalogs regenerate after therelease.mdsummary change.
-
release.ymltriggers only onworkflow_dispatchwith aversioninput; nopush:/tag trigger remains. - A malformed
versionfailspreflightbefore any publishing job runs. - The release job creates the tag and the immutable draft-first publish flow is unchanged.
-
pages.ymldeploys the site on a docs-only push tomainwith no tool release and norelease-environment approval. - A
workflow_dispatchrelease also deploys the site via thepagescaller job. - Docs reflect the new trigger, the
OIDC
refchange, and the split website deploy. -
mdsmith check .passes. - All tests pass:
go test ./.... -
go tool golangci-lint runreports no issues.