6 Commits

44 changed files with 444 additions and 885 deletions

View File

@@ -6,7 +6,7 @@
}, },
"metadata": { "metadata": {
"description": "Project management plugins with Gitea and NetBox integrations", "description": "Project management plugins with Gitea and NetBox integrations",
"version": "5.4.0" "version": "5.3.0"
}, },
"plugins": [ "plugins": [
{ {
@@ -20,6 +20,7 @@
}, },
"homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/projman/README.md", "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", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git",
"mcpServers": ["./.mcp.json"],
"category": "development", "category": "development",
"tags": ["sprint", "agile", "gitea", "project-management"], "tags": ["sprint", "agile", "gitea", "project-management"],
"license": "MIT" "license": "MIT"
@@ -83,6 +84,7 @@
}, },
"homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/cmdb-assistant/README.md", "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", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git",
"mcpServers": ["./.mcp.json"],
"category": "infrastructure", "category": "infrastructure",
"tags": ["cmdb", "netbox", "dcim", "ipam", "data-quality", "validation"], "tags": ["cmdb", "netbox", "dcim", "ipam", "data-quality", "validation"],
"license": "MIT" "license": "MIT"
@@ -143,6 +145,7 @@
}, },
"homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/pr-review/README.md", "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", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git",
"mcpServers": ["./.mcp.json"],
"category": "development", "category": "development",
"tags": ["code-review", "pull-requests", "security", "quality"], "tags": ["code-review", "pull-requests", "security", "quality"],
"license": "MIT" "license": "MIT"
@@ -158,6 +161,7 @@
}, },
"homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/data-platform/README.md", "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", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git",
"mcpServers": ["./.mcp.json"],
"category": "data", "category": "data",
"tags": ["pandas", "postgresql", "postgis", "dbt", "data-engineering", "etl"], "tags": ["pandas", "postgresql", "postgis", "dbt", "data-engineering", "etl"],
"license": "MIT" "license": "MIT"
@@ -173,6 +177,7 @@
}, },
"homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/viz-platform/README.md", "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", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git",
"mcpServers": ["./.mcp.json"],
"category": "visualization", "category": "visualization",
"tags": ["dash", "plotly", "mantine", "charts", "dashboards", "theming", "dmc"], "tags": ["dash", "plotly", "mantine", "charts", "dashboards", "theming", "dmc"],
"license": "MIT" "license": "MIT"
@@ -188,6 +193,7 @@
}, },
"homepage": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/src/branch/main/plugins/contract-validator/README.md", "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", "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git",
"mcpServers": ["./.mcp.json"],
"category": "development", "category": "development",
"tags": ["validation", "contracts", "compatibility", "agents", "interfaces", "cross-plugin"], "tags": ["validation", "contracts", "compatibility", "agents", "interfaces", "cross-plugin"],
"license": "MIT" "license": "MIT"

View File

@@ -1,24 +0,0 @@
{
"mcpServers": {
"gitea": {
"command": "/home/lmiranda/.claude/plugins/marketplaces/leo-claude-mktplace/mcp-servers/gitea/run.sh",
"args": []
},
"netbox": {
"command": "/home/lmiranda/.claude/plugins/marketplaces/leo-claude-mktplace/mcp-servers/netbox/run.sh",
"args": []
},
"viz-platform": {
"command": "/home/lmiranda/.claude/plugins/marketplaces/leo-claude-mktplace/mcp-servers/viz-platform/run.sh",
"args": []
},
"data-platform": {
"command": "/home/lmiranda/.claude/plugins/marketplaces/leo-claude-mktplace/mcp-servers/data-platform/run.sh",
"args": []
},
"contract-validator": {
"command": "/home/lmiranda/.claude/plugins/marketplaces/leo-claude-mktplace/mcp-servers/contract-validator/run.sh",
"args": []
}
}
}

View File

@@ -4,49 +4,6 @@ All notable changes to the Leo Claude Marketplace will be documented in this fil
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [5.4.0] - 2026-01-28
### Added
#### Sprint 7: Multi-Model Agent Support
Configurable model selection for agents with inheritance chain.
**Model Configuration:**
- Agent-level `model` field in YAML frontmatter (opus|sonnet|haiku)
- Plugin-level `defaultModel` in plugin.json
- Inheritance: Agent → Plugin → System default (sonnet)
**Recommended Model Assignments:**
| Model | Use Case | Agents |
|-------|----------|--------|
| **Opus** | Complex reasoning, security analysis | planner, code-reviewer, security-reviewer, data-analysis |
| **Sonnet** | Implementation, coordination | orchestrator, executor, layout-builder, data-ingestion |
| **Haiku** | Quick validation | component-check, agent-check |
**Documentation:**
- `docs/MODEL-RECOMMENDATIONS.md` - Central model selection guide
- `docs/CONFIGURATION.md` - Added agent model configuration section
- `CLAUDE.md` - Added model config quick reference
**Agent Updates (7 files):**
- Opus: planner, code-reviewer (projman), security-reviewer (pr-review, code-sentinel), data-analysis
- Haiku: component-check (viz-platform), agent-check (contract-validator)
**Plugin Manifest Updates (6 files):**
- All plugins with agents now have `defaultModel: sonnet`
- Version bumps: projman 3.3.0, pr-review 1.1.0, data-platform 1.1.0, viz-platform 1.1.0, code-sentinel 1.0.1, contract-validator 1.1.0
**Validation:**
- `scripts/validate-marketplace.sh` - Added model field validation (v5.4.0+)
**Sprint Completed:**
- Milestone: Sprint 7 - Multi-Model Agent Support
- Issues: #302, #303, #304, #305, #306
- PRs: #307, #308
- Wiki: [Change V5.4.0: Multi-Model Support (Sprint 7 Implementation)](https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/wiki/Change-V5.4.0%3A-Multi-Model-Support-%28Sprint-7-Implementation%29)
---
## [5.3.0] - 2026-01-28 ## [5.3.0] - 2026-01-28
### Added ### Added

218
CLAUDE.md
View File

