Adom Desktop
Public Made by Adomby adom
Installs the adom-desktop CLI and its Claude skills INTO A CLOUD CONTAINER so an AI assistant there can understand and drive Adom Desktop over the relay. This is the container side, NOT the app itself. The Adom Desktop app is the signed Windows installer under Download below: run THAT on the PC you want the AI to control. Rule of thumb: pkg install here (in your Linux container), Download there (on your Windows PC). Once installed, the AI can drive file transfer, screenshots, notifications, KiCa
KiCad bridge verbs
Drive KiCad 7/8/9/10: open designs, DRC/ERC, libraries, 3D, screenshots, lint.
Part of the Adom Desktop verb reference. Invoke as adom-desktop <verb> '<json>'.
Note: All kicad_* commands are forwarded to the KiCad bridge (port 8772). Use kicad_ format.
kicad_bridge_call
Generic passthrough: call any RPC method on the adom_bridge plugin running inside a specific KiCad exe. Picks the newest alive instance for that exe automatically (or use pid arg to pin to a specific PID). For export_svg / export_pdf use a larger timeout (default 10s; plot can take 5-15s).
Args:
exeName— required (kicad, pcbnew, eeschema, kicad-cli)method— required — see methods listparams— optional dict — method-specificpid— optional int — pin to a specific process PID (multi-instance disambiguation, v1.7.6+)timeout— optional float seconds (default 10; bump to 30-60 for exports)
Returns: {ok, result:, exeName, pid, port} OR {ok:false, errorCode:"plugin_not_running"|"rpc_error", ...}
Note: Methods (v1.7.9): introspection — ping, list_frames, get_menu_ids, wm_command{frame_index,menu_id}, get_board_info / get_schematic_info / get_open_editors. PCB graph (pcbnew only) — get_pcb_footprints, get_pcb_layers, get_pcb_nets, get_pcb_design_rules, get_pcb_tracks (start/end/width/layer/netName), get_pcb_pads (per-footprint pads with position/size/drill/netName), get_pcb_vias (position/diameter/drill/viaType/top+bottom layer), get_pcb_drawings (silk text + edge cuts + dimensions), get_pcb_zones (copper pour inventory with priority/isFilled/layers/boundingBox), get_drc_markers (existing markers from last DRC run, grouped by severity), get_footprint_connections{ref} (net-graph: pin → netName → connected (ref,pin) list). Export (pcbnew only) — export_svg / export_pdf via in-process PLOT_CONTROLLER. Library nav — navigate_symbol{symbolName} / navigate_footprint{footprintName} (filter only — does NOT load). select_and_load_symbol{symbolName, useSendInput?:false} / select_and_load_footprint{footprintName, useSendInput?:false}: filter + Down+Enter keystroke. v0.7.0+ (Phase 2.ac) adds optional useSendInput:true that escalates from wx.PostEvent to real Win32 SendInput — more reliable but briefly steals foreground. v0.8.0+ (Phase 2.ad, bridge bundled in v1.7.17) hardens the foreground acquisition: AttachThreadInput dance + SendInput mouse-click at the search ctrl's screen center, with cursor pos snapshot/restore. Pre-v0.8.0 the naive SetForegroundWindow was frequently downgraded to a taskbar flash and SendInput keystrokes landed in the terminal instead of KiCad. Pair with verify_loaded{kind,expectedName?} to confirm load succeeded (reads frame title). DRC trigger — run_drc_inprocess (posts WM_COMMAND 20088 to PCB Editor; ~2-5s; then poll get_drc_markers). Length-matching — get_track_paths_by_net{netName}. Net graph — get_net_topology{netName} returns components on the net + their other-net bridges (1-hop graph).
kicad_bridge_status
Enumerate every running KiCad GUI process that has the adom_bridge.py reverse-bridge plugin loaded. v1.7.6+ supports multi-instance disambiguation: discovery files are per-PID (adom-kicad-bridge--.json) so two pcbnew windows on two different boards each get their own row. Probes each /status to confirm live + returns the full inventory.
Args:
exeName— optional — filter to one exe (kicad / pcbnew / eeschema / kicad-cli)pid— optional int — filter to a specific PIDpruneStale— optional bool (default false) — delete discovery files whose plugin doesn't respond to /status
Returns: {ok, plugins:[{exeName, pid, port, version, endpoint, alive, uptimeMs, requestCount, discoveryFile, pruned?}], summary:{total, alive}, pluginAutoInstall:{...}, _hint}
Note: Phase 2 reverse bridge (v1.7.x+). If summary.alive=0 but you expect a running KiCad, the plugin isn't deployed — call kicad_install_plugin to force-deploy. Stale discovery files (process exited mid-session) show alive=false; pass pruneStale:true to clean them up.
kicad_click
Click at coordinates in a KiCad window
Args:
hwnd— requiredrelative— optional bool (default true, 0.0-1.0 range)x— requiredy— required
Note: Relative coords are scale-independent — estimate position as percentage from screenshot.
kicad_close
Close all KiCad windows
kicad_close_3d_viewer
Close 3D Viewer window
kicad_close_footprint_editor
Close Footprint Editor window
kicad_close_symbol_editor
Close Symbol Editor window
kicad_fix_keyboard
Release stuck modifier keys + unlock foreground focus
kicad_format_upgrade
Upgrade a KiCad file to the current format via kicad-cli. v1.7.13+. Wraps kicad-cli {pcb,sch,sym,fp} upgrade. MUTATES the file in place (kicad-cli has no --dry-run). Use kicad_lint_library/board/schematic first for inspection without write.
Args:
filePath— required file or directoryforce— optional bool (default false) — passes --force to resave even when already currentkind— optional pcb|sch|sym|fp (auto-detected from extension if omitted)
Returns: {success, exitCode, kind, stdout, stderr, source_path, _hint}
Note: Common use: lint_library reports fileFormatVersions includes old (pre-20231101) entries, surface that to the user, ask permission to upgrade, then call kicad_format_upgrade. After upgrade, ANY OPEN KiCad windows holding this file must be closed + reopened (they have stale in-memory state).
kicad_install_library
Install a symbol or footprint library
Args:
kicadVersion— optional (default = newest installed; library installs into THAT version's sym-lib-table)libraryName— optionallibraryPath— requiredlibraryType— required
kicad_install_plugin
Explicitly (re)deploy the Phase 2 reverse-bridge plugin to every detected KiCad version's USER_SITE. Use when auto-install (which runs once per bridge boot) didn't fire or you need to force a fresh deploy after updating the plugin payload.
Args:
force— optional bool (default true). If false, returns the cached auto-install result instead of redoing the work.
Returns: {ok, result:{summary, payloadVersion, perVersion:[...], runningKiCad:[...], _hint}, _hint}
Note: Idempotent — SHA256 hash compare skips a no-op deploy. If KiCad is currently running when this fires, the running processes still have the OLD plugin in memory until restart — surface result.runningKiCad to the user and tell them to close+reopen KiCad.
kicad_install_symbol
Decode base64 symbol, install as library, open editor
Args:
fileContent— required base64fileName— requiredkicadVersion— optional (default = newest installed)
kicad_lint_board
Headless lint pre-flight for a .kicad_pcb via kicad-cli. v1.7.12+. Comprehensive: file-existence + magic-byte + DRC with --severity-all + --all-track-errors + --schematic-parity (default on). USE THIS BEFORE kicad_open_board for any file you didn't just generate — catches DRC errors, parse issues, format-upgrade-needed BEFORE the GUI opens and possibly hangs on a modal dialog.
Args:
filePath— required .kicad_pcb pathschematicParity— optional bool (default true) — set false if no matching .kicad_sch exists in the project dir
Returns: {success, data:{violations[], summary:{total,errors,warnings,info}, fileFormat:{fileVersion}, schematicParityChecked, source_file}, _hint with tiered guidance}
Note: Distinct from kicad_run_drc: lint_board adds file-format sanity + schematic-parity + an AI-friendly tiered _hint that EXPLICITLY tells you to proceed / fix / upgrade based on the result. For schematic + board cross-check during a full design pass: kicad_lint_schematic FIRST (catches ERC issues at the source), THEN kicad_lint_board (catches what made it to the board).
kicad_lint_library
Validate a KiCad library file or directory before install. v1.7.13+. Accepts a single .kicad_sym, single .kicad_mod, .pretty directory, or directory containing .kicad_sym files. Parses S-expression structure (no kicad-cli call — sym/fp upgrade has no --dry-run and would rewrite files). USE BEFORE kicad_install_library / kicad_install_symbol / kicad_install_footprint for any file you didn't just generate.
Args:
libraryPath— required path to .kicad_sym / .kicad_mod / .pretty dir / dir with .kicad_sym files
Returns: {success, data:{kind, summary:{symbolCount, footprintCount, symFileErrorCount, modFileErrorCount, fileFormatVersions}, symbols:[{name,pinCount,unitCount,fileVersion,generator,path}], footprints:[{name,padCount,layers,fileVersion,generator,path}]}, _hint with tiered guidance}
Note: Detects outdated file formats (pre-KiCad-7 versions <20231101) and suggests kicad_format_upgrade. Magic-byte sniff catches wrong-file-type (e.g. .kicad_pcb mis-named .kicad_sym). Failed-parse files surface as _error rows so you can pinpoint which file in a bulk install is broken.
kicad_lint_schematic
Headless lint pre-flight for a .kicad_sch via kicad-cli. v1.7.12+. File-existence + magic-byte + ERC with --severity-all. USE THIS BEFORE kicad_open_schematic for any file you didn't just generate.
Args:
filePath— required .kicad_sch path
Returns: {success, data:{violations[], summary:{total,errors,warnings,info}, fileFormat:{fileVersion}, source_file}, _hint with tiered guidance}
Note: ERC catches schematic-only errors (unconnected pins, label mismatches, no-driver nets). For board-level validation use kicad_lint_board. Lint schematic FIRST so you fix issues at their source — DRC may surface them differently downstream.
kicad_list_versions
List every installed KiCad version with paths. Returns versions:[{version, base_dir, kicad_exe, default}], default, count.
Note: Run this first if you're not sure which versions are installed. Pass the desired version as kicadVersion on any open_* command to override the default (newest).
kicad_open_3d_viewer
Open KiCad 3D Viewer (board or footprint).
Args:
editor— optional: "auto" (default) | "pcb"|"board" (the PCB's 3D view) | "fp"|"footprint". "auto" prefers the PCB/board viewer when BOTH the PCB and Footprint editors are open — so you do NOT need to close sub-editors to see the board in 3D. Pass editor="pcb" to force the board, editor="fp" for the active footprint.kicadVersion— optional (default = newest installed)
kicad_open_board
Open .kicad_pcb in PCB editor
Args:
filePath— requiredkicadVersion— optional (e.g. "9.0" or "10.0"; default = newest installed)
kicad_open_editors
Cross-process inventory of every open KiCad editor frame, sourced via the reverse bridge (NOT screen scraping). Hits each alive plugin's get_open_editors method and concatenates. Replaces the kicad_window_info screenshot-poll pattern for the common case.
Returns: {ok, editors:[{kind, exeName, pid, frameTitle, hwnd, isShown}], byKind:{schematic_editor:[...], pcb_editor:[...], symbol_editor:[...], footprint_editor:[...], project_manager:[...]}, summary:{totalEditors, probedPlugins, failedPlugins, byKindCounts}, _hint}
Note: v1.7.6+. If totalEditors=0 but the user has KiCad open, the plugins likely aren't deployed or KiCad was launched before plugin install. Use kicad_bridge_status to confirm, kicad_install_plugin to deploy, then ask user to restart KiCad.
kicad_open_footprint_editor
Open Footprint Editor
Args:
footprintName— optionalkicadVersion— optional (default = newest installed)libraryName— optional
kicad_open_schematic
Open .kicad_sch in schematic editor
Args:
filePath— requiredkicadVersion— optional (e.g. "9.0" or "10.0"; default = newest installed)
kicad_open_symbol_editor
Open Symbol Editor
Args:
kicadVersion— optional (default = newest installed)libraryName— optionalsymbolName— optional
kicad_run_drc
Run Design Rule Check on a PCB via kicad-cli (headless, fast, structured JSON). Equivalent to right-clicking DRC in pcbnew but no GUI. Returns {data:{violations[], summary:{total,errors,warnings}}}.
Args:
filePath— requiredkicadVersion— optional (default = newest installed)
Note: v1.7.12+ ships kicad_lint_board with the same DRC + file-format checks + schematic-parity in one structured response — prefer it over kicad_run_drc for new code.
kicad_run_erc
Run Electrical Rule Check on a .kicad_sch via kicad-cli. v1.7.12+. Mirrors kicad_run_drc but for schematics — catches unconnected pins, duplicate references, hierarchical-label mismatches, no-driver nets, etc. Headless, ~1-3s, structured JSON.
Args:
filePath— required .kicad_sch path
Returns: {success, data:{violations[], summary:{total,errors,warnings,info}, fileFormat:{fileVersion}, source_file}, _hint guiding next steps}
kicad_screenshot_all
Screenshot all KiCad windows in one shot
Returns: Array of {type, title, hwnd, savedTo, sizeKB}
Note: Images downscaled to max 1568px. Use relative coords (0.0-1.0) for clicking — they map to actual window size regardless of image scale.
kicad_send_key
Send keystroke to KiCad window. Supports modifier combos.
Args:
hwnd— optional target HWNDkey— required: a named key (enter/escape/tab/space/f1-f12), a single char, OR a modifier combo like "ctrl+s", "alt+3", "shift+f10", "ctrl+shift+s". Modifiers: ctrl/control, alt/menu, shift, win/super. Case-insensitive.
Note: Menu hotkeys work via combos (e.g. "alt+3" = View>3D Viewer in pcbnew, "ctrl+s" = save). For dialogs prefer 'enter'/'escape'. Use click only if tab order doesn't reach the button.
kicad_window_info
List all KiCad windows (project manager, editors, dialogs) with HWNDs and rects
# KiCad bridge verbs
Drive KiCad 7/8/9/10: open designs, DRC/ERC, libraries, 3D, screenshots, lint.
_Part of the [Adom Desktop verb reference](VERB-REFERENCE.md). Invoke as `adom-desktop <verb> '<json>'`._
> **Note:** All kicad_* commands are forwarded to the KiCad bridge (port 8772). Use kicad_<command> format.
### `kicad_bridge_call`
Generic passthrough: call any RPC method on the adom_bridge plugin running inside a specific KiCad exe. Picks the newest alive instance for that exe automatically (or use pid arg to pin to a specific PID). For export_svg / export_pdf use a larger timeout (default 10s; plot can take 5-15s).
**Args:**
- `exeName` — required (kicad, pcbnew, eeschema, kicad-cli)
- `method` — required — see methods list
- `params` — optional dict — method-specific
- `pid` — optional int — pin to a specific process PID (multi-instance disambiguation, v1.7.6+)
- `timeout` — optional float seconds (default 10; bump to 30-60 for exports)
**Returns:** {ok, result:<rpc result>, exeName, pid, port} OR {ok:false, errorCode:"plugin_not_running"|"rpc_error", ...}
**Note:** Methods (v1.7.9): introspection — ping, list_frames, get_menu_ids, wm_command{frame_index,menu_id}, get_board_info / get_schematic_info / get_open_editors. PCB graph (pcbnew only) — get_pcb_footprints, get_pcb_layers, get_pcb_nets, get_pcb_design_rules, get_pcb_tracks (start/end/width/layer/netName), get_pcb_pads (per-footprint pads with position/size/drill/netName), get_pcb_vias (position/diameter/drill/viaType/top+bottom layer), get_pcb_drawings (silk text + edge cuts + dimensions), get_pcb_zones (copper pour inventory with priority/isFilled/layers/boundingBox), get_drc_markers (existing markers from last DRC run, grouped by severity), get_footprint_connections{ref} (net-graph: pin → netName → connected (ref,pin) list). Export (pcbnew only) — export_svg / export_pdf via in-process PLOT_CONTROLLER. Library nav — navigate_symbol{symbolName} / navigate_footprint{footprintName} (filter only — does NOT load). select_and_load_symbol{symbolName, useSendInput?:false} / select_and_load_footprint{footprintName, useSendInput?:false}: filter + Down+Enter keystroke. v0.7.0+ (Phase 2.ac) adds optional useSendInput:true that escalates from wx.PostEvent to real Win32 SendInput — more reliable but briefly steals foreground. v0.8.0+ (Phase 2.ad, bridge bundled in v1.7.17) hardens the foreground acquisition: AttachThreadInput dance + SendInput mouse-click at the search ctrl's screen center, with cursor pos snapshot/restore. Pre-v0.8.0 the naive SetForegroundWindow was frequently downgraded to a taskbar flash and SendInput keystrokes landed in the terminal instead of KiCad. Pair with verify_loaded{kind,expectedName?} to confirm load succeeded (reads frame title). DRC trigger — run_drc_inprocess (posts WM_COMMAND 20088 to PCB Editor; ~2-5s; then poll get_drc_markers). Length-matching — get_track_paths_by_net{netName}. Net graph — get_net_topology{netName} returns components on the net + their other-net bridges (1-hop graph).
### `kicad_bridge_status`
Enumerate every running KiCad GUI process that has the adom_bridge.py reverse-bridge plugin loaded. v1.7.6+ supports multi-instance disambiguation: discovery files are per-PID (adom-kicad-bridge-<exe>-<pid>.json) so two pcbnew windows on two different boards each get their own row. Probes each /status to confirm live + returns the full inventory.
**Args:**
- `exeName` — optional — filter to one exe (kicad / pcbnew / eeschema / kicad-cli)
- `pid` — optional int — filter to a specific PID
- `pruneStale` — optional bool (default false) — delete discovery files whose plugin doesn't respond to /status
**Returns:** {ok, plugins:[{exeName, pid, port, version, endpoint, alive, uptimeMs, requestCount, discoveryFile, pruned?}], summary:{total, alive}, pluginAutoInstall:{...}, _hint}
**Note:** Phase 2 reverse bridge (v1.7.x+). If summary.alive=0 but you expect a running KiCad, the plugin isn't deployed — call kicad_install_plugin to force-deploy. Stale discovery files (process exited mid-session) show alive=false; pass pruneStale:true to clean them up.
### `kicad_click`
Click at coordinates in a KiCad window
**Args:**
- `hwnd` — required
- `relative` — optional bool (default true, 0.0-1.0 range)
- `x` — required
- `y` — required
**Note:** Relative coords are scale-independent — estimate position as percentage from screenshot.
### `kicad_close`
Close all KiCad windows
### `kicad_close_3d_viewer`
Close 3D Viewer window
### `kicad_close_footprint_editor`
Close Footprint Editor window
### `kicad_close_symbol_editor`
Close Symbol Editor window
### `kicad_fix_keyboard`
Release stuck modifier keys + unlock foreground focus
### `kicad_format_upgrade`
Upgrade a KiCad file to the current format via kicad-cli. v1.7.13+. Wraps `kicad-cli {pcb,sch,sym,fp} upgrade`. MUTATES the file in place (kicad-cli has no --dry-run). Use kicad_lint_library/board/schematic first for inspection without write.
**Args:**
- `filePath` — required file or directory
- `force` — optional bool (default false) — passes --force to resave even when already current
- `kind` — optional pcb|sch|sym|fp (auto-detected from extension if omitted)
**Returns:** {success, exitCode, kind, stdout, stderr, source_path, _hint}
**Note:** Common use: lint_library reports fileFormatVersions includes old (pre-20231101) entries, surface that to the user, ask permission to upgrade, then call kicad_format_upgrade. After upgrade, ANY OPEN KiCad windows holding this file must be closed + reopened (they have stale in-memory state).
### `kicad_install_library`
Install a symbol or footprint library
**Args:**
- `kicadVersion` — optional (default = newest installed; library installs into THAT version's sym-lib-table)
- `libraryName` — optional
- `libraryPath` — required
- `libraryType` — required
### `kicad_install_plugin`
Explicitly (re)deploy the Phase 2 reverse-bridge plugin to every detected KiCad version's USER_SITE. Use when auto-install (which runs once per bridge boot) didn't fire or you need to force a fresh deploy after updating the plugin payload.
**Args:**
- `force` — optional bool (default true). If false, returns the cached auto-install result instead of redoing the work.
**Returns:** {ok, result:{summary, payloadVersion, perVersion:[...], runningKiCad:[...], _hint}, _hint}
**Note:** Idempotent — SHA256 hash compare skips a no-op deploy. If KiCad is currently running when this fires, the running processes still have the OLD plugin in memory until restart — surface result.runningKiCad to the user and tell them to close+reopen KiCad.
### `kicad_install_symbol`
Decode base64 symbol, install as library, open editor
**Args:**
- `fileContent` — required base64
- `fileName` — required
- `kicadVersion` — optional (default = newest installed)
### `kicad_lint_board`
Headless lint pre-flight for a .kicad_pcb via kicad-cli. v1.7.12+. Comprehensive: file-existence + magic-byte + DRC with --severity-all + --all-track-errors + --schematic-parity (default on). USE THIS BEFORE kicad_open_board for any file you didn't just generate — catches DRC errors, parse issues, format-upgrade-needed BEFORE the GUI opens and possibly hangs on a modal dialog.
**Args:**
- `filePath` — required .kicad_pcb path
- `schematicParity` — optional bool (default true) — set false if no matching .kicad_sch exists in the project dir
**Returns:** {success, data:{violations[], summary:{total,errors,warnings,info}, fileFormat:{fileVersion}, schematicParityChecked, source_file}, _hint with tiered guidance}
**Note:** Distinct from kicad_run_drc: lint_board adds file-format sanity + schematic-parity + an AI-friendly tiered _hint that EXPLICITLY tells you to proceed / fix / upgrade based on the result. For schematic + board cross-check during a full design pass: kicad_lint_schematic FIRST (catches ERC issues at the source), THEN kicad_lint_board (catches what made it to the board).
### `kicad_lint_library`
Validate a KiCad library file or directory before install. v1.7.13+. Accepts a single .kicad_sym, single .kicad_mod, .pretty directory, or directory containing .kicad_sym files. Parses S-expression structure (no kicad-cli call — sym/fp upgrade has no --dry-run and would rewrite files). USE BEFORE kicad_install_library / kicad_install_symbol / kicad_install_footprint for any file you didn't just generate.
**Args:**
- `libraryPath` — required path to .kicad_sym / .kicad_mod / .pretty dir / dir with .kicad_sym files
**Returns:** {success, data:{kind, summary:{symbolCount, footprintCount, symFileErrorCount, modFileErrorCount, fileFormatVersions}, symbols:[{name,pinCount,unitCount,fileVersion,generator,path}], footprints:[{name,padCount,layers,fileVersion,generator,path}]}, _hint with tiered guidance}
**Note:** Detects outdated file formats (pre-KiCad-7 versions <20231101) and suggests kicad_format_upgrade. Magic-byte sniff catches wrong-file-type (e.g. .kicad_pcb mis-named .kicad_sym). Failed-parse files surface as _error rows so you can pinpoint which file in a bulk install is broken.
### `kicad_lint_schematic`
Headless lint pre-flight for a .kicad_sch via kicad-cli. v1.7.12+. File-existence + magic-byte + ERC with --severity-all. USE THIS BEFORE kicad_open_schematic for any file you didn't just generate.
**Args:**
- `filePath` — required .kicad_sch path
**Returns:** {success, data:{violations[], summary:{total,errors,warnings,info}, fileFormat:{fileVersion}, source_file}, _hint with tiered guidance}
**Note:** ERC catches schematic-only errors (unconnected pins, label mismatches, no-driver nets). For board-level validation use kicad_lint_board. Lint schematic FIRST so you fix issues at their source — DRC may surface them differently downstream.
### `kicad_list_versions`
List every installed KiCad version with paths. Returns versions:[{version, base_dir, kicad_exe, default}], default, count.
**Note:** Run this first if you're not sure which versions are installed. Pass the desired version as kicadVersion on any open_* command to override the default (newest).
### `kicad_open_3d_viewer`
Open KiCad 3D Viewer (board or footprint).
**Args:**
- `editor` — optional: "auto" (default) | "pcb"|"board" (the PCB's 3D view) | "fp"|"footprint". "auto" prefers the PCB/board viewer when BOTH the PCB and Footprint editors are open — so you do NOT need to close sub-editors to see the board in 3D. Pass editor="pcb" to force the board, editor="fp" for the active footprint.
- `kicadVersion` — optional (default = newest installed)
### `kicad_open_board`
Open .kicad_pcb in PCB editor
**Args:**
- `filePath` — required
- `kicadVersion` — optional (e.g. "9.0" or "10.0"; default = newest installed)
### `kicad_open_editors`
Cross-process inventory of every open KiCad editor frame, sourced via the reverse bridge (NOT screen scraping). Hits each alive plugin's get_open_editors method and concatenates. Replaces the kicad_window_info screenshot-poll pattern for the common case.
**Returns:** {ok, editors:[{kind, exeName, pid, frameTitle, hwnd, isShown}], byKind:{schematic_editor:[...], pcb_editor:[...], symbol_editor:[...], footprint_editor:[...], project_manager:[...]}, summary:{totalEditors, probedPlugins, failedPlugins, byKindCounts}, _hint}
**Note:** v1.7.6+. If totalEditors=0 but the user has KiCad open, the plugins likely aren't deployed or KiCad was launched before plugin install. Use kicad_bridge_status to confirm, kicad_install_plugin to deploy, then ask user to restart KiCad.
### `kicad_open_footprint_editor`
Open Footprint Editor
**Args:**
- `footprintName` — optional
- `kicadVersion` — optional (default = newest installed)
- `libraryName` — optional
### `kicad_open_schematic`
Open .kicad_sch in schematic editor
**Args:**
- `filePath` — required
- `kicadVersion` — optional (e.g. "9.0" or "10.0"; default = newest installed)
### `kicad_open_symbol_editor`
Open Symbol Editor
**Args:**
- `kicadVersion` — optional (default = newest installed)
- `libraryName` — optional
- `symbolName` — optional
### `kicad_run_drc`
Run Design Rule Check on a PCB via kicad-cli (headless, fast, structured JSON). Equivalent to right-clicking DRC in pcbnew but no GUI. Returns {data:{violations[], summary:{total,errors,warnings}}}.
**Args:**
- `filePath` — required
- `kicadVersion` — optional (default = newest installed)
**Note:** v1.7.12+ ships kicad_lint_board with the same DRC + file-format checks + schematic-parity in one structured response — prefer it over kicad_run_drc for new code.
### `kicad_run_erc`
Run Electrical Rule Check on a .kicad_sch via kicad-cli. v1.7.12+. Mirrors kicad_run_drc but for schematics — catches unconnected pins, duplicate references, hierarchical-label mismatches, no-driver nets, etc. Headless, ~1-3s, structured JSON.
**Args:**
- `filePath` — required .kicad_sch path
**Returns:** {success, data:{violations[], summary:{total,errors,warnings,info}, fileFormat:{fileVersion}, source_file}, _hint guiding next steps}
### `kicad_screenshot_all`
Screenshot all KiCad windows in one shot
**Returns:** Array of {type, title, hwnd, savedTo, sizeKB}
**Note:** Images downscaled to max 1568px. Use relative coords (0.0-1.0) for clicking — they map to actual window size regardless of image scale.
### `kicad_send_key`
Send keystroke to KiCad window. Supports modifier combos.
**Args:**
- `hwnd` — optional target HWND
- `key` — required: a named key (enter/escape/tab/space/f1-f12), a single char, OR a modifier combo like "ctrl+s", "alt+3", "shift+f10", "ctrl+shift+s". Modifiers: ctrl/control, alt/menu, shift, win/super. Case-insensitive.
**Note:** Menu hotkeys work via combos (e.g. "alt+3" = View>3D Viewer in pcbnew, "ctrl+s" = save). For dialogs prefer 'enter'/'escape'. Use click only if tab order doesn't reach the button.
### `kicad_window_info`
List all KiCad windows (project manager, editors, dialogs) with HWNDs and rects