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 add succeeds with ./plugins/ paths
- ✅
claude plugin marketplace add fails 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
- ✅
enabledPlugins in settings.json matches marketplace entries
- ✅
MARKETPLACE_PATH resolution in setup-plugins.sh resolves 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.
Bug
All 13 devs-marketplace plugins fail to install during container post-start because
claude plugin marketplace addrejectsmarketplace.jsonwith a schema validation error.Error:
Impact: The marketplace never registers →
claude plugin install X@devs-marketplacefails for all 13 plugins → none of the hooks, skills, agents, or LSP configs load.Root Cause
Introduced in: PR #2 (
v1.14.0, commit2c26e3e)PR #2 refactored
marketplace.jsonto add a top-levelmetadata.pluginRoot: "./plugins"field and stripped the./plugins/prefix from allsourceentries, changing them from"source": "./plugins/codeforge-lsp"to"source": "codeforge-lsp". The assumption was thatpluginRootwould serve as the base path resolver.Claude Code's marketplace schema validator does not support
pluginRoot-based resolution — thesourcefield 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.jsonChange all 13
sourcefields from bare names to./plugins/-prefixed relative paths:"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, andownerfields all pass validation. Themetadata.pluginRootfield is harmless (ignored by the validator).Verified
Tested in the running container:
claude plugin marketplace addsucceeds with./plugins/pathsclaude plugin marketplace addfails with bare names (reproduces the bug)plugins/devs-marketplace/plugins/.claude-plugin/plugin.jsonenabledPluginsinsettings.jsonmatches marketplace entriesMARKETPLACE_PATHresolution insetup-plugins.shresolves correctlyFix applied on
Branch
test-integration— commits modifymarketplace.jsonand add a changelog entry under[Unreleased] > ### Fixed > #### Plugin Marketplace.