Skip to content

Pin the CLI plugins to their latest releases - #12

Closed
robzolkos wants to merge 1 commit into
mainfrom
pin-plugins-to-releases
Closed

robzolkos wants to merge 1 commit into
mainfrom
pin-plugins-to-releases

Conversation

@robzolkos

Copy link
Copy Markdown

Why

basecamp-cli, hey and fizzy install from their default branch, but their CLIs install from releases. A fresh claude plugin install basecamp-cli@37signals today gets 08ee7ff7, the tip of basecamp-cli's main, labelled 0.13.2. That skill runs basecamp auth agent connect --json, which only unreleased main supports (basecamp/basecamp-cli#852). The released 0.13.2 CLI refuses it, and users see the agent work around our own instructions while connecting.

What

  • release-pins.json names each pinned plugin's CLI repo.
  • bin/pin-releases sets each entry's sha to its CLI's latest release commit. It never moves a pin backwards, and a second run changes nothing.
  • bin/check-marketplace adds rule 3: every pinned plugin carries a full commit sha.
  • .github/workflows/pin-releases.yml runs the script hourly and opens or updates a pin-releases PR when a pin moved. A PR opened with the workflow's token starts no other workflow, so the job runs bin/check-marketplace itself before pushing.
  • Initial pins from running the script: basecamp-cli and its alias at v0.13.2 (d742884a), hey at v1.9.0 (76ea03f5), fizzy at v4.0.1 (3834efe7).

The house-skills plugins and the hosted plugin aren't pinned. They don't drive a separately released CLI.

Verified locally

  • A fresh Claude Code 2.1.303 home, using this branch as its marketplace, installed basecamp-cli at d742884a, hey at 76ea03f5 and fizzy at 3834efe7. That covers both url and github sources.
  • Codex 0.163.0 installed basecamp-cli from this branch. Its basecamp-connect/SKILL.md is byte-identical to v0.13.2's.
  • With basecamp-cli pinned to main's tip, the script kept the pin. GitHub compares v0.13.2 as behind main.
  • actionlint and zizmor report nothing on the workflow, and bin/check-marketplace passes.
  • The workflow itself hasn't run. It can't before merge. After merging, a workflow_dispatch run should report every plugin unchanged.

Needs a person

  • Repo setting. The workflow needs "Allow GitHub Actions to create and approve pull requests". I couldn't read the setting (403).
  • Existing installs move only when the version goes up. Claude Code's plugin update compares plugin.json versions, not commits. I checked this: a pin to a same-version commit left an install on main, and a pin to a 0.13.3 commit moved it. So:
    • basecamp-cli: existing installs move at v0.13.3. Until then, this PR changes new installs only.
    • hey: its main and v1.9.0 both say 1.9.0, so installs move at its next release.
    • fizzy: plugin.json says 0.1.0 on main and on v4.0.1. Existing Fizzy installs never update today, pinned or not, until fizzy-cli stamps its version at release.
  • New installs change today. They get each CLI's release plugin instead of main's. hey and fizzy owners should agree.
  • Who merges each pin PR. As written, the workflow opens the PR and a person merges it.

basecamp-cli, hey and fizzy installed from their default branch, while their
CLIs install from releases. A skill on main can then call a flag no released
CLI has: basecamp-cli's connect skill runs `basecamp auth agent connect --json`,
which only unreleased main supports (basecamp/basecamp-cli#852), so the
released 0.13.2 CLI refuses it.

release-pins.json names each plugin's CLI repo. bin/pin-releases moves each
entry's sha to its latest release's commit, never backwards, and an hourly
workflow opens a pull request when one moved. bin/check-marketplace fails when
a pinned plugin has no sha.
@robzolkos
robzolkos marked this pull request as ready for review October 19, 2026 18:59
Copilot AI balanced review requested due to automatic review settings October 19, 2026 18:59
@robzolkos
robzolkos requested a review from jeremy October 19, 2026 19:00

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The workflow hides pinning failures and can stop retrying failed PR creation.

2 open issues
What changed in this PR

Pins CLI-backed marketplace plugins to released commits so their instructions match released CLI behavior.

Changes:

  • Adds release mappings and initial pins for Basecamp, HEY, and Fizzy.
  • Adds forward-only pin updates, validation, and hourly PR automation.
  • Documents pinning and existing-install update limitations.

[!TIP]
If you aren't ready for review, convert to a draft PR.
Click "Convert to draft" or run gh pr ready --undo.
Click "Ready for review" or run gh pr ready to reengage.

File Description
release-pins.json Maps pinned plugins to CLI repositories.
README.md Explains release pins and update limitations.
bin/​pin-releases Advances pins to latest release commits.
bin/​check-marketplace Validates pinned entries and full commit hashes.
.github/​workflows/​pin-releases.yml Schedules pin updates and creates PRs.
.claude-plugin/​marketplace.json Sets initial release commit pins.

Review effort: Balanced

- name: Pin each plugin to its CLI's latest release
env:
GH_TOKEN: ${{ github.token }}
run: bin/pin-releases | tee "$RUNNER_TEMP/pins.txt"
Comment on lines +50 to +51
if git fetch --quiet origin "$branch" 2>/dev/null &&
git diff --quiet FETCH_HEAD -- .claude-plugin/marketplace.json; then
@robzolkos

Copy link
Copy Markdown
Author

Holding this as a draft.

Pinning matches the plugin's skill to the latest CLI release. It doesn't help someone on an older CLI, who would get a skill that's newer than their binary. Only the CLI knows its own version, so the direction we're exploring instead is to have the plugin's skills come from the binary (basecamp skill <name>), with thin stubs in the plugin. The hooks already work this way through basecamp agent-hook.

I'm spiking that with the basecamp-connect skill first. This PR stays open as a fallback, and possibly as a stopgap for hey and fizzy, until the spike says whether the stub approach holds up.

@robzolkos

Copy link
Copy Markdown
Author

Closing in favour of #13. Rather than pinning commit shas here and moving them with an hourly workflow, basecamp-cli's release workflow will move a stable branch to each release as it publishes, and the marketplace entry follows stable. That way nothing lags a release, and releases need no PR in this repo. HEY and Fizzy can adopt the same release job later. Card: https://app.basecamp.com/2914079/buckets/48521764/card_tables/cards/10423396016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants