Skip to content

feat(installer): add --develop to install the develop build - #320

Draft
evanpurkhiser wants to merge 1 commit into
mainfrom
evanpurkhiser/feat-installer-add-develop-to-install-the-develop-build
Draft

feat(installer): add --develop to install the develop build#320
evanpurkhiser wants to merge 1 commit into
mainfrom
evanpurkhiser/feat-installer-add-develop-to-install-the-develop-build

Conversation

@evanpurkhiser

@evanpurkhiser evanpurkhiser commented Aug 5, 2026

Copy link
Copy Markdown
Member

Stacked — blocked on #321 and #322. This branch still holds the original unsplit commit. Once those two merge I will re-push it with just the --develop work; until then its diff overlaps theirs.

Each plugin repo now publishes every merge to a develop branch and only releases to main (#317), but the installer could only ever reach main. There was no way to try a change before it shipped short of hand-running four different plugin commands.

npx @sentry/ai install --develop installs from the develop ref 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 ref on the harness options and a boolean on the command:

Harness Develop source
Claude claude plugin marketplace add getsentry/plugin-claude@develop
Codex codex plugin marketplace add getsentry/plugin-codex --ref develop
Cursor git clone --branch develop …
Grok grok plugin install getsentry/plugin-grok@develop --trust

Claude's @ref shorthand 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: --develop removes 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:

  • Claude — a distinct plugin id per channel (sentry@sentry-plugin-marketplace vs sentry@claude-plugins-official), since the two come from different marketplaces.
  • Cursor — a checkout, so the branch is the answer.
  • Codex and Grok — same plugin 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 on no release.

remove deliberately 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.sh clean. Every commit in the stack was checked to build and test green on its own (88 / 90 / 103). Claude's marketplace add re-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.

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.
@evanpurkhiser
evanpurkhiser requested review from HazAT and dcramer August 5, 2026 16:46
Comment on lines 91 to 93
update: async (output): Promise<InstallOutcome> => {
await runCommand(system, UPDATE_COMMAND, output);
return { kind: "done", command: UPDATE_COMMAND };

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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.

@cursor cursor Bot 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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ 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);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit bfe49ef. Configure here.

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