Propose a change
Name Last commit message Last updated
install.sh Add adompkg installer files 1mo ago
package.json Add adompkg installer files 1mo ago
page.json Remove internal identifiers from page.json 10d ago
README.md Add adompkg installer files 1mo ago
SKILL.md Add adompkg installer files 1mo ago
uninstall.sh Add adompkg installer files 1mo ago

Gallia KiCad Feature Tour

An AI-guided interactive tour of Gallia's KiCad bridge commands. You orchestrate KiCad in real time — opening editors, parsing designs, searching libraries — while narrating to the user in a dark-themed side panel AND in chat.

HARD RULES — Follow Every Time

These rules come from direct user feedback. They are non-negotiable.

1. Be Very Talkative

  • The user complained about "dead air time" — there must be NO silent gaps
  • Every panel update should have a DETAILED description explaining what's happening, why it matters, and what the data means
  • Talk to the user in chat too between tool calls — explain your thinking
  • Descriptions should be 4-8 lines minimum, not 1-2 sentence stubs

2. Take a Screenshot at EVERY Step

  • After every bridge command, window operation, or panel update — take a screenshot
  • Read the screenshot with the Read tool to verify what's on screen
  • If something looks wrong, fix it before moving on

3. Verify Window Positions at Every Step

  • After taking a screenshot, CHECK that the expected KiCad window is visible and in the foreground
  • If it's not visible, re-issue window front and window position commands
  • Tell the user in the panel that you're verifying/fixing window positions
  • For steps that don't need a KiCad window (library searches), say so explicitly in the panel: "No KiCad window needed for this step — library search is pure file parsing"

4. Newlines in Panel Text

  • When passing --data or --description to tour_cli.py panel update, use \n for newlines
  • The CLI converts \\n\n automatically — just use \n in your bash strings
  • NEVER show literal \n to the user — always verify newlines render correctly

5. Panel Must Not Clip

  • The narration panel uses screen_height - 80 px to account for taskbar + titlebar
  • The "Quit Tour" button must ALWAYS be visible at the bottom
  • If you see it clipped in a screenshot, stop and fix it

6. Shut Down Panel at End of Tour

  • When the tour completes (final summary step), ALWAYS run:
    tour_cli.py panel stop
    
  • Also close any open KiCad editor windows
  • Do not leave the panel running after the tour ends

7. Handle Errors Gracefully

  • If a KiCad window shows an error dialog, dismiss it (PostMessageW VK_RETURN) and explain what happened
  • If a bridge command fails, show the error in the panel and move to the next step
  • Never crash the tour — skip problematic steps and continue

8. Kill Everything Before Starting

  • At the start of every tour, force-kill ALL KiCad processes and the old panel
  • Verify clean slate with tasklist | grep before proceeding
  • Check bridge server health before starting

Architecture

Claude Code (you — narrator + orchestrator)
  │
  ├── tour_cli.py panel start     → launch dark-themed narration panel (port 8799)
  ├── tour_cli.py panel update    → push step/title/description/status/data to panel
  ├── tour_cli.py panel stop      → shut down panel
  ├── tour_cli.py screenshot      → capture desktop PNG → Read tool → you analyze it
  ├── tour_cli.py highlight       → draw teal border overlay on screen (auto-dismiss)
  ├── tour_cli.py bridge          → HTTP POST to KiCad bridge server (port 8772)
  ├── tour_cli.py ipc-test        → run Rust IPC test binary
  ├── tour_cli.py ipc-layer       → set KiCad active layer via IPC (live!)
  ├── tour_cli.py window          → Win32 window find / position / close / front / wait
  └── tour_cli.py preflight       → check all prerequisites

Zero pip dependencies. Only Python stdlib (tkinter, urllib, ctypes, subprocess).

Setup & Preflight

# Discover paths
TOUR_DIR="$(cd ~/Github/adom-desktop/plugins/kicad/tour && pwd)"

# Check everything is ready
python "$TOUR_DIR/tour_cli.py" preflight

Preflight prints SCH_PATH and PCB_PATH — save those for bridge commands.

Screen size is 2560x1600 physical. Panel goes on the right (width=480). KiCad editors get positioned at 0 0 1840 1528.

Tour Startup Sequence

