Compare commits
13 Commits
f6931a0e0f
...
v5.9.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 61907b78db | |||
| c4037f505c | |||
| dbf3fa7e0d | |||
| 6d093e83b6 | |||
| 13de992638 | |||
| ef28f172d6 | |||
| 39556dbb59 | |||
| c9e054e013 | |||
| db8fec42f2 | |||
| ba1dee4553 | |||
| 01e184b68f | |||
| c0d62f4957 | |||
| 5b1dde694c |
@@ -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.8.0"
|
"version": "5.9.0"
|
||||||
},
|
},
|
||||||
"plugins": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [5.9.0] - 2026-02-03
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
#### Plugin Installation Scripts
|
#### Plugin Installation Scripts
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ 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.8.0
|
**Version:** 5.9.0
|
||||||
**Status:** Production Ready
|
**Status:** Production Ready
|
||||||
|
|
||||||
A plugin marketplace for Claude Code containing:
|
A plugin marketplace for Claude Code containing:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Leo Claude Marketplace - v5.8.0
|
# Leo Claude Marketplace - v5.9.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.
|
||||||
|
|
||||||
|
|||||||
@@ -182,10 +182,42 @@ MCP servers are **shared at repository root** and configured in `.mcp.json`.
|
|||||||
| MCP configuration | `.mcp.json` | `.mcp.json` (at repo root) |
|
| MCP configuration | `.mcp.json` | `.mcp.json` (at repo root) |
|
||||||
| Shared MCP server | `mcp-servers/{server}/` | `mcp-servers/gitea/` |
|
| Shared MCP server | `mcp-servers/{server}/` | `mcp-servers/gitea/` |
|
||||||
| MCP server code | `mcp-servers/{server}/mcp_server/` | `mcp-servers/gitea/mcp_server/` |
|
| MCP server code | `mcp-servers/{server}/mcp_server/` | `mcp-servers/gitea/mcp_server/` |
|
||||||
| MCP venv | `mcp-servers/{server}/.venv/` | `mcp-servers/gitea/.venv/` |
|
| MCP venv (local) | `mcp-servers/{server}/.venv/` | `mcp-servers/gitea/.venv/` |
|
||||||
|
|
||||||
**Note:** Plugins do NOT have their own `mcp-servers/` directories. All MCP servers are shared at root and configured via `.mcp.json`.
|
**Note:** Plugins do NOT have their own `mcp-servers/` directories. All MCP servers are shared at root and configured via `.mcp.json`.
|
||||||
|
|
||||||
|
### MCP Venv Paths - CRITICAL
|
||||||
|
|
||||||
|
**Venvs live in a CACHE directory that SURVIVES marketplace updates.**
|
||||||
|
|
||||||
|
When checking for venvs, ALWAYS check in this order:
|
||||||
|
|
||||||
|
| Priority | Path | Survives Updates? |
|
||||||
|
|----------|------|-------------------|
|
||||||
|
| 1 (CHECK FIRST) | `~/.cache/claude-mcp-venvs/leo-claude-mktplace/{server}/.venv/` | YES |
|
||||||
|
| 2 (fallback) | `{marketplace}/mcp-servers/{server}/.venv/` | NO |
|
||||||
|
|
||||||
|
**Why cache first?**
|
||||||
|
- Marketplace directory gets WIPED on every update/reinstall
|
||||||
|
- Cache directory SURVIVES updates
|
||||||
|
- False "venv missing" errors waste hours of debugging
|
||||||
|
|
||||||
|
**Pattern for hooks checking venvs:**
|
||||||
|
```bash
|
||||||
|
CACHE_VENV="$HOME/.cache/claude-mcp-venvs/leo-claude-mktplace/{server}/.venv/bin/python"
|
||||||
|
LOCAL_VENV="$MARKETPLACE_ROOT/mcp-servers/{server}/.venv/bin/python"
|
||||||
|
|
||||||
|
if [[ -f "$CACHE_VENV" ]]; then
|
||||||
|
VENV_PATH="$CACHE_VENV"
|
||||||
|
elif [[ -f "$LOCAL_VENV" ]]; then
|
||||||
|
VENV_PATH="$LOCAL_VENV"
|
||||||
|
else
|
||||||
|
echo "venv missing"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
**See lesson learned:** [Startup Hooks Must Check Venv Cache Path First](https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace/wiki/lessons/patterns/startup-hooks-must-check-venv-cache-path-first)
|
||||||
|
|
||||||
### Documentation Paths
|
### Documentation Paths
|
||||||
|
|
||||||
| Type | Location |
|
| Type | Location |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "clarity-assist",
|
"name": "clarity-assist",
|
||||||
"version": "1.0.0",
|
"version": "1.2.0",
|
||||||
"description": "Prompt optimization and requirement clarification with ND-friendly accommodations",
|
"description": "Prompt optimization and requirement clarification with ND-friendly accommodations",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Leo Miranda",
|
"name": "Leo Miranda",
|
||||||
|
|||||||
@@ -19,6 +19,5 @@
|
|||||||
"data-quality",
|
"data-quality",
|
||||||
"validation"
|
"validation"
|
||||||
],
|
],
|
||||||
"mcp_servers": ["netbox"],
|
|
||||||
"commands": ["./commands/"]
|
"commands": ["./commands/"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "contract-validator",
|
"name": "contract-validator",
|
||||||
"version": "1.1.0",
|
"version": "1.2.0",
|
||||||
"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",
|
||||||
@@ -17,6 +17,5 @@
|
|||||||
"interfaces",
|
"interfaces",
|
||||||
"cross-plugin"
|
"cross-plugin"
|
||||||
],
|
],
|
||||||
"mcp_servers": ["contract-validator"],
|
|
||||||
"commands": ["./commands/"]
|
"commands": ["./commands/"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,5 @@
|
|||||||
"etl",
|
"etl",
|
||||||
"dataframe"
|
"dataframe"
|
||||||
],
|
],
|
||||||
"mcp_servers": ["data-platform"],
|
|
||||||
"commands": ["./commands/"]
|
"commands": ["./commands/"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,11 +5,26 @@
|
|||||||
|
|
||||||
PREFIX="[data-platform]"
|
PREFIX="[data-platform]"
|
||||||
|
|
||||||
# Check if MCP venv exists
|
# Check if MCP venv exists - check cache first, then local
|
||||||
|
CACHE_VENV="$HOME/.cache/claude-mcp-venvs/leo-claude-mktplace/data-platform/.venv/bin/python"
|
||||||
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "$(realpath "$0")")")}"
|
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "$(realpath "$0")")")}"
|
||||||
VENV_PATH="$PLUGIN_ROOT/mcp-servers/data-platform/.venv/bin/python"
|
MARKETPLACE_ROOT="$(dirname "$(dirname "$PLUGIN_ROOT")")"
|
||||||
|
LOCAL_VENV="$MARKETPLACE_ROOT/mcp-servers/data-platform/.venv/bin/python"
|
||||||
|
|
||||||
if [[ ! -f "$VENV_PATH" ]]; then
|
# Check cache first (preferred), then local symlink
|
||||||
|
CACHE_VENV_DIR="$HOME/.cache/claude-mcp-venvs/leo-claude-mktplace/data-platform/.venv"
|
||||||
|
LOCAL_VENV_DIR="$MARKETPLACE_ROOT/mcp-servers/data-platform/.venv"
|
||||||
|
|
||||||
|
if [[ -f "$CACHE_VENV" ]]; then
|
||||||
|
VENV_PATH="$CACHE_VENV"
|
||||||
|
# Auto-create symlink in installed marketplace if missing
|
||||||
|
if [[ ! -e "$LOCAL_VENV_DIR" && -d "$CACHE_VENV_DIR" ]]; then
|
||||||
|
mkdir -p "$(dirname "$LOCAL_VENV_DIR")" 2>/dev/null
|
||||||
|
ln -sf "$CACHE_VENV_DIR" "$LOCAL_VENV_DIR" 2>/dev/null
|
||||||
|
fi
|
||||||
|
elif [[ -f "$LOCAL_VENV" ]]; then
|
||||||
|
VENV_PATH="$LOCAL_VENV"
|
||||||
|
else
|
||||||
echo "$PREFIX MCP venv missing - run /initial-setup or setup.sh"
|
echo "$PREFIX MCP venv missing - run /initial-setup or setup.sh"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "doc-guardian",
|
"name": "doc-guardian",
|
||||||
"description": "Automatic documentation drift detection and synchronization",
|
"description": "Automatic documentation drift detection and synchronization",
|
||||||
"version": "1.0.0",
|
"version": "1.1.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Leo Miranda",
|
"name": "Leo Miranda",
|
||||||
"email": "leobmiranda@gmail.com"
|
"email": "leobmiranda@gmail.com"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "git-flow",
|
"name": "git-flow",
|
||||||
"version": "1.0.0",
|
"version": "1.2.0",
|
||||||
"description": "Git workflow automation with intelligent commit messages and branch management",
|
"description": "Git workflow automation with intelligent commit messages and branch management",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Leo Miranda",
|
"name": "Leo Miranda",
|
||||||
|
|||||||
@@ -16,6 +16,5 @@
|
|||||||
"performance",
|
"performance",
|
||||||
"multi-agent"
|
"multi-agent"
|
||||||
],
|
],
|
||||||
"mcp_servers": ["gitea"],
|
|
||||||
"commands": ["./commands/"]
|
"commands": ["./commands/"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,11 +5,18 @@
|
|||||||
|
|
||||||
PREFIX="[pr-review]"
|
PREFIX="[pr-review]"
|
||||||
|
|
||||||
# Check if MCP venv exists
|
# Check if MCP venv exists - check cache first, then local
|
||||||
|
CACHE_VENV="$HOME/.cache/claude-mcp-venvs/leo-claude-mktplace/gitea/.venv/bin/python"
|
||||||
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "$(realpath "$0")")")}"
|
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "$(realpath "$0")")")}"
|
||||||
VENV_PATH="$PLUGIN_ROOT/mcp-servers/gitea/.venv/bin/python"
|
MARKETPLACE_ROOT="$(dirname "$(dirname "$PLUGIN_ROOT")")"
|
||||||
|
LOCAL_VENV="$MARKETPLACE_ROOT/mcp-servers/gitea/.venv/bin/python"
|
||||||
|
|
||||||
if [[ ! -f "$VENV_PATH" ]]; then
|
# Check cache first (preferred), then local
|
||||||
|
if [[ -f "$CACHE_VENV" ]]; then
|
||||||
|
VENV_PATH="$CACHE_VENV"
|
||||||
|
elif [[ -f "$LOCAL_VENV" ]]; then
|
||||||
|
VENV_PATH="$LOCAL_VENV"
|
||||||
|
else
|
||||||
echo "$PREFIX MCP venvs missing - run setup.sh from installed marketplace"
|
echo "$PREFIX MCP venvs missing - run setup.sh from installed marketplace"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "projman",
|
"name": "projman",
|
||||||
"version": "3.3.0",
|
"version": "3.4.0",
|
||||||
"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",
|
||||||
@@ -16,6 +16,5 @@
|
|||||||
"agile",
|
"agile",
|
||||||
"lessons-learned"
|
"lessons-learned"
|
||||||
],
|
],
|
||||||
"mcp_servers": ["gitea"],
|
|
||||||
"commands": ["./commands/"]
|
"commands": ["./commands/"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,17 +29,19 @@ if [[ -f ".env" ]]; then
|
|||||||
|
|
||||||
if [[ -n "$GITEA_API_URL" && -n "$GITEA_API_TOKEN" && -n "$GITEA_REPO" ]]; then
|
if [[ -n "$GITEA_API_URL" && -n "$GITEA_API_TOKEN" && -n "$GITEA_REPO" ]]; then
|
||||||
# Quick check for open issues without milestone (unplanned work)
|
# Quick check for open issues without milestone (unplanned work)
|
||||||
|
# Note: grep -c returns 0 on no match but exits non-zero, causing || to also fire
|
||||||
|
# Use subshell to ensure single value
|
||||||
OPEN_ISSUES=$(curl -s -m 5 \
|
OPEN_ISSUES=$(curl -s -m 5 \
|
||||||
-H "Authorization: token $GITEA_API_TOKEN" \
|
-H "Authorization: token $GITEA_API_TOKEN" \
|
||||||
"${GITEA_API_URL}/repos/${GITEA_REPO}/issues?state=open&milestone=none&limit=1" 2>/dev/null | \
|
"${GITEA_API_URL}/repos/${GITEA_REPO}/issues?state=open&milestone=none&limit=1" 2>/dev/null | \
|
||||||
grep -c '"number"' || echo "0")
|
grep -c '"number"' 2>/dev/null) || OPEN_ISSUES=0
|
||||||
|
|
||||||
if [[ "$OPEN_ISSUES" -gt 0 ]]; then
|
if [[ "$OPEN_ISSUES" -gt 0 ]]; then
|
||||||
# Count total unplanned issues
|
# Count total unplanned issues
|
||||||
TOTAL_UNPLANNED=$(curl -s -m 5 \
|
TOTAL_UNPLANNED=$(curl -s -m 5 \
|
||||||
-H "Authorization: token $GITEA_API_TOKEN" \
|
-H "Authorization: token $GITEA_API_TOKEN" \
|
||||||
"${GITEA_API_URL}/repos/${GITEA_REPO}/issues?state=open&milestone=none" 2>/dev/null | \
|
"${GITEA_API_URL}/repos/${GITEA_REPO}/issues?state=open&milestone=none" 2>/dev/null | \
|
||||||
grep -c '"number"' || echo "?")
|
grep -c '"number"' 2>/dev/null) || TOTAL_UNPLANNED="?"
|
||||||
echo "$PREFIX ${TOTAL_UNPLANNED} open issues without milestone - consider /sprint-plan"
|
echo "$PREFIX ${TOTAL_UNPLANNED} open issues without milestone - consider /sprint-plan"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -19,6 +19,5 @@
|
|||||||
"visualization",
|
"visualization",
|
||||||
"dmc"
|
"dmc"
|
||||||
],
|
],
|
||||||
"mcp_servers": ["viz-platform"],
|
|
||||||
"commands": ["./commands/"]
|
"commands": ["./commands/"]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user