Skip to content

feat(claude): find Node outside PATH and ship a directory-ready plugin - #59

Merged
lauridskern merged 1 commit into
mainfrom
feat/claude-plugin-readiness
Oct 29, 2026
Merged

lauridskern merged 1 commit into
mainfrom
feat/claude-plugin-readiness

Conversation

@lauridskern

Copy link
Copy Markdown
Collaborator

Brings over the parts of #56 that the Claude Code plugin still needs after #58. #58 already publishes the plugin on release/claude and keeps it within the Claude plugin directory's size limits, so this adds the rest.

Finding Node.js

Claude opened from the Dock starts plugins without the shell's PATH, so a plain node command misses Node installed by a version manager.

  • The plugin now starts the server through scripts/launch-node.sh, ported from feat(claude): publish the Claude Code plugin on release/claude #56. It uses Node.js 22.19 or later from PATH, or from where Homebrew (including keg-only node@22/node@24), nvm, fnm, Volta, mise and asdf install it.
  • A SessionStart hook runs the launcher with --check. When no usable Node is found, it shows the user a message and tells Claude to offer an install and a restart.
  • The Claude skill's missing-tools recovery (references/missing-tools.md) checks which Node the launcher finds and offers brew install node or nodejs.org.
  • Cursor still starts node from PATH, and the Claude Desktop bundle still uses the Node that Claude supplies.

Directory-ready package

  • The plugin ships apps/claude/README.md instead of the repository's README, since the directory lists the plugin with it. The README is rewritten for the Claude build: Claude Code shows the simulators, and Mobile Dev adds device control, logs, app control and storage, recordings and TraceSift. It lists everything the plugin runs on the Mac, as the directory's security scan asks.
  • Claude and Cursor packages leave out Codex's agents/openai.yaml and npm's .bin symlinks. The server runs agent-device's CLI by its path, so the symlinks were unused, and plugin directories reject them.
  • plugin-host.json gains folders (the app folders a plugin ships, here scripts and hooks) and readme.

Not brought over from #56

  • Removing the Claude Desktop MCPB. The directory no longer accepts MCPB submissions, but users can still install a .mcpb by hand, so releases keep attaching it.
  • Moving the plugin to plugins/mobile-dev and tagging claude-v<version>. feat: ship Claude without the panel and control devices with agent-device in every plugin #58 already publishes release/claude with the plugin in mobile-dev/.
  • Switching URLs to codex-mobile-dev-plugin. The current mobile-dev URLs redirect. Settle the name before the directory submission.

Directory status

Measured against the pre-submission checklist, the release/claude layout passes every check that stops validation:

  • Largest file 4.60 MiB, under the 5 MiB limit.
  • About 19 MiB archived, under 50 MiB, and 66 MiB unpacked, under 256 MiB.
  • 2,010 files and folders, under 10,000.
  • No symlinks or system files, plus a README and a license.

Review holds remain. A shell-started server, compiled helpers, minified code, more than 512 files and text files over 256 KiB each mean an Anthropic reviewer reads the plugin before it goes live.

Testing

  • npm test: 873 passed, 1 skipped. test:hosts: 10 passed, 5 skipped.
  • test:claude, test:cursor and test:package pass. The Claude smoke test starts the server through the launcher from a path with spaces, and runs the session check, which stays silent when Node is usable. It also checks for the Claude README, and that there are no symlinks and no agents/ folders.
  • claude plugin validate passes for the plugin folder and its marketplace.
  • By hand:
    • With the Dock's PATH (/usr/bin:/bin:/usr/sbin:/sbin), the launcher found a mise-installed Node 22.23.2 that plain node misses.
    • With no Node in any location, --check prints valid SessionStart hook JSON, and starting the server exits 1 with the install message.

Telemetry: the launcher and hook run before the server's Sentry SDK starts and send nothing. Existing server and UI coverage is unchanged.

Co-authored with @grabbou, whose launcher, hook and recovery guidance this ports from #56.

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
lauridskern merged commit 8cd0d26 into main Oct 29, 2026
11 checks passed
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