Repository navigation
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:
|
Contributor
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
This branch has not been deployed
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.
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.