- New skill: visual-output.md defines all header, progress, and verdict formats
- All 4 agent files now reference the skill instead of inline templates
- Phase Registry table maps agents to their emoji and phase name
- Single source of truth for visual branding changes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- design-gate.md and data-gate.md declare gate_contract: v1
- domain-consultation.md Gate Command Reference includes Contract column
- validate_workflow_integration now checks contract version compatibility
- Tests added for match, mismatch, and missing contract scenarios
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Created unified /rfc command with create|list|review|approve|reject sub-commands
- Deleted 5 individual rfc-*.md command files
- Moved /clear-cache into /setup --clear-cache
- Updated all cross-references in skills, docs, and integration files
- Command count: 17 -> 12 (net -5)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Domain Advisory Pattern Hardening - patch release to close gaps from v5.6.0/v5.7.0:
## Added
- New `validate_workflow_integration` MCP tool validates domain plugins expose
required advisory interfaces (gate command, review command, advisory agent)
- New `MISSING_INTEGRATION` issue type for workflow integration validation
- New `WorkflowIntegrationResult` Pydantic model for structured validation output
- `integrates_with` field on viz-platform and data-platform in marketplace.json
declaring projman integration metadata
- 4 new test cases for workflow integration validation
## Fixed
- scripts/setup.sh banner version updated from v5.1.0 to v5.7.1
## Documentation
- Updated mcp-tools-reference.md with new tool
- Updated validation-rules.md with Workflow Integration Checks section
- Added /design-gate, /design-review, /data-gate, /data-review to COMMANDS-CHEATSHEET
- Added contract-validator to CONFIGURATION.md plugin table
- Updated README.md Contract Validator tools table
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement wiki-based Request for Comments system for capturing,
reviewing, and tracking feature ideas through their lifecycle.
New commands:
- /rfc-create: Create RFC from conversation or clarified spec
- /rfc-list: List RFCs grouped by status
- /rfc-review: Submit Draft RFC for review
- /rfc-approve: Approve RFC for sprint planning
- /rfc-reject: Reject RFC with documented reason
RFC lifecycle: Draft → Review → Approved → Implementing → Implemented
Integration:
- /sprint-plan detects approved RFCs and offers selection
- /sprint-close updates RFC status on completion
- clarity-assist suggests /rfc-create for feature ideas
New MCP tool: allocate_rfc_number
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
MCP library validates schema BEFORE call_tool handler runs, so
our _coerce_types function never gets a chance to convert strings.
Changed all integer fields to accept both types:
- issue_number, milestone_id, pr_number, depends_on, milestone, limit, position
This fixes: "Input validation error: '312' is not of type 'integer'"
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
All MCP server run.sh scripts now capture the original working
directory as CLAUDE_PROJECT_DIR before changing to the script
directory. This fixes the branch detection issue where MCP tools
detected the plugin repo's branch instead of the user's project branch.
This is a follow-up fix to #231 - the original fix relied on
CLAUDE_PROJECT_DIR being set by Claude Code, but it isn't.
Now we capture it ourselves from PWD at startup time.
Closes#231 (proper fix)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The _get_current_branch() method was running git commands from the
installed plugin directory instead of the user's project directory.
This caused incorrect branch detection (always seeing 'main' from
the marketplace repo instead of the user's actual branch).
Fix: Use CLAUDE_PROJECT_DIR environment variable to get the correct
project directory and pass it as cwd to subprocess.run().
Fixes#231
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The branch permission check was only allowing feat/, feature/, and dev/
prefixes for write operations. This blocked PR creation from fix/*
branches, forcing fallback to direct API calls.
Added patterns:
- fix/, bugfix/, hotfix/ - for bug fixes
- chore/, refactor/ - for maintenance
- docs/, test/ - for documentation and tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace direct python path in .mcp.json with run.sh wrapper scripts
that automatically locate the venv in cache or local directory.
Problem: .venv symlinks are gitignored, causing them to be wiped on
every git operation. The SessionStart hook should recreate them but
this was unreliable, leading to repeated MCP server failures.
Solution: run.sh scripts that:
- First check ~/.cache/claude-mcp-venvs/leo-claude-mktplace/{server}/.venv
- Fallback to local .venv if exists
- Exit with helpful error if neither found
This eliminates dependency on symlinks entirely - the scripts are
tracked in git and will always be present after clone/pull/update.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add missing create_pull_request tool to Gitea MCP server. This completes
the PR lifecycle - previously only had list/get/review/comment tools.
- Add create_pull_request to GiteaClient
- Add async wrapper to PullRequestTools with branch permissions
- Register tool in server.py with proper schema
- Parameters: title, body, head, base, labels (optional)
- Branch-aware security: only allowed on development/feature branches
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The filter tool was adding an __index_level_0__ column to results
because pandas query() preserves the original index, which gets
converted to a column when storing the DataFrame.
Added .reset_index(drop=True) after query() to drop the preserved
index and create a clean sequential index.
Fixes#203
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add 34 tests across 3 test modules:
- test_parse_tools.py: 11 tests for README/CLAUDE.md parsing
- test_validation_tools.py: 11 tests for compatibility and agent validation
- test_report_tools.py: 12 tests for report generation and filtering
Coverage: parse_tools 79%, validation_tools 96%, report_tools 89%
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add report generation and issue listing tools:
- generate_compatibility_report: Full marketplace validation with
markdown or JSON output, includes summary statistics
- list_issues: Filtered issue listing by severity and type
The report tools coordinate parse_tools and validation_tools to
scan all plugins in a marketplace, run pairwise compatibility
checks, and aggregate findings into comprehensive reports.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add chart_create tool: create line, bar, scatter, pie, heatmap, histogram, area charts
- Add chart_configure_interaction tool: hover templates, click data, selection, zoom
- Support theme color integration when theme is active
- Default color palette based on Mantine theme
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add list_components tool: list DMC components by category
- Add get_component_props tool: get props schema with types/defaults/enums
- Add validate_component tool: validate props with error/warning messages
- Includes typo detection and common mistake warnings
- All tools registered in MCP server with proper JSON schemas
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add component_registry.py with version-locked registry loading
- Create dmc_2_5.json with 39 components for DMC 2.5.1/Mantine 7
- Add generate-dmc-registry.py script for future registry generation
- Update dependencies to DMC >=2.0.0 (installs 2.5.1)
- Includes prop validation with typo detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add viz-platform MCP server structure at mcp-servers/viz-platform/:
- mcp_server/server.py: Main MCP server entry point with async initialization
- mcp_server/config.py: Hybrid config loader with DMC version detection
- mcp_server/dmc_tools.py: Placeholder for DMC validation tools
- pyproject.toml and requirements.txt for dependencies
- tests/ directory structure
Server starts without errors with empty tool list.
Config detects DMC installation status via importlib.metadata.
Closes#170
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fixes#160: update_wiki_page was renaming pages to "unnamed"
Root causes:
1. page_name wasn't URL-encoded, breaking pages with special chars like ':'
2. PATCH request was missing 'title' field, causing Gitea to use default name
Changes:
- Add URL encoding (urllib.parse.quote) to get_wiki_page, update_wiki_page, delete_wiki_page
- Add 'title': page_name to update_wiki_page payload to preserve page name
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Expand parameter schemas for 15 update tools that previously only exposed
the 'id' field. The underlying Python implementation already supported
all fields via **kwargs, but Claude couldn't discover available parameters.
Updated tools:
- virtualization: update_virtual_machine, update_cluster
- dcim: update_site, update_location, update_rack, update_manufacturer,
update_device_type, update_device_role, update_platform,
update_interface, update_cable
- ipam: update_vrf, update_prefix, update_ip_address, update_vlan
Each tool now exposes all commonly-used optional fields matching the
NetBox API, following the pattern established by dcim_update_device.
Fixes#137
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Claude API has a 64-character limit on tool names. Claude Code uses a
36-character prefix (mcp__plugin_cmdb-assistant_netbox__), leaving only
28 characters for the actual tool name.
Shortened 33 tools that exceeded this limit:
- virtualization_* -> virt_* (19 tools)
- circuits_*_circuit_type* -> circ_*_type* (3 tools)
- circuits_*_circuit_termination* -> circ_*_termination* (3 tools)
- wireless_*_wireless_* -> wlan_* (8 tools)
Added TOOL_NAME_MAP to route shortened names to original method names.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fixes multiple issues from diagnostic #123:
1. create_label_smart type safety (labels.py)
- Add isinstance(result, dict) checks after API calls
- Return structured error dict if API returns unexpected type
- Prevents "list indices must be integers" crash
2. debug-report always uses curl with labels
- Remove MCP option - always use curl for marketplace issues
- Add label ID fetching step (Source/Diagnostic, Type/Bug)
- Include labels in curl POST payload
- Avoids branch protection restrictions on main branch
Fixes#123
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When NetBox MCP tools fail with JSON decode errors, the error message
now includes:
- HTTP status code
- Response content length
- Preview of actual content received (first 200 bytes)
This helps diagnose transient issues like network timeouts or
incomplete responses that result in cryptic "Expecting value" errors.
Fixes#120
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Expose additional parameters in dcim_create_device and dcim_update_device
MCP tools that were already supported by the backend but not exposed:
dcim_create_device:
- platform, primary_ip4, primary_ip6, asset_tag, description, comments
dcim_update_device:
- platform, primary_ip4, primary_ip6, serial, asset_tag, site, rack,
position, description, comments
This enables setting the platform (OS) and primary IP address when
creating or updating devices in NetBox.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
create_label_smart now checks if label already exists before creating.
- Checks both org and repo labels
- Handles format variations (Type/Bug vs Type: Bug)
- Returns {skipped: true} if label already exists
- Prevents duplicate label creation errors
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The suggest_labels tool accepted a repo parameter in the implementation
but didn't expose it in the MCP tool schema, causing it to always rely
on auto-detection which failed in some contexts.
Fixes#94
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The suggest_labels function now dynamically detects the label naming convention
used in the repository (slash format like Type/Bug or colon-space format like
Type: Bug) instead of hardcoding slash format.
Changes:
- Added _build_label_lookup() to parse and normalize label formats
- Added _find_label() to find actual labels from the lookup
- Updated suggest_labels() to accept optional repo parameter
- Labels are fetched first, then suggestions match actual names
- Supports Efforts/Effort normalization (handles singular/plural)
Fixes issue #73 sub-issue 3: label format mismatch
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The MCP server runs with cwd set to the plugin directory, not the
user's project directory. This caused git remote auto-detection to
fail because it was looking at the wrong directory.
Changes:
- Added _find_project_directory() method with multiple strategies:
1. CLAUDE_PROJECT_DIR environment variable
2. PWD environment variable (if it has .git or .env)
3. Current working directory (if it has .git or .env)
- Updated _detect_repo_from_git() to accept project_dir parameter
- Added 3 new tests for project directory detection
Fixes#70
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1. Repo Auto-Detection (config.py):
- Added _detect_repo_from_git() to parse git remote URL
- Supports SSH, SSH short, HTTPS, HTTP URL formats
- Falls back to git remote when GITEA_REPO not set
2. Organization Validation (gitea_client.py):
- Changed is_org_repo() to use /orgs/{owner} endpoint
- Added _is_organization() method for reliable org detection
- Fixes issue where owner.type was null in Gitea API
3. Tests:
- Added 6 tests for git URL parsing
- Added 3 tests for org detection
Fixes#64
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The get_labels tool was failing with 404 for user-owned repositories
because it always queried /api/v1/orgs/{owner}/labels, which only
works for organizations.
Changes:
- labels.py: Check is_org_repo() before fetching org labels
- gitea_client.py: Same fix in _resolve_label_ids()
- test_labels.py: Added tests for both org and user-owned repos
Fixes#61
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update all references from old names to new marketplace identity:
- support-claude-mktplace → leo-claude-mktplace (URLs)
- lm-claude-plugins → leo-claude-mktplace (repo name)
- Claude Code Marketplace → Leo Claude Marketplace (display name)
Files updated:
- Core docs (CLAUDE.md, README.md, CHANGELOG.md)
- Documentation (CANONICAL-PATHS, CONFIGURATION, UPDATING, COMMANDS-CHEATSHEET)
- Marketplace manifest and all 9 plugin.json files
- Plugin READMEs and MCP server READMEs
- Setup script and label taxonomy reference
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Claude Code only caches the plugin directory when installed from a
marketplace, not parent directories. This broke the shared mcp-servers/
architecture because relative paths like ../../mcp-servers/ resolved
to non-existent locations in the cache.
Changes:
- Move gitea and wikijs MCP servers into plugins/projman/mcp-servers/
- Move netbox MCP server into plugins/cmdb-assistant/mcp-servers/
- Update .mcp.json files to use ${CLAUDE_PLUGIN_ROOT}/mcp-servers/
- Update setup.sh to handle new bundled structure
- Add netbox.env config template to setup.sh
- Update CLAUDE.md and CANONICAL-PATHS.md documentation
This ensures plugins work correctly when installed and cached.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove separate GITEA_OWNER config, use owner/repo format everywhere
- Add _parse_repo() helper to extract owner and repo from combined string
- Update plugin.json schema: file -> source, author as object
- Remove redundant configuration section from cmdb-assistant plugin
- Simplify gitea_client.py by removing excessive docstrings
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>