feat(installer): add --develop to install the develop build - #320
feat(installer): add --develop to install the develop build#320evanpurkhiser wants to merge 1 commit into
Conversation
Each plugin repo now publishes every merge to a develop branch and only releases to main, but the installer could only reach main -- so there was no way to try a change before it shipped without hand-running four different plugin commands. `--develop` installs from the develop ref of our own distribution repos. Every agent CLI turned out to accept a ref inline, so this is one flag over one new internal option rather than a channel abstraction: Claude takes `owner/repo@ref` on `marketplace add`, Codex takes `--ref`, Grok takes `@ref` on its install source, and Cursor is a clone with `--branch`. Both builds provide the same skills, so installing one has to take the other out or two copies resolve at once. That runs through the existing cleanup hook and is symmetric -- installing develop removes the release build, including the copy from an agent's own official marketplace, and installing without the flag removes the develop build again, so the flag is not a one-way door. Deciding which build is installed is per-agent. Claude gets a distinct plugin id per channel because the two come from different marketplaces; Cursor is a checkout, so the branch is the answer. Codex and Grok install the same id from the same source either way, so the version string settles it -- the `-dev.` prerelease that dev-version.sh stamps is on every develop build and no release. `remove` deliberately takes no channel flag. It clears whichever build is present, so undoing a develop install does not depend on remembering how it was installed.
| update: async (output): Promise<InstallOutcome> => { | ||
| await runCommand(system, UPDATE_COMMAND, output); | ||
| return { kind: "done", command: UPDATE_COMMAND }; |
There was a problem hiding this comment.
Bug: Updating a develop channel Grok installation will cause it to regress to the stable branch because the update command grok plugin update sentry doesn't preserve the develop ref.
Severity: MEDIUM
Suggested Fix
The update command for Grok should be modified to include the ref when updating a non-stable channel. Instead of using the constant UPDATE_COMMAND, the command should be constructed dynamically to include the @develop ref if the installation is on the develop channel, ensuring the update pulls from the correct branch.
Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: packages/installer/src/harnesses/grok.ts#L91-L93
Potential issue: When installing a `develop` version of the Grok plugin, the installer
uses the ref `getsentry/plugin-grok@develop`. However, the code comments indicate that
Grok records the source without the `@develop` ref. The update process uses a hardcoded
command, `grok plugin update sentry`, which does not specify a ref. This will cause the
update mechanism to pull from the default branch of the recorded source
(`getsentry/plugin-grok`), effectively downgrading a `develop` installation to the
stable version. This behavior is not covered by any tests.
Did we get this right? 👍 / 👎 to inform future reviews.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit bfe49ef. Configure here.
| output?: OutputSink, | ||
| ): Promise<void> { | ||
| const installed = await findPlugin(system, PLUGIN_ID); | ||
| const repoint = options.ref !== undefined || isDevelopVersion(installed?.version); |
There was a problem hiding this comment.
Codex stable install keeps develop marketplace
Medium Severity
Stable Codex installs only re-point the marketplace when a develop plugin is still installed. After remove, the develop-pinned marketplace stays registered and plugin version is gone, so a later plain install runs marketplace upgrade and can install the develop build instead of stable.
Reviewed by Cursor Bugbot for commit bfe49ef. Configure here.


Each plugin repo now publishes every merge to a
developbranch and only releases tomain(#317), but the installer could only ever reachmain. There was no way to try a change before it shipped short of hand-running four different plugin commands.npx @sentry/ai install --developinstalls from thedevelopref of our own distribution repos instead.One flag, one internal option
Every agent CLI turned out to accept a ref inline, so this needed no channel abstraction — just a
refon the harness options and a boolean on the command:claude plugin marketplace add getsentry/plugin-claude@developcodex plugin marketplace add getsentry/plugin-codex --ref developgit clone --branch develop …grok plugin install getsentry/plugin-grok@develop --trustClaude's
@refshorthand is documented but absent from--help, which is worth knowing if you go looking for it.Removing the conflicting install
Both builds ship the same skills, so installing one has to take the other out or two copies resolve at once. That extends the
cleanup?()hook #322 gives Claude, and it is symmetric:--developremoves the release build — including the copy from the agent's own official marketplace — and installing without the flag removes the develop build again. The flag is not a one-way door.Deciding which build is installed
Per-agent, because the CLIs expose different things:
sentry@sentry-plugin-marketplacevssentry@claude-plugins-official), since the two come from different marketplaces.-dev.prerelease thatdev-version.shstamps is on every develop build and on no release.removedeliberately takes no channel flag. It clears whichever build is present, so undoing a develop install doesn't depend on remembering how it was installed.Verification
103 tests pass, typecheck and build clean,
scripts/lint.shclean. Every commit in the stack was checked to build and test green on its own (88 / 90 / 103). Claude'smarketplace addre-pointing an already-registered marketplace in place — which is what lets it skip Codex's remove-then-add dance — was confirmed against the real CLI rather than inferred.