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.187: #34 - the loader started an RPC server inside the bridge's OWN short-lived python probes (exeName python, alive:false, fighting one port). GUI processes only now; dead discovery files pruned by default
6 files changed
+24−8
BRIDGE_VERSION+1−1@@ -1 +1 @@-0.9.186+0.9.187
adom-bridge-kicad-manifest.json+5−5@@ -1,15 +1,15 @@ { "manifest_version": 1, "name": "kicad",- "version": "0.9.186",- "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.186/adom-bridge-kicad-v0.9.186.zip",- "sha256": "2abae3be4fa6ae7695bb2a7db1aa6f9d2e6a34559f8e4ac40cdf578889f0b25f",- "size": 454911,+ "version": "0.9.187",+ "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.187/adom-bridge-kicad-v0.9.187.zip",+ "sha256": "279aec2125f3cb52f91bbd8ddfd24cf1a0c8b485824b0e597246caf2484af510",+ "size": 455506, "verbPrefixes": [ "kicad_" ], "healthEndpoint": "/status",- "released_at": "2026-08-19T19:06:45Z",+ "released_at": "2026-08-19T20:32:19Z", "hero": "https://wiki.adom.inc/blob/app/kicad-bridge/kicad-hero.png", "languages": [ "Python",
adom-bridge-kicad-v0.9.187.zipadded⋯ 1 unchanged line ⋯
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "kicad", "displayName": "KiCad EDA",- "version": "0.9.186",+ "version": "0.9.187", "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/bridge_client.py+6−1@@ -156,7 +156,12 @@ def handle_bridge_status(kicad_info: dict, args: dict) -> dict: """ filter_exe = args.get("exeName") filter_pid = args.get("pid")- prune_stale = bool(args.get("pruneStale"))+ # WIKI ISSUE #34 (Colby Knox): his status read "alive: 0 of 2" with both+ # entries belonging to processes that had long since exited, which reads as+ # "the plugin keeps dying" when the truth is "these files outlived their+ # processes". A discovery file whose PID is gone is garbage, not a data+ # point - drop it by default rather than only on an explicit cleanup run.+ prune_stale = bool(args.get("pruneStale", True)) probe_port = _make_port_prober() # unique-port cache + wall-clock budget plugins = []
plugin_payload/usercustomize.py+11@@ -54,6 +54,17 @@ try: pass # -- Step 2: start the reverse bridge (Phase 2 MVP) --+ # GUI PROCESSES ONLY (wiki issue #34, Colby Knox, 2026-08-19). This file is+ # importable by ANY Python that has KiCad's user-site on its path, which+ # includes the short-lived `python.exe -c ...` probes the bridge itself+ # spawns. Those started an RPC server, registered a discovery file, and then+ # exited a moment later - so kicad_bridge_status showed instances with+ # exeName "python" that were all alive:false, several fighting over the same+ # port, and every plugin tier reported plugin_not_running while looking at a+ # graveyard. Only a real KiCad GUI process should ever host the bridge.+ _GUI = ("kicad", "eeschema", "pcbnew", "gerbview", "pl_editor", "bitmap2component")+ if not any(_EXE_NAME.startswith(_n) for _n in _GUI):+ raise SystemExit try: import adom_bridge # type: ignore[import-not-found] port = adom_bridge.start()