Skip to content

feat(claude): publish the Claude Code plugin on release/claude - #56

Closed
grabbou wants to merge 1 commit into
mainfrom
feat/claude-plugin-release
Closed

grabbou wants to merge 1 commit into
mainfrom
feat/claude-plugin-release

Conversation

@grabbou

@grabbou grabbou commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

Summary

Makes the Claude Code plugin the only Claude target and publishes it from the release workflow. This replaces the Claude Desktop MCPB bundle, which the Claude directory no longer accepts; local servers now ship inside a plugin.

  • Node detection. The manifest starts the server through scripts/launch-node.sh. It finds Node.js 22.19+ on PATH, or in the usual Homebrew (including keg-only node@22/node@24), nvm, fnm, Volta, mise and asdf locations, because Claude opened from the Dock doesn't inherit the shell's PATH. A SessionStart hook runs the same script with --check. When no usable Node is found, it shows the user a message and tells Claude to offer an install (brew install node or nodejs.org) and a restart. The setup skill gets a Claude-specific recovery reference.
  • Package contents. The package now includes a Claude README, which becomes the directory listing's description. It leaves out Codex skill metadata (agents/openai.yaml) and npm .bin symlinks, which the directory blocks. The MCPB manifest, its packaging and its smoke test are removed.
  • release/claude branch. Each v* release also packages and smoke-tests the Claude plugin. A new publish-claude job makes release/claude hold only the plugin in plugins/mobile-dev plus a root .claude-plugin/marketplace.json, and tags the commit claude-v<version>. Older or repeated versions never replace it.
  • Manifest URLs. They now point at callstackincubator/codex-mobile-dev-plugin.

Install after the first release:

claude plugin marketplace add callstackincubator/codex-mobile-dev-plugin@release/claude
claude plugin install mobile-dev@mobile-dev

Verification

  • npm run package:claude and npm run test:claude pass. The smoke test runs the hook and starts the server through the launcher from a path with spaces. test:cursor still passes.
  • claude plugin validate --strict (Claude Code 2.1.311) passes for both the plugin folder and the branch layout's marketplace.
  • End to end, in an isolated CLAUDE_CONFIG_DIR: plugin marketplace add on the branch layout, plugin install mobile-dev@mobile-dev, then claude mcp list with a Dock-like PATH shows plugin:mobile-dev:mobile-dev … ✔ Connected.
  • The launcher was checked by hand: it finds Node with PATH=/usr/bin:/bin, prints valid hook JSON when none is found, and exits 1 with the install message.
  • apps/claude/test/publish-release.test.ts is new and covers layout, tag, executable modes, advancing, version ordering and release-build checks. The Codex publish tests still pass.
  • npm test locally: 835 pass. The 2 failures that reproduce (Baguette Xcode-library relocation, socket QoS server startup) also fail on clean main on this machine, with Node 24.0.1. The others were load flakes that passed on rerun.

Not covered: Claude directory submission

The directory stops validation for any plugin file over 5 MiB, or a repository over 50 MiB as GitHub archives it (pre-submission checklist). Today the package has:

  • dist/baguette/Baguette at 25.3 MiB (11 MiB stripped)
  • three Baguette .usdz device models at 5.1–5.7 MiB
  • dist/server.mjs at 5.02 MiB
  • about 60 MiB archived in total

Getting into the directory needs a follow-up: either a slimmer plugin that fetches its native runtime with a pinned hash, or an exception from Anthropic. The self-hosted marketplace on release/claude doesn't have these limits.

🤖 Generated with Claude Code

Ship the Claude Code plugin as the only Claude target and publish it from
the release workflow, replacing the Claude Desktop MCPB bundle that the
Claude directory no longer accepts.

- Start the server through scripts/launch-node.sh, which finds Node.js
  22.19+ on PATH or in Homebrew, nvm, fnm, Volta, mise and asdf locations,
  since Claude opened from the Dock lacks the shell PATH. A SessionStart
  hook runs the same check and tells the user and Claude when none is found.
- Add a Claude README for the listing and a Claude recovery reference for
  the setup skill; leave out Codex skill metadata and npm .bin symlinks.
- Publish the plugin in plugins/mobile-dev plus a root marketplace as the
  only content of release/claude, tagged claude-v<version>.
- Point the manifest at the repository's current URLs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lauridskern added a commit that referenced this pull request Oct 29, 2026
#59)

Brings over the parts of #56 that the Claude plugin still needs. Claude
opened from the Dock starts plugins without the shell's PATH, so the
server now starts through scripts/launch-node.sh, which also looks for
Node.js 22.19 or later where Homebrew, nvm, fnm, Volta, mise and asdf
install it. A SessionStart hook runs it with --check and tells the user
and Claude when none is found, and the Claude skill's missing-tools
recovery checks the launcher and offers an install.

The plugin ships a Claude README, which the plugin directory lists, and
leaves out Codex skill metadata and npm's .bin symlinks, which plugin
directories reject; the smoke test checks all three and starts the
server through the launcher.

Co-authored-by: Mike Grabowski <grabbou@gmail.com>
@lauridskern

Copy link
Copy Markdown
Collaborator

closing in favor of #59

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