[BUG] 3P managed-marketplace auto-install rejects plugins with source "./" (path escape) — manual Directory install of the same entry succeeds; CLI equivalent was fixed in 2.1.142 (#57570)
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet (closest: #57570 and #51888, which cover the same rejection in the Claude Code CLI and were closed as fixed in 2.1.142 — this report is the Claude Desktop 3P managed auto-install path, which still exhibits it)
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
On Claude Desktop (third-party / 3P deployment mode), a managed-config allowedPluginMarketplaces entry with installationPreference: "auto_install" pointing at a marketplace whose plugins declare "source": "./" (plugin root = marketplace root, with a skills array — e.g. Anthropic's own anthropics/skills repo) fails to auto-install every plugin at launch:
- The marketplace itself clones and registers fine.
- Each plugin's launch-time auto-install is rejected with
path escape: "./". - The same plugins install successfully when the user manually installs them from the plugin Directory UI — and the installed skills work (verified:
document-skills:docxproduced a valid .docx in a Cowork session).
So the launch-time auto-installer and the interactive install path disagree about the validity of the same marketplace entry. The "skills": ["./"] / root-level plugin layout is documented as supported (plugins-reference → path behavior rules), and its rejection in the CLI was treated as a regression and fixed in v2.1.142 (#57570, #51888). The 3P managed auto-install path appears to retain the pre-fix strict check.
What Should Happen?
auto_install marketplaces should install root-level ("source": "./") plugins at launch, consistent with the documented path rules and with the interactive install path — anthropics/skills itself is the canonical repro. (Alternatively, if root-level plugins are intentionally disallowed for unattended installs, the Directory install should reject them too, the restriction should be documented, and anthropics/skills restructured — but consistency fixed in 2.1.142 suggests the auto-installer is the one that's wrong.)
Error Messages/Logs
# ~/Library/Logs/Claude-3p/main.log, at app launch:
[custom-3p:configured-marketplaces] syncing 1 configured source(s)
[custom-3p:configured-marketplaces] installed 'anthropic-agent-skills' from anthropics/skills
[custom-3p:configured-marketplaces] auto-install document-skills@anthropic-agent-skills rejected (path escape: "./")
[custom-3p:configured-marketplaces] auto-install example-skills@anthropic-agent-skills rejected (path escape: "./")
[custom-3p:configured-marketplaces] auto-install claude-api@anthropic-agent-skills rejected (path escape: "./")
# after manually installing the same three plugins from the Directory UI, they mount and work:
[LocalPluginsReader] Found 3 enabled local plugins (3 installed)
[workspaceMcpServer] bash: ... mounts=...,.local-plugins/cache/anthropic-agent-skills/document-skills/...,example-skills/...,claude-api/...
Steps to Reproduce
- Deploy Claude Desktop in third-party (3P) mode with a managed config whose
allowedPluginMarketplacescontains (delivered via MDM.mobileconfigor a bootstrap-server overlay — both reproduce):
``json``
[{
"source": "github",
"repo": "anthropics/skills",
"expectedName": "anthropic-agent-skills",
"ref": "9d2f1ae187231d8199c64b5b762e1bdf2244733d",
"installationPreference": "auto_install"
}]
- Fully quit and relaunch the app; watch
~/Library/Logs/Claude-3p/main.log. - Observe: marketplace installs, then three
auto-install ... rejected (path escape: "./")warnings; no plugins appear in Cowork. - Open the plugin Directory in-app and install any of the same plugins manually → installs successfully, skills load and run in Cowork sessions.
Root-cause pointer from the shipped bundle (app.asar, minified): the safe-join used by the auto-installer resolves join(marketplaceRoot, "./") === marketplaceRoot, and its containment check is invoked with allowEqual: false, so "plugin dir == marketplace root" is classified as an escape; the interactive path resolves the same join with the lenient/default behavior. This mirrors the pre-2.1.142 CLI behavior fixed via #57570.
Claude Model
Not sure / Multiple models
Is this a regression?
I don't know
Last Working Version
n/a (CLI equivalent last broken before 2.1.142; unknown for the 3P auto-installer)
Claude Code Version
Claude Desktop 1.22209.0 (3P mode; bundled claude-code 0.3.209). Also observed on Desktop 1.20186.x.
Platform
AWS Bedrock
Operating System
macOS
Terminal/Shell
Other
Additional Information
Enterprise fleet context: with auto_install broken for this layout, the managed tier silently degrades to available (users must find and install plugins by hand), and the rejection warnings repeat at every launch. Related open reports on the marketplace side of this repo's own skills content: anthropics/skills#67, anthropics/skills#1087, anthropics/skills#919.