diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index fa727f7..1e643d9 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -6,7 +6,7 @@ }, "metadata": { "description": "Project management plugins with Gitea and NetBox integrations", - "version": "5.0.0" + "version": "5.1.0" }, "plugins": [ { @@ -75,8 +75,8 @@ }, { "name": "cmdb-assistant", - "version": "1.0.0", - "description": "NetBox CMDB integration for infrastructure management", + "version": "1.1.0", + "description": "NetBox CMDB integration with data quality validation and machine registration", "source": "./plugins/cmdb-assistant", "author": { "name": "Leo Miranda", @@ -86,7 +86,7 @@ "repository": "https://gitea.hotserv.cloud/personal-projects/leo-claude-mktplace.git", "mcpServers": ["./.mcp.json"], "category": "infrastructure", - "tags": ["cmdb", "netbox", "dcim", "ipam"], + "tags": ["cmdb", "netbox", "dcim", "ipam", "data-quality", "validation"], "license": "MIT" }, { diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b7a3b0..f2685e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,45 @@ 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/). +## [Unreleased] + +### Added + +#### cmdb-assistant v1.1.0 - Data Quality Validation +- **SessionStart Hook**: Tests NetBox API connectivity at session start + - Warns if VMs exist without site assignment + - Warns if devices exist without platform + - Non-blocking: displays warning, doesn't prevent work +- **PreToolUse Hook**: Validates input parameters before VM/device operations + - Warns about missing site, tenant, platform + - Non-blocking: suggests best practices without blocking +- **`/cmdb-audit` Command**: Comprehensive data quality analysis + - Scopes: all, vms, devices, naming, roles + - Identifies Critical/High/Medium/Low issues + - Provides prioritized remediation recommendations +- **`/cmdb-register` Command**: Register current machine into NetBox + - Discovers system info: hostname, platform, hardware, network interfaces + - Discovers running apps: Docker containers, systemd services + - Creates device with interfaces, IPs, and sets primary IP + - Creates cluster and VMs for Docker containers +- **`/cmdb-sync` Command**: Sync machine state with NetBox + - Compares current state with NetBox record + - Shows diff of changes (interfaces, IPs, containers) + - Updates with user confirmation + - Supports --full and --dry-run flags +- **NetBox Best Practices Skill**: Reference documentation + - Dependency order for object creation + - Naming conventions (`{role}-{site}-{number}`, `{env}-{app}-{number}`) + - Role consolidation guidance + - Site/tenant/platform assignment requirements +- **Agent Enhancement**: Updated cmdb-assistant agent with validation requirements + - Proactive suggestions for missing fields + - Naming convention checks + - Dependency order enforcement + - Duplicate prevention + +--- + ## [5.0.0] - 2026-01-26 ### Added diff --git a/README.md b/README.md index 77a260b..5142d10 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Leo Claude Marketplace - v5.0.0 +# Leo Claude Marketplace - v5.1.0 A collection of Claude Code plugins for project management, infrastructure automation, and development workflows. diff --git a/plugins/cmdb-assistant/.claude-plugin/plugin.json b/plugins/cmdb-assistant/.claude-plugin/plugin.json index 2b3c1e1..4105491 100644 --- a/plugins/cmdb-assistant/.claude-plugin/plugin.json +++ b/plugins/cmdb-assistant/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "cmdb-assistant", - "version": "1.0.0", - "description": "NetBox CMDB integration for infrastructure management - query, create, update, and manage network devices, IP addresses, sites, and more", + "version": "1.1.0", + "description": "NetBox CMDB integration with data quality validation - query, create, update, and manage network devices, IP addresses, sites, and more with best practices enforcement", "author": { "name": "Leo Miranda", "email": "leobmiranda@gmail.com" @@ -15,7 +15,9 @@ "infrastructure", "network", "ipam", - "dcim" + "dcim", + "data-quality", + "validation" ], "commands": ["./commands/"], "mcpServers": ["./.mcp.json"] diff --git a/plugins/cmdb-assistant/README.md b/plugins/cmdb-assistant/README.md index 394e587..ea05bb5 100644 --- a/plugins/cmdb-assistant/README.md +++ b/plugins/cmdb-assistant/README.md @@ -2,6 +2,14 @@ A Claude Code plugin for NetBox CMDB integration - query, create, update, and manage your network infrastructure directly from Claude Code. +## What's New in v1.1.0 + +- **Data Quality Validation**: Hooks for SessionStart and PreToolUse that check data quality and warn about missing fields +- **Best Practices Skill**: Reference documentation for NetBox patterns (naming conventions, dependency order, role management) +- **`/cmdb-audit`**: Analyze data quality across VMs, devices, naming conventions, and roles +- **`/cmdb-register`**: Register the current machine into NetBox with all running applications (Docker containers, systemd services) +- **`/cmdb-sync`**: Synchronize existing machine state with NetBox (detect drift, update with confirmation) + ## Features - **Full CRUD Operations**: Create, read, update, and delete across all NetBox modules @@ -9,6 +17,9 @@ A Claude Code plugin for NetBox CMDB integration - query, create, update, and ma - **IP Management**: Allocate IPs, manage prefixes, track VLANs - **Infrastructure Documentation**: Document servers, network devices, and connections - **Audit Trail**: Review changes and maintain infrastructure history +- **Data Quality Validation**: Proactive checks for missing site, tenant, platform assignments +- **Machine Registration**: Auto-discover and register servers with running applications +- **Drift Detection**: Sync machine state and detect changes over time ## Installation @@ -40,10 +51,14 @@ Add to your Claude Code plugins or marketplace configuration. | Command | Description | |---------|-------------| +| `/initial-setup` | Interactive setup wizard for NetBox MCP server | | `/cmdb-search ` | Search for devices, IPs, sites, or any CMDB object | | `/cmdb-device ` | Manage network devices (list, create, update, delete) | | `/cmdb-ip ` | Manage IP addresses and prefixes | | `/cmdb-site ` | Manage sites and locations | +| `/cmdb-audit [scope]` | Data quality analysis (all, vms, devices, naming, roles) | +| `/cmdb-register` | Register current machine into NetBox with running apps | +| `/cmdb-sync` | Sync machine state with NetBox (detect drift, update) | ## Agent @@ -103,6 +118,15 @@ This plugin provides access to the full NetBox API: - **Wireless**: WLANs, Wireless Links - **Extras**: Tags, Custom Fields, Journal Entries, Audit Log +## Hooks + +| Event | Purpose | +|-------|---------| +| `SessionStart` | Test NetBox connectivity, report data quality issues | +| `PreToolUse` | Validate VM/device parameters before create/update | + +Hooks are **non-blocking** - they emit warnings but never prevent operations. + ## Architecture ``` @@ -115,13 +139,23 @@ cmdb-assistant/ │ ├── cmdb-search.md # Search command │ ├── cmdb-device.md # Device management │ ├── cmdb-ip.md # IP management -│ └── cmdb-site.md # Site management +│ ├── cmdb-site.md # Site management +│ ├── cmdb-audit.md # Data quality audit (NEW) +│ ├── cmdb-register.md # Machine registration (NEW) +│ └── cmdb-sync.md # Machine sync (NEW) +├── hooks/ +│ ├── hooks.json # Hook configuration +│ ├── startup-check.sh # SessionStart validation +│ └── validate-input.sh # PreToolUse validation +├── skills/ +│ └── netbox-patterns/ +│ └── SKILL.md # NetBox best practices reference ├── agents/ │ └── cmdb-assistant.md # Main assistant agent └── README.md ``` -The plugin uses the shared NetBox MCP server at `../mcp-servers/netbox/`. +The plugin uses the shared NetBox MCP server at `mcp-servers/netbox/`. ## Configuration diff --git a/plugins/cmdb-assistant/agents/cmdb-assistant.md b/plugins/cmdb-assistant/agents/cmdb-assistant.md index b216e15..b573958 100644 --- a/plugins/cmdb-assistant/agents/cmdb-assistant.md +++ b/plugins/cmdb-assistant/agents/cmdb-assistant.md @@ -76,3 +76,132 @@ When presenting data: - Suggest corrective actions - For permission errors, note what access is needed - For validation errors, explain required fields/formats + +## Data Quality Validation + +**IMPORTANT:** Load the `netbox-patterns` skill for best practice reference. + +Before ANY create or update operation, validate against NetBox best practices: + +### VM Operations + +**Required checks before `virt_create_vm` or `virt_update_vm`:** + +1. **Cluster/Site Assignment** - VMs must have either cluster or site +2. **Tenant Assignment** - Recommend if not provided +3. **Platform Assignment** - Recommend for OS tracking +4. **Naming Convention** - Check against `{env}-{app}-{number}` pattern +5. **Role Assignment** - Recommend appropriate role + +**If user provides no site/tenant, ASK:** + +> "This VM has no site or tenant assigned. NetBox best practices recommend: +> - **Site**: For location-based queries and power budgeting +> - **Tenant**: For resource isolation and ownership tracking +> +> Would you like me to: +> 1. Assign to an existing site/tenant (list available) +> 2. Create new site/tenant first +> 3. Proceed without (not recommended for production use)" + +### Device Operations + +**Required checks before `dcim_create_device` or `dcim_update_device`:** + +1. **Site is REQUIRED** - Fail without it +2. **Platform Assignment** - Recommend for OS tracking +3. **Naming Convention** - Check against `{role}-{location}-{number}` pattern +4. **Role Assignment** - Ensure appropriate role selected +5. **After Creation** - Offer to set primary IP + +### Cluster Operations + +**Required checks before `virt_create_cluster`:** + +1. **Site Scope** - Recommend assigning to site +2. **Cluster Type** - Ensure appropriate type selected +3. **Device Association** - Recommend linking to host device + +### Role Management + +**Before creating a new device role:** + +1. List existing roles with `dcim_list_device_roles` +2. Check if a more general role already exists +3. Recommend role consolidation if >10 specific roles exist + +**Example guidance:** + +> "You're creating role 'nginx-web-server'. An existing 'web-server' role exists. +> Consider using 'web-server' and tracking nginx via the platform field instead. +> This reduces role fragmentation and improves maintainability." + +## Dependency Order Enforcement + +When creating multiple objects, follow this order: + +``` +1. Regions → Sites → Locations → Racks +2. Tenant Groups → Tenants +3. Manufacturers → Device Types +4. Device Roles, Platforms +5. Devices (with site, role, type) +6. Clusters (with type, optional site) +7. VMs (with cluster) +8. Interfaces → IP Addresses → Primary IP assignment +``` + +**CRITICAL Rules:** +- NEVER create a VM before its cluster exists +- NEVER create a device before its site exists +- NEVER create an interface before its device exists +- NEVER create an IP before its interface exists (if assigning) + +## Naming Convention Enforcement + +When user provides a name, check against patterns: + +| Object Type | Pattern | Example | +|-------------|---------|---------| +| Device | `{role}-{site}-{number}` | `web-dc1-01` | +| VM | `{env}-{app}-{number}` or `{prefix}_{service}` | `prod-api-01` | +| Cluster | `{site}-{type}` | `dc1-vmware`, `home-docker` | +| Prefix | Include purpose in description | "Production /24 for web tier" | + +**If name doesn't match patterns, warn:** + +> "The name 'HotServ' doesn't follow naming conventions. +> Suggested: `prod-hotserv-01` or `hotserv-cloud-01`. +> Consistent naming improves searchability and automation compatibility. +> Proceed with original name? [Y/n]" + +## Duplicate Prevention + +Before creating objects, always check for existing duplicates: + +``` +# Before creating device +dcim_list_devices name= + +# Before creating VM +virt_list_vms name= + +# Before creating prefix +ipam_list_prefixes prefix= +``` + +If duplicate found, inform user and suggest update instead of create. + +## Available Commands + +Users can invoke these commands for structured workflows: + +| Command | Purpose | +|---------|---------| +| `/cmdb-search ` | Search across all CMDB objects | +| `/cmdb-device ` | Device CRUD operations | +| `/cmdb-ip ` | IP address and prefix management | +| `/cmdb-site ` | Site and location management | +| `/cmdb-audit [scope]` | Data quality analysis | +| `/cmdb-register` | Register current machine | +| `/cmdb-sync` | Sync machine state with NetBox | diff --git a/plugins/cmdb-assistant/commands/cmdb-audit.md b/plugins/cmdb-assistant/commands/cmdb-audit.md new file mode 100644 index 0000000..4cf9929 --- /dev/null +++ b/plugins/cmdb-assistant/commands/cmdb-audit.md @@ -0,0 +1,195 @@ +--- +description: Audit NetBox data quality and identify consistency issues +--- + +# CMDB Data Quality Audit + +Analyze NetBox data for quality issues and best practice violations. + +## Usage + +``` +/cmdb-audit [scope] +``` + +**Scopes:** +- `all` (default) - Full audit across all categories +- `vms` - Virtual machines only +- `devices` - Physical devices only +- `naming` - Naming convention analysis +- `roles` - Role fragmentation analysis + +## Instructions + +You are a data quality auditor for NetBox. Your job is to identify consistency issues and best practice violations. + +**IMPORTANT:** Load the `netbox-patterns` skill for best practice reference. + +### Phase 1: Data Collection + +Run these MCP tool calls to gather data for analysis: + +``` +1. virt_list_vms (no filters - get all) +2. dcim_list_devices (no filters - get all) +3. virt_list_clusters (no filters) +4. dcim_list_sites +5. tenancy_list_tenants +6. dcim_list_device_roles +7. dcim_list_platforms +``` + +Store the results for analysis. + +### Phase 2: Quality Checks + +Analyze collected data for these issues by severity: + +#### CRITICAL Issues (must fix immediately) + +| Check | Detection | +|-------|-----------| +| VMs without cluster | `cluster` field is null AND `site` field is null | +| Devices without site | `site` field is null | +| Active devices without primary IP | `status=active` AND `primary_ip4` is null AND `primary_ip6` is null | + +#### HIGH Issues (should fix soon) + +| Check | Detection | +|-------|-----------| +| VMs without site | VM has no site (neither direct nor via cluster.site) | +| VMs without tenant | `tenant` field is null | +| Devices without platform | `platform` field is null | +| Clusters not scoped to site | `site` field is null on cluster | +| VMs without role | `role` field is null | + +#### MEDIUM Issues (plan to address) + +| Check | Detection | +|-------|-----------| +| Inconsistent naming | Names don't match patterns: devices=`{role}-{site}-{num}`, VMs=`{env}-{app}-{num}` | +| Role fragmentation | More than 10 device roles with <3 assignments each | +| Missing tags on production | Active resources without any tags | +| Mixed naming separators | Some names use `_`, others use `-` | + +#### LOW Issues (informational) + +| Check | Detection | +|-------|-----------| +| Docker containers as VMs | Cluster type is "Docker Compose" - document this modeling choice | +| VMs without description | `description` field is empty | +| Sites without physical address | `physical_address` is empty | +| Devices without serial | `serial` field is empty | + +### Phase 3: Naming Convention Analysis + +For naming scope, analyze patterns: + +1. **Extract naming patterns** from existing objects +2. **Identify dominant patterns** (most common conventions) +3. **Flag outliers** that don't match dominant patterns +4. **Suggest standardization** based on best practices + +**Expected Patterns:** +- Devices: `{role}-{location}-{number}` (e.g., `web-dc1-01`) +- VMs: `{prefix}_{service}` or `{env}-{app}-{number}` (e.g., `prod-api-01`) +- Clusters: `{site}-{type}` (e.g., `home-docker`) + +### Phase 4: Role Analysis + +For roles scope, analyze fragmentation: + +1. **List all device roles** with assignment counts +2. **Identify single-use roles** (only 1 device/VM) +3. **Identify similar roles** that could be consolidated +4. **Suggest consolidation** based on patterns + +**Red Flags:** +- More than 15 highly specific roles +- Roles with technology in name (use platform instead) +- Roles that duplicate functionality + +### Phase 5: Report Generation + +Present findings in this structure: + +```markdown +## CMDB Data Quality Audit Report + +**Generated:** [timestamp] +**Scope:** [scope parameter] + +### Summary + +| Metric | Count | +|--------|-------| +| Total VMs | X | +| Total Devices | Y | +| Total Clusters | Z | +| **Total Issues** | **N** | + +| Severity | Count | +|----------|-------| +| Critical | A | +| High | B | +| Medium | C | +| Low | D | + +### Critical Issues + +[List each with specific object names and IDs] + +**Example:** +- VM `HotServ` (ID: 1) - No cluster or site assignment +- Device `server-01` (ID: 5) - No site assignment + +### High Issues + +[List each with specific object names] + +### Medium Issues + +[Grouped by category with counts] + +### Recommendations + +1. **[Most impactful fix]** - affects N objects +2. **[Second priority]** - affects M objects +... + +### Quick Fixes + +Commands to fix common issues: + +``` +# Assign site to VM +virt_update_vm id=X site=Y + +# Assign platform to device +dcim_update_device id=X platform=Y +``` + +### Next Steps + +- Run `/cmdb-register` to properly register new machines +- Use `/cmdb-sync` to update existing registrations +- Consider bulk updates via NetBox web UI for >10 items +``` + +## Scope-Specific Instructions + +### For `vms` scope: +Focus only on Virtual Machine checks. Skip device and role analysis. + +### For `devices` scope: +Focus only on Device checks. Skip VM and cluster analysis. + +### For `naming` scope: +Focus on naming convention analysis across all objects. Generate detailed pattern report. + +### For `roles` scope: +Focus on role fragmentation analysis. Generate consolidation recommendations. + +## User Request + +$ARGUMENTS diff --git a/plugins/cmdb-assistant/commands/cmdb-register.md b/plugins/cmdb-assistant/commands/cmdb-register.md new file mode 100644 index 0000000..bd8d62f --- /dev/null +++ b/plugins/cmdb-assistant/commands/cmdb-register.md @@ -0,0 +1,322 @@ +--- +description: Register the current machine into NetBox with all running applications +--- + +# CMDB Machine Registration + +Register the current machine into NetBox, including hardware info, network interfaces, and running applications (Docker containers, services). + +## Usage + +``` +/cmdb-register [--site ] [--tenant ] [--role ] +``` + +**Options:** +- `--site `: Site to assign (will prompt if not provided) +- `--tenant `: Tenant for resource isolation (optional) +- `--role `: Device role (default: auto-detect based on services) + +## Instructions + +You are registering the current machine into NetBox. This is a multi-phase process that discovers local system information and creates corresponding NetBox objects. + +**IMPORTANT:** Load the `netbox-patterns` skill for best practice reference. + +### Phase 1: System Discovery (via Bash) + +Gather system information using these commands: + +#### 1.1 Basic Device Info + +```bash +# Hostname +hostname + +# OS/Platform info +cat /etc/os-release 2>/dev/null || uname -a + +# Hardware model (varies by system) +# Raspberry Pi: +cat /proc/device-tree/model 2>/dev/null || echo "Unknown" + +# x86 systems: +cat /sys/class/dmi/id/product_name 2>/dev/null || echo "Unknown" + +# Serial number +# Raspberry Pi: +cat /proc/device-tree/serial-number 2>/dev/null || cat /proc/cpuinfo | grep Serial | cut -d: -f2 | tr -d ' ' 2>/dev/null + +# x86 systems: +cat /sys/class/dmi/id/product_serial 2>/dev/null || echo "Unknown" + +# CPU info +nproc + +# Memory (MB) +free -m | awk '/Mem:/ {print $2}' + +# Disk (GB, root filesystem) +df -BG / | awk 'NR==2 {print $2}' | tr -d 'G' +``` + +#### 1.2 Network Interfaces + +```bash +# Get interfaces with IPs (JSON format) +ip -j addr show 2>/dev/null || ip addr show + +# Get default gateway interface +ip route | grep default | awk '{print $5}' | head -1 + +# Get MAC addresses +ip -j link show 2>/dev/null || ip link show +``` + +#### 1.3 Running Applications + +```bash +# Docker containers (if docker available) +docker ps --format '{"name":"{{.Names}}","image":"{{.Image}}","status":"{{.Status}}","ports":"{{.Ports}}"}' 2>/dev/null || echo "Docker not available" + +# Docker Compose projects (check common locations) +find ~/apps /home/*/apps -name "docker-compose.yml" -o -name "docker-compose.yaml" 2>/dev/null | head -20 + +# Systemd services (running) +systemctl list-units --type=service --state=running --no-pager --plain 2>/dev/null | grep -v "^UNIT" | head -30 +``` + +### Phase 2: Pre-Registration Checks (via MCP) + +Before creating objects, verify prerequisites: + +#### 2.1 Check if Device Already Exists + +``` +dcim_list_devices name= +``` + +**If device exists:** +- Inform user and suggest `/cmdb-sync` instead +- Ask if they want to proceed with re-registration (will update existing) + +#### 2.2 Verify/Create Site + +If `--site` provided: +``` +dcim_list_sites name= +``` + +If site doesn't exist, ask user if they want to create it. + +If no site provided, list available sites and ask user to choose: +``` +dcim_list_sites +``` + +#### 2.3 Verify/Create Platform + +Based on OS detected, check if platform exists: +``` +dcim_list_platforms name= +``` + +**Platform naming:** +- `Raspberry Pi OS (Bookworm)` for Raspberry Pi +- `Ubuntu 24.04 LTS` for Ubuntu +- `Debian 12` for Debian +- Use format: `{OS Name} {Version}` + +If platform doesn't exist, create it: +``` +dcim_create_platform name= slug= +``` + +#### 2.4 Verify/Create Device Role + +Based on detected services: +- If Docker containers found → `Docker Host` +- If only basic services → `Server` +- If specific role specified → Use that + +``` +dcim_list_device_roles name= +``` + +### Phase 3: Device Registration (via MCP) + +#### 3.1 Get/Create Manufacturer and Device Type + +For Raspberry Pi: +``` +dcim_list_manufacturers name="Raspberry Pi Foundation" +dcim_list_device_types manufacturer_id=X model="Raspberry Pi 4 Model B" +``` + +Create if not exists. + +For generic x86: +``` +dcim_list_manufacturers name= +``` + +#### 3.2 Create Device + +``` +dcim_create_device + name= + device_type= + role= + site= + platform= + tenant= # if provided + serial= + description="Registered via cmdb-assistant" +``` + +#### 3.3 Create Interfaces + +For each network interface discovered: +``` +dcim_create_interface + device= + name= # eth0, wlan0, tailscale0, etc. + type= # 1000base-t, virtual, other + mac_address= + enabled=true +``` + +**Interface type mapping:** +- `eth*`, `enp*` → `1000base-t` +- `wlan*` → `ieee802.11ax` (or appropriate wifi type) +- `tailscale*`, `docker*`, `br-*` → `virtual` +- `lo` → skip (loopback) + +#### 3.4 Create IP Addresses + +For each IP on each interface: +``` +ipam_create_ip_address + address= # e.g., "192.168.1.100/24" + assigned_object_type="dcim.interface" + assigned_object_id= + status="active" + description="Discovered via cmdb-register" +``` + +#### 3.5 Set Primary IP + +Identify primary IP (interface with default route): +``` +dcim_update_device + id= + primary_ip4= +``` + +### Phase 4: Container Registration (via MCP) + +If Docker containers were discovered: + +#### 4.1 Create/Get Cluster Type + +``` +virt_list_cluster_types name="Docker Compose" +``` + +Create if not exists: +``` +virt_create_cluster_type name="Docker Compose" slug="docker-compose" +``` + +#### 4.2 Create Cluster + +For each Docker Compose project directory found: +``` +virt_create_cluster + name= # e.g., "apps-hotport" + type= + site= + description="Docker Compose stack on " +``` + +#### 4.3 Create VMs for Containers + +For each running container: +``` +virt_create_vm + name= + cluster= + site= + role= # Map container function to role + status="active" + vcpus= # Default 1.0 if unknown + memory= # Default 256 if unknown + disk= # Default 5 if unknown + description= + comments= +``` + +**Container role mapping:** +- `*caddy*`, `*nginx*`, `*traefik*` → "Reverse Proxy" +- `*db*`, `*postgres*`, `*mysql*`, `*redis*` → "Database" +- `*webui*`, `*frontend*` → "Web Application" +- Others → Infer from image name or use generic "Container" + +### Phase 5: Documentation + +#### 5.1 Add Journal Entry + +``` +extras_create_journal_entry + assigned_object_type="dcim.device" + assigned_object_id= + comments="Device registered via /cmdb-register command\n\nDiscovered:\n- X network interfaces\n- Y IP addresses\n- Z Docker containers" +``` + +### Phase 6: Summary Report + +Present registration summary: + +```markdown +## Machine Registration Complete + +### Device Created +- **Name:** +- **Site:** +- **Platform:** +- **Role:** +- **ID:** +- **URL:** https://netbox.example.com/dcim/devices// + +### Network Interfaces +| Interface | Type | MAC | IP Address | +|-----------|------|-----|------------| +| eth0 | 1000base-t | aa:bb:cc:dd:ee:ff | 192.168.1.100/24 | +| tailscale0 | virtual | - | 100.x.x.x/32 | + +### Primary IP: 192.168.1.100 + +### Docker Containers Registered (if applicable) +**Cluster:** (ID: ) + +| Container | Role | vCPUs | Memory | Status | +|-----------|------|-------|--------|--------| +| media_jellyfin | Media Server | 2.0 | 2048MB | Active | +| media_sonarr | Media Management | 1.0 | 512MB | Active | + +### Next Steps +- Run `/cmdb-sync` periodically to keep data current +- Run `/cmdb-audit` to check data quality +- Add tags for classification (env:*, team:*, etc.) +``` + +## Error Handling + +- **Device already exists:** Suggest `/cmdb-sync` or ask to proceed +- **Site not found:** List available sites, offer to create new +- **Docker not available:** Skip container registration, note in summary +- **Permission denied:** Note which operations failed, suggest fixes + +## User Request + +$ARGUMENTS diff --git a/plugins/cmdb-assistant/commands/cmdb-sync.md b/plugins/cmdb-assistant/commands/cmdb-sync.md new file mode 100644 index 0000000..1311019 --- /dev/null +++ b/plugins/cmdb-assistant/commands/cmdb-sync.md @@ -0,0 +1,336 @@ +--- +description: Synchronize current machine state with existing NetBox record +--- + +# CMDB Machine Sync + +Update an existing NetBox device record with the current machine state. Compares local system information with NetBox and applies changes. + +## Usage + +``` +/cmdb-sync [--full] [--dry-run] +``` + +**Options:** +- `--full`: Force refresh all fields, even unchanged ones +- `--dry-run`: Show what would change without applying updates + +## Instructions + +You are synchronizing the current machine's state with its NetBox record. This involves comparing current system state with stored data and updating differences. + +**IMPORTANT:** Load the `netbox-patterns` skill for best practice reference. + +### Phase 1: Device Lookup (via MCP) + +First, find the existing device record: + +```bash +# Get current hostname +hostname +``` + +``` +dcim_list_devices name= +``` + +**If device not found:** +- Inform user: "Device '' not found in NetBox" +- Suggest: "Run `/cmdb-register` to register this machine first" +- Exit sync + +**If device found:** +- Store device ID and all current field values +- Fetch interfaces: `dcim_list_interfaces device_id=` +- Fetch IPs: `ipam_list_ip_addresses device_id=` + +Also check for associated clusters/VMs: +``` +virt_list_clusters # Look for cluster associated with this device +virt_list_vms cluster= # If cluster found +``` + +### Phase 2: Current State Discovery (via Bash) + +Gather current system information (same as `/cmdb-register`): + +```bash +# Device info +hostname +cat /etc/os-release 2>/dev/null || uname -a +nproc +free -m | awk '/Mem:/ {print $2}' +df -BG / | awk 'NR==2 {print $2}' | tr -d 'G' + +# Network interfaces with IPs +ip -j addr show 2>/dev/null || ip addr show + +# Docker containers +docker ps --format '{"name":"{{.Names}}","image":"{{.Image}}","status":"{{.Status}}"}' 2>/dev/null || echo "[]" +``` + +### Phase 3: Comparison + +Compare discovered state with NetBox record: + +#### 3.1 Device Attributes + +| Field | Compare | +|-------|---------| +| Platform | OS version changed? | +| Status | Still active? | +| Serial | Match? | +| Description | Keep existing | + +#### 3.2 Network Interfaces + +| Change Type | Detection | +|-------------|-----------| +| New interface | Interface exists locally but not in NetBox | +| Removed interface | Interface in NetBox but not locally | +| Changed MAC | MAC address different | +| Interface type | Type mismatch | + +#### 3.3 IP Addresses + +| Change Type | Detection | +|-------------|-----------| +| New IP | IP exists locally but not in NetBox | +| Removed IP | IP in NetBox but not locally (on this device) | +| Primary IP changed | Default route interface changed | + +#### 3.4 Docker Containers + +| Change Type | Detection | +|-------------|-----------| +| New container | Container running locally but no VM in cluster | +| Stopped container | VM exists but container not running | +| Resource change | vCPUs/memory different (if trackable) | + +### Phase 4: Diff Report + +Present changes to user: + +```markdown +## Sync Diff Report + +**Device:** (ID: ) +**NetBox URL:** https://netbox.example.com/dcim/devices// + +### Device Attributes +| Field | NetBox Value | Current Value | Action | +|-------|--------------|---------------|--------| +| Platform | Ubuntu 22.04 | Ubuntu 24.04 | UPDATE | +| Status | active | active | - | + +### Network Interfaces + +#### New Interfaces (will create) +| Interface | Type | MAC | IPs | +|-----------|------|-----|-----| +| tailscale0 | virtual | - | 100.x.x.x/32 | + +#### Removed Interfaces (will mark offline) +| Interface | Type | Reason | +|-----------|------|--------| +| eth1 | 1000base-t | Not found locally | + +#### Changed Interfaces +| Interface | Field | Old | New | +|-----------|-------|-----|-----| +| eth0 | mac_address | aa:bb:cc:00:00:00 | aa:bb:cc:11:11:11 | + +### IP Addresses + +#### New IPs (will create) +- 192.168.1.150/24 on eth0 + +#### Removed IPs (will unassign) +- 192.168.1.100/24 from eth0 + +### Docker Containers + +#### New Containers (will create VMs) +| Container | Image | Role | +|-----------|-------|------| +| media_lidarr | linuxserver/lidarr | Media Management | + +#### Stopped Containers (will mark offline) +| Container | Last Status | +|-----------|-------------| +| media_bazarr | Exited | + +### Summary +- **Updates:** X +- **Creates:** Y +- **Removals/Offline:** Z +``` + +### Phase 5: User Confirmation + +If not `--dry-run`: + +``` +The following changes will be applied: +- Update device platform to "Ubuntu 24.04" +- Create interface "tailscale0" +- Create IP "100.x.x.x/32" on tailscale0 +- Create VM "media_lidarr" in cluster +- Mark VM "media_bazarr" as offline + +Proceed with sync? [Y/n] +``` + +**Use AskUserQuestion** to get confirmation. + +### Phase 6: Apply Updates (via MCP) + +Only if user confirms (or `--full` specified): + +#### 6.1 Device Updates + +``` +dcim_update_device + id= + platform= + # ... other changed fields +``` + +#### 6.2 Interface Updates + +**For new interfaces:** +``` +dcim_create_interface + device= + name= + type= + mac_address= + enabled=true +``` + +**For removed interfaces:** +``` +dcim_update_interface + id= + enabled=false + description="Marked offline by cmdb-sync - interface no longer present" +``` + +**For changed interfaces:** +``` +dcim_update_interface + id= + mac_address= +``` + +#### 6.3 IP Address Updates + +**For new IPs:** +``` +ipam_create_ip_address + address= + assigned_object_type="dcim.interface" + assigned_object_id= + status="active" +``` + +**For removed IPs:** +``` +ipam_update_ip_address + id= + assigned_object_type=null + assigned_object_id=null + description="Unassigned by cmdb-sync" +``` + +#### 6.4 Primary IP Update + +If primary IP changed: +``` +dcim_update_device + id= + primary_ip4= +``` + +#### 6.5 Container/VM Updates + +**For new containers:** +``` +virt_create_vm + name= + cluster= + status="active" + # ... other fields +``` + +**For stopped containers:** +``` +virt_update_vm + id= + status="offline" + description="Container stopped - detected by cmdb-sync" +``` + +### Phase 7: Journal Entry + +Document the sync: + +``` +extras_create_journal_entry + assigned_object_type="dcim.device" + assigned_object_id= + comments="Device synced via /cmdb-sync command\n\nChanges applied:\n- " +``` + +### Phase 8: Summary Report + +```markdown +## Sync Complete + +**Device:** +**Sync Time:** + +### Changes Applied +- Updated platform: Ubuntu 22.04 → Ubuntu 24.04 +- Created interface: tailscale0 (ID: X) +- Created IP: 100.x.x.x/32 (ID: Y) +- Created VM: media_lidarr (ID: Z) +- Marked VM offline: media_bazarr (ID: W) + +### Current State +- **Interfaces:** 4 (3 active, 1 offline) +- **IP Addresses:** 5 +- **Containers/VMs:** 8 (7 active, 1 offline) + +### Next Sync +Run `/cmdb-sync` again after: +- Adding/removing Docker containers +- Changing network configuration +- OS upgrades +``` + +## Dry Run Mode + +If `--dry-run` specified: +- Complete Phase 1-4 (lookup, discovery, compare, diff report) +- Skip Phase 5-8 (no confirmation, no updates, no journal) +- End with: "Dry run complete. No changes applied. Run without --dry-run to apply." + +## Full Sync Mode + +If `--full` specified: +- Skip user confirmation +- Update all fields even if unchanged (force refresh) +- Useful for ensuring NetBox matches current state exactly + +## Error Handling + +- **Device not found:** Suggest `/cmdb-register` +- **Permission denied on updates:** Note which failed, continue with others +- **Cluster not found:** Offer to create or skip container sync +- **API errors:** Log error, continue with remaining updates + +## User Request + +$ARGUMENTS diff --git a/plugins/cmdb-assistant/hooks/hooks.json b/plugins/cmdb-assistant/hooks/hooks.json new file mode 100644 index 0000000..d90fb51 --- /dev/null +++ b/plugins/cmdb-assistant/hooks/hooks.json @@ -0,0 +1,21 @@ +{ + "hooks": { + "SessionStart": [ + { + "type": "command", + "command": "${CLAUDE_PLUGIN_ROOT}/hooks/startup-check.sh" + } + ], + "PreToolUse": [ + { + "matcher": "mcp__plugin_cmdb-assistant_netbox__virt_create|mcp__plugin_cmdb-assistant_netbox__virt_update|mcp__plugin_cmdb-assistant_netbox__dcim_create|mcp__plugin_cmdb-assistant_netbox__dcim_update", + "hooks": [ + { + "type": "command", + "command": "${CLAUDE_PLUGIN_ROOT}/hooks/validate-input.sh" + } + ] + } + ] + } +} diff --git a/plugins/cmdb-assistant/hooks/startup-check.sh b/plugins/cmdb-assistant/hooks/startup-check.sh new file mode 100755 index 0000000..46f0b46 --- /dev/null +++ b/plugins/cmdb-assistant/hooks/startup-check.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# cmdb-assistant SessionStart hook +# Tests NetBox API connectivity and checks for data quality issues +# All output MUST have [cmdb-assistant] prefix +# Non-blocking: always exits 0 + +set -euo pipefail + +PREFIX="[cmdb-assistant]" + +# Load NetBox configuration +NETBOX_CONFIG="$HOME/.config/claude/netbox.env" + +if [[ ! -f "$NETBOX_CONFIG" ]]; then + echo "$PREFIX NetBox not configured - run /cmdb-assistant:initial-setup" + exit 0 +fi + +# Source config +source "$NETBOX_CONFIG" + +# Validate required variables +if [[ -z "${NETBOX_API_URL:-}" ]] || [[ -z "${NETBOX_API_TOKEN:-}" ]]; then + echo "$PREFIX Missing NETBOX_API_URL or NETBOX_API_TOKEN in config" + exit 0 +fi + +# Quick API connectivity test (5s timeout) +HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -m 5 \ + -H "Authorization: Token $NETBOX_API_TOKEN" \ + -H "Accept: application/json" \ + "${NETBOX_API_URL}/" 2>/dev/null || echo "000") + +if [[ "$HTTP_CODE" == "000" ]]; then + echo "$PREFIX NetBox API unreachable (timeout/connection error)" + exit 0 +elif [[ "$HTTP_CODE" != "200" ]]; then + echo "$PREFIX NetBox API returned HTTP $HTTP_CODE - check credentials" + exit 0 +fi + +# Check for VMs without site assignment (data quality) +VMS_RESPONSE=$(curl -s -m 5 \ + -H "Authorization: Token $NETBOX_API_TOKEN" \ + -H "Accept: application/json" \ + "${NETBOX_API_URL}/virtualization/virtual-machines/?site__isnull=true&limit=1" 2>/dev/null || echo '{"count":0}') + +VMS_NO_SITE=$(echo "$VMS_RESPONSE" | grep -o '"count":[0-9]*' | cut -d: -f2 || echo "0") + +if [[ "$VMS_NO_SITE" -gt 0 ]]; then + echo "$PREFIX $VMS_NO_SITE VMs without site assignment - run /cmdb-audit for details" +fi + +# Check for devices without platform +DEVICES_RESPONSE=$(curl -s -m 5 \ + -H "Authorization: Token $NETBOX_API_TOKEN" \ + -H "Accept: application/json" \ + "${NETBOX_API_URL}/dcim/devices/?platform__isnull=true&limit=1" 2>/dev/null || echo '{"count":0}') + +DEVICES_NO_PLATFORM=$(echo "$DEVICES_RESPONSE" | grep -o '"count":[0-9]*' | cut -d: -f2 || echo "0") + +if [[ "$DEVICES_NO_PLATFORM" -gt 0 ]]; then + echo "$PREFIX $DEVICES_NO_PLATFORM devices without platform - consider updating" +fi + +exit 0 diff --git a/plugins/cmdb-assistant/hooks/validate-input.sh b/plugins/cmdb-assistant/hooks/validate-input.sh new file mode 100755 index 0000000..c889efa --- /dev/null +++ b/plugins/cmdb-assistant/hooks/validate-input.sh @@ -0,0 +1,79 @@ +#!/bin/bash +# cmdb-assistant PreToolUse validation hook +# Validates input parameters for create/update operations +# NON-BLOCKING: Warns but allows operation to proceed (always exits 0) + +set -euo pipefail + +PREFIX="[cmdb-assistant]" + +# Read tool input from stdin +INPUT=$(cat) + +# Extract tool name from the input +# Format varies, try to find tool_name or name field +TOOL_NAME="" +if echo "$INPUT" | grep -q '"tool_name"'; then + TOOL_NAME=$(echo "$INPUT" | grep -o '"tool_name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/' || true) +elif echo "$INPUT" | grep -q '"name"'; then + TOOL_NAME=$(echo "$INPUT" | grep -o '"name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/' || true) +fi + +# If we can't determine the tool, exit silently +if [[ -z "$TOOL_NAME" ]]; then + exit 0 +fi + +# VM creation/update validation +if echo "$TOOL_NAME" | grep -qE "virt_create_vm|virt_create_virtual_machine|virt_update_vm|virt_update_virtual_machine"; then + WARNINGS=() + + # Check for missing site + if ! echo "$INPUT" | grep -qE '"site"[[:space:]]*:[[:space:]]*[0-9]'; then + WARNINGS+=("no site assigned") + fi + + # Check for missing tenant + if ! echo "$INPUT" | grep -qE '"tenant"[[:space:]]*:[[:space:]]*[0-9]'; then + WARNINGS+=("no tenant assigned") + fi + + # Check for missing platform + if ! echo "$INPUT" | grep -qE '"platform"[[:space:]]*:[[:space:]]*[0-9]'; then + WARNINGS+=("no platform assigned") + fi + + if [[ ${#WARNINGS[@]} -gt 0 ]]; then + echo "$PREFIX VM best practice: $(IFS=', '; echo "${WARNINGS[*]}") - consider assigning for data quality" + fi +fi + +# Device creation/update validation +if echo "$TOOL_NAME" | grep -qE "dcim_create_device|dcim_update_device"; then + WARNINGS=() + + # Check for missing platform + if ! echo "$INPUT" | grep -qE '"platform"[[:space:]]*:[[:space:]]*[0-9]'; then + WARNINGS+=("no platform assigned") + fi + + # Check for missing tenant + if ! echo "$INPUT" | grep -qE '"tenant"[[:space:]]*:[[:space:]]*[0-9]'; then + WARNINGS+=("no tenant assigned") + fi + + if [[ ${#WARNINGS[@]} -gt 0 ]]; then + echo "$PREFIX Device best practice: $(IFS=', '; echo "${WARNINGS[*]}") - consider assigning" + fi +fi + +# Cluster creation validation +if echo "$TOOL_NAME" | grep -qE "virt_create_cluster"; then + # Check for missing site scope + if ! echo "$INPUT" | grep -qE '"site"[[:space:]]*:[[:space:]]*[0-9]'; then + echo "$PREFIX Cluster best practice: no site scope - clusters should be scoped to a site" + fi +fi + +# Always allow operation (non-blocking) +exit 0 diff --git a/plugins/cmdb-assistant/skills/netbox-patterns/SKILL.md b/plugins/cmdb-assistant/skills/netbox-patterns/SKILL.md new file mode 100644 index 0000000..1581aa7 --- /dev/null +++ b/plugins/cmdb-assistant/skills/netbox-patterns/SKILL.md @@ -0,0 +1,249 @@ +--- +description: NetBox best practices for data quality and consistency based on official NetBox Labs guidelines +--- + +# NetBox Best Practices Skill + +Reference documentation for proper NetBox data modeling, following official NetBox Labs guidelines. + +## CRITICAL: Dependency Order + +Objects must be created in this order due to foreign key dependencies. Creating objects out of order results in validation errors. + +``` +1. ORGANIZATION (no dependencies) + ├── Tenant Groups + ├── Tenants (optional: Tenant Group) + ├── Regions + ├── Site Groups + └── Tags + +2. SITES AND LOCATIONS + ├── Sites (optional: Region, Site Group, Tenant) + └── Locations (requires: Site, optional: parent Location) + +3. DCIM PREREQUISITES + ├── Manufacturers + ├── Device Types (requires: Manufacturer) + ├── Platforms + ├── Device Roles + └── Rack Roles + +4. RACKS + └── Racks (requires: Site, optional: Location, Rack Role, Tenant) + +5. DEVICES + ├── Devices (requires: Device Type, Role, Site; optional: Rack, Location) + └── Interfaces (requires: Device) + +6. VIRTUALIZATION + ├── Cluster Types + ├── Cluster Groups + ├── Clusters (requires: Cluster Type, optional: Site) + ├── Virtual Machines (requires: Cluster OR Site) + └── VM Interfaces (requires: Virtual Machine) + +7. IPAM + ├── VRFs (optional: Tenant) + ├── Prefixes (optional: VRF, Site, Tenant) + ├── IP Addresses (optional: VRF, Tenant, Interface) + └── VLANs (optional: Site, Tenant) + +8. CONNECTIONS (last) + └── Cables (requires: endpoints) +``` + +**Key Rule:** NEVER create a VM before its cluster exists. NEVER create a device before its site exists. + +## HIGH: Site Assignment + +**All infrastructure objects should have a site:** + +| Object Type | Site Requirement | +|-------------|------------------| +| Devices | **REQUIRED** | +| Racks | **REQUIRED** | +| VMs | RECOMMENDED (via cluster or direct) | +| Clusters | RECOMMENDED | +| Prefixes | RECOMMENDED | +| VLANs | RECOMMENDED | + +**Why Sites Matter:** +- Location-based queries and filtering +- Power and capacity budgeting +- Physical inventory tracking +- Compliance and audit requirements + +## HIGH: Tenant Usage + +Use tenants for logical resource separation: + +**When to Use Tenants:** +- Multi-team environments (assign resources to teams) +- Multi-customer scenarios (MSP, hosting) +- Cost allocation requirements +- Access control boundaries + +**Apply Tenants To:** +- Sites (who owns the physical location) +- Devices (who operates the hardware) +- VMs (who owns the workload) +- Prefixes (who owns the IP space) +- VLANs (who owns the network segment) + +## HIGH: Platform Tracking + +Platforms track OS/runtime information for automation and lifecycle management. + +**Platform Examples:** +| Device Type | Platform Examples | +|-------------|-------------------| +| Servers | Ubuntu 24.04, Windows Server 2022, RHEL 9 | +| Network | Cisco IOS 17.x, Junos 23.x, Arista EOS | +| Raspberry Pi | Raspberry Pi OS (Bookworm), Ubuntu Server ARM | +| Containers | Docker Container (as runtime indicator) | + +**Benefits:** +- Vulnerability tracking (CVE correlation) +- Configuration management integration +- Lifecycle management (EOL tracking) +- Automation targeting + +## MEDIUM: Tag Conventions + +Use tags for cross-cutting classification that spans object types. + +**Recommended Tag Patterns:** + +| Pattern | Purpose | Examples | +|---------|---------|----------| +| `env:*` | Environment classification | `env:production`, `env:staging`, `env:development` | +| `app:*` | Application grouping | `app:web`, `app:database`, `app:monitoring` | +| `team:*` | Ownership | `team:platform`, `team:infra`, `team:devops` | +| `backup:*` | Backup policy | `backup:daily`, `backup:weekly`, `backup:none` | +| `monitoring:*` | Monitoring level | `monitoring:critical`, `monitoring:standard` | + +**Tags vs Custom Fields:** +- Tags: Cross-object classification, multiple values, filtering +- Custom Fields: Object-specific structured data, single values, reporting + +## MEDIUM: Naming Conventions + +Consistent naming improves searchability and automation compatibility. + +**Recommended Patterns:** + +| Object Type | Pattern | Examples | +|-------------|---------|----------| +| Devices | `{role}-{location}-{number}` | `web-dc1-01`, `db-cloud-02`, `fw-home-01` | +| VMs | `{env}-{app}-{number}` | `prod-api-01`, `dev-worker-03` | +| Clusters | `{site}-{type}` | `dc1-vmware`, `home-docker` | +| Prefixes | Include purpose in description | "Production web tier /24" | +| VLANs | `{site}-{function}` | `dc1-mgmt`, `home-iot` | + +**Avoid:** +- Inconsistent casing (mixing `HotServ` and `hotserv`) +- Mixed separators (mixing `hhl_cluster` and `media-cluster`) +- Generic names without context (`server1`, `vm2`) +- Special characters other than hyphen + +## MEDIUM: Role Consolidation + +Avoid role fragmentation - use general roles with platform/tags for specificity. + +**Instead of:** +``` +nginx-web-server +apache-web-server +web-server-frontend +web-server-api +``` + +**Use:** +``` +web-server (role) + platform (nginx/apache) + tags (frontend, api) +``` + +**Recommended Role Categories:** + +| Category | Roles | +|----------|-------| +| Infrastructure | `hypervisor`, `storage-server`, `network-device`, `firewall` | +| Compute | `application-server`, `database-server`, `web-server`, `api-server` | +| Services | `container-host`, `load-balancer`, `monitoring-server`, `backup-server` | +| Development | `development-workstation`, `ci-runner`, `build-server` | +| Containers | `reverse-proxy`, `database`, `cache`, `queue`, `worker` | + +## Docker Containers as VMs + +NetBox's Virtualization module can model Docker containers: + +**Approach:** +1. Create device for physical Docker host +2. Create cluster (type: "Docker Compose" or "Docker Swarm") +3. Associate cluster with host device +4. Create VMs for each container in the cluster + +**VM Fields for Containers:** +- `name`: Container name (e.g., `media_jellyfin`) +- `role`: Container function (e.g., `Media Server`) +- `vcpus`: CPU limit/shares +- `memory`: Memory limit (MB) +- `disk`: Volume size estimate +- `description`: Container purpose +- `comments`: Image, ports, volumes, dependencies + +**This is a pragmatic modeling choice** - containers aren't VMs, but the Virtualization module is the closest fit for tracking container workloads. + +## Primary IP Workflow + +To set a device/VM's primary IP: + +1. Create interface on device/VM +2. Create IP address assigned to interface +3. Set IP as `primary_ip4` or `primary_ip6` on device/VM + +**Why Primary IP Matters:** +- Used for device connectivity checks +- Displayed in device list views +- Used by automation tools (NAPALM, Ansible) +- Required for many integrations + +## Data Quality Checklist + +Before closing a sprint or audit: + +- [ ] All VMs have site assignment (direct or via cluster) +- [ ] All VMs have tenant assignment +- [ ] All active devices have platform +- [ ] All active devices have primary IP +- [ ] Naming follows conventions +- [ ] No orphaned prefixes (allocated but unused) +- [ ] Tags applied consistently +- [ ] Clusters scoped to sites +- [ ] Roles not overly fragmented + +## MCP Tool Reference + +**Dependency Order for Creation:** +``` +1. dcim_create_site +2. dcim_create_manufacturer +3. dcim_create_device_type +4. dcim_create_device_role +5. dcim_create_platform +6. dcim_create_device +7. virt_create_cluster_type +8. virt_create_cluster +9. virt_create_vm +10. dcim_create_interface / virt_create_vm_interface +11. ipam_create_ip_address +12. dcim_update_device (set primary_ip4) +``` + +**Lookup Before Create:** +Always check if object exists before creating to avoid duplicates: +``` +1. dcim_list_devices name= +2. If exists, update; if not, create +``` diff --git a/scripts/verify-hooks.sh b/scripts/verify-hooks.sh index 7b8588c..a2317ae 100755 --- a/scripts/verify-hooks.sh +++ b/scripts/verify-hooks.sh @@ -23,7 +23,7 @@ if [ -d ~/.claude/plugins/cache/leo-claude-mktplace ]; then fi # Verify installed hooks are command type -for plugin in doc-guardian code-sentinel projman pr-review project-hygiene data-platform; do +for plugin in doc-guardian code-sentinel projman pr-review project-hygiene data-platform cmdb-assistant; do HOOK_FILE=~/.claude/plugins/marketplaces/leo-claude-mktplace/plugins/$plugin/hooks/hooks.json if [ -f "$HOOK_FILE" ]; then if grep -q '"type": "command"' "$HOOK_FILE" || grep -q '"type":"command"' "$HOOK_FILE"; then