-
Notifications
You must be signed in to change notification settings - Fork 2
Description
Bug
All 13 devs-marketplace plugins fail to install during container post-start because claude plugin marketplace add rejects marketplace.json with a schema validation error.
Error:
Failed to parse marketplace file: Invalid schema: plugins.0.source: Invalid input, plugins.1.source: Invalid input, ...
Impact: The marketplace never registers → claude plugin install X@devs-marketplace fails for all 13 plugins → none of the hooks, skills, agents, or LSP configs load.
Root Cause
Introduced in: PR #2 (v1.14.0, commit 2c26e3e)
PR #2 refactored marketplace.json to add a top-level metadata.pluginRoot: "./plugins" field and stripped the ./plugins/ prefix from all source entries, changing them from "source": "./plugins/codeforge-lsp" to "source": "codeforge-lsp". The assumption was that pluginRoot would serve as the base path resolver.
Claude Code's marketplace schema validator does not support pluginRoot-based resolution — the source field must be a self-contained relative path starting with ./. The official Anthropic marketplace (claude-plugins-official) uses "source": "./plugins/plugin-name" format.
PR #7 (prompt-snippets) and PR #10 (git-workflow) followed the same bare-name pattern when adding new plugins.
Fix
File: .devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json
Change all 13 source fields from bare names to ./plugins/-prefixed relative paths:
| Current (broken) | Fixed |
|---|---|
"source": "codeforge-lsp" |
"source": "./plugins/codeforge-lsp" |
"source": "ticket-workflow" |
"source": "./plugins/ticket-workflow" |
"source": "notify-hook" |
"source": "./plugins/notify-hook" |
"source": "dangerous-command-blocker" |
"source": "./plugins/dangerous-command-blocker" |
"source": "protected-files-guard" |
"source": "./plugins/protected-files-guard" |
"source": "agent-system" |
"source": "./plugins/agent-system" |
"source": "skill-engine" |
"source": "./plugins/skill-engine" |
"source": "spec-workflow" |
"source": "./plugins/spec-workflow" |
"source": "session-context" |
"source": "./plugins/session-context" |
"source": "auto-code-quality" |
"source": "./plugins/auto-code-quality" |
"source": "workspace-scope-guard" |
"source": "./plugins/workspace-scope-guard" |
"source": "prompt-snippets" |
"source": "./plugins/prompt-snippets" |
"source": "git-workflow" |
"source": "./plugins/git-workflow" |
No other fields need changing. The metadata, category, keywords, $schema, and owner fields all pass validation. The metadata.pluginRoot field is harmless (ignored by the validator).
Verified
Tested in the running container:
- ✅
claude plugin marketplace addsucceeds with./plugins/paths - ✅
claude plugin marketplace addfails with bare names (reproduces the bug) - ✅ All 13 plugin directories exist at
plugins/devs-marketplace/plugins/ - ✅ All 13 have valid
.claude-plugin/plugin.json - ✅ All hook scripts exist at referenced paths
- ✅
enabledPluginsinsettings.jsonmatches marketplace entries - ✅
MARKETPLACE_PATHresolution insetup-plugins.shresolves correctly - ✅ JSON is syntactically valid after the fix
Fix applied on
Branch test-integration — commits modify marketplace.json and add a changelog entry under [Unreleased] > ### Fixed > #### Plugin Marketplace.