# 1. Kill everything
taskkill //F //IM kicad.exe; taskkill //F //IM eeschema.exe; taskkill //F //IM pcbnew.exe
tour_cli.py panel stop

# 2. Check bridge
tour_cli.py bridge health

# 3. Get screen size
tour_cli.py window screen-size

# 4. Launch narration panel
tour_cli.py panel start --port 8799

# 5. Screenshot to verify panel position and Quit button visibility
tour_cli.py screenshot
# READ the screenshot — verify panel is on right, Quit button visible at bottom

Panel Update Reference

tour_cli.py panel update \
  --step N --total 12 \
  --title "Step Title" \
  --act "ACT_NAME" \
  --description "Multi-line description\nwith newlines" \
  --status "Status text" \
  --status-color "#3fb950" \
  --data "Monospace data area\nfor tables and results" \
  --data-color "#3fb950"

Colors: green=#3fb950, yellow=#d29922, blue=#58a6ff, red=#f85149, teal=#00b8b1

Workflow Per Step — FOLLOW THIS EXACTLY

For EVERY tour step:

  1. Update panel — set step number, title, act, description (4-8 lines explaining what you're about to do and why it matters)
  2. Set status — "Running command..." with yellow color (#d29922)
  3. Execute — run the bridge/window/IPC command
  4. Update status — change to green (#3fb950) with results summary
  5. Update data area — format the results as a clean monospace table
  6. Verify window — if a KiCad editor should be visible:
    • Run window front "Editor Name" to ensure it's in foreground
    • Run window position "Editor Name" 0 0 1840 1528 if needed
  7. Screenshot — capture desktop, Read the PNG
  8. Analyze — verify the expected window is visible, panel looks right, button not clipped
  9. Fix issues — if window not visible, re-issue front/position commands; if panel text wrong, re-send update
  10. Narrate in chat — tell the user what you see, what's interesting, transition to next step

Tour Steps (12 Steps, 3 Acts)

Act 1: "DESIGN" — Analyze the Demo Schematic (Steps 1-6)

Step 1: Welcome

  • Panel: overview of what the tour will demonstrate (3 acts, 12 steps)
  • Data area: show the act breakdown
  • No KiCad window needed yet

Step 2: Open Demo Schematic

  • Bridge: open_schematic filePath=<SCH_PATH>
  • Window: wait → position (0,0,1840,1528) → front
  • Panel: explain that the bridge launches eeschema.exe via HTTP
  • Highlight the schematic area
  • Verify editor is in foreground via screenshot

Step 3: Schematic Statistics

  • Bridge: get_schematic_stats filePath=<SCH_PATH>
  • Panel: show component count, wire count, power symbols, etc.
  • Explain: "AI agents can instantly understand any design's scope"

Step 4: List All Components

  • Bridge: list_schematic_components filePath=<SCH_PATH>
  • Panel: format as Ref / Value / Footprint table
  • Explain: what each component does in the circuit

Step 5: Component Deep Dive (U1 — LM358)

  • Bridge: get_component_details filePath=<SCH_PATH> reference=U1
  • Panel: show all properties, footprint, datasheet, position
  • Explain: dual op-amp, SOIC-8 package, TI datasheet

Step 6: Generate BOM

  • Bridge: generate_bom filePath=<SCH_PATH>
  • Panel: format as Qty / Value / Package / Refs table
  • Explain: identical parts grouped (R1+R2 = qty 2), ready for procurement
  • Close schematic editor after this step

Act 2: "LIBRARIES" — Browse Component Libraries (Steps 7-9)

Step 7: Search Symbol Libraries

  • Bridge: search_symbols query=opamp limit=10
  • Panel: format results as Library / Symbol / Pins table
  • Explain: 224 symbol libraries, thousands of components, regex search
  • Note in panel: "No KiCad window needed — pure file parsing"

Step 8: Symbol Detail — LM358 Pin Map

  • Bridge: get_symbol_info library=Amplifier_Operational symbol=LM358
  • Panel: show full pin map — Pin# / Name / Type / Unit
  • Explain: AI can use pin data to auto-wire circuits correctly

Step 9: Search Footprint Libraries

  • Bridge: search_footprints query=QFP limit=10 (or 0805, SOIC, etc.)
  • Panel: format as Library / Name / Pads / Type table
  • Explain: 155+ footprint libraries, 15,000+ footprints, fast filename matching
  • Note: this command was added recently, searches system + user libraries

Act 3: "PCB" — PCB Board Analysis (Steps 10-11)

Step 10: Open PCB Layout

  • Close any lingering KiCad windows first
  • Bridge: open_board filePath=<PCB_PATH>
  • Window: wait → position → front
  • If error dialog appears, dismiss it (PostMessageW VK_RETURN)
  • Panel: explain what the PCB editor shows (copper traces, pads, board outline)
  • Verify PCB Editor is in foreground via screenshot

Step 11: PCB Statistics

  • Bridge: get_pcb_statistics filePath=<PCB_PATH>
  • Panel: format Board/Components/Routing sections
  • Explain: matches schematic (same component count), board dimensions, layer config
  • Close PCB editor after this step

Finale

Step 12: Tour Complete

  • Panel: "Tour Complete!" with full capabilities summary
  • Data area: list ALL bridge command categories
  • Status: "All 12 steps complete!" in green
  • Chat: recap table of all 12 steps
  • SHUT DOWN: tour_cli.py panel stop and close any remaining KiCad windows

CLI Reference

Subcommand Purpose Example
preflight Check bridge, IPC, demo files tour_cli.py preflight
screenshot [path] Capture desktop to PNG tour_cli.py screenshot
highlight x y w h Draw highlight overlay tour_cli.py highlight 100 80 800 600 --label "Schematic"
bridge <cmd> [k=v] Send bridge command tour_cli.py bridge get_schematic_stats filePath=...
ipc-test [--section N] Run IPC test suite tour_cli.py ipc-test --section 1
ipc-layer <id> Set active PCB layer tour_cli.py ipc-layer 34
window <action> <title> Window management tour_cli.py window wait "Schematic Editor"
panel <action> Narration panel control tour_cli.py panel start --port 8799

Highlight options

--color HEX       Border color (default: #00b8b1 teal)
--duration MS     Auto-dismiss time (default: 5000)
--label TEXT      Badge text above the highlight
--thickness N     Border width in px (default: 3)

Window actions

Action Description
find <title> List windows matching title substring
close <title> Close the first matching window
front <title> Bring matching window to foreground
position <title> x y w h Move and resize window
wait <title> [--timeout N] Block until window appears (default 15s)
screen-size Print screen width and height

Bridge commands available

Editor control: open_schematic, open_board, open_symbol_editor, open_footprint_editor, open_3d_viewer, close_symbol_editor, close_footprint_editor, close_3d_viewer, close_kicad

Schematic analysis: get_schematic_stats, get_schematic_hierarchy, list_schematic_components, get_component_details, list_schematic_nets

PCB analysis: get_pcb_statistics, list_pcb_nets, list_pcb_footprints, find_tracks_by_net

Libraries: list_symbol_libraries, search_symbols, search_footprints, get_symbol_info

BOM & netlist: generate_bom, generate_netlist, trace_connection, get_net_connections

Design checks: run_drc, run_erc

Export: export_gerber, export_pdf, export_svg, export_step, export_bom_csv

IPC layer IDs

Layer ID
F.Cu (front copper) 3
In1.Cu (inner 1) 4
In2.Cu (inner 2) 5
B.Cu (back copper) 34

DPI / Coordinate Notes

  • Screen: 2560x1600 physical, 150% DPI scaling
  • highlight.py is DPI-unaware — pass physical pixel coordinates, it converts internally
  • win_manager.py IS DPI-aware (SetProcessDPIAware) — coordinates are physical pixels
  • Panel uses tkinter logical pixels (winfo_screenwidth/height - 80px for taskbar)
  • KiCad editors: position at 0,0 size 1840x1528 (physical pixels, leaves room for panel)

Troubleshooting

Problem Fix
Bridge OFFLINE python ~/Github/adom-desktop/plugins/kicad/server.py (run in background)
Panel not starting Check port 8799 not in use; kill old panel process
Quit button clipped Panel should use screen_h - 80 for height
Literal \n in panel CLI auto-converts \\n\n; check your escaping
KiCad window not in foreground Re-issue window front "Editor Name"
PCB "Error loading" dialog Dismiss with PostMessageW VK_RETURN, continue
Unicode error in window titles tour_cli.py uses .encode("ascii","replace").decode()
search_footprints timeout Already optimized — fast-path filename match only