Plugins from this marketplace fail to load ("conflicting manifests") after every Claude Desktop marketplace refresh
Summary
On a machine where Claude Desktop refreshes this marketplace, academy-guide, claude-api and discernment-nudge stop loading in Claude Code after each refresh. The Desktop writes a .claude-plugin/plugin.json into each plugin's cache folder and copies the entry's skills array into it. The entries in .claude-plugin/marketplace.json are strict: false and declare skills, so Claude Code rejects each plugin as having conflicting manifests, which is its documented behavior. document-skills and example-skills have the same entry shape. They were not installed on this machine, so they were not observed.
Environment
- Claude Desktop 2.16120.0 on Windows 11 (MSIX); bundled Claude Code 2.1.284
- Claude Code CLI 2.1.286 (the debug log below was captured with 2.1.280)
- Plugins installed at commit
8a1541c4a3ffof this repo (before that:41bbe19d1a1a,34040c9c5685,33375500bcea)
What happens
Desktop log (%LOCALAPPDATA%\Claude\logs\main.log), on every refresh that includes this marketplace (unrelated lines omitted):
[CCDMarketplacePluginManagerCLI] Refreshing marketplace: anthropic-agent-skills
[marketplaceFileOps] Synthesized plugin.json for academy-guide (strict:false marketplace plugin)
[marketplaceFileOps] Synthesized plugin.json for claude-api (strict:false marketplace plugin)
[marketplaceFileOps] Synthesized plugin.json for discernment-nudge (strict:false marketplace plugin)
[CCDMarketplacePluginManagerCLI] Marketplace refreshed: anthropic-agent-skillsThe written file has name, description and skills (for example "skills": ["./skills/academy-guide"]). The file's mtime matches the log line to the second. Claude Code then logs:
Plugin academy-guide has conflicting manifests: both plugin.json and marketplace entry specify components. Set strict: true in marketplace entry or remove component specs from one location.
Plugin not available for MCP: academy-guide@anthropic-agent-skills - error type: generic-errorThe same two lines appear for claude-api and discernment-nudge. The plugins stay enabled in settings but contribute nothing. After the refresh, academy-guide:academy-guide, claude-api:claude-api and discernment-nudge:discernment-nudge are missing from the skill listing of new sessions. claude plugin update from the CLI restores them, because it produces a new cache folder without plugin.json, but only until the next Desktop refresh.
How often
Six Desktop refreshes included this marketplace between 2026-09-12 and 2026-10-01, and every one of them synthesized all three manifests. Refreshes that did not include this marketplace left the files alone. Two app restarts on 2026-10-01 did not trigger one. Another report (anthropics/claude-code#90114) says that just opening the plugins panel does.
Why (from reading the Desktop 2.16120.0 bundle)
- On a marketplace refresh,
ensureManifestsForMarketplacecallsensurePluginManifestExists(pluginId, …, true)for every installed plugin of that marketplace. Withoverwrite: truethe manifest is written even if one already exists. The only skip is when the plugin's source directory in the marketplace clone ships a real.claude-plugin/plugin.json. - On install and update the same function runs with
overwrite: false, and writes only if the file is missing. - The writer copies
name,displayName,description,version,author,commands,skills,agents,hooksandmcpServersfrom the entry. This path has no check onstrict; the "strict:false" text is only part of the log message.
The documented rule it collides with
From https://code.claude.com/docs/en/plugins-reference, "How entry fields combine with plugin.json": "plugin.json present, strict: false: an entry that declares any of commands, agents, skills, hooks, outputStyles, or themes is a conflict, and the plugin fails to load with Plugin <name> has conflicting manifests."
Related
- anthropics/claude-code#78604 (open): the same synthesis on Desktop 2.16120.0, which there drops
lspServersfrom LSP plugins. The fix suggested there is to skip synthesizing aplugin.jsonforstrict: falseentries. - anthropics/claude-code#90114: a refresh triggered by opening the plugins panel overwrote a hand-edited
plugin.json. - #189, #551 and #929: the shared
source: "./"layout of this marketplace (duplicate skills).
Possible fixes
- Desktop (product): don't synthesize a
plugin.jsonfor entries that arestrict: falseand declare components, or don't copy the component fields. This belongs to anthropics/claude-code#78604. - This catalog, in the meantime: give each plugin its own source directory with its own
.claude-plugin/plugin.json, the layout #1645 uses forclaude-academy. Per the code above, the Desktop then skips the synthesis on refresh. This would also address #189. Not tested. strict: truealone, as the CLI message suggests, is probably not enough with the current Desktop. The synthesis does not checkstrict. With aplugin.jsonpresent, a manifestskillskey adds to the defaultskills/directory (same docs page), so withsource: "./"every skill in the repo would load. This is inferred from the code and the docs, not tested.
Source: anthropics/skills