app
KiCad - the KiCad Bridge
Public Made by Adomby adom
Reference implementation of the KiCad bridge: multi-instance Python server, forward path via kicad-cli, reverse path via in-process plugin. Most complex of the three bundled bridges.
← Commit history
v0.9.78: CLI-name sweep adom-bridge-cli -> adom-bridge (ab 2.0.35); kicad_uninstall echoes cascade flag
7 files changed
+31−27
BRIDGE_VERSION+1−1@@ -1 +1 @@-0.9.77+0.9.78
README.md+4−4@@ -54,10 +54,10 @@ during Hydrogen's install. Six beats, in the order a hardware person thinks: | 6 | the finished **board in 3D** | ```bash-adom-bridge-cli kicad_demo '{}' # start: prepares, warms KiCad, opens beat 1-adom-bridge-cli kicad_demo '{"step":"footprint"}' # ...then follow data.nextCall each time-adom-bridge-cli kicad_demo '{"all":true}' # bulk (non-interactive; slower than one request budget)-adom-bridge-cli kicad_close '{"force":true}' # tear down+adom-bridge kicad_demo '{}' # start: prepares, warms KiCad, opens beat 1+adom-bridge kicad_demo '{"step":"footprint"}' # ...then follow data.nextCall each time+adom-bridge kicad_demo '{"all":true}' # bulk (non-interactive; slower than one request budget)+adom-bridge kicad_close '{"force":true}' # tear down ``` **It narrates itself.** Every beat returns `say` (a line to speak), `pointOut`
SKILL.md+16−16@@ -1,15 +1,15 @@ --- name: adom-desktop-kicad public: true-description: "Launch and drive KiCad on the user's laptop (KiCad 7/8/9/10 supported, multi-version side-by-side) from this container via the adom-bridge-cli CLI. Open schematics/boards/symbols/footprints, run DRC, install sym-lib-table / fp-lib-table libraries, show the 3D viewer, capture KiCad window screenshots, send keyboard shortcuts and click coordinates. Trigger words: kicad, open schematic, open board, open pcb, open symbol, open footprint, KiCad symbol editor, KiCad footprint editor, KiCad 3D viewer, run DRC, install KiCad library, sym-lib-table, fp-lib-table, KiCad screenshot, kicad_send_key, kicad_click, kicad_window_info, kicad_screenshot_all, close KiCad, kicad versions, kicad_list_versions, KiCad bridge."+description: "Launch and drive KiCad on the user's laptop (KiCad 7/8/9/10 supported, multi-version side-by-side) from this container via the adom-bridge CLI. Open schematics/boards/symbols/footprints, run DRC, install sym-lib-table / fp-lib-table libraries, show the 3D viewer, capture KiCad window screenshots, send keyboard shortcuts and click coordinates. Trigger words: kicad, open schematic, open board, open pcb, open symbol, open footprint, KiCad symbol editor, KiCad footprint editor, KiCad 3D viewer, run DRC, install KiCad library, sym-lib-table, fp-lib-table, KiCad screenshot, kicad_send_key, kicad_click, kicad_window_info, kicad_screenshot_all, close KiCad, kicad versions, kicad_list_versions, KiCad bridge." --- -# adom-bridge-cli — KiCad bridge+# adom-bridge — KiCad bridge All commands dispatch to the KiCad Python bridge running alongside the desktop app. Invoke from this container via Bash: ```bash-adom-bridge-cli kicad_<action> '<json_args>'+adom-bridge kicad_<action> '<json_args>' ``` The leading `kicad_` routes the call to the KiCad plugin; the `<action>` names below are the plugin-side command names.@@ -47,7 +47,7 @@ Users can have multiple KiCad versions installed at the same time. The bridge au ```bash # Discover what's installed (run this first if unsure)-adom-bridge-cli kicad_list_versions '{}'+adom-bridge kicad_list_versions '{}' # → {"versions":[{"version":"10.0", "default":true, ...}, {"version":"9.0", ...}], "default":"10.0", "count":2} ``` @@ -55,10 +55,10 @@ Every `kicad_open_*` (and `install_*`, `run_drc`) command accepts an optional ** ```bash # Open in KiCad 10 (newest — default if you omit kicadVersion)-adom-bridge-cli kicad_open_board '{"filePath":"C:/designs/foo.kicad_pcb"}'+adom-bridge kicad_open_board '{"filePath":"C:/designs/foo.kicad_pcb"}' # Open in KiCad 9 explicitly (e.g. to check that an older project still works)-adom-bridge-cli kicad_open_board '{"filePath":"C:/designs/foo.kicad_pcb","kicadVersion":"9.0"}'+adom-bridge kicad_open_board '{"filePath":"C:/designs/foo.kicad_pcb","kicadVersion":"9.0"}' ``` If you pass a version that's not installed, the bridge returns a hint listing the installed versions. The success response includes `kicadVersionUsed` so you can confirm which install actually ran.@@ -69,8 +69,8 @@ If you pass a version that's not installed, the bridge returns a hint listing th **KiCad is the user's HOST APP. Adom Bridge *detects* it — it won't silently auto-install it as a prewarm/dependency** (Bridge v1.9.47+). But if KiCad isn't found, **do NOT hand the user a manual download** — offer to install it for them and run `kicad_upgrade '{}'`. That verb installs the latest stable from the official downloads.kicad.org installer (silent `/S`, Windows only; may raise a UAC prompt) and **installs from scratch, not just upgrades**. The distinction: Bridge-core never auto-installs a host app, but a user-requested, agent-run install is exactly right. -- To answer **"what EDA tools / host apps do I have?"** across every bridge, call the Bridge-level verb **`adom-bridge-cli bridge_readiness '{}'`** — Bridge aggregates each bridge's host-app detection (KiCad, Fusion 360, …) into one report. Start here for any "do I have X installed?" question.-- For **KiCad specifically**, `adom-bridge-cli kicad_readiness '{}'` is a zero-side-effect read-only probe: `{hostApp, detected, ready, versionCount, defaultVersion, versions[]}`. It does not install the plugin or spawn subprocesses, and works even when KiCad is absent (`detected:false`). Use `kicad_list_versions` when you need the full per-version detail (paths, IPC API, lib tables).+- To answer **"what EDA tools / host apps do I have?"** across every bridge, call the Bridge-level verb **`adom-bridge bridge_readiness '{}'`** — Bridge aggregates each bridge's host-app detection (KiCad, Fusion 360, …) into one report. Start here for any "do I have X installed?" question.+- For **KiCad specifically**, `adom-bridge kicad_readiness '{}'` is a zero-side-effect read-only probe: `{hostApp, detected, ready, versionCount, defaultVersion, versions[]}`. It does not install the plugin or spawn subprocesses, and works even when KiCad is absent (`detected:false`). Use `kicad_list_versions` when you need the full per-version detail (paths, IPC API, lib tables). ## Commands @@ -104,19 +104,19 @@ If you pass a version that's not installed, the bridge returns a hint listing th ```bash # Open a schematic-adom-bridge-cli kicad_open_schematic '{"path":"C:/designs/foo.kicad_sch"}'+adom-bridge kicad_open_schematic '{"path":"C:/designs/foo.kicad_sch"}' # List open KiCad windows-adom-bridge-cli kicad_window_info '{}'+adom-bridge kicad_window_info '{}' # Screenshot every KiCad window-adom-bridge-cli kicad_screenshot_all '{}'+adom-bridge kicad_screenshot_all '{}' # Run DRC-adom-bridge-cli kicad_run_drc '{"board_path":"C:/designs/foo.kicad_pcb"}'+adom-bridge kicad_run_drc '{"board_path":"C:/designs/foo.kicad_pcb"}' # Install a library pair-adom-bridge-cli kicad_install_library '{+adom-bridge kicad_install_library '{ "name":"my-lib", "sym_path":"C:/libs/my-lib.kicad_sym", "fp_path":"C:/libs/my-lib.pretty"@@ -131,10 +131,10 @@ Every failing response includes a `_hint` field with a human-readable next step Earlier versions of the KiCad bridge listened on hardcoded port `8772`. **As of v1.8.31, bridges use OS-assigned ephemeral ports** — every spawn gets a new free port. You never need to know it. -- The CLI (`adom-bridge-cli kicad_*`) automatically routes through adom-desktop's direct API (default port 47200 as of v1.8.33, with auto-fallback to 47201-47209 if 47200 is taken). adom-bridge-cli then forwards to the bridge's actual runtime port.+- The CLI (`adom-bridge kicad_*`) automatically routes through adom-desktop's direct API (default port 47200 as of v1.8.33, with auto-fallback to 47201-47209 if 47200 is taken). adom-bridge then forwards to the bridge's actual runtime port. - The bridge port is internal plumbing and can change every spawn. `bridge_list` reports it as `spawn.runtimePort` for debugging only — do NOT hardcode that anywhere.-- Why: this lets adom-bridge-cli coexist with Hydrogen (which used to claim 8772 itself) and any other tool that grabs ports in the 8000 range. Side-by-side bridges from different apps no longer collide.-- The relay path (Docker → wss proxy → Windows GUI) is unchanged — same `adom-bridge-cli kicad_*` verbs, same JSON shape.+- Why: this lets adom-bridge coexist with Hydrogen (which used to claim 8772 itself) and any other tool that grabs ports in the 8000 range. Side-by-side bridges from different apps no longer collide.+- The relay path (Docker → wss proxy → Windows GUI) is unchanged — same `adom-bridge kicad_*` verbs, same JSON shape. If you ever find yourself wanting to talk directly to the KiCad bridge process: don't. Go through the verb dispatch. If the verb you need doesn't exist, request a feature in `adom-inc/adom-desktop`.
adom-bridge-kicad-manifest.json+5−5@@ -1,15 +1,15 @@ { "manifest_version": 1, "name": "kicad",- "version": "0.9.77",- "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.77/adom-bridge-kicad-v0.9.77.zip",- "sha256": "b0a50d1262eb84074fba0ed4d3378668f2d8568f05af455fa57d20f91b3c68c4",- "size": 374204,+ "version": "0.9.78",+ "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.78/adom-bridge-kicad-v0.9.78.zip",+ "sha256": "fe8093e95d901169e249f1df77bef73a80e911749a58c6b28daa5e0f31357f12",+ "size": 374309, "verbPrefixes": [ "kicad_" ], "healthEndpoint": "/status",- "released_at": "2026-08-14T01:28:56Z",+ "released_at": "2026-08-14T09:25:04Z", "hero": "https://wiki.adom.inc/blob/app/kicad-bridge/kicad-hero.png", "languages": [ "Python",
adom-bridge-kicad-v0.9.78.zipadded⋯ 1 unchanged line ⋯
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "kicad", "displayName": "KiCad EDA",- "version": "0.9.77",+ "version": "0.9.78", "description": "Reverse bridge for KiCad \u2014 board/schematic introspection, lint via kicad-cli, plugin install, multi-instance probe, in-process DRC.", "homepage": "https://wiki.adom.inc/adom/adom-bridge", "author": "Adom Inc.",
handlers/uninstall.py+4@@ -177,6 +177,10 @@ def handle_uninstall(kicad_info: dict, args: dict) -> dict: ok = len(failed) == 0 return { "success": ok,+ # ab 2.0.35+: bridge_uninstall cascades into this verb with+ # {cascade:true, name:"kicad"} while our files still exist; echo it so+ # the cascade report on ab's side shows this ran as part of a cascade.+ "cascade": bool(args.get("cascade")), "dryRun": dry, "removed": removed, "failed": failed,