@@ -1,120 +1,56 @@
# CLAUDE.md # CLAUDE.md
This file provides guidance to Claude Code when working with code in this repository. This file provides guidance to Claude Code when working with code in this repository.
## ⛔ MANDATORY BEHAVIOR RULES - READ FIRST
## ⛔ RULES - READ FIRST **These rules are NON-NEGOTIABLE. Violating them wastes the user's time and money.**
### Behavioral Rules ### 1. WHEN USER ASKS YOU TO CHECK SOMETHING - CHECK EVERYTHING
- Search ALL locations, not just where you think it is
- Check cache directories: `~/.claude/plugins/cache/`
- Check installed: `~/.claude/plugins/marketplaces/`
- Check source: `~/claude-plugins-work/`
- **NEVER say "no" or "that's not the issue" without exhaustive verification**
| Rule | Summary | ### 2. WHEN USER SAYS SOMETHING IS WRONG - BELIEVE THEM
|------|---------| - The user knows their system better than you
| **Check everything** | Search cache (`~/.claude/plugins/cache/`), installed (`~/.claude/plugins/marketplaces/`), and source (`~/claude-plugins-work/`) | - Investigate thoroughly before disagreeing
| **Believe the user** | User knows their system. Investigate before disagreeing. | - If user suspects cache, CHECK THE CACHE
| **Verify before "done"** | Run commands, show output, check all locations. "Done" = verified working. | - If user suspects a file, READ THE FILE
| **Show what's asked** | Don't interpret or summarize unless asked. | - **Your confidence is often wrong. User's instincts are often right.**
### After Plugin Updates ### 3. NEVER SAY "DONE" WITHOUT VERIFICATION
- Run the actual command/script to verify
- Show the output to the user
- Check ALL affected locations
- **"Done" means VERIFIED WORKING, not "I made changes"**
Run `./scripts/verify-hooks.sh`. If changes affect MCP servers or hooks, inform user to restart session. ### 4. SHOW EXACTLY WHAT USER ASKS FOR
**DO NOT clear cache mid-session** - breaks loaded MCP tools. - If user asks for messages, show the MESSAGES
- If user asks for code, show the CODE
- If user asks for output, show the OUTPUT
- **Don't interpret or summarize unless asked**
### NEVER USE CLI TOOLS FOR EXTERNAL SERVICES ### 5. AFTER PLUGIN UPDATES - VERIFY AND RESTART
- **FORBIDDEN:** `gh`, `tea`, `curl` to APIs, any CLI that talks to Gitea/GitHub/external services
- **REQUIRED:** Use MCP tools exclusively (`mcp__plugin_projman_gitea__*`, `mcp__plugin_pr-review_gitea__*`)
- **NO EXCEPTIONS.** Don't try CLI first. Don't fall back to CLI. MCP ONLY.
### NEVER PUSH DIRECTLY TO PROTECTED BRANCHES **⚠️ DO NOT clear cache mid-session** - this breaks MCP tools that are already loaded.
- **FORBIDDEN:** `git push origin development`, `git push origin main`, `git push origin master`
- **REQUIRED:** Create feature branch → push feature branch → create PR via MCP
- If you accidentally commit to a protected branch locally: `git checkout -b fix/branch-name` then reset the protected branch
### Repository Rules 1. Run `./scripts/verify-hooks.sh` to check hook types
2. If changes affect MCP servers or hooks, inform the user:
> "Plugin changes require a session restart to take effect. Please restart Claude Code."
3. Cache clearing is ONLY safe **before** starting a new session (not during)
| Rule | Details | See `docs/DEBUGGING-CHECKLIST.md` for details on cache timing.
|------|---------|
| **File creation** | Only in allowed paths. Use `.scratch/` for temp work. Verify against `docs/CANONICAL-PATHS.md` |
| **plugin.json location** | Must be in `.claude-plugin/` directory |
| **Hooks** | Use `hooks/hooks.json` (auto-discovered). Never inline in plugin.json |
| **MCP servers** | Shared at root with symlinks. Use MCP tools, never CLI (`tea`, `gh`) |
| **Allowed root files** | `CLAUDE.md`, `README.md`, `LICENSE`, `CHANGELOG.md`, `.gitignore`, `.env.example` |
**Valid hook events:** `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `SessionStart`, `SessionEnd`, `Notification`, `Stop`, `SubagentStop`, `PreCompact` **FAILURE TO FOLLOW THESE RULES = WASTED USER TIME = UNACCEPTABLE**
### ⛔ MANDATORY: Before Any Code Change
**Claude MUST show this checklist BEFORE editing any file:**
#### 1. Impact Search Results
Run and show output of:
```bash
grep -rn "PATTERN" --include="*.sh" --include="*.md" --include="*.json" --include="*.py" | grep -v ".git"
```
#### 2. Files That Will Be Affected
Numbered list of every file to be modified, with the specific change for each.
#### 3. Files Searched But Not Changed (and why)
Proof that related files were checked and determined unchanged.
#### 4. Documentation That References This
List of docs that mention this feature/script/function.
**User verifies this list before Claude proceeds. If Claude skips this, STOP IMMEDIATELY.**
#### After Changes
Run the same grep and show results proving no references remain unaddressed.
--- ---
## ⚠️ Development Context: We Build AND Use These Plugins
**This is a self-referential project.** We are:
1. **BUILDING** a plugin marketplace (source code in `plugins/`)
2. **USING** the installed marketplace to build it (dogfooding)
### Plugins ACTIVELY USED in This Project
These plugins are installed and should be used during development:
| Plugin | Used For |
|--------|----------|
| **projman** | Sprint planning, issue management, lessons learned |
| **git-flow** | Commits, branch management |
| **pr-review** | Pull request reviews |
| **doc-guardian** | Documentation drift detection |
| **code-sentinel** | Security scanning, refactoring |
| **clarity-assist** | Prompt clarification |
| **claude-config-maintainer** | CLAUDE.md optimization |
| **contract-validator** | Cross-plugin compatibility |
### Plugins NOT Used Here (Development Only)
These plugins exist in source but are **NOT relevant** to this project's workflow:
| Plugin | Why Not Used |
|--------|--------------|
| **data-platform** | For data engineering projects (pandas, PostgreSQL, dbt) |
| **viz-platform** | For dashboard projects (Dash, Plotly) |
| **cmdb-assistant** | For infrastructure projects (NetBox) |
**Do NOT suggest** `/ingest`, `/profile`, `/chart`, `/cmdb-*` commands - they don't apply here.
### Key Distinction
| Context | Path | What To Do |
|---------|------|------------|
| **Editing plugin source** | `~/claude-plugins-work/plugins/` | Modify code, add features |
| **Using installed plugins** | `~/.claude/plugins/marketplaces/` | Run commands like `/sprint-plan` |
When user says "run /sprint-plan", use the INSTALLED plugin.
When user says "fix the sprint-plan command", edit the SOURCE code.
---
## Project Overview ## Project Overview
**Repository:** leo-claude-mktplace **Repository:** leo-claude-mktplace
**Version:** 5.4.0 **Version:** 5.3.0
**Status:** Production Ready **Status:** Production Ready
A plugin marketplace for Claude Code containing: A plugin marketplace for Claude Code containing:
@@ -122,16 +58,16 @@ A plugin marketplace for Claude Code containing:
| Plugin | Description | Version | | Plugin | Description | Version |
|--------|-------------|---------| |--------|-------------|---------|
| `projman` | Sprint planning and project management with Gitea integration | 3.3.0 | | `projman` | Sprint planning and project management with Gitea integration | 3.3.0 |
| `git-flow` | Git workflow automation with smart commits and branch management | 1.0.0 | | `git-flow` | Git workflow automation with smart commits and branch management | 1.2.0 |
| `pr-review` | Multi-agent PR review with confidence scoring | 1.1.0 | | `pr-review` | Multi-agent PR review with confidence scoring | 1.1.0 |
| `clarity-assist` | Prompt optimization with ND-friendly accommodations | 1.0.0 | | `clarity-assist` | Prompt optimization with ND-friendly accommodations | 1.2.0 |
| `doc-guardian` | Automatic documentation drift detection and synchronization | 1.0.0 | | `doc-guardian` | Automatic documentation drift detection and synchronization | 1.1.0 |
| `code-sentinel` | Security scanning and code refactoring tools | 1.0.1 | | `code-sentinel` | Security scanning and code refactoring tools | 1.0.0 |
| `claude-config-maintainer` | CLAUDE.md optimization and maintenance | 1.0.0 | | `claude-config-maintainer` | CLAUDE.md optimization and maintenance | 1.1.0 |
| `cmdb-assistant` | NetBox CMDB integration for infrastructure management | 1.2.0 | | `cmdb-assistant` | NetBox CMDB integration for infrastructure management | 1.2.0 |
| `data-platform` | pandas, PostgreSQL, and dbt integration for data engineering | 1.1.0 | | `data-platform` | pandas, PostgreSQL, and dbt integration for data engineering | 1.2.0 |
| `viz-platform` | DMC validation, Plotly charts, and theming for dashboards | 1.1.0 | | `viz-platform` | DMC validation, Plotly charts, and theming for dashboards | 1.1.0 |
| `contract-validator` | Cross-plugin compatibility validation and agent verification | 1.1.0 | | `contract-validator` | Cross-plugin compatibility validation and agent verification | 1.2.0 |
| `project-hygiene` | Post-task cleanup automation via hooks | 0.1.0 | | `project-hygiene` | Post-task cleanup automation via hooks | 0.1.0 |
## Quick Start ## Quick Start
@@ -144,7 +80,7 @@ A plugin marketplace for Claude Code containing:
./scripts/post-update.sh # Rebuild venvs, verify symlinks ./scripts/post-update.sh # Rebuild venvs, verify symlinks
``` ```
### Plugin Commands - USE THESE in This Project ### Plugin Commands by Category
| Category | Commands | | Category | Commands |
|----------|----------| |----------|----------|
@@ -156,19 +92,12 @@ A plugin marketplace for Claude Code containing:
| **Docs** | `/doc-audit`, `/doc-sync`, `/changelog-gen`, `/doc-coverage`, `/stale-docs` | | **Docs** | `/doc-audit`, `/doc-sync`, `/changelog-gen`, `/doc-coverage`, `/stale-docs` |
| **Security** | `/security-scan`, `/refactor`, `/refactor-dry` | | **Security** | `/security-scan`, `/refactor`, `/refactor-dry` |
| **Config** | `/config-analyze`, `/config-optimize`, `/config-diff`, `/config-lint` | | **Config** | `/config-analyze`, `/config-optimize`, `/config-diff`, `/config-lint` |
| **Data** | `/ingest`, `/profile`, `/schema`, `/explain`, `/lineage`, `/lineage-viz`, `/run`, `/dbt-test`, `/data-quality` |
| **Visualization** | `/component`, `/chart`, `/chart-export`, `/dashboard`, `/theme`, `/theme-new`, `/theme-css`, `/accessibility-check`, `/breakpoints` |
| **Validation** | `/validate-contracts`, `/check-agent`, `/list-interfaces`, `/dependency-graph` | | **Validation** | `/validate-contracts`, `/check-agent`, `/list-interfaces`, `/dependency-graph` |
| **CMDB** | `/cmdb-search`, `/cmdb-device`, `/cmdb-ip`, `/cmdb-site`, `/cmdb-audit`, `/cmdb-register`, `/cmdb-sync`, `/cmdb-topology`, `/change-audit`, `/ip-conflicts` |
| **Debug** | `/debug-report`, `/debug-review` | | **Debug** | `/debug-report`, `/debug-review` |
### Plugin Commands - NOT RELEVANT to This Project
These commands are being developed but don't apply to this project's workflow:
| Category | Commands | For Projects Using |
|----------|----------|-------------------|
| **Data** | `/ingest`, `/profile`, `/schema`, `/lineage`, `/dbt-test` | pandas, PostgreSQL, dbt |
| **Visualization** | `/component`, `/chart`, `/dashboard`, `/theme` | Dash, Plotly dashboards |
| **CMDB** | `/cmdb-search`, `/cmdb-device`, `/cmdb-sync` | NetBox infrastructure |
## Repository Structure ## Repository Structure
``` ```
@@ -183,7 +112,7 @@ leo-claude-mktplace/
├── plugins/ ├── plugins/
│ ├── projman/ # Sprint management │ ├── projman/ # Sprint management
│ │ ├── .claude-plugin/plugin.json │ │ ├── .claude-plugin/plugin.json
│ │ # .mcp.json removed - now at marketplace root │ │ ├── .mcp.json
│ │ ├── mcp-servers/gitea -> ../../../mcp-servers/gitea # SYMLINK │ │ ├── mcp-servers/gitea -> ../../../mcp-servers/gitea # SYMLINK
│ │ ├── commands/ # 14 commands (incl. setup, debug, suggest-version) │ │ ├── commands/ # 14 commands (incl. setup, debug, suggest-version)
│ │ ├── hooks/ # SessionStart: mismatch detection + sprint suggestions │ │ ├── hooks/ # SessionStart: mismatch detection + sprint suggestions
@@ -195,7 +124,7 @@ leo-claude-mktplace/
│ │ └── agents/ │ │ └── agents/
│ ├── pr-review/ # Multi-agent PR review │ ├── pr-review/ # Multi-agent PR review
│ │ ├── .claude-plugin/plugin.json │ │ ├── .claude-plugin/plugin.json
│ │ # .mcp.json removed - now at marketplace root │ │ ├── .mcp.json
│ │ ├── mcp-servers/gitea -> ../../../mcp-servers/gitea # SYMLINK │ │ ├── mcp-servers/gitea -> ../../../mcp-servers/gitea # SYMLINK
│ │ ├── commands/ # 6 commands (incl. setup) │ │ ├── commands/ # 6 commands (incl. setup)
│ │ ├── hooks/ # SessionStart mismatch detection │ │ ├── hooks/ # SessionStart mismatch detection
@@ -206,14 +135,14 @@ leo-claude-mktplace/
│ │ └── agents/ │ │ └── agents/
│ ├── data-platform/ # Data engineering (NEW v4.0.0) │ ├── data-platform/ # Data engineering (NEW v4.0.0)
│ │ ├── .claude-plugin/plugin.json │ │ ├── .claude-plugin/plugin.json
│ │ # .mcp.json removed - now at marketplace root │ │ ├── .mcp.json
│ │ ├── mcp-servers/ # pandas, postgresql, dbt MCPs │ │ ├── mcp-servers/ # pandas, postgresql, dbt MCPs
│ │ ├── commands/ # 7 commands │ │ ├── commands/ # 7 commands
│ │ ├── hooks/ # SessionStart PostgreSQL check │ │ ├── hooks/ # SessionStart PostgreSQL check
│ │ └── agents/ # 2 agents │ │ └── agents/ # 2 agents
│ ├── viz-platform/ # Visualization (NEW v4.0.0) │ ├── viz-platform/ # Visualization (NEW v4.0.0)
│ │ ├── .claude-plugin/plugin.json │ │ ├── .claude-plugin/plugin.json
│ │ # .mcp.json removed - now at marketplace root │ │ ├── .mcp.json
│ │ ├── mcp-servers/ # viz-platform MCP │ │ ├── mcp-servers/ # viz-platform MCP
│ │ ├── commands/ # 7 commands │ │ ├── commands/ # 7 commands
│ │ ├── hooks/ # SessionStart DMC check │ │ ├── hooks/ # SessionStart DMC check
@@ -233,6 +162,40 @@ leo-claude-mktplace/
└── CONFIGURATION.md # Centralized configuration guide └── CONFIGURATION.md # Centralized configuration guide
``` ```
## CRITICAL: Rules You MUST Follow
### File Operations
- **NEVER** create files in repository root unless listed in "Allowed Root Files"
- **NEVER** modify `.gitignore` without explicit permission
- **ALWAYS** use `.scratch/` for temporary/exploratory work
- **ALWAYS** verify paths against `docs/CANONICAL-PATHS.md` before creating files
### Plugin Development
- **plugin.json MUST be in `.claude-plugin/` directory** (not plugin root)
- **Every plugin MUST be listed in marketplace.json**
- **MCP servers are SHARED at root** with symlinks from plugins
- **MCP server venv path**: `${CLAUDE_PLUGIN_ROOT}/mcp-servers/{name}/.venv/bin/python`
- **CLI tools forbidden** - Use MCP tools exclusively (never `tea`, `gh`, etc.)
#### ⚠️ plugin.json Format Rules (CRITICAL)
- **Hooks in separate file** - Use `hooks/hooks.json` (auto-discovered), NOT inline in plugin.json
- **NEVER reference hooks** - Don't add `"hooks": "..."` field to plugin.json at all
- **Agents auto-discover** - NEVER add `"agents": ["./agents/"]` - .md files found automatically
- **Always validate** - Run `./scripts/validate-marketplace.sh` before committing
- **Working examples:** projman, pr-review, claude-config-maintainer all use `hooks/hooks.json`
- See lesson: `lessons/patterns/plugin-manifest-validation---hooks-and-agents-format-requirements`
### Hooks (Valid Events Only)
`PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `SessionStart`, `SessionEnd`, `Notification`, `Stop`, `SubagentStop`, `PreCompact`
**INVALID:** `task-completed`, `file-changed`, `git-commit-msg-needed`
### Allowed Root Files
`CLAUDE.md`, `README.md`, `LICENSE`, `CHANGELOG.md`, `.gitignore`, `.env.example`
### Allowed Root Directories
`.claude/`, `.claude-plugin/`, `.claude-plugins/`, `.scratch/`, `docs/`, `hooks/`, `mcp-servers/`, `plugins/`, `scripts/`
## Architecture ## Architecture
### Four-Agent Model (projman) ### Four-Agent Model (projman)
@@ -265,21 +228,6 @@ leo-claude-mktplace/
**Note:** `GITEA_ORG` is at project level since different projects may belong to different organizations. **Note:** `GITEA_ORG` is at project level since different projects may belong to different organizations.
### Agent Model Configuration
Agents can specify preferred Claude models for cost/performance optimization:
| Model | Use For | Agents |
|-------|---------|--------|
| `opus` | Complex reasoning, security | planner, code-reviewer, security-reviewer |
| `sonnet` | Implementation, coordination | orchestrator, executor, most agents |
| `haiku` | Simple validation | component-check, agent-check |
**Configuration:** Add `model: opus|sonnet|haiku` to agent frontmatter, or `defaultModel` to plugin.json.
**Inheritance:** Agent → Plugin default → System default (sonnet)
See `docs/MODEL-RECOMMENDATIONS.md` for detailed guidance.
### Branch-Aware Security ### Branch-Aware Security
| Branch Pattern | Mode | Capabilities | | Branch Pattern | Mode | Capabilities |
@@ -429,4 +377,4 @@ The script will:
--- ---
**Last Updated:** 2026-01-30 **Last Updated:** 2026-01-28

