diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 6c84a6c..215d2c3 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": "7.1.0" + "version": "8.0.0" }, "plugins": [ { @@ -20,10 +20,18 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/projman/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "development", - "tags": ["sprint", "agile", "gitea", "project-management"], - "license": "MIT" + "tags": [ + "sprint", + "agile", + "gitea", + "project-management" + ], + "license": "MIT", + "domain": "core" }, { "name": "doc-guardian", @@ -36,10 +44,17 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/doc-guardian/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "productivity", - "tags": ["documentation", "drift-detection", "sync"], - "license": "MIT" + "tags": [ + "documentation", + "drift-detection", + "sync" + ], + "license": "MIT", + "domain": "core" }, { "name": "code-sentinel", @@ -52,10 +67,17 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/code-sentinel/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "security", - "tags": ["security-scan", "refactoring", "vulnerabilities"], - "license": "MIT" + "tags": [ + "security-scan", + "refactoring", + "vulnerabilities" + ], + "license": "MIT", + "domain": "core" }, { "name": "project-hygiene", @@ -68,10 +90,17 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/project-hygiene/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "productivity", - "tags": ["cleanup", "automation", "hygiene"], - "license": "MIT" + "tags": [ + "cleanup", + "automation", + "hygiene" + ], + "license": "MIT", + "domain": "core" }, { "name": "cmdb-assistant", @@ -84,10 +113,20 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/cmdb-assistant/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "infrastructure", - "tags": ["cmdb", "netbox", "dcim", "ipam", "data-quality", "validation"], - "license": "MIT" + "tags": [ + "cmdb", + "netbox", + "dcim", + "ipam", + "data-quality", + "validation" + ], + "license": "MIT", + "domain": "ops" }, { "name": "claude-config-maintainer", @@ -100,10 +139,17 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/claude-config-maintainer/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "development", - "tags": ["claude-md", "configuration", "optimization"], - "license": "MIT" + "tags": [ + "claude-md", + "configuration", + "optimization" + ], + "license": "MIT", + "domain": "core" }, { "name": "clarity-assist", @@ -116,10 +162,18 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/clarity-assist/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "productivity", - "tags": ["prompts", "requirements", "clarification", "nd-friendly"], - "license": "MIT" + "tags": [ + "prompts", + "requirements", + "clarification", + "nd-friendly" + ], + "license": "MIT", + "domain": "core" }, { "name": "git-flow", @@ -132,10 +186,18 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/git-flow/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "development", - "tags": ["git", "workflow", "commits", "branching"], - "license": "MIT" + "tags": [ + "git", + "workflow", + "commits", + "branching" + ], + "license": "MIT", + "domain": "core" }, { "name": "pr-review", @@ -148,10 +210,18 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/pr-review/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "development", - "tags": ["code-review", "pull-requests", "security", "quality"], - "license": "MIT" + "tags": [ + "code-review", + "pull-requests", + "security", + "quality" + ], + "license": "MIT", + "domain": "core" }, { "name": "data-platform", @@ -164,10 +234,20 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/data-platform/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "data", - "tags": ["pandas", "postgresql", "postgis", "dbt", "data-engineering", "etl"], - "license": "MIT" + "tags": [ + "pandas", + "postgresql", + "postgis", + "dbt", + "data-engineering", + "etl" + ], + "license": "MIT", + "domain": "data" }, { "name": "viz-platform", @@ -180,10 +260,21 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/viz-platform/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "visualization", - "tags": ["dash", "plotly", "mantine", "charts", "dashboards", "theming", "dmc"], - "license": "MIT" + "tags": [ + "dash", + "plotly", + "mantine", + "charts", + "dashboards", + "theming", + "dmc" + ], + "license": "MIT", + "domain": "data" }, { "name": "contract-validator", @@ -196,10 +287,20 @@ }, "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/contract-validator/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", - "hooks": ["./hooks/hooks.json"], + "hooks": [ + "./hooks/hooks.json" + ], "category": "development", - "tags": ["validation", "contracts", "compatibility", "agents", "interfaces", "cross-plugin"], - "license": "MIT" + "tags": [ + "validation", + "contracts", + "compatibility", + "agents", + "interfaces", + "cross-plugin" + ], + "license": "MIT", + "domain": "core" } ] } diff --git a/.doc-guardian-queue b/.doc-guardian-queue index cd03013..f75e64e 100644 --- a/.doc-guardian-queue +++ b/.doc-guardian-queue @@ -63,3 +63,4 @@ 2026-02-03T21:09:40 | commands | /home/lmiranda/claude-plugins-work/plugins/viz-platform/commands/viz-breakpoints.md | docs/COMMANDS-CHEATSHEET.md README.md 2026-02-03T21:09:46 | commands | /home/lmiranda/claude-plugins-work/plugins/viz-platform/commands/design-review.md | docs/COMMANDS-CHEATSHEET.md README.md 2026-02-03T21:10:22 | commands | /home/lmiranda/claude-plugins-work/plugins/viz-platform/commands/accessibility-check.md | docs/COMMANDS-CHEATSHEET.md README.md +2026-02-04T21:32:01 | .claude-plugin | /home/lmiranda/claude-plugins-work/.claude-plugin/marketplace-lean.json | CLAUDE.md .claude-plugin/marketplace.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 67f11df..98994ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,15 +6,40 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +--- + +## [8.0.0] - 2026-02-06 + +### BREAKING CHANGES + +#### Domain Metadata Required (v8.0.0) + +All plugin manifests now require a `domain` field. `validate-marketplace.sh` rejects plugins without it. + +### Added + +- **marketplace:** `domain` field added to all 12 `plugin.json` files and all `marketplace.json` entries +- **marketplace:** Domain validation in `validate-marketplace.sh` — validates presence, allowed values, and cross-file consistency +- **marketplace:** New launch profiles: `saas`, `ops`, `debug` in `claude-launch.sh` +- **marketplace:** `data-seed` added to `data` launch profile (forward-looking) +- **docs:** Domain metadata conventions in `CANONICAL-PATHS.md` +- **docs:** Domain field requirements in `CLAUDE.md` "Adding a New Plugin" section + +### Changed + +- `validate-marketplace.sh` now requires `domain` in both `plugin.json` and `marketplace.json` (breaking change for validation pipeline) +- `claude-launch.sh` profiles expanded: sprint, data, saas, ops, review, debug, full + +### Deprecated + +- `infra` launch profile — use `ops` instead (auto-redirects with warning) + ### Fixed - Confirmed projman `metadata.json` exists with gitea MCP mapping - Synced `marketplace-full.json` and `marketplace-lean.json` to current version (were stale) - Added `metadata.json` validation to `validate-marketplace.sh` — rejects `mcp_servers` in `plugin.json`, verifies MCP server references - Updated `CANONICAL-PATHS.md` to current version - -### Changed - - Deprecated `switch-profile.sh` in favor of `claude-launch.sh` --- diff --git a/CLAUDE.md b/CLAUDE.md index 32059fb..18f3552 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -391,13 +391,32 @@ Stored in Gitea Wiki under `lessons-learned/sprints/`. ### Adding a New Plugin -1. Create `plugins/{name}/.claude-plugin/plugin.json` -2. Add entry to `.claude-plugin/marketplace.json` with category, tags, license +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` +5. Run `./scripts/validate-marketplace.sh` — rejects plugins without valid `domain` field 6. Update `CHANGELOG.md` +**Domain field is required (v8.0.0+):** +```json +{ + "name": "plugin-name", + "domain": "core", + ... +} +``` + +**Naming convention:** New plugins use domain prefix (`saas-*`, `ops-*`, `data-*`, `debug-*`). Core plugins have no prefix. + +### Domain Assignments + +| Domain | Plugins | +|--------|---------| +| `core` | projman, git-flow, pr-review, code-sentinel, doc-guardian, clarity-assist, contract-validator, claude-config-maintainer, project-hygiene | +| `data` | data-platform, viz-platform | +| `ops` | cmdb-assistant | + ### Adding a Command to projman 1. Create `plugins/projman/commands/{name}.md` diff --git a/README.md b/README.md index e1af751..cc9ddb2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Leo Claude Marketplace - v7.1.0 +# Leo Claude Marketplace - v8.0.0 A collection of Claude Code plugins for project management, infrastructure automation, and development workflows. diff --git a/docs/CANONICAL-PATHS.md b/docs/CANONICAL-PATHS.md index 4343f87..8ef10d7 100644 --- a/docs/CANONICAL-PATHS.md +++ b/docs/CANONICAL-PATHS.md @@ -2,7 +2,7 @@ **This file defines ALL valid paths in this repository. No exceptions. No inference. No assumptions.** -Last Updated: 2026-02-04 (v7.1.0) +Last Updated: 2026-02-06 (v8.0.0) --- @@ -172,6 +172,33 @@ leo-claude-mktplace/ ## Path Patterns (MANDATORY) +### Phase 1a Paths (v8.1.0) + +New files added in v8.1.0: + +``` +plugins/projman/commands/project.md +plugins/projman/commands/project-initiation.md +plugins/projman/commands/project-plan.md +plugins/projman/commands/project-status.md +plugins/projman/commands/project-close.md +plugins/projman/commands/adr.md +plugins/projman/commands/adr-create.md +plugins/projman/commands/adr-list.md +plugins/projman/commands/adr-update.md +plugins/projman/commands/adr-supersede.md +plugins/projman/skills/source-analysis.md +plugins/projman/skills/project-charter.md +plugins/projman/skills/adr-conventions.md +plugins/projman/skills/epic-conventions.md +plugins/projman/skills/wbs.md +plugins/projman/skills/risk-register.md +plugins/projman/skills/sprint-roadmap.md +plugins/projman/skills/wiki-conventions.md +plugins/project-hygiene/commands/hygiene-check.md +plugins/contract-validator/commands/cv-status.md +``` + ### Plugin Paths | Context | Pattern | Example | @@ -312,10 +339,63 @@ All MCP servers are defined in `.mcp.json` at repository root: --- +## Domain Metadata + +### Domain Field Locations + +Both manifest files require a `domain` field (v8.0.0+): + +| 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` | + +### Allowed Domain Values + +| Domain | Purpose | Existing Plugins | +|--------|---------|-----------------| +| `core` | Development workflow plugins | projman, git-flow, pr-review, code-sentinel, doc-guardian, clarity-assist, contract-validator, claude-config-maintainer, project-hygiene | +| `data` | Data engineering and visualization | data-platform, viz-platform | +| `ops` | Operations and infrastructure | cmdb-assistant | +| `saas` | SaaS application development | (Phase 2) | +| `debug` | Debugging and diagnostics | (Phase 2) | + +### Plugin Naming Convention + +- **Core plugins:** No prefix (existing names never change) +- **New plugins:** Domain prefix: `saas-*`, `ops-*`, `data-*`, `debug-*` +- Domain is always in metadata — prefix is a naming convention, not a requirement + +### Domain Query Examples + +```bash +# List all plugins in a domain +jq '.plugins[] | select(.domain=="saas") | .name' .claude-plugin/marketplace.json + +# Count plugins per domain +jq '[.plugins[] | .domain] | group_by(.) | map({domain: .[0], count: length})' .claude-plugin/marketplace.json +``` + +### Future Plugin Path Patterns + +``` +plugins/saas-api-platform/ +plugins/saas-db-migrate/ +plugins/saas-react-platform/ +plugins/saas-test-pilot/ +plugins/data-seed/ +plugins/ops-release-manager/ +plugins/ops-deploy-pipeline/ +plugins/debug-mcp/ +``` + +--- + ## Change Log | Date | Change | By | |------|--------|-----| +| 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 | | 2026-01-30 | v5.5.0: Removed plugin-level mcp-servers symlinks - all MCP config now in root .mcp.json | Claude Code | | 2026-01-26 | v5.0.0: Added contract-validator plugin and MCP server | Claude Code | diff --git a/plugins/clarity-assist/.claude-plugin/plugin.json b/plugins/clarity-assist/.claude-plugin/plugin.json index e0b1d69..28ce9ac 100644 --- a/plugins/clarity-assist/.claude-plugin/plugin.json +++ b/plugins/clarity-assist/.claude-plugin/plugin.json @@ -16,5 +16,8 @@ "requirements", "methodology" ], - "commands": ["./commands/"] + "commands": [ + "./commands/" + ], + "domain": "core" } diff --git a/plugins/claude-config-maintainer/.claude-plugin/plugin.json b/plugins/claude-config-maintainer/.claude-plugin/plugin.json index 47899a2..b48d9e8 100644 --- a/plugins/claude-config-maintainer/.claude-plugin/plugin.json +++ b/plugins/claude-config-maintainer/.claude-plugin/plugin.json @@ -18,5 +18,8 @@ "settings", "permissions" ], - "commands": ["./commands/"] + "commands": [ + "./commands/" + ], + "domain": "core" } diff --git a/plugins/cmdb-assistant/.claude-plugin/plugin.json b/plugins/cmdb-assistant/.claude-plugin/plugin.json index 801eb77..5709555 100644 --- a/plugins/cmdb-assistant/.claude-plugin/plugin.json +++ b/plugins/cmdb-assistant/.claude-plugin/plugin.json @@ -19,5 +19,8 @@ "data-quality", "validation" ], - "commands": ["./commands/"] + "commands": [ + "./commands/" + ], + "domain": "ops" } diff --git a/plugins/code-sentinel/.claude-plugin/plugin.json b/plugins/code-sentinel/.claude-plugin/plugin.json index 590aa8d..982da3c 100644 --- a/plugins/code-sentinel/.claude-plugin/plugin.json +++ b/plugins/code-sentinel/.claude-plugin/plugin.json @@ -9,6 +9,15 @@ "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/code-sentinel/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", "license": "MIT", - "keywords": ["security", "refactoring", "code-quality", "static-analysis", "hooks"], - "commands": ["./commands/"] + "keywords": [ + "security", + "refactoring", + "code-quality", + "static-analysis", + "hooks" + ], + "commands": [ + "./commands/" + ], + "domain": "core" } diff --git a/plugins/contract-validator/.claude-plugin/plugin.json b/plugins/contract-validator/.claude-plugin/plugin.json index 20cf47e..2f7e3e7 100644 --- a/plugins/contract-validator/.claude-plugin/plugin.json +++ b/plugins/contract-validator/.claude-plugin/plugin.json @@ -17,5 +17,8 @@ "interfaces", "cross-plugin" ], - "commands": ["./commands/"] + "commands": [ + "./commands/" + ], + "domain": "core" } diff --git a/plugins/data-platform/.claude-plugin/plugin.json b/plugins/data-platform/.claude-plugin/plugin.json index 18f596c..a7df788 100644 --- a/plugins/data-platform/.claude-plugin/plugin.json +++ b/plugins/data-platform/.claude-plugin/plugin.json @@ -18,5 +18,8 @@ "etl", "dataframe" ], - "commands": ["./commands/"] + "commands": [ + "./commands/" + ], + "domain": "data" } diff --git a/plugins/doc-guardian/.claude-plugin/plugin.json b/plugins/doc-guardian/.claude-plugin/plugin.json index a7d9e9f..8e70d57 100644 --- a/plugins/doc-guardian/.claude-plugin/plugin.json +++ b/plugins/doc-guardian/.claude-plugin/plugin.json @@ -9,6 +9,15 @@ "homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/doc-guardian/README.md", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", "license": "MIT", - "keywords": ["documentation", "sync", "drift-detection", "automation", "hooks"], - "commands": ["./commands/"] + "keywords": [ + "documentation", + "sync", + "drift-detection", + "automation", + "hooks" + ], + "commands": [ + "./commands/" + ], + "domain": "core" } diff --git a/plugins/git-flow/.claude-plugin/plugin.json b/plugins/git-flow/.claude-plugin/plugin.json index 921d32c..c834730 100644 --- a/plugins/git-flow/.claude-plugin/plugin.json +++ b/plugins/git-flow/.claude-plugin/plugin.json @@ -16,5 +16,8 @@ "branch", "automation" ], - "commands": ["./commands/"] + "commands": [ + "./commands/" + ], + "domain": "core" } diff --git a/plugins/pr-review/.claude-plugin/plugin.json b/plugins/pr-review/.claude-plugin/plugin.json index 6ee1e11..be6df44 100644 --- a/plugins/pr-review/.claude-plugin/plugin.json +++ b/plugins/pr-review/.claude-plugin/plugin.json @@ -16,5 +16,8 @@ "performance", "multi-agent" ], - "commands": ["./commands/"] + "commands": [ + "./commands/" + ], + "domain": "core" } diff --git a/plugins/project-hygiene/.claude-plugin/plugin.json b/plugins/project-hygiene/.claude-plugin/plugin.json index f5bb888..9cf43d6 100644 --- a/plugins/project-hygiene/.claude-plugin/plugin.json +++ b/plugins/project-hygiene/.claude-plugin/plugin.json @@ -28,5 +28,6 @@ ] } ] - } + }, + "domain": "core" } diff --git a/plugins/projman/.claude-plugin/plugin.json b/plugins/projman/.claude-plugin/plugin.json index 52a924f..065e425 100644 --- a/plugins/projman/.claude-plugin/plugin.json +++ b/plugins/projman/.claude-plugin/plugin.json @@ -16,5 +16,8 @@ "agile", "lessons-learned" ], - "commands": ["./commands/"] + "commands": [ + "./commands/" + ], + "domain": "core" } diff --git a/plugins/viz-platform/.claude-plugin/plugin.json b/plugins/viz-platform/.claude-plugin/plugin.json index 5edce0d..1f99053 100644 --- a/plugins/viz-platform/.claude-plugin/plugin.json +++ b/plugins/viz-platform/.claude-plugin/plugin.json @@ -19,5 +19,8 @@ "visualization", "dmc" ], - "commands": ["./commands/"] + "commands": [ + "./commands/" + ], + "domain": "data" } diff --git a/scripts/claude-launch.sh b/scripts/claude-launch.sh index d295332..e1a8077 100755 --- a/scripts/claude-launch.sh +++ b/scripts/claude-launch.sh @@ -6,9 +6,11 @@ # # Profiles: # sprint - Project management, git, PR review, security, docs (default) -# infra - Infrastructure/CMDB management # data - Data engineering and visualization +# saas - SaaS development (API, frontend, DB, testing) +# ops - Operations and infrastructure (CMDB, releases, deploy) # review - Code review only (lightweight) +# debug - MCP debugging tools # full - All plugins via marketplace.json (~22K tokens) # # Examples: @@ -42,18 +44,28 @@ fi # Define plugin lists for each profile declare -A PROFILES PROFILES[sprint]="projman git-flow pr-review code-sentinel doc-guardian clarity-assist" -PROFILES[infra]="cmdb-assistant" -PROFILES[data]="data-platform viz-platform" +PROFILES[infra]="DEPRECATED" +PROFILES[data]="data-platform viz-platform data-seed" +PROFILES[saas]="saas-api-platform saas-react-platform saas-db-migrate saas-test-pilot" +PROFILES[ops]="cmdb-assistant ops-release-manager ops-deploy-pipeline" PROFILES[review]="pr-review code-sentinel" +PROFILES[debug]="debug-mcp" PROFILES[full]="" # Empty = use marketplace.json # Validate profile if [[ ! ${PROFILES[$PROFILE]+_} ]]; then echo -e "${YELLOW}Unknown profile: $PROFILE${NC}" - echo "Available profiles: sprint, infra, data, review, full" + echo "Available profiles: sprint, data, saas, ops, review, debug, full" exit 1 fi +# Handle deprecated profiles +if [[ "$PROFILE" == "infra" ]]; then + echo -e "${YELLOW}Warning: 'infra' profile is deprecated. Use 'ops' instead.${NC}" + echo -e "${YELLOW} The 'ops' profile includes cmdb-assistant plus future ops plugins.${NC}" + PROFILE="ops" +fi + # Build --plugin-dir arguments PLUGIN_ARGS=() PLUGIN_LIST="${PROFILES[$PROFILE]}" diff --git a/scripts/validate-marketplace.sh b/scripts/validate-marketplace.sh index ffe9ded..aa57c2d 100755 --- a/scripts/validate-marketplace.sh +++ b/scripts/validate-marketplace.sh @@ -4,6 +4,9 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(dirname "$SCRIPT_DIR")" +# v8.0.0: Valid domain values +VALID_DOMAINS="core data saas ops debug" + echo "=== Validating Marketplace ===" # Check marketplace.json exists and is valid JSON @@ -89,6 +92,18 @@ 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") + if [[ -z "$PLUGIN_DOMAIN" ]]; then + echo "ERROR: Missing 'domain' in marketplace entry for $PLUGIN_NAME (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)" + exit 1 + fi + echo " ✓ domain: $PLUGIN_DOMAIN" + echo "✓ Marketplace entry $PLUGIN_NAME valid" done @@ -143,6 +158,18 @@ 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+)" + 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)" + exit 1 + fi + echo " ✓ domain: $PLUGIN_DOMAIN_PJ" + # Check README exists if [[ ! -f "$plugin_dir/README.md" ]]; then echo "WARNING: Missing README.md in $plugin_name/" @@ -297,5 +324,22 @@ 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 +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'" + exit 1 + fi + echo "✓ $PLUGIN_NAME domain consistent: $MARKETPLACE_DOMAIN" + fi +done + echo "" echo "=== All validations passed ==="