Skip to content

Version the Claude Code plugin with onctl releases - #1177

Merged
cdalar merged 1 commit into
mainfrom
feat/plugin-release-version
Oct 5, 2026
Merged

cdalar merged 1 commit into
mainfrom
feat/plugin-release-version

Conversation

@cdalar

@cdalar cdalar commented Oct 5, 2026

Copy link
Copy Markdown
Owner

The plugin's version now follows onctl's: each release publishes the plugin as it was at that release, with the same number (v0.1.34 → plugin 0.1.34).

How it works

  • .claude-plugin/marketplace.json serves the plugin from the plugin-stable branch instead of main. It uses a git-subdir source with ref: plugin-stable (marketplace reference).
  • The new .github/workflows/plugin-release.yml runs on every v* tag, or by hand with a tag. It checks out the tag, stamps claude-plugin/.claude-plugin/plugin.json with the version, and force-pushes the result to plugin-stable.
    • Anything that isn't vX.Y.Z is refused, e.g. the moving edge tag.
  • Users get exactly what shipped with each release. Work on main waits for the next release; plugin.json on main stays without a version.
  • Why a branch, not a commit to main: pushes and PRs made with the workflow's token trigger no workflows, so such a commit could never pass main's required checks.

Tested locally

  • The stamping step produced onctl 0.1.34, which passes claude plugin validate --strict.
  • The marketplace file passes claude plugin validate.
  • Non-release tags are rejected.
  • The workflow itself first runs at the next release.

Note: plugin-stable doesn't exist until the first release that contains the plugin (v0.1.33 predates it). Until then, installing from the marketplace fails. Local testing works without it: claude --plugin-dir ./claude-plugin.

🤖 Generated with Claude Code

https://claude.ai/code/session_01U8g3mHkS6JmtYVYc4AjcV4

The marketplace now serves the plugin from the plugin-stable branch
instead of main. On every v* release tag, the new plugin-release
workflow takes claude-plugin/ as it is at that tag, stamps plugin.json
with the release's version (v0.1.34 -> 0.1.34) and force-pushes it to
plugin-stable. Users get exactly the plugin that shipped with each onctl
release, labelled with the same version; work on main waits for the
next release.

A branch, not a commit to main: commits made with the workflow's token
can't pass main's required checks, since its pushes and PRs trigger no
workflows. It can also be run by hand with a tag to republish.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U8g3mHkS6JmtYVYc4AjcV4
@cdalar
cdalar enabled auto-merge (squash) October 5, 2026 05:40
@cdalar
cdalar merged commit 38cc79b into main Oct 5, 2026
12 checks passed
cdalar added a commit that referenced this pull request Oct 9, 2026
The plugin lives in cdalar/boxctl (/boxctl:on ...), where it drives the
boxctl CLI. The copy made here as 'onctl' (#1175) did the same job with
a second 500-line helper to keep in step, had no users, and since #1177
couldn't be installed from its marketplace at all: that pointed at a
plugin-stable branch only a release creates, and none has been cut.

Removes claude-plugin/, .claude-plugin/marketplace.json, the
plugin-release workflow, the plugin hint in onctl login (with its test)
and the paragraph in onctl claude --help, and the README line. login.go
and claude.go are back to what they were before #1176.

The boxes provider, ssh-proxy, port-forward, sizes and onctl claude are
unaffected; none of them used the plugin. The plan doc now says steps 4
(the plugin) and 5 (retiring boxctl) aren't happening.


Claude-Session: https://claude.ai/code/session_01U8g3mHkS6JmtYVYc4AjcV4

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant

⌂ 换网址