View File

@@ -1,4 +1,4 @@
# Leo Claude Marketplace - v5.4.0 # Leo Claude Marketplace - v5.3.0
A collection of Claude Code plugins for project management, infrastructure automation, and development workflows. A collection of Claude Code plugins for project management, infrastructure automation, and development workflows.

View File

@@ -163,11 +163,12 @@ leo-claude-mktplace/
│ └── claude-md-integration.md │ └── claude-md-integration.md
├── scripts/ # Setup and maintenance scripts ├── scripts/ # Setup and maintenance scripts
│ ├── setup.sh # Initial setup (create venvs, config templates) │ ├── setup.sh # Initial setup (create venvs, config templates)
│ ├── post-update.sh # Post-update (clear cache, show changelog) │ ├── post-update.sh # Post-update (rebuild venvs, verify symlinks)
│ ├── check-venv.sh # Check if venvs exist (read-only) │ ├── check-venv.sh # Check if venvs exist (for hooks)
│ ├── validate-marketplace.sh # Marketplace compliance validation │ ├── validate-marketplace.sh # Marketplace compliance validation
│ ├── verify-hooks.sh # Verify all hooks use correct event types │ ├── verify-hooks.sh # Verify all hooks use correct event types
│ ├── setup-venvs.sh # Setup MCP server venvs (create only, never delete) │ ├── setup-venvs.sh # Setup/repair MCP server venvs
│ ├── venv-repair.sh # Repair broken venv symlinks
│ └── release.sh # Release automation with version bumping │ └── release.sh # Release automation with version bumping
├── CLAUDE.md ├── CLAUDE.md
├── README.md ├── README.md

View File

@@ -501,8 +501,9 @@ If you get 401, regenerate your token in Gitea.
# Check venv exists # Check venv exists
ls /path/to/mcp-servers/gitea/.venv ls /path/to/mcp-servers/gitea/.venv
# If missing, create venv (do NOT delete existing venvs) # Reinstall if missing
cd /path/to/mcp-servers/gitea cd /path/to/mcp-servers/gitea
rm -rf .venv
python3 -m venv .venv python3 -m venv .venv
source .venv/bin/activate source .venv/bin/activate
pip install -r requirements.txt pip install -r requirements.txt
@@ -521,56 +522,6 @@ cat .env
--- ---
## Agent Model Configuration
Agents can specify which Claude model to use for optimal cost/performance.
### Model Options
| Model | Use For | Cost |
|-------|---------|------|
| `opus` | Complex reasoning, security analysis | Highest |
| `sonnet` | Implementation, coordination (default) | Medium |
| `haiku` | Simple validation, quick checks | Lowest |
### Configuration Levels
**1. Agent-Level (highest priority)**
Add to agent frontmatter in `agents/*.md`:
```yaml
---
name: planner
description: Sprint planning agent
model: opus
---
```
**2. Plugin-Level (fallback)**
Add to `plugin.json`:
```json
{
"defaultModel": "sonnet"
}
```
**3. System Default**
If neither is specified, agents use `sonnet`.
### Inheritance Chain
```
Agent model → Plugin defaultModel → System default (sonnet)
```
See [Model Recommendations](MODEL-RECOMMENDATIONS.md) for detailed guidance on model selection by task type.
---
## Security Best Practices ## Security Best Practices
1. **Never commit tokens** 1. **Never commit tokens**

View File

