[BUG] Desktop: Chat/Cowork account plugin loads as @inline and overrides the same plugin installed from a same-named Claude Code marketplace

Status Open
Reported on v2.1.281
Maintainer reply None cached
Activity 0 comments · opened Sep 25, 2026

Summary

In Claude Desktop, a plugin provisioned from a Chat/Cowork (claude.ai account) marketplace silently overrides the same plugin that the user installed for Claude Code from a local clone of that marketplace. Both marketplaces declare the same name in marketplace.json, so the plugin has the same <name>@<marketplace> id in both. Desktop Code sessions load the account copy as <name>@inline, and because an @inline plugin takes precedence over an installed marketplace plugin with the same manifest name, the Code session runs the stale account copy instead of the one the user installed. Nothing in the UI or claude plugin list shows which copy is active.

Related: #95372 (same @inline injection of Desktop-provisioned plugins, there affecting plugin disable).

Environment

  • Windows 11
  • Claude Desktop (Microsoft Store build 2.9939.2.0), Code session running Claude Code 2.1.281
  • Claude Code CLI 2.1.282 and the VS Code extension on the same machine

Steps to reproduce

  1. Add a GitHub repository whose marketplace.json declares "name": "M" as a plugin marketplace to the claude.ai account (Chat/Cowork), and install plugin P from it. The published branch has P at version 1.0.0.
  2. Add a local clone of the same repository as a Claude Code marketplace (a directory source). It declares the same name M. Claude Code replaces its existing M entry in known_marketplaces.json with the local directory. Install P@M for Claude Code; the local copy is a newer version, 1.1.1, with changed hook behavior.
  3. Start a Code session in Claude Desktop and trigger P's hook.

Expected

The Desktop Code session uses the plugin installed for Claude Code (P@M from the local directory, 1.1.1), the same as the CLI and the VS Code extension, or at least warns that two plugins named P conflict and says which one loads.

Actual

  • The Desktop Code session runs the account copy (1.0.0). Its hook output is the old behavior, while the CLI and VS Code run 1.1.1.
  • ~/.claude.json pluginUsage records the Desktop run as P@inline, alongside P@M for the CLI and VS Code runs.
  • Desktop keeps the account copy under its own app data (local-agent-mode-sessions/.../rpm/<plugin id>/), which it refreshes when it fetches account-scoped remote plugins. ~/.claude/plugins/installed_plugins.json still records P@M 1.1.1 from the local directory.
  • Desktop's plugin list shows version 1.0.0 for the plugin, even though the Claude Code install is 1.1.1.
  • Removing the marketplace from the account view did not remove the cached account copy, so Desktop kept loading it.
  • Because both marketplaces share the name M, nothing tells the two copies apart: Claude Code keeps a single M marketplace, and Desktop loads the account copy of P as @inline next to it. The shared name may be what lets the account copy take over.

Impact

Plugin authors testing a local marketplace in Desktop silently run the published version instead, so changes do not take effect.

Suggested fix

  • Don't let a Desktop-provisioned @inline plugin shadow a plugin the user installed for Claude Code; prefer the installed plugin, or apply the documented name-conflict order that ranks synced/account plugins below installed ones.
  • Treat an account marketplace and a Claude Code marketplace with the same name as a conflict to resolve or report, rather than keeping one silently per surface.
  • Surface the conflict in Desktop and in claude plugin list / /plugin (for example "P from your account is replacing P@M from the local directory").
  • Show the version of the copy that actually loads.

View original on GitHub ↗