fix(installer): clean up a conflicting Claude sentry plugin - #322
Merged
evanpurkhiser merged 1 commit intoAug 5, 2026
Conversation
Our plugin reaches Claude two ways. The installer uses Anthropic's official catalog, which pins getsentry/plugin-claude; adding our own catalog by hand installs the same repo under a second id. Claude holds both happily, so two plugins end up serving the same skills and both resolve. Claude had no cleanup hook, so nothing dropped the copy the installer does not manage. It gets one, checking only whether the other id is present -- a no-op for anyone who has only ever run the installer. The direction is not the same as the other harnesses and is not meant to be: Grok evicts the vendor catalog's copy to keep its direct-repo install, because its marketplace install is TUI-only. The rule they share is to keep whatever the harness installs and evict every other sentry.
evanpurkhiser
force-pushed
the
evanpurkhiser/fix-installer-remove-the-plugin-left-by-our-own-claude-marketplace
branch
from
August 5, 2026 18:31
e779eb9 to
c0f5a3e
Compare
evanpurkhiser
deleted the
evanpurkhiser/fix-installer-remove-the-plugin-left-by-our-own-claude-marketplace
branch
August 5, 2026 18:34
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 c0f5a3e. Configure here.
| } | ||
|
|
||
| await runCommand(system, `claude plugin uninstall ${OUR_PLUGIN_ID}`, output); | ||
| return `Removed conflicting plugin ${OUR_PLUGIN_ID}`; |
There was a problem hiding this comment.
Cleanup can leave Sentry disabled
High Severity
When the official plugin is installed but disabled, cleanup removes the enabled marketplace copy and then the installer selects update. Activation state is ignored, so a successful run can leave no active Sentry plugin.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit c0f5a3e. Configure here.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


Claude was the only harness with no
cleanuphook, so nothing stopped a secondsentryplugin from resolving alongside the one the installer manages.Our plugin is installable from two marketplaces under two ids. The installer uses Anthropic's official catalog (
sentry@claude-plugins-official), which pinsgetsentry/plugin-claude— but adding our own catalog by hand givessentry@sentry-plugin-marketplacefrom the same repo, and Claude will hold both. Two plugins then serve the same skills and both resolve. I have exactly that: ours enabled, the official one disabled, so the installer manages one plugin while a different one is live.This removes the copy the installer does not manage, before installing. The check is just whether the other id is present, so it is a no-op for anyone who only ever ran the installer.
isSentryInstalledbecomeshasPlugin(system, pluginId)so one listing can be checked for either id.How this relates to the other harnesses' cleanups
Not by doing the same thing — worth being precise, because the direction differs:
sentry@openai-curatedClaude is the inverse of Grok for an identical situation, since both vendors catalog our own repo. That is not a preference: Grok's marketplace install is TUI-only, so its direct-repo install is a workaround with a standing TODO to switch once it is headless — at which point Grok's direction would flip to match Claude's.
The rule all three share is weaker but real: keep whatever the harness's
installproduces and evict every othersentry. Today each harness open-codes that; #320 expresses it once, which is why it needs this hook to exist.Scope, honestly: the installer has always installed Claude from Anthropic's marketplace — that source has been in
claude.tssince the first installer commit (#180) — so this is not repairing a migration the installer caused. The duplicate comes from a manualmarketplace add, which in practice means people developing on this repo.Stacked on #321.