@@ -1,149 +0,0 @@
# Model Recommendations
Guidelines for selecting Claude models (opus, sonnet, haiku) for plugin agents.
---
## Model Overview
| Model | Best For | Cost | Speed |
|-------|----------|------|-------|
| **Opus** | Complex reasoning, architecture decisions, security analysis | Highest | Slower |
| **Sonnet** | Implementation, coordination, standard tasks | Medium | Balanced |
| **Haiku** | Simple validation, quick checks, status queries | Lowest | Fastest |
---
## Task-Type Recommendations
| Task Type | Model | Rationale |
|-----------|-------|-----------|
| Architecture decisions | Opus | Requires deep reasoning, trade-off analysis |
| Security analysis | Opus | Critical thinking, vulnerability pattern recognition |
| Code review (quality) | Opus | Thorough analysis, edge case detection |
| Sprint planning | Opus | Strategic thinking, dependency analysis |
| Complex data analysis | Opus | Multi-step reasoning, insight generation |
| Code implementation | Sonnet | Fast, capable code generation |
| Coordination/dispatch | Sonnet | Task management, status tracking |
| Data transformation | Sonnet | ETL operations, query building |
| Documentation | Sonnet | Clear writing, structure |
| Simple validation | Haiku | Fast prop checks, schema validation |
| Status checks | Haiku | Quick queries, cost-effective |
| Quick verification | Haiku | Simple pass/fail checks |
---
## Agent Model Assignments
### projman (Sprint Management)
| Agent | Model | Rationale |
|-------|-------|-----------|
| `planner` | opus | Architecture decisions, issue structuring |
| `orchestrator` | sonnet | Coordination, parallel execution |
| `executor` | sonnet | Code implementation |
| `code-reviewer` | opus | Quality review, security analysis |
### pr-review (PR Analysis)
| Agent | Model | Rationale |
|-------|-------|-----------|
| `coordinator` | sonnet | Task dispatch, result aggregation |
| `security-reviewer` | opus | Security vulnerability detection |
| `performance-analyst` | sonnet | Pattern recognition |
| `maintainability-auditor` | sonnet | Code quality checks |
| `test-validator` | sonnet | Test coverage analysis |
### code-sentinel (Security & Refactoring)
| Agent | Model | Rationale |
|-------|-------|-----------|
| `security-reviewer` | opus | Security scanning |
| `refactor-advisor` | sonnet | Refactoring suggestions |
### data-platform (Data Engineering)
| Agent | Model | Rationale |
|-------|-------|-----------|
| `data-analysis` | opus | Complex data insights |
| `data-ingestion` | sonnet | ETL operations |
### viz-platform (Visualization)
| Agent | Model | Rationale |
|-------|-------|-----------|
| `component-check` | haiku | Simple prop validation |
| `layout-builder` | sonnet | UI construction |
| `theme-setup` | sonnet | Design configuration |
### contract-validator (Compatibility)
| Agent | Model | Rationale |
|-------|-------|-----------|
| `full-validation` | sonnet | Contract checking |
| `agent-check` | haiku | Quick verification |
---
## Configuration Schema
### Agent-Level (Frontmatter)
Add `model` field to agent YAML frontmatter:
```yaml
---
name: planner
description: Sprint planning agent
model: opus
---
```
**Valid values:** `opus`, `sonnet`, `haiku`
### Plugin-Level (plugin.json)
Add `defaultModel` for plugin-wide fallback:
```json
{
"name": "projman",
"version": "3.4.0",
"defaultModel": "sonnet"
}
```
---
## Inheritance Chain
Model selection follows this precedence:
```
1. Agent model field (highest priority)
↓ if not specified
2. Plugin defaultModel (plugin.json)
↓ if not specified
3. System default: sonnet
```
**Example:**
- Agent has `model: opus` → Uses opus
- Agent has no model, plugin has `defaultModel: sonnet` → Uses sonnet
- Neither specified → Uses sonnet (system default)
---
## Cost Optimization Tips
1. **Default to Sonnet** - Good balance for most tasks
2. **Reserve Opus** for critical decisions (security, architecture)
3. **Use Haiku** for validation and quick checks
4. **Batch simple tasks** - Use haiku for parallel validation
---
## See Also
- [Configuration Guide](CONFIGURATION.md) - Full configuration reference
- [Plugin Development](../README.md) - Adding new plugins

View File

@@ -132,8 +132,10 @@ When updating, review if changes affect the setup workflow:
### Dependencies fail to install ### Dependencies fail to install
```bash ```bash
# Install missing dependencies (do NOT delete .venv) # Rebuild virtual environment
cd mcp-servers/gitea cd mcp-servers/gitea
rm -rf .venv
python3 -m venv .venv
source .venv/bin/activate source .venv/bin/activate
pip install -r requirements.txt pip install -r requirements.txt
deactivate deactivate

View File

