Skip to content

Fix marketplace.json source field format — all 13 plugins fail to register #16

@AnExiledDev

Description

@AnExiledDev

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions