diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index e302985..62ce7e2 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -6,7 +6,7 @@ }, "metadata": { "description": "Project management plugins with Gitea and NetBox integrations", - "version": "9.1.1" + "version": "9.1.2" }, "plugins": [ { @@ -27,8 +27,7 @@ "gitea", "project-management" ], - "license": "MIT", - "domain": "core" + "license": "MIT" }, { "name": "doc-guardian", @@ -47,8 +46,7 @@ "drift-detection", "sync" ], - "license": "MIT", - "domain": "core" + "license": "MIT" }, { "name": "code-sentinel", @@ -70,8 +68,7 @@ "refactoring", "vulnerabilities" ], - "license": "MIT", - "domain": "core" + "license": "MIT" }, { "name": "project-hygiene", @@ -91,8 +88,7 @@ "maintenance", "manual-check" ], - "license": "MIT", - "domain": "core" + "license": "MIT" }, { "name": "cmdb-assistant", @@ -117,8 +113,7 @@ "data-quality", "validation" ], - "license": "MIT", - "domain": "ops" + "license": "MIT" }, { "name": "claude-config-maintainer", @@ -137,8 +132,7 @@ "configuration", "optimization" ], - "license": "MIT", - "domain": "core" + "license": "MIT" }, { "name": "clarity-assist", @@ -161,8 +155,7 @@ "clarification", "nd-friendly" ], - "license": "MIT", - "domain": "core" + "license": "MIT" }, { "name": "git-flow", @@ -185,8 +178,7 @@ "commits", "branching" ], - "license": "MIT", - "domain": "core" + "license": "MIT" }, { "name": "pr-review", @@ -206,8 +198,7 @@ "security", "quality" ], - "license": "MIT", - "domain": "core" + "license": "MIT" }, { "name": "data-platform", @@ -229,8 +220,7 @@ "data-engineering", "etl" ], - "license": "MIT", - "domain": "data" + "license": "MIT" }, { "name": "viz-platform", @@ -253,8 +243,7 @@ "theming", "dmc" ], - "license": "MIT", - "domain": "data" + "license": "MIT" }, { "name": "contract-validator", @@ -276,8 +265,7 @@ "interfaces", "cross-plugin" ], - "license": "MIT", - "domain": "core" + "license": "MIT" }, { "name": "saas-api-platform", @@ -299,8 +287,7 @@ "express", "openapi" ], - "license": "MIT", - "domain": "saas" + "license": "MIT" }, { "name": "saas-db-migrate", @@ -322,8 +309,7 @@ "sql", "schema" ], - "license": "MIT", - "domain": "saas" + "license": "MIT" }, { "name": "saas-react-platform", @@ -345,8 +331,7 @@ "frontend", "components" ], - "license": "MIT", - "domain": "saas" + "license": "MIT" }, { "name": "saas-test-pilot", @@ -368,8 +353,7 @@ "playwright", "coverage" ], - "license": "MIT", - "domain": "saas" + "license": "MIT" }, { "name": "data-seed", @@ -390,8 +374,7 @@ "fixtures", "database" ], - "license": "MIT", - "domain": "data" + "license": "MIT" }, { "name": "ops-release-manager", @@ -412,8 +395,7 @@ "versioning", "tags" ], - "license": "MIT", - "domain": "ops" + "license": "MIT" }, { "name": "ops-deploy-pipeline", @@ -434,8 +416,7 @@ "caddy", "cicd" ], - "license": "MIT", - "domain": "ops" + "license": "MIT" }, { "name": "debug-mcp", @@ -456,8 +437,7 @@ "server", "development" ], - "license": "MIT", - "domain": "debug" + "license": "MIT" } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index c44caca..2390bef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +## [9.1.2] - 2026-02-07 + +### Fixed + +- **BREAKING FIX:** Removed `"domain"` field from all `marketplace.json` and `plugin.json` files — Claude Code's strict schema validator rejects unrecognized keys, causing `Failed to load marketplace` error +- Domain metadata moved to `metadata.json` per plugin (same pattern as `mcp_servers`) +- `validate-marketplace.sh` updated to read domain from `metadata.json` instead of `marketplace.json`/`plugin.json` +- All documentation updated to reference `metadata.json` as domain source + ## [9.1.1] - 2026-02-07 ### Changed diff --git a/CLAUDE.md b/CLAUDE.md index f54b407..ccb303e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -154,7 +154,7 @@ When user says "fix the sprint plan command", edit the SOURCE code. ## Project Overview **Repository:** leo-claude-mktplace -**Version:** 9.1.1 +**Version:** 9.1.2 **Status:** Production Ready A plugin marketplace for Claude Code containing: @@ -424,19 +424,18 @@ Stored in Gitea Wiki under `lessons-learned/sprints/`. ### Adding a New Plugin -1. Create `plugins/{name}/.claude-plugin/plugin.json` — must include `"domain"` field (`core`, `data`, `saas`, `ops`, or `debug`) -2. Add entry to `.claude-plugin/marketplace.json` with category, tags, license, and `"domain"` field (must match plugin.json) -3. Create `claude-md-integration.md` -4. If using new MCP server, add to root `mcp-servers/` and update `.mcp.json` -5. Run `./scripts/validate-marketplace.sh` — rejects plugins without valid `domain` field -6. Update `CHANGELOG.md` +1. Create `plugins/{name}/.claude-plugin/plugin.json` (standard schema fields only — no custom fields) +2. Create `plugins/{name}/.claude-plugin/metadata.json` — must include `"domain"` field (`core`, `data`, `saas`, `ops`, or `debug`) +3. Add entry to `.claude-plugin/marketplace.json` with category, tags, license (no custom fields — Claude Code schema is strict) +4. Create `claude-md-integration.md` +5. If using new MCP server, add to root `mcp-servers/` and update `.mcp.json` +6. Run `./scripts/validate-marketplace.sh` — rejects plugins without valid `domain` field +7. Update `CHANGELOG.md` -**Domain field is required (v8.0.0+):** +**Domain field is required in metadata.json (v8.0.0+, moved from plugin.json in v9.1.2):** ```json { - "name": "plugin-name", - "domain": "core", - ... + "domain": "core" } ``` diff --git a/README.md b/README.md index 73ed04e..7aabb7b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Leo Claude Marketplace — v9.1.1 +# Leo Claude Marketplace — v9.1.2 A plugin marketplace for Claude Code providing sprint management, code review, security scanning, infrastructure automation, and development workflow tools. 20 plugins across 5 domains, backed by 5 shared MCP servers. diff --git a/docs/CANONICAL-PATHS.md b/docs/CANONICAL-PATHS.md index 2ac5a56..5254ca4 100644 --- a/docs/CANONICAL-PATHS.md +++ b/docs/CANONICAL-PATHS.md @@ -384,14 +384,13 @@ All MCP servers are defined in `.mcp.json` at repository root: ## Domain Metadata -### Domain Field Locations +### Domain Field Location -Both manifest files require a `domain` field (v8.0.0+): +Domain metadata is stored in `metadata.json` (v9.1.2+, moved from plugin.json/marketplace.json for Claude Code schema compliance): | Location | Field | Example | |----------|-------|---------| -| `plugins/{name}/.claude-plugin/plugin.json` | `"domain": "core"` | `plugins/projman/.claude-plugin/plugin.json` | -| `.claude-plugin/marketplace.json` | `"domain": "core"` per plugin entry | `.claude-plugin/marketplace.json` | +| `plugins/{name}/.claude-plugin/metadata.json` | `"domain": "core"` | `plugins/projman/.claude-plugin/metadata.json` | ### Allowed Domain Values @@ -413,10 +412,15 @@ Both manifest files require a `domain` field (v8.0.0+): ```bash # List all plugins in a domain -jq '.plugins[] | select(.domain=="saas") | .name' .claude-plugin/marketplace.json +for p in plugins/*; do + d=$(jq -r '.domain // empty' "$p/.claude-plugin/metadata.json" 2>/dev/null) + [[ "$d" == "saas" ]] && basename "$p" +done # Count plugins per domain -jq '[.plugins[] | .domain] | group_by(.) | map({domain: .[0], count: length})' .claude-plugin/marketplace.json +for p in plugins/*; do + jq -r '.domain // empty' "$p/.claude-plugin/metadata.json" 2>/dev/null +done | sort | uniq -c | sort -rn ``` --- @@ -425,6 +429,7 @@ jq '[.plugins[] | .domain] | group_by(.) | map({domain: .[0], count: length})' . | Date | Change | By | |------|--------|-----| +| 2026-02-07 | v9.1.2: Moved domain field from plugin.json/marketplace.json to metadata.json for Claude Code schema compliance | Claude Code | | 2026-02-07 | v9.1.0: Removed deleted dirs (architecture/, prompts/, project-lessons-learned/), added Phase 3 plugins, added ARCHITECTURE.md, MIGRATION-v9.md, updated Domain table, removed stale hooks/ dirs | Claude Code | | 2026-02-06 | v8.0.0: Added domain metadata section, Phase 1a paths, future plugin paths | Claude Code | | 2026-02-04 | v7.1.0: Added profile configs, prompts/, project-lessons-learned/, metadata.json, deprecated switch-profile.sh | Claude Code | diff --git a/plugins/clarity-assist/.claude-plugin/metadata.json b/plugins/clarity-assist/.claude-plugin/metadata.json new file mode 100644 index 0000000..f99a72a --- /dev/null +++ b/plugins/clarity-assist/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "core" +} diff --git a/plugins/clarity-assist/.claude-plugin/plugin.json b/plugins/clarity-assist/.claude-plugin/plugin.json index 54f794b..be23302 100644 --- a/plugins/clarity-assist/.claude-plugin/plugin.json +++ b/plugins/clarity-assist/.claude-plugin/plugin.json @@ -18,6 +18,5 @@ ], "commands": [ "./commands/" - ], - "domain": "core" + ] } diff --git a/plugins/claude-config-maintainer/.claude-plugin/metadata.json b/plugins/claude-config-maintainer/.claude-plugin/metadata.json new file mode 100644 index 0000000..f99a72a --- /dev/null +++ b/plugins/claude-config-maintainer/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "core" +} diff --git a/plugins/claude-config-maintainer/.claude-plugin/plugin.json b/plugins/claude-config-maintainer/.claude-plugin/plugin.json index 48d08a0..9cc437c 100644 --- a/plugins/claude-config-maintainer/.claude-plugin/plugin.json +++ b/plugins/claude-config-maintainer/.claude-plugin/plugin.json @@ -20,6 +20,5 @@ ], "commands": [ "./commands/" - ], - "domain": "core" + ] } diff --git a/plugins/cmdb-assistant/.claude-plugin/metadata.json b/plugins/cmdb-assistant/.claude-plugin/metadata.json index 3a90799..ba79054 100644 --- a/plugins/cmdb-assistant/.claude-plugin/metadata.json +++ b/plugins/cmdb-assistant/.claude-plugin/metadata.json @@ -1 +1,6 @@ -{"mcp_servers": ["netbox"]} +{ + "mcp_servers": [ + "netbox" + ], + "domain": "ops" +} diff --git a/plugins/cmdb-assistant/.claude-plugin/plugin.json b/plugins/cmdb-assistant/.claude-plugin/plugin.json index 01fc239..76032dd 100644 --- a/plugins/cmdb-assistant/.claude-plugin/plugin.json +++ b/plugins/cmdb-assistant/.claude-plugin/plugin.json @@ -21,6 +21,5 @@ ], "commands": [ "./commands/" - ], - "domain": "ops" + ] } diff --git a/plugins/code-sentinel/.claude-plugin/metadata.json b/plugins/code-sentinel/.claude-plugin/metadata.json new file mode 100644 index 0000000..f99a72a --- /dev/null +++ b/plugins/code-sentinel/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "core" +} diff --git a/plugins/code-sentinel/.claude-plugin/plugin.json b/plugins/code-sentinel/.claude-plugin/plugin.json index 9600990..39fb079 100644 --- a/plugins/code-sentinel/.claude-plugin/plugin.json +++ b/plugins/code-sentinel/.claude-plugin/plugin.json @@ -18,6 +18,5 @@ ], "commands": [ "./commands/" - ], - "domain": "core" + ] } diff --git a/plugins/contract-validator/.claude-plugin/metadata.json b/plugins/contract-validator/.claude-plugin/metadata.json index 11632cc..b21415b 100644 --- a/plugins/contract-validator/.claude-plugin/metadata.json +++ b/plugins/contract-validator/.claude-plugin/metadata.json @@ -1 +1,6 @@ -{"mcp_servers": ["contract-validator"]} +{ + "mcp_servers": [ + "contract-validator" + ], + "domain": "core" +} diff --git a/plugins/contract-validator/.claude-plugin/plugin.json b/plugins/contract-validator/.claude-plugin/plugin.json index 9515ed2..04fab1e 100644 --- a/plugins/contract-validator/.claude-plugin/plugin.json +++ b/plugins/contract-validator/.claude-plugin/plugin.json @@ -19,6 +19,5 @@ ], "commands": [ "./commands/" - ], - "domain": "core" + ] } diff --git a/plugins/data-platform/.claude-plugin/metadata.json b/plugins/data-platform/.claude-plugin/metadata.json index 59da561..b7dd4e6 100644 --- a/plugins/data-platform/.claude-plugin/metadata.json +++ b/plugins/data-platform/.claude-plugin/metadata.json @@ -1 +1,6 @@ -{"mcp_servers": ["data-platform"]} +{ + "mcp_servers": [ + "data-platform" + ], + "domain": "data" +} diff --git a/plugins/data-platform/.claude-plugin/plugin.json b/plugins/data-platform/.claude-plugin/plugin.json index b2f5166..39ba963 100644 --- a/plugins/data-platform/.claude-plugin/plugin.json +++ b/plugins/data-platform/.claude-plugin/plugin.json @@ -20,6 +20,5 @@ ], "commands": [ "./commands/" - ], - "domain": "data" + ] } diff --git a/plugins/data-seed/.claude-plugin/metadata.json b/plugins/data-seed/.claude-plugin/metadata.json new file mode 100644 index 0000000..07d315c --- /dev/null +++ b/plugins/data-seed/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "data" +} diff --git a/plugins/data-seed/.claude-plugin/plugin.json b/plugins/data-seed/.claude-plugin/plugin.json index 659325d..72d976d 100644 --- a/plugins/data-seed/.claude-plugin/plugin.json +++ b/plugins/data-seed/.claude-plugin/plugin.json @@ -20,6 +20,5 @@ ], "commands": [ "./commands/" - ], - "domain": "data" + ] } diff --git a/plugins/debug-mcp/.claude-plugin/metadata.json b/plugins/debug-mcp/.claude-plugin/metadata.json new file mode 100644 index 0000000..fc629a6 --- /dev/null +++ b/plugins/debug-mcp/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "debug" +} diff --git a/plugins/debug-mcp/.claude-plugin/plugin.json b/plugins/debug-mcp/.claude-plugin/plugin.json index 08303ba..fbb4c77 100644 --- a/plugins/debug-mcp/.claude-plugin/plugin.json +++ b/plugins/debug-mcp/.claude-plugin/plugin.json @@ -20,6 +20,5 @@ ], "commands": [ "./commands/" - ], - "domain": "debug" + ] } diff --git a/plugins/doc-guardian/.claude-plugin/metadata.json b/plugins/doc-guardian/.claude-plugin/metadata.json index a352e4a..9af4ef0 100644 --- a/plugins/doc-guardian/.claude-plugin/metadata.json +++ b/plugins/doc-guardian/.claude-plugin/metadata.json @@ -1 +1,6 @@ -{"mcp_servers": ["gitea"]} +{ + "mcp_servers": [ + "gitea" + ], + "domain": "core" +} diff --git a/plugins/doc-guardian/.claude-plugin/plugin.json b/plugins/doc-guardian/.claude-plugin/plugin.json index 1ba3635..deae60b 100644 --- a/plugins/doc-guardian/.claude-plugin/plugin.json +++ b/plugins/doc-guardian/.claude-plugin/plugin.json @@ -18,6 +18,5 @@ ], "commands": [ "./commands/" - ], - "domain": "core" + ] } diff --git a/plugins/git-flow/.claude-plugin/metadata.json b/plugins/git-flow/.claude-plugin/metadata.json index a352e4a..9af4ef0 100644 --- a/plugins/git-flow/.claude-plugin/metadata.json +++ b/plugins/git-flow/.claude-plugin/metadata.json @@ -1 +1,6 @@ -{"mcp_servers": ["gitea"]} +{ + "mcp_servers": [ + "gitea" + ], + "domain": "core" +} diff --git a/plugins/git-flow/.claude-plugin/plugin.json b/plugins/git-flow/.claude-plugin/plugin.json index 9559b42..b0043e8 100644 --- a/plugins/git-flow/.claude-plugin/plugin.json +++ b/plugins/git-flow/.claude-plugin/plugin.json @@ -18,6 +18,5 @@ ], "commands": [ "./commands/" - ], - "domain": "core" + ] } diff --git a/plugins/ops-deploy-pipeline/.claude-plugin/metadata.json b/plugins/ops-deploy-pipeline/.claude-plugin/metadata.json new file mode 100644 index 0000000..06a6c26 --- /dev/null +++ b/plugins/ops-deploy-pipeline/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "ops" +} diff --git a/plugins/ops-deploy-pipeline/.claude-plugin/plugin.json b/plugins/ops-deploy-pipeline/.claude-plugin/plugin.json index 13165b4..fa59704 100644 --- a/plugins/ops-deploy-pipeline/.claude-plugin/plugin.json +++ b/plugins/ops-deploy-pipeline/.claude-plugin/plugin.json @@ -20,6 +20,5 @@ ], "commands": [ "./commands/" - ], - "domain": "ops" + ] } diff --git a/plugins/ops-release-manager/.claude-plugin/metadata.json b/plugins/ops-release-manager/.claude-plugin/metadata.json new file mode 100644 index 0000000..06a6c26 --- /dev/null +++ b/plugins/ops-release-manager/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "ops" +} diff --git a/plugins/ops-release-manager/.claude-plugin/plugin.json b/plugins/ops-release-manager/.claude-plugin/plugin.json index 44e2e58..46db311 100644 --- a/plugins/ops-release-manager/.claude-plugin/plugin.json +++ b/plugins/ops-release-manager/.claude-plugin/plugin.json @@ -20,6 +20,5 @@ ], "commands": [ "./commands/" - ], - "domain": "ops" + ] } diff --git a/plugins/pr-review/.claude-plugin/metadata.json b/plugins/pr-review/.claude-plugin/metadata.json index a352e4a..9af4ef0 100644 --- a/plugins/pr-review/.claude-plugin/metadata.json +++ b/plugins/pr-review/.claude-plugin/metadata.json @@ -1 +1,6 @@ -{"mcp_servers": ["gitea"]} +{ + "mcp_servers": [ + "gitea" + ], + "domain": "core" +} diff --git a/plugins/pr-review/.claude-plugin/plugin.json b/plugins/pr-review/.claude-plugin/plugin.json index 12edf84..25b336f 100644 --- a/plugins/pr-review/.claude-plugin/plugin.json +++ b/plugins/pr-review/.claude-plugin/plugin.json @@ -18,6 +18,5 @@ ], "commands": [ "./commands/" - ], - "domain": "core" + ] } diff --git a/plugins/project-hygiene/.claude-plugin/metadata.json b/plugins/project-hygiene/.claude-plugin/metadata.json new file mode 100644 index 0000000..f99a72a --- /dev/null +++ b/plugins/project-hygiene/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "core" +} diff --git a/plugins/project-hygiene/.claude-plugin/plugin.json b/plugins/project-hygiene/.claude-plugin/plugin.json index dcca84c..e7559ba 100644 --- a/plugins/project-hygiene/.claude-plugin/plugin.json +++ b/plugins/project-hygiene/.claude-plugin/plugin.json @@ -15,7 +15,6 @@ "maintenance", "manual-check" ], - "domain": "core", "commands": [ "./commands/" ] diff --git a/plugins/projman/.claude-plugin/metadata.json b/plugins/projman/.claude-plugin/metadata.json index a352e4a..9af4ef0 100644 --- a/plugins/projman/.claude-plugin/metadata.json +++ b/plugins/projman/.claude-plugin/metadata.json @@ -1 +1,6 @@ -{"mcp_servers": ["gitea"]} +{ + "mcp_servers": [ + "gitea" + ], + "domain": "core" +} diff --git a/plugins/projman/.claude-plugin/plugin.json b/plugins/projman/.claude-plugin/plugin.json index cc49851..008fc01 100644 --- a/plugins/projman/.claude-plugin/plugin.json +++ b/plugins/projman/.claude-plugin/plugin.json @@ -18,6 +18,5 @@ ], "commands": [ "./commands/" - ], - "domain": "core" + ] } diff --git a/plugins/saas-api-platform/.claude-plugin/metadata.json b/plugins/saas-api-platform/.claude-plugin/metadata.json new file mode 100644 index 0000000..1ed9b8f --- /dev/null +++ b/plugins/saas-api-platform/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "saas" +} diff --git a/plugins/saas-api-platform/.claude-plugin/plugin.json b/plugins/saas-api-platform/.claude-plugin/plugin.json index 32abbf8..a8ef6f4 100644 --- a/plugins/saas-api-platform/.claude-plugin/plugin.json +++ b/plugins/saas-api-platform/.claude-plugin/plugin.json @@ -21,6 +21,5 @@ ], "commands": [ "./commands/" - ], - "domain": "saas" + ] } diff --git a/plugins/saas-db-migrate/.claude-plugin/metadata.json b/plugins/saas-db-migrate/.claude-plugin/metadata.json new file mode 100644 index 0000000..1ed9b8f --- /dev/null +++ b/plugins/saas-db-migrate/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "saas" +} diff --git a/plugins/saas-db-migrate/.claude-plugin/plugin.json b/plugins/saas-db-migrate/.claude-plugin/plugin.json index c169f77..6445238 100644 --- a/plugins/saas-db-migrate/.claude-plugin/plugin.json +++ b/plugins/saas-db-migrate/.claude-plugin/plugin.json @@ -20,6 +20,5 @@ ], "commands": [ "./commands/" - ], - "domain": "saas" + ] } diff --git a/plugins/saas-react-platform/.claude-plugin/metadata.json b/plugins/saas-react-platform/.claude-plugin/metadata.json new file mode 100644 index 0000000..1ed9b8f --- /dev/null +++ b/plugins/saas-react-platform/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "saas" +} diff --git a/plugins/saas-react-platform/.claude-plugin/plugin.json b/plugins/saas-react-platform/.claude-plugin/plugin.json index 7948e92..1e2a29a 100644 --- a/plugins/saas-react-platform/.claude-plugin/plugin.json +++ b/plugins/saas-react-platform/.claude-plugin/plugin.json @@ -21,6 +21,5 @@ ], "commands": [ "./commands/" - ], - "domain": "saas" + ] } diff --git a/plugins/saas-test-pilot/.claude-plugin/metadata.json b/plugins/saas-test-pilot/.claude-plugin/metadata.json new file mode 100644 index 0000000..1ed9b8f --- /dev/null +++ b/plugins/saas-test-pilot/.claude-plugin/metadata.json @@ -0,0 +1,3 @@ +{ + "domain": "saas" +} diff --git a/plugins/saas-test-pilot/.claude-plugin/plugin.json b/plugins/saas-test-pilot/.claude-plugin/plugin.json index e5a3ac9..06a2a17 100644 --- a/plugins/saas-test-pilot/.claude-plugin/plugin.json +++ b/plugins/saas-test-pilot/.claude-plugin/plugin.json @@ -21,6 +21,5 @@ ], "commands": [ "./commands/" - ], - "domain": "saas" + ] } diff --git a/plugins/viz-platform/.claude-plugin/metadata.json b/plugins/viz-platform/.claude-plugin/metadata.json index 3b6981d..4d82a2f 100644 --- a/plugins/viz-platform/.claude-plugin/metadata.json +++ b/plugins/viz-platform/.claude-plugin/metadata.json @@ -1 +1,6 @@ -{"mcp_servers": ["viz-platform"]} +{ + "mcp_servers": [ + "viz-platform" + ], + "domain": "data" +} diff --git a/plugins/viz-platform/.claude-plugin/plugin.json b/plugins/viz-platform/.claude-plugin/plugin.json index c85810b..e2e4424 100644 --- a/plugins/viz-platform/.claude-plugin/plugin.json +++ b/plugins/viz-platform/.claude-plugin/plugin.json @@ -21,6 +21,5 @@ ], "commands": [ "./commands/" - ], - "domain": "data" + ] } diff --git a/scripts/validate-marketplace.sh b/scripts/validate-marketplace.sh index aa57c2d..4787655 100755 --- a/scripts/validate-marketplace.sh +++ b/scripts/validate-marketplace.sh @@ -92,17 +92,23 @@ for i in $(seq 0 $((PLUGIN_COUNT - 1))); do exit 1 fi - # v8.0.0: Check domain field - PLUGIN_DOMAIN=$(jq -r ".plugins[$i].domain // empty" "$MARKETPLACE_JSON") + # v8.0.0/v9.1.2: Check domain field in metadata.json (moved from marketplace.json for schema compliance) + PLUGIN_SOURCE=$(jq -r ".plugins[$i].source" "$MARKETPLACE_JSON") + METADATA_JSON="$ROOT_DIR/$PLUGIN_SOURCE/.claude-plugin/metadata.json" + if [[ -f "$METADATA_JSON" ]]; then + PLUGIN_DOMAIN=$(jq -r '.domain // empty' "$METADATA_JSON") + else + PLUGIN_DOMAIN="" + fi if [[ -z "$PLUGIN_DOMAIN" ]]; then - echo "ERROR: Missing 'domain' in marketplace entry for $PLUGIN_NAME (required v8.0.0+)" + echo "ERROR: Missing 'domain' in $PLUGIN_NAME/.claude-plugin/metadata.json (required v8.0.0+)" exit 1 fi if ! echo "$VALID_DOMAINS" | grep -qw "$PLUGIN_DOMAIN"; then - echo "ERROR: Invalid domain '$PLUGIN_DOMAIN' in marketplace entry for $PLUGIN_NAME (allowed: $VALID_DOMAINS)" + echo "ERROR: Invalid domain '$PLUGIN_DOMAIN' in $PLUGIN_NAME/metadata.json (allowed: $VALID_DOMAINS)" exit 1 fi - echo " ✓ domain: $PLUGIN_DOMAIN" + echo " ✓ domain: $PLUGIN_DOMAIN (from metadata.json)" echo "✓ Marketplace entry $PLUGIN_NAME valid" done @@ -158,17 +164,22 @@ for plugin_dir in "$PLUGINS_DIR"/*/; do echo "WARNING: Missing 'keywords' array in $plugin_name/plugin.json" fi - # v8.0.0: Check domain field in plugin.json - PLUGIN_DOMAIN_PJ=$(jq -r '.domain // empty' "$plugin_json") - if [[ -z "$PLUGIN_DOMAIN_PJ" ]]; then - echo "ERROR: Missing 'domain' in $plugin_name/plugin.json (required v8.0.0+)" + # v8.0.0/v9.1.2: Check domain field in metadata.json (moved from plugin.json for schema compliance) + metadata_json="$plugin_dir.claude-plugin/metadata.json" + if [[ -f "$metadata_json" ]]; then + PLUGIN_DOMAIN_MD=$(jq -r '.domain // empty' "$metadata_json") + else + PLUGIN_DOMAIN_MD="" + fi + if [[ -z "$PLUGIN_DOMAIN_MD" ]]; then + echo "ERROR: Missing 'domain' in $plugin_name/.claude-plugin/metadata.json (required v8.0.0+)" exit 1 fi - if ! echo "$VALID_DOMAINS" | grep -qw "$PLUGIN_DOMAIN_PJ"; then - echo "ERROR: Invalid domain '$PLUGIN_DOMAIN_PJ' in $plugin_name/plugin.json (allowed: $VALID_DOMAINS)" + if ! echo "$VALID_DOMAINS" | grep -qw "$PLUGIN_DOMAIN_MD"; then + echo "ERROR: Invalid domain '$PLUGIN_DOMAIN_MD' in $plugin_name/metadata.json (allowed: $VALID_DOMAINS)" exit 1 fi - echo " ✓ domain: $PLUGIN_DOMAIN_PJ" + echo " ✓ domain: $PLUGIN_DOMAIN_MD (from metadata.json)" # Check README exists if [[ ! -f "$plugin_dir/README.md" ]]; then @@ -324,20 +335,23 @@ if [[ ! -f "$ROOT_DIR/.mcp.json" ]]; then fi echo "✓ .mcp.json configuration exists" -# v8.0.0: Cross-validate domains match between marketplace.json and plugin.json +# v8.0.0/v9.1.2: Validate domain in metadata.json for all plugins (single source of truth) echo "" -echo "=== Cross-Validating Domain Fields ===" -for i in $(seq 0 $((PLUGIN_COUNT - 1))); do - PLUGIN_NAME=$(jq -r ".plugins[$i].name" "$MARKETPLACE_JSON") - MARKETPLACE_DOMAIN=$(jq -r ".plugins[$i].domain" "$MARKETPLACE_JSON") - PLUGIN_JSON_PATH="$PLUGINS_DIR/$PLUGIN_NAME/.claude-plugin/plugin.json" - if [[ -f "$PLUGIN_JSON_PATH" ]]; then - PLUGIN_DOMAIN=$(jq -r '.domain' "$PLUGIN_JSON_PATH") - if [[ "$MARKETPLACE_DOMAIN" != "$PLUGIN_DOMAIN" ]]; then - echo "ERROR: Domain mismatch for $PLUGIN_NAME: marketplace.json='$MARKETPLACE_DOMAIN' vs plugin.json='$PLUGIN_DOMAIN'" +echo "=== Validating Domain Fields (metadata.json) ===" +for plugin_dir in "$PLUGINS_DIR"/*/; do + plugin_name=$(basename "$plugin_dir") + metadata_file="$plugin_dir.claude-plugin/metadata.json" + if [[ -f "$metadata_file" ]]; then + domain=$(jq -r '.domain // empty' "$metadata_file") + if [[ -n "$domain" ]]; then + echo "✓ $plugin_name domain: $domain" + else + echo "ERROR: $plugin_name/metadata.json exists but missing domain field" exit 1 fi - echo "✓ $PLUGIN_NAME domain consistent: $MARKETPLACE_DOMAIN" + else + echo "ERROR: $plugin_name missing .claude-plugin/metadata.json" + exit 1 fi done