fix(schema): move domain field to metadata.json for Claude Code compatibility

BREAKING FIX: Claude Code's marketplace schema validator rejects
unrecognized keys. The 'domain' field added in v8.0.0 caused
'Failed to load marketplace' errors on all 20 plugin entries.

- Removed 'domain' from marketplace.json (all 3 profiles)
- Removed 'domain' from all 20 plugin.json files
- Added 'domain' to metadata.json for all 20 plugins
- Updated validate-marketplace.sh to read from metadata.json
- Updated docs (CANONICAL-PATHS.md, CLAUDE.md) to reference metadata.json
- 12 new metadata.json files created (plugins without mcp_servers)
- 8 existing metadata.json files updated with domain field

Version: 9.1.2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-07 17:00:58 -05:00
parent f4e62dd1fb
commit e824b18e44
46 changed files with 192 additions and 129 deletions

View File

@@ -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