Repository navigation
Promote a stable branch to each release for the plugin to install from - #925
Conversation
The 37signals marketplace installed the Claude Code and Codex plugin from main, so between releases a fresh install got skills that call commands no released CLI has. The marketplace will install from a stable branch instead (basecamp/plugins), and this keeps that branch on the latest release. A promote-stable job fast-forwards stable to the tag once the release has published, and only for the latest stable release, as the skills sync does. GitHub refuses the ref update unless it is a fast-forward, so stable can't move backwards. Moving it from the release workflow, not release.sh, means a release whose build fails never moves it, and no other repository changes per release.
Sensitive Change Detection (shadow mode)This PR modifies control-plane files:
|
There was a problem hiding this comment.
🟢 Approved
The narrowly scoped promotion logic, wiring checks, and documentation have no identified blocking issues.
No open issues 🎉
What changed in this PR
Keeps marketplace-installed plugin skills aligned with released CLI versions by promoting stable after publication.
Changes:
- Adds a guarded, fast-forward-only promotion job for the latest stable release.
- Tests the job’s dependencies, permissions, and release guards.
- Documents plugin distribution and recovery after promotion failures.
[!TIP]
If you aren't ready for review, convert to a draft PR.
Click "Convert to draft" or rungh pr ready --undo.
Click "Ready for review" or rungh pr readyto reengage.
| File | Description |
|---|---|
| RELEASING.md | Documents stable-branch distribution and recovery. |
| internal/release/manifests_test.go | Adds promotion-job wiring checks. |
| .github/workflows/release.yml | Promotes stable after the latest stable release publishes. |
Review effort: Balanced
Decision: after this merges, fast-forward
|
|
Done: |
What
promote-stablejob in.github/workflows/release.ymlfast-forwards astablebranch to the release tag.release, so it runs only once GoReleaser has published.sync-skills, it skips prerelease tags and any tag that isn't the latest stable release.force=false, so GitHub refuses anything but a fast-forward.RELEASING.mdcovers the new branch: in the release steps, the stable/prerelease table, a short "Plugin install source" section (including what to do if the job fails), and the distribution channels table.internal/release/manifests_test.gogets a wiring test. It requires the job to needrelease, skip prereleases, havecontents: write, skip non-latest releases and passforce=false.Why
The 37signals marketplace installs this repo's Claude Code and Codex plugin from
main. People install thebasecampcommand from releases, so between releases a fresh plugin install can get skills that call commands no released CLI has. 4, 5 and 8 commits touchedskills/in the last three release cycles.basecamp/plugins#13 points the marketplace at
stable, and this keepsstableon the latest release.I moved the branch from the release workflow rather than
scripts/release.shfor two reasons. Pushing the tag only starts the build, so movingstablethere would publish skills before the binaries exist, and would still move it if the build failed. And this way no other repository has to change per release. It replaces basecamp/plugins#12, which moved commit pins with an hourly workflow and needed a merged PR in that repo for each release.Card: https://app.basecamp.com/2914079/buckets/48521764/card_tables/cards/10423396016
Testing
make checkpasses:bin/ciexited 0 locally.actionlintandzizmorreport nothing onrelease.yml. zizmor had 3 ignored and 25 suppressed, all already present.if:loses the prerelease exclusion, and fails ifforce=falsebecomesforce=true.stablealready exists atv0.14.0(2dbca87a), so Integrate name resolution into commands #13 can merge first. Therefs/heads/stablerule set is only Copilot code review, which doesn't block ref updates.stable:force=falsewas refused withUpdate is not a fast forward(HTTP 422), andstablestayed at v0.14.0.stable is now vX.Y.Z (<sha>). If it fails, the release is still out, and rerunning the job recovers it.Summary by cubic
Adds a
promote-stablerelease job that fast-forwards thestablebranch to each new stable release, so the 37signals marketplace installs plugin skills from the latest release instead of whatever is onmain.Details
stablealone.force=false, so GitHub rejects any update that isn't a fast-forward, keepingstablefrom moving backwards.RELEASING.mdwith the new branch behavior and adds a wiring test covering the job's guards.Written for commit 97fd606. Summary will update on new commits.