feat(boxel-cli): auto-publish unstable per merge, repurpose manual workflow as stable promoter#4804
Draft
FadhlanR wants to merge 2 commits into
Draft
Conversation
…rkflow as stable promoter Closes CS-11112. PR-time enforcement shrinks to "conventional PR title" — no more local regen, no more hand-bumping plugin.json, no more four-gate CI block. On every merge to main that touches packages/boxel-cli/**, a new on-main workflow regenerates plugin/skills/, computes per-surface bumps from the merged PR title (fetched via gh api), commits back to main, and publishes @cardstack/boxel-cli@<v>-unstable.<n> under npm dist-tag `unstable`. Stable releases stay deliberate — the renamed manual workflow promotes the latest unstable to `latest` rather than cutting fresh. - .github/workflows/boxel-cli-pr-title.yml — new; amannn/action-semantic-pull-request, path-scoped to boxel-cli - .github/workflows/boxel-cli-on-main.yml — new; regen + compute-release + bump + tag + publish, concurrency-serialized - .github/workflows/manual-boxel-cli-publish.yml — repurposed: strip -unstable.N, publish under latest - .github/workflows/ci-lint.yaml — drop the four boxel-cli verification gates (lines 128-224); plain pnpm run lint stays - packages/boxel-cli/scripts/compute-release.ts — new; pure function + I/O wrapper. Handles prerelease base escalation. - packages/boxel-cli/tests/scripts/compute-release.test.ts — 29 vitest cases - packages/boxel-cli/plugin/README.md — rewrite Versioning + Releasing for the new flow - AGENTS.md — add "boxel-cli commit prefixes" subsection - packages/boxel-cli/package.json — seed 0.1.4 → 0.1.5-unstable.0 - docs/cs-11112-auto-publish-boxel-cli-unstable-plan.md — implementation plan doc
The seed bump to 0.1.5-unstable.0 (and subsequent auto-unstable versions like 0.2.0-unstable.7) broke the strict /^\d+\.\d+\.\d+$/ regex. Accept optional semver prerelease tail.
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.
Summary
Closes CS-11112.
PR-time enforcement for boxel-cli shrinks to "write a conventional PR title." Every merge to
maintouchingpackages/boxel-cli/**auto-publishes@cardstack/boxel-cli@<v>-unstable.<n>to npm under dist-tagunstable(Ember canary pattern). Stable releases stay deliberate via the repurposed manual workflow, which promotes the latest unstable tolatest.What changes
.github/workflows/boxel-cli-pr-title.yml(new) validates the PR title viaamannn/action-semantic-pull-request, path-scoped topackages/boxel-cli/**. Four old CI gates inci-lint.yaml(lines 128-224) are removed — no more local regen, no more hand-bumpingplugin.json..github/workflows/boxel-cli-on-main.yml(new) regeneratesplugin/skills/, fetches the merged PR's title viagh api repos/.../commits/<sha>/pulls, classifies the bump, applies per-surface version updates, commits back with[skip ci], tags, and publishes to npm. Concurrency-serialized to prevent prerelease-counter collisions..github/workflows/manual-boxel-cli-publish.ymlrepurposed — strips-unstable.N, publishes underlatest, tags, creates a non-prerelease GitHub Release. Input is now aconfirm: 'promote'typed string.packages/boxel-cli/scripts/compute-release.ts(new) is the pure decision engine. Maps PR-title prefix → bump level, checks per-surface (src/vsplugin/), handles prerelease base escalation (e.g.0.1.5-unstable.X+ breaking change →1.0.0-unstable.<n>). 29 vitest cases.plugin/README.mdVersioning + Releasing rewritten for the new flow, including theBOXEL_SKILLS_VERSIONfix(skills):caveat.AGENTS.mdgains a "boxel-cli commit prefixes" subsection.package.jsonbumped0.1.4→0.1.5-unstable.0so the first auto-publish after this merges has a clean starting state.Test plan
pnpm test:unitcoverscompute-releaselogic — 29 / 29 passing.pnpm lintclean.PR_TITLE='feat: test' pnpm exec ts-node --transpileOnly scripts/compute-release.tsemits valid JSON.boxel-cli-on-main.yml. Expected behavior:feat(boxel-cli): …→ minor bump.scripts/compute-release.ts,tests/scripts/,package.json) →0.1.5-unstable.0escalates to0.2.0-unstable.<n>, publishes to npm underunstable.plugin/README.md) →plugin.json0.1.4→0.2.0.fix:PR touchingsrc/once this lands; verify it publishes0.2.0-unstable.<n+1>.manual-boxel-cli-publish.ymlwithconfirm: promote; verify it strips the suffix and publisheslatest.Notes for reviewer
main. Required path-filtered checks would leave non-boxel-cli PRs pending forever — discussed in the plan doc.[skip ci]AND the workflow job guardsif: github.actor != 'github-actions[bot]'.boxel-cli-releaseis shared with the manual workflow so a stable promotion can't race an auto unstable publish.docs/cs-11112-auto-publish-boxel-cli-unstable-plan.mdfor the implementation plan;~/.claude/plans/let-s-work-on-cs-11112-floofy-hippo.md(local) has the design rationale and decision log.