diff --git a/CLAUDE.md b/CLAUDE.md index f9ab937..074727b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -161,10 +161,11 @@ Both plugins use **two shared MCP servers** at repository root level (`mcp-serve - `tag_lesson` - Add tags to lessons learned **Key Architecture Points:** -- MCP servers are **shared** by both plugins at `mcp-servers/gitea` and `mcp-servers/wikijs` +- MCP servers are **bundled inside each plugin** at `plugins/{plugin}/mcp-servers/` +- This ensures plugins work when cached by Claude Code (only plugin directory is cached) - Each MCP server detects its mode (project-scoped vs company-wide) based on environment variables - Configuration uses hybrid approach (system-level + project-level) -- All plugins reference `../../mcp-servers/` in their `.mcp.json` files (from `plugins/*/`) +- All plugins reference `${CLAUDE_PLUGIN_ROOT}/mcp-servers/` in their `.mcp.json` files ## Branch-Aware Security Model @@ -261,76 +262,73 @@ See [docs/reference-material/projman-implementation-plan.md](docs/reference-mate bandit/support-claude-mktplace/ ├── .claude-plugin/ │ └── marketplace.json -├── mcp-servers/ # ← SHARED BY ALL PLUGINS -│ ├── gitea/ -│ │ ├── .venv/ -│ │ ├── requirements.txt # Python dependencies -│ │ ├── mcp_server/ -│ │ │ ├── __init__.py -│ │ │ ├── server.py -│ │ │ ├── config.py # Mode detection (project/company) -│ │ │ ├── gitea_client.py -│ │ │ └── tools/ -│ │ │ ├── issues.py -│ │ │ └── labels.py -│ │ └── tests/ -│ └── wikijs/ -│ ├── .venv/ -│ ├── requirements.txt # Python + GraphQL dependencies -│ ├── mcp_server/ -│ │ ├── __init__.py -│ │ ├── server.py -│ │ ├── config.py # Mode detection (project/company) -│ │ ├── wikijs_client.py # GraphQL client -│ │ └── tools/ -│ │ ├── pages.py -│ │ ├── lessons_learned.py -│ │ └── documentation.py -│ └── tests/ -└── plugins/ # ← ALL PLUGINS - ├── projman/ # ← PROJECT PLUGIN - │ ├── .claude-plugin/ - │ │ └── plugin.json - │ ├── .mcp.json # Points to ../../mcp-servers/ - │ ├── commands/ - │ │ ├── sprint-plan.md - │ │ ├── sprint-start.md - │ │ ├── sprint-status.md - │ │ ├── sprint-close.md - │ │ └── labels-sync.md - │ ├── agents/ - │ │ ├── planner.md - │ │ ├── orchestrator.md - │ │ └── executor.md - │ ├── skills/ - │ │ └── label-taxonomy/ - │ │ └── labels-reference.md - │ ├── README.md - │ └── CONFIGURATION.md - ├── projman-pmo/ # ← PMO PLUGIN - │ ├── .claude-plugin/ - │ │ └── plugin.json - │ ├── .mcp.json # Points to ../../mcp-servers/ - │ ├── commands/ - │ │ ├── pmo-status.md - │ │ ├── pmo-priorities.md - │ │ ├── pmo-dependencies.md - │ │ └── pmo-schedule.md - │ ├── agents/ - │ │ └── pmo-coordinator.md - │ └── README.md - └── project-hygiene/ # ← CLEANUP PLUGIN - └── ... +├── plugins/ # ← ALL PLUGINS (with bundled MCP servers) +│ ├── projman/ # ← PROJECT PLUGIN +│ │ ├── .claude-plugin/ +│ │ │ └── plugin.json +│ │ ├── .mcp.json # Points to ${CLAUDE_PLUGIN_ROOT}/mcp-servers/ +│ │ ├── mcp-servers/ # ← MCP servers BUNDLED IN plugin +│ │ │ ├── gitea/ +│ │ │ │ ├── .venv/ +│ │ │ │ ├── requirements.txt +│ │ │ │ ├── mcp_server/ +│ │ │ │ └── tests/ +│ │ │ └── wikijs/ +│ │ │ ├── .venv/ +│ │ │ ├── requirements.txt +│ │ │ ├── mcp_server/ +│ │ │ └── tests/ +│ │ ├── commands/ +│ │ │ ├── sprint-plan.md +│ │ │ ├── sprint-start.md +│ │ │ ├── sprint-status.md +│ │ │ ├── sprint-close.md +│ │ │ └── labels-sync.md +│ │ ├── agents/ +│ │ │ ├── planner.md +│ │ │ ├── orchestrator.md +│ │ │ └── executor.md +│ │ ├── skills/ +│ │ │ └── label-taxonomy/ +│ │ │ └── labels-reference.md +│ │ ├── README.md +│ │ └── CONFIGURATION.md +│ ├── projman-pmo/ # ← PMO PLUGIN +│ │ ├── .claude-plugin/ +│ │ │ └── plugin.json +│ │ ├── .mcp.json +│ │ ├── commands/ +│ │ ├── agents/ +│ │ │ └── pmo-coordinator.md +│ │ └── README.md +│ ├── cmdb-assistant/ # ← CMDB PLUGIN +│ │ ├── .claude-plugin/ +│ │ │ └── plugin.json +│ │ ├── .mcp.json # Points to ${CLAUDE_PLUGIN_ROOT}/mcp-servers/ +│ │ ├── mcp-servers/ # ← MCP servers BUNDLED IN plugin +│ │ │ └── netbox/ +│ │ │ ├── .venv/ +│ │ │ ├── requirements.txt +│ │ │ └── mcp_server/ +│ │ ├── commands/ +│ │ └── agents/ +│ └── project-hygiene/ # ← CLEANUP PLUGIN +│ └── ... +├── scripts/ # Setup and maintenance scripts +│ ├── setup.sh +│ └── post-update.sh +└── docs/ ``` ### Key Design Decisions -**Two MCP Servers (Shared Architecture):** -- **Gitea MCP**: Issues, labels, repository management -- **Wiki.js MCP**: Documentation, lessons learned, knowledge base -- Servers are **shared** between both plugins at repository root +**MCP Servers (Bundled in Plugins):** +- **Gitea MCP**: Issues, labels, repository management (bundled in projman) +- **Wiki.js MCP**: Documentation, lessons learned, knowledge base (bundled in projman) +- **NetBox MCP**: Infrastructure management (bundled in cmdb-assistant) +- Servers are **bundled inside each plugin** that needs them +- This ensures plugins work when cached by Claude Code - Mode detection based on environment variables (project vs company-wide) -- Benefits: Single source of truth, fix bugs once, professional architecture **Python Implementation:** - Python chosen over Node.js for MCP servers diff --git a/docs/CANONICAL-PATHS.md b/docs/CANONICAL-PATHS.md index c05e55b..9ee0b0f 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: 2025-12-12 +Last Updated: 2025-12-15 --- @@ -19,15 +19,23 @@ support-claude-mktplace/ │ ├── references/ # Reference specifications │ └── workflows/ # Workflow documentation ├── hooks/ # Shared hooks (if any) -├── mcp-servers/ # Shared MCP servers (AT ROOT) -│ ├── gitea/ -│ ├── wikijs/ -│ └── netbox/ -├── plugins/ # ALL plugins (INSIDE plugins/) +├── plugins/ # ALL plugins with bundled MCP servers │ ├── projman/ +│ │ ├── .claude-plugin/ +│ │ ├── mcp-servers/ # MCP servers bundled IN plugin +│ │ │ ├── gitea/ +│ │ │ └── wikijs/ +│ │ ├── commands/ +│ │ ├── agents/ +│ │ └── skills/ │ ├── projman-pmo/ │ ├── project-hygiene/ │ └── cmdb-assistant/ +│ ├── .claude-plugin/ +│ ├── mcp-servers/ # MCP servers bundled IN plugin +│ │ └── netbox/ +│ ├── commands/ +│ └── agents/ ├── scripts/ # Setup and maintenance scripts ├── CLAUDE.md ├── README.md @@ -50,19 +58,21 @@ support-claude-mktplace/ | Plugin agents | `plugins/{plugin-name}/agents/` | `plugins/projman/agents/` | | Plugin .mcp.json | `plugins/{plugin-name}/.mcp.json` | `plugins/projman/.mcp.json` | -### MCP Server Paths +### MCP Server Paths (Bundled in Plugins) + +MCP servers are now **bundled inside each plugin** to ensure they work when plugins are cached. | Context | Pattern | Example | |---------|---------|---------| -| MCP server location | `mcp-servers/{server-name}/` | `mcp-servers/gitea/` | -| MCP server code | `mcp-servers/{server-name}/mcp_server/` | `mcp-servers/gitea/mcp_server/` | -| MCP venv | `mcp-servers/{server-name}/.venv/` | `mcp-servers/gitea/.venv/` | +| MCP server location | `plugins/{plugin}/mcp-servers/{server}/` | `plugins/projman/mcp-servers/gitea/` | +| MCP server code | `plugins/{plugin}/mcp-servers/{server}/mcp_server/` | `plugins/projman/mcp-servers/gitea/mcp_server/` | +| MCP venv | `plugins/{plugin}/mcp-servers/{server}/.venv/` | `plugins/projman/mcp-servers/gitea/.venv/` | ### Relative Path Patterns (CRITICAL) | From | To | Pattern | |------|----|---------| -| Plugin .mcp.json | MCP server | `${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/{server}` | +| Plugin .mcp.json | Bundled MCP server | `${CLAUDE_PLUGIN_ROOT}/mcp-servers/{server}` | | marketplace.json | Plugin | `./plugins/{plugin-name}` | ### Documentation Paths @@ -92,16 +102,13 @@ support-claude-mktplace/ ### Relative Path Calculation -From `plugins/projman/.mcp.json` to `mcp-servers/gitea/`: +From `plugins/projman/.mcp.json` to bundled `mcp-servers/gitea/`: ``` plugins/projman/.mcp.json - ↑ go up to plugins/projman/ (../) - ↑ go up to plugins/ (../) - ↑ go up to root/ (../) - → go down to mcp-servers/gitea/ (mcp-servers/gitea/) + → MCP servers are IN the plugin at mcp-servers/ -Result: ../../mcp-servers/gitea/ -With variable: ${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/gitea/ +Result: mcp-servers/gitea/ +With variable: ${CLAUDE_PLUGIN_ROOT}/mcp-servers/gitea/ ``` From `.claude-plugin/marketplace.json` to `plugins/projman/`: @@ -120,9 +127,18 @@ Result: ./plugins/projman | Wrong | Why | Correct | |-------|-----|---------| | `projman/` at root | Plugins go in `plugins/` | `plugins/projman/` | -| `../mcp-servers/` from plugin | Missing one level | `../../mcp-servers/` | +| `mcp-servers/` at root | MCP servers are bundled in plugins | `plugins/{plugin}/mcp-servers/` | +| `../../mcp-servers/` from plugin | Old pattern, doesn't work with caching | `${CLAUDE_PLUGIN_ROOT}/mcp-servers/` | | `./../../../plugins/projman` in marketplace | Wrong (old nested structure) | `./plugins/projman` | -| Creating `docs/CORRECT-ARCHITECTURE.md` | This file replaces it | Use `docs/CANONICAL-PATHS.md` | + +--- + +## Architecture Note + +MCP servers are bundled inside each plugin (not shared at root) because: +- Claude Code caches only the plugin directory when installed +- Relative paths to parent directories break in the cache +- Each plugin must be self-contained to work properly --- @@ -130,4 +146,5 @@ Result: ./plugins/projman | Date | Change | By | |------|--------|-----| +| 2025-12-15 | Restructured: MCP servers now bundled in plugins | Claude Code | | 2025-12-12 | Initial creation | Claude Code | diff --git a/plugins/cmdb-assistant/.mcp.json b/plugins/cmdb-assistant/.mcp.json index 451a6e5..b049871 100644 --- a/plugins/cmdb-assistant/.mcp.json +++ b/plugins/cmdb-assistant/.mcp.json @@ -1,11 +1,11 @@ { "mcpServers": { "netbox": { - "command": "${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/netbox/.venv/bin/python", + "command": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/netbox/.venv/bin/python", "args": ["-m", "mcp_server.server"], - "cwd": "${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/netbox", + "cwd": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/netbox", "env": { - "PYTHONPATH": "${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/netbox" + "PYTHONPATH": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/netbox" } } } diff --git a/mcp-servers/netbox/README.md b/plugins/cmdb-assistant/mcp-servers/netbox/README.md similarity index 100% rename from mcp-servers/netbox/README.md rename to plugins/cmdb-assistant/mcp-servers/netbox/README.md diff --git a/mcp-servers/netbox/mcp_server/__init__.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/__init__.py similarity index 100% rename from mcp-servers/netbox/mcp_server/__init__.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/__init__.py diff --git a/mcp-servers/netbox/mcp_server/config.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/config.py similarity index 100% rename from mcp-servers/netbox/mcp_server/config.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/config.py diff --git a/mcp-servers/netbox/mcp_server/netbox_client.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/netbox_client.py similarity index 100% rename from mcp-servers/netbox/mcp_server/netbox_client.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/netbox_client.py diff --git a/mcp-servers/netbox/mcp_server/server.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/server.py similarity index 100% rename from mcp-servers/netbox/mcp_server/server.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/server.py diff --git a/mcp-servers/netbox/mcp_server/tools/__init__.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/__init__.py similarity index 100% rename from mcp-servers/netbox/mcp_server/tools/__init__.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/__init__.py diff --git a/mcp-servers/netbox/mcp_server/tools/circuits.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/circuits.py similarity index 100% rename from mcp-servers/netbox/mcp_server/tools/circuits.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/circuits.py diff --git a/mcp-servers/netbox/mcp_server/tools/dcim.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/dcim.py similarity index 100% rename from mcp-servers/netbox/mcp_server/tools/dcim.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/dcim.py diff --git a/mcp-servers/netbox/mcp_server/tools/extras.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/extras.py similarity index 100% rename from mcp-servers/netbox/mcp_server/tools/extras.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/extras.py diff --git a/mcp-servers/netbox/mcp_server/tools/ipam.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/ipam.py similarity index 100% rename from mcp-servers/netbox/mcp_server/tools/ipam.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/ipam.py diff --git a/mcp-servers/netbox/mcp_server/tools/tenancy.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/tenancy.py similarity index 100% rename from mcp-servers/netbox/mcp_server/tools/tenancy.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/tenancy.py diff --git a/mcp-servers/netbox/mcp_server/tools/virtualization.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/virtualization.py similarity index 100% rename from mcp-servers/netbox/mcp_server/tools/virtualization.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/virtualization.py diff --git a/mcp-servers/netbox/mcp_server/tools/vpn.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/vpn.py similarity index 100% rename from mcp-servers/netbox/mcp_server/tools/vpn.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/vpn.py diff --git a/mcp-servers/netbox/mcp_server/tools/wireless.py b/plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/wireless.py similarity index 100% rename from mcp-servers/netbox/mcp_server/tools/wireless.py rename to plugins/cmdb-assistant/mcp-servers/netbox/mcp_server/tools/wireless.py diff --git a/mcp-servers/netbox/requirements.txt b/plugins/cmdb-assistant/mcp-servers/netbox/requirements.txt similarity index 100% rename from mcp-servers/netbox/requirements.txt rename to plugins/cmdb-assistant/mcp-servers/netbox/requirements.txt diff --git a/mcp-servers/netbox/tests/__init__.py b/plugins/cmdb-assistant/mcp-servers/netbox/tests/__init__.py similarity index 100% rename from mcp-servers/netbox/tests/__init__.py rename to plugins/cmdb-assistant/mcp-servers/netbox/tests/__init__.py diff --git a/plugins/projman/.mcp.json b/plugins/projman/.mcp.json index 5795267..bd6c317 100644 --- a/plugins/projman/.mcp.json +++ b/plugins/projman/.mcp.json @@ -1,19 +1,19 @@ { "mcpServers": { "gitea": { - "command": "${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/gitea/.venv/bin/python", + "command": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/gitea/.venv/bin/python", "args": ["-m", "mcp_server.server"], - "cwd": "${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/gitea", + "cwd": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/gitea", "env": { - "PYTHONPATH": "${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/gitea" + "PYTHONPATH": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/gitea" } }, "wikijs": { - "command": "${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/wikijs/.venv/bin/python", + "command": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/wikijs/.venv/bin/python", "args": ["-m", "mcp_server.server"], - "cwd": "${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/wikijs", + "cwd": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/wikijs", "env": { - "PYTHONPATH": "${CLAUDE_PLUGIN_ROOT}/../../mcp-servers/wikijs" + "PYTHONPATH": "${CLAUDE_PLUGIN_ROOT}/mcp-servers/wikijs" } } } diff --git a/mcp-servers/gitea/README.md b/plugins/projman/mcp-servers/gitea/README.md similarity index 100% rename from mcp-servers/gitea/README.md rename to plugins/projman/mcp-servers/gitea/README.md diff --git a/mcp-servers/gitea/TESTING.md b/plugins/projman/mcp-servers/gitea/TESTING.md similarity index 100% rename from mcp-servers/gitea/TESTING.md rename to plugins/projman/mcp-servers/gitea/TESTING.md diff --git a/mcp-servers/gitea/mcp_server/__init__.py b/plugins/projman/mcp-servers/gitea/mcp_server/__init__.py similarity index 100% rename from mcp-servers/gitea/mcp_server/__init__.py rename to plugins/projman/mcp-servers/gitea/mcp_server/__init__.py diff --git a/mcp-servers/gitea/mcp_server/config.py b/plugins/projman/mcp-servers/gitea/mcp_server/config.py similarity index 100% rename from mcp-servers/gitea/mcp_server/config.py rename to plugins/projman/mcp-servers/gitea/mcp_server/config.py diff --git a/mcp-servers/gitea/mcp_server/gitea_client.py b/plugins/projman/mcp-servers/gitea/mcp_server/gitea_client.py similarity index 100% rename from mcp-servers/gitea/mcp_server/gitea_client.py rename to plugins/projman/mcp-servers/gitea/mcp_server/gitea_client.py diff --git a/mcp-servers/gitea/mcp_server/server.py b/plugins/projman/mcp-servers/gitea/mcp_server/server.py similarity index 100% rename from mcp-servers/gitea/mcp_server/server.py rename to plugins/projman/mcp-servers/gitea/mcp_server/server.py diff --git a/mcp-servers/gitea/mcp_server/tools/__init__.py b/plugins/projman/mcp-servers/gitea/mcp_server/tools/__init__.py similarity index 100% rename from mcp-servers/gitea/mcp_server/tools/__init__.py rename to plugins/projman/mcp-servers/gitea/mcp_server/tools/__init__.py diff --git a/mcp-servers/gitea/mcp_server/tools/issues.py b/plugins/projman/mcp-servers/gitea/mcp_server/tools/issues.py similarity index 100% rename from mcp-servers/gitea/mcp_server/tools/issues.py rename to plugins/projman/mcp-servers/gitea/mcp_server/tools/issues.py diff --git a/mcp-servers/gitea/mcp_server/tools/labels.py b/plugins/projman/mcp-servers/gitea/mcp_server/tools/labels.py similarity index 100% rename from mcp-servers/gitea/mcp_server/tools/labels.py rename to plugins/projman/mcp-servers/gitea/mcp_server/tools/labels.py diff --git a/mcp-servers/gitea/requirements.txt b/plugins/projman/mcp-servers/gitea/requirements.txt similarity index 100% rename from mcp-servers/gitea/requirements.txt rename to plugins/projman/mcp-servers/gitea/requirements.txt diff --git a/mcp-servers/gitea/tests/__init__.py b/plugins/projman/mcp-servers/gitea/tests/__init__.py similarity index 100% rename from mcp-servers/gitea/tests/__init__.py rename to plugins/projman/mcp-servers/gitea/tests/__init__.py diff --git a/mcp-servers/gitea/tests/test_config.py b/plugins/projman/mcp-servers/gitea/tests/test_config.py similarity index 100% rename from mcp-servers/gitea/tests/test_config.py rename to plugins/projman/mcp-servers/gitea/tests/test_config.py diff --git a/mcp-servers/gitea/tests/test_gitea_client.py b/plugins/projman/mcp-servers/gitea/tests/test_gitea_client.py similarity index 100% rename from mcp-servers/gitea/tests/test_gitea_client.py rename to plugins/projman/mcp-servers/gitea/tests/test_gitea_client.py diff --git a/mcp-servers/gitea/tests/test_issues.py b/plugins/projman/mcp-servers/gitea/tests/test_issues.py similarity index 100% rename from mcp-servers/gitea/tests/test_issues.py rename to plugins/projman/mcp-servers/gitea/tests/test_issues.py diff --git a/mcp-servers/gitea/tests/test_labels.py b/plugins/projman/mcp-servers/gitea/tests/test_labels.py similarity index 100% rename from mcp-servers/gitea/tests/test_labels.py rename to plugins/projman/mcp-servers/gitea/tests/test_labels.py diff --git a/mcp-servers/wikijs/README.md b/plugins/projman/mcp-servers/wikijs/README.md similarity index 100% rename from mcp-servers/wikijs/README.md rename to plugins/projman/mcp-servers/wikijs/README.md diff --git a/mcp-servers/wikijs/TESTING.md b/plugins/projman/mcp-servers/wikijs/TESTING.md similarity index 100% rename from mcp-servers/wikijs/TESTING.md rename to plugins/projman/mcp-servers/wikijs/TESTING.md diff --git a/mcp-servers/wikijs/mcp_server/__init__.py b/plugins/projman/mcp-servers/wikijs/mcp_server/__init__.py similarity index 100% rename from mcp-servers/wikijs/mcp_server/__init__.py rename to plugins/projman/mcp-servers/wikijs/mcp_server/__init__.py diff --git a/mcp-servers/wikijs/mcp_server/config.py b/plugins/projman/mcp-servers/wikijs/mcp_server/config.py similarity index 100% rename from mcp-servers/wikijs/mcp_server/config.py rename to plugins/projman/mcp-servers/wikijs/mcp_server/config.py diff --git a/mcp-servers/wikijs/mcp_server/server.py b/plugins/projman/mcp-servers/wikijs/mcp_server/server.py similarity index 100% rename from mcp-servers/wikijs/mcp_server/server.py rename to plugins/projman/mcp-servers/wikijs/mcp_server/server.py diff --git a/mcp-servers/wikijs/mcp_server/tools/__init__.py b/plugins/projman/mcp-servers/wikijs/mcp_server/tools/__init__.py similarity index 100% rename from mcp-servers/wikijs/mcp_server/tools/__init__.py rename to plugins/projman/mcp-servers/wikijs/mcp_server/tools/__init__.py diff --git a/mcp-servers/wikijs/mcp_server/tools/lessons_learned.py b/plugins/projman/mcp-servers/wikijs/mcp_server/tools/lessons_learned.py similarity index 100% rename from mcp-servers/wikijs/mcp_server/tools/lessons_learned.py rename to plugins/projman/mcp-servers/wikijs/mcp_server/tools/lessons_learned.py diff --git a/mcp-servers/wikijs/mcp_server/tools/pages.py b/plugins/projman/mcp-servers/wikijs/mcp_server/tools/pages.py similarity index 100% rename from mcp-servers/wikijs/mcp_server/tools/pages.py rename to plugins/projman/mcp-servers/wikijs/mcp_server/tools/pages.py diff --git a/mcp-servers/wikijs/mcp_server/wikijs_client.py b/plugins/projman/mcp-servers/wikijs/mcp_server/wikijs_client.py similarity index 100% rename from mcp-servers/wikijs/mcp_server/wikijs_client.py rename to plugins/projman/mcp-servers/wikijs/mcp_server/wikijs_client.py diff --git a/mcp-servers/wikijs/requirements.txt b/plugins/projman/mcp-servers/wikijs/requirements.txt similarity index 100% rename from mcp-servers/wikijs/requirements.txt rename to plugins/projman/mcp-servers/wikijs/requirements.txt diff --git a/mcp-servers/wikijs/test_integration.py b/plugins/projman/mcp-servers/wikijs/test_integration.py similarity index 100% rename from mcp-servers/wikijs/test_integration.py rename to plugins/projman/mcp-servers/wikijs/test_integration.py diff --git a/mcp-servers/wikijs/tests/__init__.py b/plugins/projman/mcp-servers/wikijs/tests/__init__.py similarity index 100% rename from mcp-servers/wikijs/tests/__init__.py rename to plugins/projman/mcp-servers/wikijs/tests/__init__.py diff --git a/mcp-servers/wikijs/tests/test_config.py b/plugins/projman/mcp-servers/wikijs/tests/test_config.py similarity index 100% rename from mcp-servers/wikijs/tests/test_config.py rename to plugins/projman/mcp-servers/wikijs/tests/test_config.py diff --git a/mcp-servers/wikijs/tests/test_wikijs_client.py b/plugins/projman/mcp-servers/wikijs/tests/test_wikijs_client.py similarity index 100% rename from mcp-servers/wikijs/tests/test_wikijs_client.py rename to plugins/projman/mcp-servers/wikijs/tests/test_wikijs_client.py diff --git a/scripts/setup.sh b/scripts/setup.sh index ab47ca0..2ef84b5 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -5,12 +5,12 @@ # Usage: ./scripts/setup.sh # # This script: -# 1. Creates Python virtual environments for MCP servers +# 1. Creates Python virtual environments for MCP servers (inside each plugin) # 2. Installs dependencies # 3. Creates config file templates (if missing) # 4. Validates existing configuration # 5. Checks/creates Wiki.js directory structure -# 6. Syncs Gitea labels (creates/updates, respects custom labels) +# 6. Validates label reference file # 7. Reports remaining manual steps # @@ -40,11 +40,13 @@ log_error() { echo -e "${RED}[ERROR]${NC} $1"; FAILED+=("$1"); } log_todo() { echo -e "${YELLOW}[TODO]${NC} $1"; MANUAL_TODO+=("$1"); } # --- Section 1: Python Environments --- -setup_python_env() { - local server_name="$1" - local server_path="$REPO_ROOT/mcp-servers/$server_name" +# MCP servers are now inside each plugin +setup_plugin_mcp() { + local plugin_name="$1" + local server_name="$2" + local server_path="$REPO_ROOT/plugins/$plugin_name/mcp-servers/$server_name" - log_info "Setting up $server_name MCP server..." + log_info "Setting up $server_name MCP server (plugin: $plugin_name)..." if [[ ! -d "$server_path" ]]; then log_error "$server_name directory not found at $server_path" @@ -55,10 +57,10 @@ setup_python_env() { # Check if venv exists if [[ -d ".venv" ]]; then - log_skip "$server_name venv already exists" + log_skip "$plugin_name/$server_name venv already exists" else python3 -m venv .venv - log_success "$server_name venv created" + log_success "$plugin_name/$server_name venv created" fi # Install/update dependencies @@ -67,9 +69,9 @@ setup_python_env() { pip install -q --upgrade pip pip install -q -r requirements.txt deactivate - log_success "$server_name dependencies installed" + log_success "$plugin_name/$server_name dependencies installed" else - log_error "$server_name requirements.txt not found" + log_error "$plugin_name/$server_name requirements.txt not found" fi cd "$REPO_ROOT" @@ -117,6 +119,22 @@ EOF log_success "wikijs.env template created" log_todo "Edit ~/.config/claude/wikijs.env with your Wiki.js credentials" fi + + # NetBox config + if [[ -f "$config_dir/netbox.env" ]]; then + log_skip "netbox.env already exists" + else + cat > "$config_dir/netbox.env" << 'EOF' +# NetBox API Configuration +# Update these values with your NetBox instance details + +NETBOX_API_URL=https://netbox.example.com/api +NETBOX_API_TOKEN=your_netbox_token_here +EOF + chmod 600 "$config_dir/netbox.env" + log_success "netbox.env template created" + log_todo "Edit ~/.config/claude/netbox.env with your NetBox credentials" + fi } # --- Section 3: Validate Configuration --- @@ -128,7 +146,7 @@ validate_config() { # Check Gitea config has real values if [[ -f "$config_dir/gitea.env" ]]; then source "$config_dir/gitea.env" - if [[ "$GITEA_API_TOKEN" == "your_gitea_token_here" ]] || [[ -z "$GITEA_API_TOKEN" ]]; then + if [[ "${GITEA_API_TOKEN:-}" == "your_gitea_token_here" ]] || [[ -z "${GITEA_API_TOKEN:-}" ]]; then log_todo "Update GITEA_API_TOKEN in ~/.config/claude/gitea.env" else log_success "Gitea configuration appears valid" @@ -138,12 +156,22 @@ validate_config() { # Check Wiki.js config has real values if [[ -f "$config_dir/wikijs.env" ]]; then source "$config_dir/wikijs.env" - if [[ "$WIKIJS_API_TOKEN" == "your_wikijs_jwt_token_here" ]] || [[ -z "$WIKIJS_API_TOKEN" ]]; then + if [[ "${WIKIJS_API_TOKEN:-}" == "your_wikijs_jwt_token_here" ]] || [[ -z "${WIKIJS_API_TOKEN:-}" ]]; then log_todo "Update WIKIJS_API_TOKEN in ~/.config/claude/wikijs.env" else log_success "Wiki.js configuration appears valid" fi fi + + # Check NetBox config has real values + if [[ -f "$config_dir/netbox.env" ]]; then + source "$config_dir/netbox.env" + if [[ "${NETBOX_API_TOKEN:-}" == "your_netbox_token_here" ]] || [[ -z "${NETBOX_API_TOKEN:-}" ]]; then + log_todo "Update NETBOX_API_TOKEN in ~/.config/claude/netbox.env" + else + log_success "NetBox configuration appears valid" + fi + fi } # --- Section 4: Wiki.js Directory Structure --- @@ -156,7 +184,7 @@ setup_wikijs_structure() { local config_dir="$HOME/.config/claude" if [[ -f "$config_dir/wikijs.env" ]]; then source "$config_dir/wikijs.env" - if [[ "$WIKIJS_API_TOKEN" != "your_wikijs_jwt_token_here" ]] && [[ -n "$WIKIJS_API_TOKEN" ]]; then + if [[ "${WIKIJS_API_TOKEN:-}" != "your_wikijs_jwt_token_here" ]] && [[ -n "${WIKIJS_API_TOKEN:-}" ]]; then log_info "Wiki.js credentials found - directory structure can be verified after first use" log_success "Wiki.js setup deferred to first use" else @@ -238,9 +266,12 @@ main() { echo "==============================================" echo "" - # Python environments - setup_python_env "gitea" - setup_python_env "wikijs" + # Python environments for projman plugin + setup_plugin_mcp "projman" "gitea" + setup_plugin_mcp "projman" "wikijs" + + # Python environment for cmdb-assistant plugin + setup_plugin_mcp "cmdb-assistant" "netbox" # Configuration setup_config_templates