app
KiCad - the KiCad Bridge
Public Made by Adomby adom
Drive your own KiCad from an AI, in the background: open every editor, read the whole board as data (the EDA Bridge Standard board model), stack-up, part heights, netlists, place, route, pour, DRC and exports.
← Commit history
1.0.90: 1.0.90: four more of the standard's verbs (#29: every standard verb answered on every bridge).
- **kicad_swap_footprint (new; the standard's swap_footprint):** puts another library footprint on one placed part.
- The part keeps its position, rotation, side, reference, fields, schematic link, DNP/BOM flags and lock.
- Pads keep their nets by number, and assigns ("9=GND") sets nets on any pad. The reply lists the pads whose net was kept and any pad left without a net.
- Checked: C1 on a copy of KiCad's pic_programmer demo went from an axial to a radial capacitor with both nets kept, and KiCad's DRC is clean.
- **kicad_plate_vias (new; the standard's plate_vias):** in a footprint library, every drilled pad becomes a plated hole through every copper layer when it isn't one already: a thru_hole pad on only some copper layers, or an smd pad with a drill (thermal vias written as surface pads).
- Numbered unplated holes are listed, and plated only with includeNpth. Running it again changes nothing.
- **kicad_normalize_bodies (new; the standard's normalize_bodies):** moves a footprint's 3D model onto its pad cluster (by its offset) when the body sits more than minShiftMm from the pads' centre. Models already on their pads are left alone.
- Checked: a SOIC-8 whose STEP sat 50 mm away was moved back onto its pads.
- **kicad_symbol_mode (new; the standard's symbol_mode):** one body style of a library symbol as a picture, plotted by KiCad: mode 0 the standard body, mode 1 the De Morgan alternate, per unit.
- Checked: 74LS00 in mode 1 shows the OR body with inverted inputs. A symbol with no De Morgan body refuses mode 1.
- The standard's Altium-only verbs (licence, sign-in, agent, extension, symbol-mode specs, cleanup) are now answered in KiCad's equivalents: mapped where KiCad has the job, otherwise unsupported with the reason. panel maps to kicad_send_key's View > Panels toggle; activate_document maps to kicad_open_board and kicad_open_schematic.
- **The standard's Altium-only verbs now exist in KiCad and refuse with not_supported**, each with the reason and what to call instead. They are add_symbol_art, cleanup_libs, build_symbol_modes, license, signin, connect_workspace, agent_start/stop/status/recover, selftest_script_error, extension_ping, install_extension and install_receipt.
- An AI that calls kicad_license learns that KiCad is GPL with no licence page (instead: kicad_license_status) rather than meeting unknown_verb.
1 file changed
+21−3
README.md+21−3@@ -257,7 +257,7 @@ viewer. This is how every 3D shot above exists. <!-- verbs:start (tools/readme_verbs.py writes this) --> -Every verb of this build (301, `kicad_describe` is the live catalog with inputs, hints and pitfalls). A name marked *standard* is the EDA Bridge Standard's name for the verb after the arrow.+Every verb of this build (319, `kicad_describe` is the live catalog with inputs, hints and pitfalls). A name marked *standard* is the EDA Bridge Standard's name for the verb after the arrow. **Board model and reads (EDA Bridge Standard)** (12) @@ -322,7 +322,7 @@ Every verb of this build (301, `kicad_describe` is the live catalog with inputs, | `kicad_sch_zoom` | Find parts on a schematic sheet and frame them: where each sits (mm), which are not on the sheet, and a proof frame: KiCad's own plot of the sheet cropped to the parts, each outlined. The schematic half of cross-probing (kicad_zoom_to is the board half). | | `kicad_update_pcb` | *standard* → `kicad_update_pcb_from_schematic` | -**Symbols, footprints and libraries** (32)+**Symbols, footprints and libraries** (34) | Verb | What it does | |---|---|@@ -335,10 +335,12 @@ Every verb of this build (301, `kicad_describe` is the live catalog with inputs, | `kicad_fp_create` | Write a new footprint (.kicad_mod, KiCad 10) into a .pretty folder from a pad list: courtyard generated with a margin, fab outline, silkscreen box clear of the pads with a pin-1 dot, reference and value text, optional 3D model. | | `kicad_fp_edit` | Edit a .kicad_mod in place: edit, delete, add or renumber pads; append, replace or delete graphics on a layer (line, arc, rect, circle, poly); set description, tags and attributes; replace, append or delete 3D models (path, offset, scale, rotate). Everything not edited stays byte-identical. | | `kicad_fp_info` | Full details of one footprint: pads (number, type, shape, position, size, drill, layers), layers used, courtyard box, graphics per layer, attributes, properties and 3D models. |+| `kicad_install_extension` | Install the bridge's extension into the tool (the standard's install_extension). Not in KiCad: KiCad needs no extension installed inside it: its IPC API is built in, so there is nothing to install, ping or keep a receipt for. | | `kicad_install_footprint` | Write a .kicad_mod into the global Adom.pretty footprint library, register it in fp-lib-table, optionally install and wire a 3D model. | | `kicad_install_library` | Register a symbol/footprint library in the user's sym-/fp-lib-table (footprint installs also carry a bundle's 3D models). | | `kicad_install_library_bundle` | Install an Adom wiki Cloud Library bundle zip (symbols + footprints + 3D models) in one call. | | `kicad_install_plugin` | Retired: the native bridge installs no Python plugin into KiCad. Returns success with nothing to do so old scripts keep working. |+| `kicad_install_receipt` | The last extension install's receipt (the standard's install_receipt). Not in KiCad: KiCad needs no extension installed inside it: its IPC API is built in, so there is nothing to install, ping or keep a receipt for. | | `kicad_install_symbol` | Merge the symbol(s) of a .kicad_sym into the single global Adom library (Adom.kicad_sym), creating and registering it on first use. | | `kicad_lint_library` | Lint a symbol/footprint library: the bridge's structural check, KiCad's own verdict (kicad-cli), and the standard's content rules (pads, courtyard, origin, silkscreen, 3D body, description; pins, footprint link, pins against pads, part number), each finding with its rule and severity. | | `kicad_list_footprints` | What footprints actually exist, per library: the fp-lib-table (URIs expanded, stock libraries included) plus unregistered .pretty folders in the user dir. |@@ -469,13 +471,18 @@ Every verb of this build (301, `kicad_describe` is the live catalog with inputs, | `kicad_project_rename` | Rename a project: the .kicad_pro, root .kicad_sch, .kicad_pcb, .kicad_prl (and .kicad_dru, backups folder), with the references inside updated (project file entries, every schematic's instance headers, the board's sheet references and title). Refused while KiCad has the project open. | | `kicad_project_snapshot` | Timestamped copy of the project's files into <project>/snapshots/<stamp>[-label]/, plus schematic and board PDFs made with kicad-cli. | -**Windows, editors, install and the bridge** (126)+**Windows, editors, install and the bridge** (142) | Verb | What it does | |---|---| | `kicad_3d_view` | Drive the 3D Viewer without the mouse: zoom, rotate, view orientation, flip, or a scripted tour; menu commands posted to the viewer in the background. | | `kicad_3d_viewer_settings` | Read or set the 3D viewer's model-visibility toggles (SMD, through-hole, virtual, not-in-POS, DNP) that can hide every chip body. | | `kicad_add_body` | Put a 3D body (a STEP or VRML model) on a library footprint. It REPLACES the footprint's models unless keepExisting:true, so a re-import never stacks a second body. |+| `kicad_add_symbol_art` | Draw adom-symbol's chip outline into a symbol (the standard's add_symbol_art). Not in KiCad: The chip outline is baked into the KiCad symbol itself by adom-symbol: KiCad shows it with no second copy to draw (Altium needs this because its symbol is rebuilt from KiCad's). |+| `kicad_agent_recover` | Recover a halted script agent (the standard's agent_recover). Not in KiCad: KiCad has no resident script agent to manage: the bridge reaches KiCad through kicad-cli, its built-in IPC API and KiCad's own Python per call, so there is nothing to start, stop, check or recover. |+| `kicad_agent_start` | Start the tool's resident script agent (the standard's agent_start). Not in KiCad: KiCad has no resident script agent to manage: the bridge reaches KiCad through kicad-cli, its built-in IPC API and KiCad's own Python per call, so there is nothing to start, stop, check or recover. |+| `kicad_agent_status` | Report the tool's resident script agent (the standard's agent_status). Not in KiCad: KiCad has no resident script agent to manage: the bridge reaches KiCad through kicad-cli, its built-in IPC API and KiCad's own Python per call, so there is nothing to start, stop, check or recover. |+| `kicad_agent_stop` | Stop the tool's resident script agent (the standard's agent_stop). Not in KiCad: KiCad has no resident script agent to manage: the bridge reaches KiCad through kicad-cli, its built-in IPC API and KiCad's own Python per call, so there is nothing to start, stop, check or recover. | | `kicad_align_parts` | *standard* → `kicad_align_footprints` | | `kicad_analyze_connections` | Connectivity overview: suspected-unconnected pins, power nets, highest-fanout nets/components (read-only). | | `kicad_animate_view` | Camera choreography on the open board, run inside the bridge so the timing is tight enough to narrate over: zooms on the PCB editor (KiCad's own actions through its API), and in the 3D Viewer orbits, rolls, views, pans and flips (its View-menu commands), all in the background. |@@ -487,8 +494,10 @@ Every verb of this build (301, `kicad_describe` is the live catalog with inputs, | `kicad_bridge_status` | Retired: the in-KiCad Python plugin (reverse bridge) is not part of the native bridge. Reports that, plus what replaced each of its jobs. | | `kicad_build_board` | Build a NEW board from a parts list and a netlist: the outline (a rectangle with rounded corners allowed, or a polygon), every footprint from its library placed by its own origin, pad nets assigned, saved; then read back pin by pin. | | `kicad_build_schematic` | Draw a design's schematic from its netlist with library symbols, as a new sheet (and project): one column per block, every part placed, a wire stub and a net label on every connected pin, the title block filled; then KiCad's netlist of it checked against the nets given, pin by pin, and ERC run. |+| `kicad_build_symbol_modes` | Build a symbol with N display modes from a symbol_modes spec (the standard's build_symbol_modes). Not in KiCad: KiCad symbols have two body styles (standard and De Morgan), not N display modes, and nothing in KiCad reads Altium's symbol_modes spec. | | `kicad_check_for_updates` | Read-only: installed KiCad vs latest stable. | | `kicad_check_orientation` | Advisory: two-pad parts whose rotation could be better. Each part is scored at 0, 90, 180 and 270 degrees by airline length (a net's spanning tree, or for a plane-like net the distance to its nearest pad); parts whose best turn saves minImprovementMm are listed. Nothing is moved. |+| `kicad_cleanup_libs` | Remove a new library's factory-default stray part (the standard's cleanup_libs). Not in KiCad: A new KiCad library starts empty, so there is no factory-default stray to remove. | | `kicad_click` | Click at coordinates inside a KiCad window. | | `kicad_clone_symbol` | Copy a symbol inside a .kicad_sym under a new name, every unit and body style included. | | `kicad_close` | Close KiCad (editors first, then the project manager). |@@ -497,6 +506,7 @@ Every verb of this build (301, `kicad_describe` is the live catalog with inputs, | `kicad_close_symbol_editor` | Close the Symbol Editor window. | | `kicad_compile` | Check a project's schematic the way a compile does: KiCad's ERC on the root sheet (hierarchy followed) and the netlist, with the messages counted by class and the net and part counts. | | `kicad_component_classes` | List, make or remove component classes on the board (KiCad 9+), each optionally with a room: a rule area that keeps the class's parts together (fitted around their pads or a rectangle), enforced by a custom DRC rule. The classes scope rules (A.hasComponentClass('<name>')) and group a channel for kicad_replicate_layout. |+| `kicad_connect_workspace` | Connect the tool to a cloud workspace (the standard's connect_workspace). Not in KiCad: KiCad has no cloud workspace to connect to. | | `kicad_copper_balance` | Copper per layer as a share of the board, poured copper included, and how evenly mirrored layers match (F.Cu against B.Cu, In1 against the last inner layer): a pair that differs by more than 20 points can bow or twist through reflow. | | `kicad_copy_footprint` | Duplicate a footprint inside a .pretty library under a new name (every pad, graphic, text and 3D model copied). | | `kicad_create_part_project` | *standard* → `kicad_make_part_project` |@@ -511,6 +521,7 @@ Every verb of this build (301, `kicad_describe` is the live catalog with inputs, | `kicad_edit_parts` | *standard* → `kicad_edit_footprint` | | `kicad_enable_software_opengl` | LAST-RESORT fallback: deploy Mesa llvmpipe software OpenGL into KiCad's bin so it renders on a GPU-less host (Hyper-V/RDP/headless). SLOW (CPU). Never suggest proactively. | | `kicad_eval` | Run a Python snippet with KiCad's pcbnew module, headless: with filePath the board is loaded as `board`; set `result` to return a value as JSON. |+| `kicad_extension_ping` | Ping the bridge's extension inside the tool (the standard's extension_ping). Not in KiCad: KiCad needs no extension installed inside it: its IPC API is built in, so there is nothing to install, ping or keep a receipt for. | | `kicad_extract_netlist` | Extract the full netlist from a schematic: every component and every net with its nodes (read-only, via kicad-cli). | | `kicad_find_connections` | Everything one component connects to, pin by pin, with peer pins per net (read-only). | | `kicad_find_space` | Free spots on the board for a part near another: clear of every other part's courtyard on that side, of that side's tracks and vias, and inside the outline, nearest first. check:true lists parts that already overlap or leave the outline. |@@ -527,12 +538,14 @@ Every verb of this build (301, `kicad_describe` is the live catalog with inputs, | `kicad_layers` | The board's whole layer set: KiCad's id, name, kind (signal, power, mixed, user) and the user's name for each, and whether the open PCB editor shows it. | | `kicad_length_tune` | Lengthen a routed net to a target length, or to match another net (a pair's skew, a DDR byte lane): a serpentine in its longest straight track that has room beside it, the bumps sized to add exactly the length missing, every bump clear of other copper and inside the board. Live as one Undo step after a DRC check, else in the closed file. | | `kicad_library_views` | Pictures of library parts for review, each as an image file: the schematic symbol, the footprint (pads with their numbers), the 3D body seated on the footprint, and the device view (every symbol pin mapped to a pad). |+| `kicad_license` | Drive the tool's licence page (the standard's license). Not in KiCad: KiCad is GPL-3.0-or-later and has no licence page to drive. | | `kicad_license_status` | What licence KiCad is on, in plain words: KiCad is free, open-source software (GPL-3.0-or-later), so there is no seat, sign-in or trial; with the installed version. | | `kicad_list_installed_libraries` | Every symbol and footprint library KiCad loads: the global tables and, with projectPath, the project's own, with nickname, path and whether the path exists. | | `kicad_list_versions` | Every KiCad install found (registry and standard folders) with bin dir, kicad-cli path and version. | | `kicad_log_tail` | New KiCad log output since a byte offset: what KiCad said about ITSELF (read-only). | | `kicad_menu_items` | List a KiCad window's menu bar items (path, id, accelerator), optionally filtered by a substring: what kicad_send_key {menu} and kicad_3d_view can fire. | | `kicad_net_lengths` | Routed length of every net (or the ones named) by layer, with its vias; the skew inside each differential pair; and the spread of matched-length groups against a tolerance. |+| `kicad_normalize_bodies` | Move each 3D model of a footprint library (or one footprint) onto its pad cluster when its body sits more than minShiftMm from the pads' centre, by its offset; models already on their pads are left alone. | | `kicad_open_3d_viewer` | Open the 3D board viewer for a .kicad_pcb. | | `kicad_open_board` | Open a .kicad_pcb in the PCB editor (pcbnew). | | `kicad_open_editors` | List currently open KiCad editor windows. |@@ -546,6 +559,7 @@ Every verb of this build (301, `kicad_describe` is the live catalog with inputs, | `kicad_place_on_sch` | Place one symbol or a ';' list of symbols from a .kicad_sym on ONE new sheet, sized from the measured parts (12.7 mm gaps, 15.24 mm margins, A4 at least), each with the next free designator and its name as the value; fills the title block. | | `kicad_placement_check` | A placement review before routing: parts whose pads and 3D bodies come closer than a margin on the same side, parts off the board or over its edge, pads too close to the edge for assembly and depanelling, and parts on a mounting hole. | | `kicad_plan_route` | Plan a path for one net between two pads without changing the board: a grid search around the existing copper that keeps the clearance rules, on the allowed copper layers, with vias where they help. Answered as kicad_route_net's own arguments. |+| `kicad_plate_vias` | Make every drilled pad in a footprint library a plated hole through every copper layer (thru_hole, *.Cu *.Mask): a thru_hole pad on only some copper layers, or an smd pad with a drill (thermal vias written as surface pads). Numbered unplated holes are listed, and plated only with includeNpth. | | `kicad_plugin_diagnose` | Retired: reports that no plugin is expected and whether a leftover Python plugin payload is still on disk. | | `kicad_prewarm` | Get this machine ready for a fast first KiCad call: detect KiCad, seed its first-run config, mark its setup wizard done, repair its taskbar shortcuts. Idempotent. | | `kicad_progress` | What this bridge is doing RIGHT NOW: one progress block per in-flight phase for THIS caller (stepLabel, percent, etaSec, confidence, blockedBy, stepShot), plus the machine's timing history. |@@ -565,6 +579,7 @@ Every verb of this build (301, `kicad_describe` is the live catalog with inputs, | `kicad_ripup_nets` | Delete every unlocked track, arc and via of the named nets live, as one Undo step (pads, pours and locked copper stay). | | `kicad_schematic_review` | Review the schematic before updating the board: every pin (with its electrical type) against KiCad's own netlist of the design. Errors: power pins on no net, outputs driving each other. Warnings: pins on no net, one-pin nets, inputs nothing drives, IC supplies with no decoupling capacitor to ground. | | `kicad_screenshot_all` | Screenshot every open KiCad window. |+| `kicad_selftest_script_error` | Self-test the script-error safety net (the standard's selftest_script_error). Not in KiCad: KiCad runs no resident script engine to test: a failing kicad_eval snippet already comes back as eval_failed with its traceback. | | `kicad_send_key` | Send a key to KiCad, or fire a menu item by label; chords and menu labels resolve to menu commands (background) | | `kicad_set_layer_visibility` | Show or hide one layer in the open PCB editor (KiCad's own layer visibility, through its API), read back. | | `kicad_set_params` | Set parameters on a library symbol (fields; a missing one is added hidden), optionally its value (the standard's comment) and its footprint link. |@@ -579,12 +594,15 @@ Every verb of this build (301, `kicad_describe` is the live catalog with inputs, | `kicad_show_project` | Show the whole electronics PROJECT: the KiCad Project Manager (top of the design tree). | | `kicad_show_schematic` | Show a schematic (2D) in the Schematic Editor. | | `kicad_show_symbol` | Show a schematic symbol in the Symbol Editor (design/library surface). |+| `kicad_signin` | Sign in to the tool's account (the standard's signin). Not in KiCad: KiCad has no account to sign in to. | | `kicad_silk_designators` | Place every reference designator the way assembly houses want: one size, upright, beside its own part, clear of every pad (JLCPCB: 0.15 mm), every other part's body and the other designators, inside the board, then read back from KiCad. Parts with no clear spot are reported, not forced onto pads. | | `kicad_silk_state` | The silkscreen as it stands: every part's body box, its designator and value as placed (text, position, size, rotation, shown), and the free texts and graphics on both silkscreen layers. | | `kicad_silkscreen_prep` | Get the silkscreen off the copper for fab: the Gerbers set to subtract the solder mask from the silkscreen (KiCad's own clipping), silkscreen lying outside the board deleted, designators that sit on pads moved beside their parts, and KiCad's silkscreen DRC findings counted before and after. | | `kicad_simulate` | Simulate a schematic with SPICE, headless: KiCad's netlist of the sheet run by the ngspice library KiCad installs, with the analysis you give (transient, AC, DC sweep, operating point) or the one the schematic carries, optionally stepped over a part's value, a model parameter or the temperature; each probe comes back downsampled with its first, last, min and max values (AC as dB and phase), and as a CSV file. | | `kicad_state` | KiCad's full state of the union: every owned window as inline base64 PNG + logical state. | | `kicad_status` | Bridge health, KiCad version, install location and uptime. |+| `kicad_swap_footprint` | Put another library footprint on one placed part at the same position, rotation and side, keeping its reference, fields, schematic link, DNP/BOM flags and lock; pads keep their nets by number and assigns sets nets on any pad. Tracks are not moved. |+| `kicad_symbol_mode` | Show one body style of a library symbol as a picture: mode 0 the standard body, mode 1 the De Morgan alternate (KiCad's two display modes), for one unit, plotted by KiCad itself (kicad-cli) without opening an editor. | | `kicad_symbol_prims` | A library symbol's drawing: primitives counted by kind, the body rectangle, the polylines' bounding box, units and body styles, the footprint link and filters. Read only. | | `kicad_taskbar_repair` | Fix the white taskbar icon on standalone KiCad editors by writing KiCad's own AUMID onto its Start Menu shortcuts. | | `kicad_teardrops` | Add (or remove) teardrops with KiCad's own Edit > Edit Teardrops on the board open in the PCB editor: on vias, PTH pads and SMD pads, optionally track to track, for the whole board or the selection; teardrops counted before and after. |