{
  "schema_version": 1,
  "type": "skill",
  "slug": "kicad-service",
  "title": "KiCad Service",
  "brief": "Use when the user asks about the KiCad service, KiCad CLI, DRC validation, ERC, Gerber export, symbol/footprint SVG rendering, STEP/GLB 3D model export, or any headless KiCad operation.",
  "version": "1.0.0",
  "tags": [],
  "license": "MIT",
  "source_path": "SKILL.md",
  "readme": "# KiCad Service\n\nA shared KiCad CLI HTTP service running on a dedicated Adom container. Provides headless KiCad operations without needing KiCad installed locally.\n\n**This is NOT the same as adom-desktop KiCad control.** Two different things:\n\n| | KiCad Service (this skill) | adom-desktop KiCad |\n|---|---|---|\n| **Where KiCad runs** | Dedicated server container | User's Windows/Mac desktop |\n| **GUI** | None — headless CLI only | Full KiCad GUI (schematic editor, PCB layout, 3D viewer) |\n| **What it does** | DRC, Gerber export, SVG rendering, STEP/GLB export, symbol/footprint search | Open/close editors, install symbols/footprints, screenshot windows, handle dialogs |\n| **Install needed** | None — already running | Yes — user installs Adom Desktop app |\n| **Best for** | Automated validation, rendering, batch export | Interactive editing, visual inspection, demo recordings |\n\n## When to use which\n\n- \"Run DRC on my board\" → **KiCad Service** (this skill)\n- \"Open my schematic in KiCad\" → **adom-desktop** (needs desktop install)\n- \"Export gerbers from a .kicad_pcb file\" → **KiCad Service**\n- \"Show me the KiCad Symbol Editor\" → **adom-desktop**\n- \"Render my footprint as SVG\" → **KiCad Service**\n- \"Install this symbol into KiCad's library\" → **adom-desktop**\n\n## Service URL\n\n```\nhttps://coder.john-service-kicad-cli-5948815f6104358b.containers.adom.inc/proxy/8780\n```\n\nThis is a shared service available to all Adom containers. Use `$KICAD_API` if set, otherwise use the URL above.\n\n```bash\n# Health check\ncurl -s \"https://coder.john-service-kicad-cli-5948815f6104358b.containers.adom.inc/proxy/8780/health\"\n# → {\"ok\":true,\"kicad_version\":\"9.0.7\",\"uptime_seconds\":...}\n```\n\n## API Client\n\nJavaScript client with all functions:\n\n```javascript\nimport { checkHealth, symSearch, pcbDrc, pcbExportGerbers, ... } from '/home/adom/project/gallia/viewer/kicad-api-client.js';\n```\n\n## Available Operations\n\n### Health Check\n\n```javascript\nconst health = await checkHealth();\n// → { ok: true, kicadVersion: \"9.0.1\", uptimeSeconds: 12345, cacheSizeMb: 42 }\n```\n\n### Symbol Operations\n\n```javascript\n// Search for symbols\nconst results = await symSearch(\"STM32F103\", 20);\n\n// Get symbol details\nconst sym = await symGet(\"Device\", \"R\");\n\n// Export symbol as SVG\nconst svg = await symExportSvg(\"/path/to/file.kicad_sym\", \"SYMBOL_NAME\");\n\n// Export by library+name (cached)\nconst svg = await symExportSvgByName(\"Device\", \"R\");\n```\n\n### Footprint Operations\n\n```javascript\n// List footprints\nconst fps = await fpList({ library: \"Package_SO\" });\n\n// Export footprint as SVG\nconst svg = await fpExportSvg(\"/path/to/file.kicad_mod\", \"SOT-23\");\nconst svg = await fpExportSvgByName(\"Package_SO\", \"SOT-23\");\n\n// Export as GLB (3D model)\nconst glb = await fpExportGlbByName(\"Package_SO\", \"SOT-23\", \"/tmp/sot23.glb\");\n\n// Export as STEP\nconst step = await fpExportStepByName(\"Package_SO\", \"SOT-23\", \"/tmp/sot23.step\");\n\n// Download footprint file\nawait fpDownload(\"Package_SO/SOT-23.kicad_mod\", \"/tmp/sot23.kicad_mod\");\n```\n\n### PCB / Board Operations\n\n```javascript\n// Run Design Rule Check\nconst drc = await pcbDrc(\"/path/to/board.kicad_pcb\");\n// → { violations: [...], errorCount: 2, warningCount: 5 }\n\n// Export Gerbers\nconst gerbers = await pcbExportGerbers(\"/path/to/board.kicad_pcb\", \"/tmp/gerbers/\");\n\n// Export board as GLB (3D model)\nconst glb = await boardExportGlb(\"/path/to/board.kicad_pcb\", \"/tmp/board.glb\");\n\n// Export footprint from PCB as STEP\nconst step = await pcbExportStep(\"/path/to/board.kicad_pcb\", \"U1\", \"/tmp/u1.step\");\n```\n\n### 3D Model Operations\n\n```javascript\n// List available 3D models\nconst models = await models3dList({ library: \"Package_SO\" });\n\n// Download a 3D model\nawait models3dDownload(\"Package_SO/SOT-23.step\", \"/tmp/sot23.step\");\n```\n\n## Error Handling\n\nThe health check distinguishes three failure modes:\n\n1. **Service healthy** — KiCad CLI available, ready for operations\n2. **Node process down** — Container running but Node server crashed. The service auto-restarts, retry in 30s.\n3. **Container unreachable** — ECONNREFUSED/ETIMEDOUT. Container may be stopped or not provisioned.\n\n```javascript\nconst health = await checkHealth();\nif (!health.ok) {\n  console.error(health.status);     // 'node_down' | 'container_unreachable' | 'unknown_error'\n  console.error(health.suggestion); // Human-readable fix suggestion\n}\n```\n\n## Which skills use the KiCad Service\n\n- **board-creator** — DRC validation on generated PCB boards\n- **symbol-creator** — SVG rendering of created symbols\n- **footprint-creator** — SVG rendering, STEP/GLB export of footprints\n- **3d-component-creator** — GLB export for 3D viewer\n- **gerber-viewer** — Gerber file generation\n- **instapcb** — DRC before manufacturing submission\n- **library-creator** — Symbol/footprint validation\n\n## NOT the same as adom-desktop\n\nIf the user wants to:\n- **See the KiCad GUI** → they need `adom-desktop` (install the desktop app)\n- **Open a schematic in the editor** → `adom-desktop`\n- **Install a symbol into their local KiCad library** → `adom-desktop`\n- **Control KiCad windows, handle dialogs** → `adom-desktop`\n\nThis service is for headless, API-driven operations only.",
  "author": {
    "name": "Kyle Bergstedt",
    "email": "[email protected]"
  },
  "visibility": {
    "public": true
  },
  "hero": null,
  "sample_prompts": [],
  "discovery_triggers": [],
  "discovery_pitch": null,
  "metadata": {},
  "created_at": "2026-05-28T05:29:50.623Z",
  "updated_at": "2026-05-28T05:29:50.623Z",
  "sub_skills": [],
  "parent_app": null
}