@@ -144,7 +144,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"issue_number": { "issue_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Issue number" "description": "Issue number"
}, },
"repo": { "repo": {
@@ -189,7 +189,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"issue_number": { "issue_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Issue number" "description": "Issue number"
}, },
"title": { "title": {
@@ -211,7 +211,7 @@ class GiteaMCPServer:
"description": "New labels" "description": "New labels"
}, },
"milestone": { "milestone": {
"type": ["integer", "string"], "type": "integer",
"description": "Milestone ID to assign" "description": "Milestone ID to assign"
}, },
"repo": { "repo": {
@@ -229,7 +229,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"issue_number": { "issue_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Issue number" "description": "Issue number"
}, },
"comment": { "comment": {
@@ -424,7 +424,7 @@ class GiteaMCPServer:
"description": "Tags to filter by (optional)" "description": "Tags to filter by (optional)"
}, },
"limit": { "limit": {
"type": ["integer", "string"], "type": "integer",
"default": 20, "default": 20,
"description": "Maximum results" "description": "Maximum results"
}, },
@@ -462,7 +462,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"milestone_id": { "milestone_id": {
"type": ["integer", "string"], "type": "integer",
"description": "Milestone ID" "description": "Milestone ID"
}, },
"repo": { "repo": {
@@ -506,7 +506,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"milestone_id": { "milestone_id": {
"type": ["integer", "string"], "type": "integer",
"description": "Milestone ID" "description": "Milestone ID"
}, },
"title": { "title": {
@@ -541,7 +541,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"milestone_id": { "milestone_id": {
"type": ["integer", "string"], "type": "integer",
"description": "Milestone ID" "description": "Milestone ID"
}, },
"repo": { "repo": {
@@ -560,7 +560,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"issue_number": { "issue_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Issue number" "description": "Issue number"
}, },
"repo": { "repo": {
@@ -578,11 +578,11 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"issue_number": { "issue_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Issue that will depend on another" "description": "Issue that will depend on another"
}, },
"depends_on": { "depends_on": {
"type": ["integer", "string"], "type": "integer",
"description": "Issue that blocks issue_number" "description": "Issue that blocks issue_number"
}, },
"repo": { "repo": {
@@ -600,11 +600,11 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"issue_number": { "issue_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Issue that depends on another" "description": "Issue that depends on another"
}, },
"depends_on": { "depends_on": {
"type": ["integer", "string"], "type": "integer",
"description": "Issue being depended on" "description": "Issue being depended on"
}, },
"repo": { "repo": {
@@ -782,7 +782,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"pr_number": { "pr_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Pull request number" "description": "Pull request number"
}, },
"repo": { "repo": {
@@ -800,7 +800,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"pr_number": { "pr_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Pull request number" "description": "Pull request number"
}, },
"repo": { "repo": {
@@ -818,7 +818,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"pr_number": { "pr_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Pull request number" "description": "Pull request number"
}, },
"repo": { "repo": {
@@ -836,7 +836,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"pr_number": { "pr_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Pull request number" "description": "Pull request number"
}, },
"body": { "body": {
@@ -855,7 +855,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"path": {"type": "string"}, "path": {"type": "string"},
"position": {"type": ["integer", "string"]}, "position": {"type": "integer"},
"body": {"type": "string"} "body": {"type": "string"}
} }
}, },
@@ -876,7 +876,7 @@ class GiteaMCPServer:
"type": "object", "type": "object",
"properties": { "properties": {
"pr_number": { "pr_number": {
"type": ["integer", "string"], "type": "integer",
"description": "Pull request number" "description": "Pull request number"
}, },
"body": { "body": {

View File

@@ -277,39 +277,6 @@ Every CLAUDE.md should have:
1. **Project Overview** - What is this? 1. **Project Overview** - What is this?
2. **Quick Start** - How do I build/test/run? 2. **Quick Start** - How do I build/test/run?
3. **Important Rules** - What must I NOT do? 3. **Important Rules** - What must I NOT do?
4. **Pre-Change Protocol** - Mandatory dependency check before code changes
### Pre-Change Protocol Section (MANDATORY)
**This section is REQUIRED in every CLAUDE.md.** It ensures Claude performs comprehensive dependency analysis before making any code changes.
```markdown
## ⛔ MANDATORY: Before Any Code Change
**Claude MUST show this checklist BEFORE editing any file:**
### 1. Impact Search Results
Run and show output of:
```bash
grep -rn "PATTERN" --include="*.sh" --include="*.md" --include="*.json" --include="*.py" | grep -v ".git"
```
### 2. Files That Will Be Affected
Numbered list of every file to be modified, with the specific change for each.
### 3. Files Searched But Not Changed (and why)
Proof that related files were checked and determined unchanged.
### 4. Documentation That References This
List of docs that mention this feature/script/function.
**User verifies this list before Claude proceeds. If Claude skips this, stop immediately.**
### After Changes
Run the same grep and show results proving no references remain unaddressed.
```
**When analyzing a CLAUDE.md, flag as HIGH priority issue if this section is missing.**
### Optional Sections (as needed) ### Optional Sections (as needed)

View File

@@ -59,7 +59,6 @@ Analyze the CLAUDE.md file in this project
- Quick start commands documented - Quick start commands documented
- Critical rules highlighted - Critical rules highlighted
- Key workflows covered - Key workflows covered
- **Pre-Change Protocol section present** (MANDATORY - see below)
### Conciseness (25 points) ### Conciseness (25 points)
- No unnecessary repetition - No unnecessary repetition
@@ -67,42 +66,6 @@ Analyze the CLAUDE.md file in this project
- Appropriate length for project size - Appropriate length for project size
- No generic filler content - No generic filler content
## Pre-Change Protocol Check (MANDATORY)
**This check is CRITICAL.** The Pre-Change Protocol section ensures Claude performs comprehensive dependency analysis before making any code changes, preventing missed references and incomplete updates.
### What to Check
Search CLAUDE.md for:
- Section header containing "Pre-Change" or "Before Any Code Change"
- References to `grep -rn` or impact search
- Checklist with "Files That Will Be Affected"
- Requirement for user verification before proceeding
### If Missing
**Flag as HIGH PRIORITY issue:**
```
1. [HIGH] Missing Pre-Change Protocol section
CLAUDE.md lacks mandatory dependency-check protocol.
Impact: Claude may miss file references when making changes,
leading to broken dependencies and incomplete updates.
Recommendation: Add Pre-Change Protocol section immediately.
This is the #1 cause of cascading bugs from incomplete changes.
```
### Required Section Content
The Pre-Change Protocol section must include:
1. Requirement to run grep search and show results
2. List of files that will be affected
3. List of files searched but not changed (with reasoning)
4. Documentation that references the change target
5. User verification checkpoint before proceeding
6. Post-change verification step
## Plugin Integration Analysis ## Plugin Integration Analysis
After the content analysis, the command detects and analyzes marketplace plugin integration: After the content analysis, the command detects and analyzes marketplace plugin integration:

View File

@@ -139,7 +139,6 @@ For small projects or when starting fresh:
- Project Overview (required) - Project Overview (required)
- Quick Start (required) - Quick Start (required)
- Critical Rules (required) - Critical Rules (required)
- **Pre-Change Protocol (required)**
### Standard Template (default) ### Standard Template (default)
For typical projects: For typical projects:
@@ -147,7 +146,6 @@ For typical projects:
- Quick Start - Quick Start
- Architecture - Architecture
- Critical Rules - Critical Rules
- **Pre-Change Protocol**
- Common Operations - Common Operations
- File Structure - File Structure
@@ -155,44 +153,11 @@ For typical projects:
For large or complex projects: For large or complex projects:
- All standard sections plus: - All standard sections plus:
- Detailed Architecture - Detailed Architecture
- **Pre-Change Protocol**
- Troubleshooting - Troubleshooting
- Integration Points - Integration Points
- Development Workflow - Development Workflow
- Deployment Notes - Deployment Notes
### Pre-Change Protocol Section (MANDATORY in ALL templates)
**This section MUST be included in every generated CLAUDE.md:**
```markdown
## ⛔ MANDATORY: Before Any Code Change
**Claude MUST show this checklist BEFORE editing any file:**
### 1. Impact Search Results
Run and show output of:
\`\`\`bash
grep -rn "PATTERN" --include="*.sh" --include="*.md" --include="*.json" --include="*.py" | grep -v ".git"
\`\`\`
### 2. Files That Will Be Affected
Numbered list of every file to be modified, with the specific change for each.
### 3. Files Searched But Not Changed (and why)
Proof that related files were checked and determined unchanged.
### 4. Documentation That References This
List of docs that mention this feature/script/function.
**User verifies this list before Claude proceeds. If Claude skips this, stop immediately.**
### After Changes
Run the same grep and show results proving no references remain unaddressed.
```
**Rationale:** This protocol prevents incomplete changes where Claude modifies some files but misses others that reference the same code, causing cascading bugs.
## Auto-Detection ## Auto-Detection
The command automatically detects: The command automatically detects:

View File

@@ -56,7 +56,6 @@ Or specify specific optimizations:
### Enhance ### Enhance
- Add missing essential sections - Add missing essential sections
- **Add Pre-Change Protocol if missing (HIGH PRIORITY)**
- Improve unclear instructions - Improve unclear instructions
- Add helpful examples - Add helpful examples
- Highlight critical rules - Highlight critical rules
@@ -159,49 +158,6 @@ Backup saved to: .claude/backups/CLAUDE.md.2025-01-18
| `--preserve-comments` | Keep all existing comments | | `--preserve-comments` | Keep all existing comments |
| `--section=NAME` | Optimize specific section only | | `--section=NAME` | Optimize specific section only |
## Pre-Change Protocol (Mandatory Addition)
**If CLAUDE.md is missing the Pre-Change Protocol section, optimization MUST add it.**
This is the highest priority enhancement because it prevents cascading bugs from incomplete code changes.
### Detection
Search CLAUDE.md for:
- "Pre-Change" or "Before Any Code Change" in headers
- References to impact search or grep verification
- User verification checkpoint
### If Missing
Add this section (position: after Critical Rules, before Common Operations):
```markdown
## ⛔ MANDATORY: Before Any Code Change
**Claude MUST show this checklist BEFORE editing any file:**
### 1. Impact Search Results
Run and show output of:
\`\`\`bash
grep -rn "PATTERN" --include="*.sh" --include="*.md" --include="*.json" --include="*.py" | grep -v ".git"
\`\`\`
### 2. Files That Will Be Affected
Numbered list of every file to be modified, with the specific change for each.
### 3. Files Searched But Not Changed (and why)
Proof that related files were checked and determined unchanged.
### 4. Documentation That References This
List of docs that mention this feature/script/function.
**User verifies this list before Claude proceeds. If Claude skips this, stop immediately.**
### After Changes
Run the same grep and show results proving no references remain unaddressed.
```
## When to Use ## When to Use
Run `/config-optimize` when: Run `/config-optimize` when:

View File

@@ -19,5 +19,6 @@
"data-quality", "data-quality",
"validation" "validation"
], ],
"commands": ["./commands/"] "commands": ["./commands/"],
"mcpServers": ["./.mcp.json"]
} }

View File

@@ -0,0 +1,8 @@
{
"mcpServers": {
"netbox": {
"command": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/netbox/run.sh",
"args": []
}
}
}

View File

@@ -1,8 +1,7 @@
{ {
"name": "code-sentinel", "name": "code-sentinel",
"description": "Security scanning and code refactoring tools", "description": "Security scanning and code refactoring tools",
"version": "1.0.1", "version": "1.0.0",
"defaultModel": "sonnet",
"author": { "author": {
"name": "Leo Miranda", "name": "Leo Miranda",
"email": "leobmiranda@gmail.com" "email": "leobmiranda@gmail.com"

View File

@@ -1,7 +1,5 @@
--- ---
name: security-reviewer
description: Security-focused code review agent description: Security-focused code review agent
model: opus
--- ---
# Security Reviewer Agent # Security Reviewer Agent

View File

@@ -1,7 +1,6 @@
{ {
"name": "contract-validator", "name": "contract-validator",
"version": "1.1.0", "version": "1.0.0",
"defaultModel": "sonnet",
"description": "Cross-plugin compatibility validation and Claude.md agent verification", "description": "Cross-plugin compatibility validation and Claude.md agent verification",
"author": { "author": {
"name": "Leo Miranda", "name": "Leo Miranda",
@@ -18,5 +17,6 @@
"interfaces", "interfaces",
"cross-plugin" "cross-plugin"
], ],
"commands": ["./commands/"] "commands": ["./commands/"],
"mcpServers": ["./.mcp.json"]
} }

View File

@@ -0,0 +1,9 @@
{
"mcpServers": {
"contract-validator": {
"type": "stdio",
"command": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/contract-validator/run.sh",
"args": []
}
}
}

View File

@@ -1,9 +1,3 @@
---
name: agent-check
description: Agent definition validator for quick verification
model: haiku
---
# Agent Check Agent # Agent Check Agent
You are an agent definition validator. Your role is to verify that a specific agent's tool references and data flow are valid. You are an agent definition validator. Your role is to verify that a specific agent's tool references and data flow are valid.

View File

@@ -1,7 +1,6 @@
{ {
"name": "data-platform", "name": "data-platform",
"version": "1.1.0", "version": "1.0.0",
"defaultModel": "sonnet",
"description": "Data engineering tools with pandas, PostgreSQL/PostGIS, and dbt integration", "description": "Data engineering tools with pandas, PostgreSQL/PostGIS, and dbt integration",
"author": { "author": {
"name": "Leo Miranda", "name": "Leo Miranda",
@@ -19,5 +18,6 @@
"etl", "etl",
"dataframe" "dataframe"
], ],
"commands": ["./commands/"] "commands": ["./commands/"],
"mcpServers": ["./.mcp.json"]
} }

View File

@@ -0,0 +1,9 @@
{
"mcpServers": {
"data-platform": {
"type": "stdio",
"command": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/data-platform/run.sh",
"args": []
}
}
}

View File

@@ -1,9 +1,3 @@
---
name: data-analysis
description: Data analysis specialist for exploration and profiling
model: opus
---
# Data Analysis Agent # Data Analysis Agent
You are a data analysis specialist. Your role is to help users explore, profile, and understand their data. You are a data analysis specialist. Your role is to help users explore, profile, and understand their data.

View File

@@ -52,13 +52,7 @@ Then proceed with the sync.
- Single commit: `docs: sync documentation with code changes` - Single commit: `docs: sync documentation with code changes`
- Include summary of what was updated in commit body - Include summary of what was updated in commit body
5. **Clear Queue** 5. **Output**
After successful sync, clear the queue file:
```bash
echo "# Doc Guardian Queue - cleared after sync on $(date +%Y-%m-%d)" > .doc-guardian-queue
```
6. **Output**
``` ```
## Documentation Sync Complete ## Documentation Sync Complete

View File

@@ -1,12 +1,7 @@
#!/bin/bash #!/bin/bash
# doc-guardian notification hook # doc-guardian notification hook
# Tracks documentation dependencies and queues updates # Tracks documentation dependencies and queues updates
# # This is a command hook - guaranteed not to block workflow
# SILENT BY DEFAULT - No output to avoid interrupting Claude's workflow.
# Changes are queued to .doc-guardian-queue for later processing.
# Run /doc-sync or /doc-audit to see and process pending updates.
#
# Set DOC_GUARDIAN_VERBOSE=1 to enable notification output.
# Read tool input from stdin (JSON with file_path) # Read tool input from stdin (JSON with file_path)
INPUT=$(cat) INPUT=$(cat)
@@ -49,26 +44,15 @@ DEPENDENT_DOCS="${DOC_DEPS[$MODIFIED_TYPE]}"
# Queue file for tracking pending updates # Queue file for tracking pending updates
QUEUE_FILE="${CLAUDE_PROJECT_ROOT:-.}/.doc-guardian-queue" QUEUE_FILE="${CLAUDE_PROJECT_ROOT:-.}/.doc-guardian-queue"
# Add to queue (always, for deduplication we check file+type combo) # Add to queue (create if doesn't exist, append if does)
# Format: timestamp | type | file_path | dependent_docs {
QUEUE_ENTRY="$(date +%Y-%m-%dT%H:%M:%S) | $MODIFIED_TYPE | $FILE_PATH | $DEPENDENT_DOCS" echo "$(date +%Y-%m-%dT%H:%M:%S) | $MODIFIED_TYPE | $FILE_PATH | $DEPENDENT_DOCS"
} >> "$QUEUE_FILE" 2>/dev/null || true
# Check if this exact file+type combo already exists in queue (dedup) # Count pending updates
if [ -f "$QUEUE_FILE" ]; then PENDING_COUNT=$(wc -l < "$QUEUE_FILE" 2>/dev/null | tr -d ' ' || echo "1")
if grep -qF "| $MODIFIED_TYPE | $FILE_PATH |" "$QUEUE_FILE" 2>/dev/null; then
# Already queued, skip silently
exit 0
fi
fi
# Add to queue # Output notification with specific docs that need updating
echo "$QUEUE_ENTRY" >> "$QUEUE_FILE" 2>/dev/null || true echo "[doc-guardian] $MODIFIED_TYPE changed → update needed: $DEPENDENT_DOCS (${PENDING_COUNT} pending)"
# SILENT by default - only output if DOC_GUARDIAN_VERBOSE is set
# This prevents Claude from stopping to ask about documentation updates
if [ "${DOC_GUARDIAN_VERBOSE:-0}" = "1" ]; then
PENDING_COUNT=$(wc -l < "$QUEUE_FILE" 2>/dev/null | tr -d ' ' || echo "1")
echo "[doc-guardian] queued: $MODIFIED_TYPE ($PENDING_COUNT pending)"
fi
exit 0 exit 0

View File

@@ -1,16 +1,19 @@
{ {
"hooks": [ "hooks": {
{ "PreToolUse": [
"event": "PreToolUse", {
"matcher": "Bash", "matcher": "Bash",
"type": "command", "hooks": [
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/branch-check.sh" {
}, "type": "command",
{ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/branch-check.sh"
"event": "PreToolUse", },
"matcher": "Bash", {
"type": "command", "type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/commit-msg-check.sh" "command": "${CLAUDE_PLUGIN_ROOT}/hooks/commit-msg-check.sh"
} }
] ]
}
]
}
} }

View File

@@ -1,7 +1,6 @@
{ {
"name": "pr-review", "name": "pr-review",
"version": "1.1.0", "version": "1.0.0",
"defaultModel": "sonnet",
"description": "Multi-agent pull request review with confidence scoring and actionable feedback", "description": "Multi-agent pull request review with confidence scoring and actionable feedback",
"author": { "author": {
"name": "Leo Miranda", "name": "Leo Miranda",
@@ -17,5 +16,6 @@
"performance", "performance",
"multi-agent" "multi-agent"
], ],
"commands": ["./commands/"] "commands": ["./commands/"],
"mcpServers": ["./.mcp.json"]
} }

View File

@@ -0,0 +1,8 @@
{
"mcpServers": {
"gitea": {
"command": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/gitea/run.sh",
"args": []
}
}
}

View File

@@ -1,9 +1,3 @@
---
name: security-reviewer
description: Security-focused code reviewer for PR analysis
model: opus
---
# Security Reviewer Agent # Security Reviewer Agent
## Visual Output Requirements ## Visual Output Requirements

View File

@@ -1,7 +1,6 @@
{ {
"name": "projman", "name": "projman",
"version": "3.3.0", "version": "3.2.0",
"defaultModel": "sonnet",
"description": "Sprint planning and project management with Gitea integration", "description": "Sprint planning and project management with Gitea integration",
"author": { "author": {
"name": "Leo Miranda", "name": "Leo Miranda",
@@ -17,5 +16,6 @@
"agile", "agile",
"lessons-learned" "lessons-learned"
], ],
"commands": ["./commands/"] "commands": ["./commands/"],
"mcpServers": ["./.mcp.json"]
} }

View File

@@ -0,0 +1,8 @@
{
"mcpServers": {
"gitea": {
"command": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/gitea/run.sh",
"args": []
}
}
}

View File

@@ -1,7 +1,6 @@
--- ---
name: code-reviewer name: code-reviewer
description: Specialized agent for pre-sprint code quality review description: Specialized agent for pre-sprint code quality review
model: opus
--- ---
# Code Reviewer Agent # Code Reviewer Agent

View File

@@ -1,7 +1,6 @@
--- ---
name: planner name: planner
description: Sprint planning agent - thoughtful architecture analysis and issue creation description: Sprint planning agent - thoughtful architecture analysis and issue creation
model: opus
--- ---
# Sprint Planner Agent # Sprint Planner Agent

View File

@@ -1,28 +0,0 @@
---
description: Clear plugin cache to force fresh configuration reload after marketplace updates
---
# Clear Cache
Clear plugin cache to force fresh configuration reload. Run this after marketplace updates.
## When to Use
- After updating the marketplace (`git pull` or reinstall)
- When MCP servers show stale configuration
- When plugin changes don't take effect
## What It Does
1. Clears `~/.claude/plugins/cache/leo-claude-mktplace/`
2. Forces Claude Code to re-read `.mcp.json` files on next session
## Instructions
Run this command, then **restart your Claude Code session** for changes to take effect.
```bash
rm -rf ~/.claude/plugins/cache/leo-claude-mktplace/
```
After clearing, inform the user: "Cache cleared. Restart Claude Code for changes to take effect."

View File

@@ -385,13 +385,6 @@ git push -u origin fix/issue-[NUMBER]-[brief-description]
git checkout development git checkout development
``` ```
**⚠️ IMPORTANT: Issue will NOT auto-close**
PRs merged to `development` do NOT trigger Gitea's auto-close feature.
Auto-close only works when merging to the default branch (`main`).
You MUST manually close the issue in Step 15 after the PR is merged.
5. Add comment to original issue: 5. Add comment to original issue:
``` ```
mcp__plugin_projman_gitea__add_comment( mcp__plugin_projman_gitea__add_comment(
@@ -424,14 +417,9 @@ Next Steps:
**This step runs AFTER the user has verified the fix works.** **This step runs AFTER the user has verified the fix works.**
**⚠️ MANDATORY: You MUST manually close the issue.**
PRs merged to `development` do NOT auto-close issues (Gitea only auto-closes
on merges to the default branch `main`). Always close manually after merge.
When user returns and confirms the fix is working: When user returns and confirms the fix is working:
**1. Close the issue (REQUIRED - won't auto-close):** **1. Close the issue:**
``` ```
mcp__plugin_projman_gitea__update_issue( mcp__plugin_projman_gitea__update_issue(

View File

@@ -1,8 +1,4 @@
--- # /suggest-version
description: Analyze CHANGELOG.md and suggest appropriate semantic version bump
---
# Suggest Version
Analyze CHANGELOG.md and suggest appropriate semantic version bump. Analyze CHANGELOG.md and suggest appropriate semantic version bump.

View File

@@ -7,6 +7,42 @@ PREFIX="[projman]"
# Calculate paths # Calculate paths
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "$(realpath "$0")")")}" PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "$(realpath "$0")")")}"
# Marketplace root is 2 levels up from plugin root (plugins/projman -> .)
MARKETPLACE_ROOT="$(dirname "$(dirname "$PLUGIN_ROOT")")"
VENV_REPAIR_SCRIPT="$MARKETPLACE_ROOT/scripts/venv-repair.sh"
PLUGIN_CACHE="$HOME/.claude/plugins/cache/leo-claude-mktplace"
# ============================================================================
# Clear stale plugin cache (MUST run before MCP servers load)
# ============================================================================
# The cache at ~/.claude/plugins/cache/ holds versioned .mcp.json files.
# After marketplace updates, cached configs may point to old paths.
# Clearing forces Claude to read fresh configs from installed marketplace.
if [[ -d "$PLUGIN_CACHE" ]]; then
rm -rf "$PLUGIN_CACHE"
# Don't output anything - this should be silent and automatic
fi
# ============================================================================
# Auto-repair MCP venvs (runs before other checks)
# ============================================================================
if [[ -x "$VENV_REPAIR_SCRIPT" ]]; then
# Run venv repair - this creates symlinks to cached venvs
# Only outputs messages if something needed fixing
"$VENV_REPAIR_SCRIPT" 2>/dev/null || {
echo "$PREFIX MCP venv setup failed - run: cd $MARKETPLACE_ROOT && ./scripts/setup-venvs.sh"
exit 0
}
else
# Fallback: just check if venv exists
VENV_PATH="$PLUGIN_ROOT/mcp-servers/gitea/.venv/bin/python"
if [[ ! -f "$VENV_PATH" ]]; then
echo "$PREFIX MCP venvs missing - run setup.sh from installed marketplace"
exit 0
fi
fi
# Check git remote vs .env config (only if .env exists) # Check git remote vs .env config (only if .env exists)
if [[ -f ".env" ]]; then if [[ -f ".env" ]]; then
@@ -45,29 +81,6 @@ if [[ -f ".env" ]]; then
fi fi
fi fi
# ============================================================================
# Check version consistency across files (early drift detection)
# ============================================================================
# Versions must stay in sync across: README.md, marketplace.json, CHANGELOG.md
# Drift here causes confusion and release issues
if [[ -f "README.md" && -f ".claude-plugin/marketplace.json" && -f "CHANGELOG.md" ]]; then
VERSION_README=$(grep -oE "^# .* - v[0-9]+\.[0-9]+\.[0-9]+" README.md 2>/dev/null | grep -oE "[0-9]+\.[0-9]+\.[0-9]+" || echo "")
# Extract metadata.version specifically (appears after "metadata" in marketplace.json)
VERSION_MARKETPLACE=$(sed -n '/"metadata"/,/}/p' .claude-plugin/marketplace.json 2>/dev/null | grep -oE '"version"[[:space:]]*:[[:space:]]*"[0-9]+\.[0-9]+\.[0-9]+"' | head -1 | grep -oE "[0-9]+\.[0-9]+\.[0-9]+" || echo "")
VERSION_CHANGELOG=$(grep -oE "^## \[[0-9]+\.[0-9]+\.[0-9]+\]" CHANGELOG.md 2>/dev/null | head -1 | grep -oE "[0-9]+\.[0-9]+\.[0-9]+" || echo "")
if [[ -n "$VERSION_README" && -n "$VERSION_MARKETPLACE" && -n "$VERSION_CHANGELOG" ]]; then
if [[ "$VERSION_README" != "$VERSION_MARKETPLACE" ]] || [[ "$VERSION_README" != "$VERSION_CHANGELOG" ]]; then
echo "$PREFIX Version mismatch detected:"
echo "$PREFIX README.md: v$VERSION_README"
echo "$PREFIX marketplace.json: v$VERSION_MARKETPLACE"
echo "$PREFIX CHANGELOG.md: v$VERSION_CHANGELOG"
echo "$PREFIX Run /suggest-version to analyze and fix"
fi
fi
fi
# Check for CHANGELOG.md [Unreleased] content (version management) # Check for CHANGELOG.md [Unreleased] content (version management)
if [[ -f "CHANGELOG.md" ]]; then if [[ -f "CHANGELOG.md" ]]; then
# Check if there's content under [Unreleased] that hasn't been released # Check if there's content under [Unreleased] that hasn't been released

View File

@@ -1,7 +1,6 @@
{ {
"name": "viz-platform", "name": "viz-platform",
"version": "1.1.0", "version": "1.0.0",
"defaultModel": "sonnet",
"description": "Visualization tools with Dash Mantine Components validation, Plotly charts, and theming", "description": "Visualization tools with Dash Mantine Components validation, Plotly charts, and theming",
"author": { "author": {
"name": "Leo Miranda", "name": "Leo Miranda",
@@ -20,5 +19,6 @@
"visualization", "visualization",
"dmc" "dmc"
], ],
"commands": ["./commands/"] "commands": ["./commands/"],
"mcpServers": ["./.mcp.json"]
} }

View File

@@ -0,0 +1,9 @@
{
"mcpServers": {
"viz-platform": {
"type": "stdio",
"command": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/viz-platform/run.sh",
"args": []
}
}
}

View File

@@ -1,9 +1,3 @@
---
name: component-check
description: DMC component validation specialist
model: haiku
---
# Component Check Agent # Component Check Agent
You are a strict component validation specialist. Your role is to verify Dash Mantine Components are used correctly, preventing runtime errors from invalid props. You are a strict component validation specialist. Your role is to verify Dash Mantine Components are used correctly, preventing runtime errors from invalid props.

View File

@@ -6,10 +6,9 @@
# #
# This script: # This script:
# 1. Clears Claude plugin cache (forces fresh .mcp.json reads) # 1. Clears Claude plugin cache (forces fresh .mcp.json reads)
# 2. Shows recent changelog updates # 2. Restores MCP venv symlinks (instant if cache exists)
# # 3. Creates venvs in external cache if missing (first run only)
# NOTE: This script does NOT touch .venv directories. # 4. Shows recent changelog updates
# If venvs are missing, run ./scripts/setup.sh manually.
# #
set -euo pipefail set -euo pipefail
@@ -23,11 +22,13 @@ REPO_ROOT="$(dirname "$SCRIPT_DIR")"
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[0;34m' BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m' NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; } log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
check_changelog() { check_changelog() {
if [[ -f "$REPO_ROOT/CHANGELOG.md" ]]; then if [[ -f "$REPO_ROOT/CHANGELOG.md" ]]; then
@@ -51,21 +52,35 @@ main() {
# Clear Claude plugin cache to force fresh .mcp.json reads # Clear Claude plugin cache to force fresh .mcp.json reads
# This cache holds versioned copies that become stale after updates # This cache holds versioned copies that become stale after updates
# NOTE: This does NOT touch .venv directories
if [[ -d "$CLAUDE_PLUGIN_CACHE" ]]; then if [[ -d "$CLAUDE_PLUGIN_CACHE" ]]; then
log_info "Clearing Claude plugin cache..." log_info "Clearing Claude plugin cache..."
rm -rf "$CLAUDE_PLUGIN_CACHE" rm -rf "$CLAUDE_PLUGIN_CACHE"
log_success "Plugin cache cleared" log_success "Plugin cache cleared"
fi fi
# Run venv-repair.sh to restore symlinks to external cache
# This is instant if cache exists, or does full setup on first run
if [[ -x "$SCRIPT_DIR/venv-repair.sh" ]]; then
log_info "Restoring MCP venv symlinks..."
if "$SCRIPT_DIR/venv-repair.sh"; then
log_success "MCP venvs ready"
else
log_error "MCP venv setup failed"
log_warn "Run: $SCRIPT_DIR/setup-venvs.sh for full setup"
exit 1
fi
else
log_error "venv-repair.sh not found at $SCRIPT_DIR"
exit 1
fi
check_changelog check_changelog
echo "" echo ""
log_success "Post-update complete!" log_success "Post-update complete!"
echo "" echo ""
echo "IMPORTANT: Restart Claude Code for changes to take effect." echo "IMPORTANT: Restart Claude Code for changes to take effect."
echo "" echo "MCP servers will work immediately on next session start."
echo "If MCP servers are not working, run: ./scripts/setup.sh"
} }
main "$@" main "$@"

View File

@@ -143,155 +143,14 @@ for plugin_dir in "$PLUGINS_DIR"/*/; do
echo "WARNING: Missing 'keywords' array in $plugin_name/plugin.json" echo "WARNING: Missing 'keywords' array in $plugin_name/plugin.json"
fi fi
# v5.4.0: Validate defaultModel field if present
default_model=$(jq -r '.defaultModel // empty' "$plugin_json")
if [[ -n "$default_model" ]]; then
if [[ ! "$default_model" =~ ^(opus|sonnet|haiku)$ ]]; then
echo "ERROR: Invalid defaultModel '$default_model' in $plugin_name/plugin.json (must be opus|sonnet|haiku)"
exit 1
fi
echo " ✓ defaultModel: $default_model"
fi
# Check README exists # Check README exists
if [[ ! -f "$plugin_dir/README.md" ]]; then if [[ ! -f "$plugin_dir/README.md" ]]; then
echo "WARNING: Missing README.md in $plugin_name/" echo "WARNING: Missing README.md in $plugin_name/"
fi fi
# CRITICAL: Validate file references exist (mcpServers, hooks, commands)
# This prevents broken references that silently break plugin loading
# Check mcpServers references
mcp_servers=$(jq -r '.mcpServers // [] | .[]' "$plugin_json" 2>/dev/null)
for mcp_ref in $mcp_servers; do
mcp_path="$plugin_dir/$mcp_ref"
if [[ ! -f "$mcp_path" ]]; then
echo "ERROR: BROKEN REFERENCE in $plugin_name/plugin.json"
echo " mcpServers references '$mcp_ref' but file does not exist at:"
echo " $mcp_path"
echo ""
echo " FIX: Either create the file or remove the mcpServers entry"
exit 1
fi
echo " ✓ mcpServers reference: $mcp_ref exists"
done
# Check hooks references (can be array of file paths OR object with handlers)
hooks_type=$(jq -r '.hooks | type' "$plugin_json" 2>/dev/null)
if [[ "$hooks_type" == "array" ]]; then
# Array format: ["./hooks/hooks.json"]
hooks=$(jq -r '.hooks[]' "$plugin_json" 2>/dev/null)
for hook_ref in $hooks; do
hook_path="$plugin_dir/$hook_ref"
if [[ ! -f "$hook_path" ]]; then
echo "ERROR: BROKEN REFERENCE in $plugin_name/plugin.json"
echo " hooks references '$hook_ref' but file does not exist at:"
echo " $hook_path"
echo ""
echo " FIX: Either create the file or remove the hooks entry"
exit 1
fi
echo " ✓ hooks reference: $hook_ref exists"
done
elif [[ "$hooks_type" == "object" ]]; then
# Object format: { "PostToolUse": [...] } - inline hooks, no file reference to validate
echo " ✓ hooks: inline object format (no file references)"
fi
# Check commands directory references
commands=$(jq -r '.commands // [] | .[]' "$plugin_json" 2>/dev/null)
for cmd_ref in $commands; do
cmd_path="$plugin_dir/$cmd_ref"
if [[ ! -d "$cmd_path" ]] && [[ ! -f "$cmd_path" ]]; then
echo "ERROR: BROKEN REFERENCE in $plugin_name/plugin.json"
echo " commands references '$cmd_ref' but path does not exist at:"
echo " $cmd_path"
echo ""
echo " FIX: Either create the path or remove the commands entry"
exit 1
fi
echo " ✓ commands reference: $cmd_ref exists"
done
echo "$plugin_name valid" echo "$plugin_name valid"
done done
# CRITICAL: Validate marketplace.json file references
echo ""
echo "=== Validating Marketplace File References (CRITICAL) ==="
for i in $(seq 0 $((PLUGIN_COUNT - 1))); do
PLUGIN_NAME=$(jq -r ".plugins[$i].name" "$MARKETPLACE_JSON")
PLUGIN_SOURCE=$(jq -r ".plugins[$i].source" "$MARKETPLACE_JSON")
PLUGIN_DIR="$ROOT_DIR/$PLUGIN_SOURCE"
# Check mcpServers in marketplace.json
mcp_servers=$(jq -r ".plugins[$i].mcpServers // [] | .[]" "$MARKETPLACE_JSON" 2>/dev/null)
for mcp_ref in $mcp_servers; do
mcp_path="$PLUGIN_DIR/$mcp_ref"
if [[ ! -f "$mcp_path" ]]; then
echo "ERROR: BROKEN REFERENCE in marketplace.json for $PLUGIN_NAME"
echo " mcpServers references '$mcp_ref' but file does not exist at:"
echo " $mcp_path"
echo ""
echo " FIX: Either create the file or remove the mcpServers entry from marketplace.json"
exit 1
fi
echo "$PLUGIN_NAME: mcpServers reference $mcp_ref exists"
done
# Check hooks in marketplace.json
hooks=$(jq -r ".plugins[$i].hooks // [] | .[]" "$MARKETPLACE_JSON" 2>/dev/null)
for hook_ref in $hooks; do
hook_path="$PLUGIN_DIR/$hook_ref"
if [[ ! -f "$hook_path" ]]; then
echo "ERROR: BROKEN REFERENCE in marketplace.json for $PLUGIN_NAME"
echo " hooks references '$hook_ref' but file does not exist at:"
echo " $hook_path"
echo ""
echo " FIX: Either create the file or remove the hooks entry from marketplace.json"
exit 1
fi
echo "$PLUGIN_NAME: hooks reference $hook_ref exists"
done
done
echo "✓ All file references validated"
# v5.4.0: Validate agent model fields
echo ""
echo "=== Validating Agent Model Fields (v5.4.0+) ==="
validate_agent_model() {
local file="$1"
local agent_name=$(basename "$file" .md)
# Extract model from frontmatter (between --- markers)
local model=$(sed -n '/^---$/,/^---$/p' "$file" | grep '^model:' | awk '{print $2}')
if [[ -n "$model" ]]; then
if [[ ! "$model" =~ ^(opus|sonnet|haiku)$ ]]; then
echo "ERROR: Invalid model '$model' in $file (must be opus|sonnet|haiku)"
exit 1
fi
echo "$agent_name: model=$model"
fi
}
for plugin_dir in "$PLUGINS_DIR"/*/; do
plugin_name=$(basename "$plugin_dir")
agents_dir="$plugin_dir/agents"
if [[ -d "$agents_dir" ]]; then
echo "--- Checking agents in $plugin_name ---"
for agent_file in "$agents_dir"/*.md; do
if [[ -f "$agent_file" ]]; then
validate_agent_model "$agent_file"
fi
done
fi
done
# v3.0.0: Validate MCP server symlinks # v3.0.0: Validate MCP server symlinks
echo "" echo ""
echo "=== Validating MCP Server Symlinks (v3.0.0+) ===" echo "=== Validating MCP Server Symlinks (v3.0.0+) ==="

169
scripts/venv-repair.sh Executable file
View File

@@ -0,0 +1,169 @@
#!/usr/bin/env bash
#
# venv-repair.sh - Fast MCP venv auto-repair for SessionStart hooks
#
# This script is designed to run at session start. It:
# 1. Checks if venvs exist in external cache (~/.cache/claude-mcp-venvs/)
# 2. Creates symlinks from marketplace to cache (instant operation)
# 3. Only runs pip install if cache is missing (first install)
#
# Output format: All messages prefixed with [mcp-venv] for hook display
#
# Usage:
# ./scripts/venv-repair.sh # Auto-repair (default)
# ./scripts/venv-repair.sh --silent # Silent mode (no output unless error)
#
set -euo pipefail
# ============================================================================
# Configuration
# ============================================================================
PREFIX="[mcp-venv]"
VENV_CACHE_DIR="${HOME}/.cache/claude-mcp-venvs/leo-claude-mktplace"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(dirname "$SCRIPT_DIR")"
# MCP servers
MCP_SERVERS=(gitea netbox data-platform viz-platform contract-validator)
# Parse args
SILENT=false
[[ "${1:-}" == "--silent" ]] && SILENT=true
log() {
[[ "$SILENT" == true ]] && return
echo "$PREFIX $1"
}
log_error() {
echo "$PREFIX ERROR: $1" >&2
}
# ============================================================================
# Check if all venvs exist in cache
# ============================================================================
cache_complete() {
for server in "${MCP_SERVERS[@]}"; do
local venv_python="$VENV_CACHE_DIR/$server/.venv/bin/python"
[[ ! -f "$venv_python" ]] && return 1
done
return 0
}
# ============================================================================
# Create symlinks from marketplace to cache
# ============================================================================
create_symlink() {
local server_name="$1"
local server_path="$REPO_ROOT/mcp-servers/$server_name"
local venv_cache="$VENV_CACHE_DIR/$server_name/.venv"
local venv_link="$server_path/.venv"
# Skip if server doesn't exist
[[ ! -d "$server_path" ]] && return 0
# Skip if cache doesn't exist
[[ ! -d "$venv_cache" ]] && return 1
# Already correct symlink?
if [[ -L "$venv_link" ]]; then
local target
target=$(readlink "$venv_link")
[[ "$target" == "$venv_cache" ]] && return 0
rm "$venv_link"
elif [[ -d "$venv_link" ]]; then
# Old venv directory exists - back it up or remove
rm -rf "$venv_link"
fi
# Create symlink
ln -s "$venv_cache" "$venv_link"
return 0
}
create_all_symlinks() {
local created=0
for server in "${MCP_SERVERS[@]}"; do
if create_symlink "$server"; then
((created++)) || true
fi
done
[[ $created -gt 0 ]] && log "Restored $created venv symlinks"
}
# ============================================================================
# Full setup (only if cache missing)
# ============================================================================
setup_server() {
local server_name="$1"
local server_path="$REPO_ROOT/mcp-servers/$server_name"
local venv_path="$VENV_CACHE_DIR/$server_name/.venv"
[[ ! -d "$server_path" ]] && return 0
mkdir -p "$VENV_CACHE_DIR/$server_name"
# Create venv
if [[ ! -d "$venv_path" ]]; then
python3 -m venv "$venv_path"
fi
# Install dependencies
# shellcheck disable=SC1091
source "$venv_path/bin/activate"
pip install -q --upgrade pip
if [[ -f "$server_path/requirements.txt" ]]; then
pip install -q -r "$server_path/requirements.txt"
fi
if [[ -f "$server_path/pyproject.toml" ]]; then
pip install -q -e "$server_path"
fi
deactivate
# Save hash for future quick checks
local hash_file="$VENV_CACHE_DIR/$server_name/.requirements_hash"
{
if [[ -f "$server_path/requirements.txt" ]]; then
cat "$server_path/requirements.txt"
fi
if [[ -f "$server_path/pyproject.toml" ]]; then
cat "$server_path/pyproject.toml"
fi
echo "" # Ensure non-empty input for sha256sum
} | sha256sum | cut -d' ' -f1 > "$hash_file"
}
full_setup() {
log "First run - setting up MCP venvs (this only happens once)..."
for server in "${MCP_SERVERS[@]}"; do
log " Setting up $server..."
setup_server "$server"
done
log "Setup complete. Future sessions will be instant."
}
# ============================================================================
# Main
# ============================================================================
main() {
# Fast path: cache exists, just ensure symlinks
if cache_complete; then
create_all_symlinks
exit 0
fi
# Slow path: need to create venvs (first install)
full_setup
create_all_symlinks
}
main "$@"