[BUG] Cowork: Custom marketplace plugins removed by RemotePluginManager sync — marked NOT_AVAILABLE on every session start
Description
Custom marketplace plugins installed in Cowork are immediately removed by RemotePluginManager sync on every session start. The plugins install successfully, but when a new session begins, the sync marks them as NOT_AVAILABLE and removes them from the active session. Only first-party plugins (e.g., cowork-plugin-management from knowledge-work-plugins) survive the sync.
The user sees "authenticating → working on it" and then nothing happens — the session completes silently with no output.
Steps to Reproduce
- In Cowork, add a custom GitHub marketplace (e.g.,
https://github.com/<user>/cowork-plugins) - Wait for marketplace sync to complete (
pollSyncUntilDone...settled with status=success) - Install a plugin from the custom marketplace (e.g.,
hello-world@cowork-plugins) - Installation succeeds:
installPlugin: remote API install succeeded - Start a new Cowork session and invoke a skill from the plugin (e.g.,
/hello-world:hello-echo) - Nothing happens — the skill is silently not recognized
Root Cause (from logs)
The RemotePluginManager sync cycle runs on every session start:
fetchAutoInstalledPlugins: 0 pluginsfetchBrowsableRemotePlugins: 18 plugins (offset=0, hasMore=false)— always exactly 18, regardless of custom marketplacesRemoved 1 user-installed plugins set to NOT_AVAILABLEUsing 1 remote plugins— onlycowork-plugin-managementremains
The browsable plugins catalog never includes custom marketplace plugins. The install API registers the plugin, but fetchBrowsableRemotePlugins returns only curated/official plugins. The sync logic then removes any installed plugin not in the catalog.
Audit log confirmation
The VM process returns immediately with zero API usage:
"result": "Unknown skill: hello-world:hello-echo"
"duration_ms": 8
"duration_api_ms": 0
"had_first_response": false
RPM manifest after sync
Only the first-party plugin survives:
{
"plugins": [
{
"id": "plugin_016jbzs7aGBZSgBfSWhp4ToX",
"name": "cowork-plugin-management",
"marketplaceName": "knowledge-work-plugins",
"installedBy": "user",
"installationPreference": "available"
}
]
}
Custom marketplace plugins never appear in this manifest after sync.
Log Evidence
# Install succeeds
[CustomPlugins] installPlugin: remote API install succeeded for plugin hello-world@cowork-plugins
# Marketplace sync succeeds
[remoteMarketplaceClient] pollSyncUntilDone id=marketplace_01KEiP7xZbHaYQ8LQjjJEhVn settled with status=success after 19865ms
# But on session start, plugin is removed
[RemotePluginManager] Starting remote plugins sync
[PluginsFetcher] fetchBrowsableRemotePlugins: 18 plugins (offset=0, hasMore=false)
[RemotePluginManager] Removed 1 user-installed plugins set to NOT_AVAILABLE
[RemotePluginManager] Sync complete: 0 downloaded, 0 removed, 0 orphans cleaned
[LocalAgentModeSessionManager] Using 1 remote plugins
This pattern repeats on every session start, dating back to at least 2026-03-30.
Attempted Fixes
- Removed and re-added the custom marketplace — same result
- Removed both custom marketplaces (
cowork-pluginsandresume-agent) and re-added — same result - Reinstalled the plugin after marketplace re-sync — same result
- Verified plugin structure matches working
cowork-plugin-managementplugin.json format exactly
Expected Behavior
Custom marketplace plugins that install successfully via the remote API should:
- Appear in the
fetchBrowsableRemotePluginscatalog after marketplace sync - Persist in the RPM manifest across session starts
- Be mounted into the VM and available as skills
Environment
- App version: Claude Desktop (Cowork)
- Claude Code SDK: 2.1.87
- OS: macOS (Darwin 25.4.0, arm64)
- VM: 4 CPUs, 4GB RAM, gvisor networking
- Plugin structure: Standard
.claude-plugin/plugin.json+skills/*/SKILL.md
Related Issues
- #33718 — Plugin from custom marketplace not appearing (CLI, different mechanism)
- #25278 — Claude Code plugins should be available in Cowork sessions
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