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
Update 4 file(s)
4 files changed
+43−10
BRIDGE_VERSION+1−1@@ -1 +1 @@-0.9.210+0.9.211
adom-bridge-kicad-manifest.json+5−5@@ -1,15 +1,15 @@ { "manifest_version": 1, "name": "kicad",- "version": "0.9.210",- "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.210/adom-bridge-kicad-v0.9.210.zip",- "sha256": "c06dc627507b8fe6d94afa33475f36af0602e319682ebf2e79cf5e1e3501228a",- "size": 478408,+ "version": "0.9.211",+ "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.211/adom-bridge-kicad-v0.9.211.zip",+ "sha256": "87da9060b22146a3d1981502bfbf410f872091b6732d696e41ac7865978aa312",+ "size": 480064, "verbPrefixes": [ "kicad_" ], "healthEndpoint": "/status",- "released_at": "2026-08-20T14:25:00Z",+ "released_at": "2026-08-20T15:20:00Z", "hero": "https://wiki.adom.inc/blob/app/kicad-bridge/kicad-hero.png", "languages": [ "Python",
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "kicad", "displayName": "KiCad EDA",- "version": "0.9.210",+ "version": "0.9.211", "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/open_symbol_editor.py+36−3@@ -862,6 +862,37 @@ def handle_open_symbol_editor(kicad_info: dict, args: dict) -> dict: "a bridge bug worth reporting, not a library problem."), } stale = _symbol_on_disk_but_not_in_editor(kicad_info, symbol_name or search_text)++ # 0.9.211 (wiki #35, Colby's root cause). We KNOW the remedy here, so+ # handing it back as a required argument is passing our own retry out+ # through the API - the same mistake 0.9.192 fixed for the navigate+ # retry. His measurement made the common path obvious: the Quick Actions+ # recipe installs a part and THEN shows it, so whenever an editor is+ # already open the new symbol is installed-after-open EVERY time. That+ # is why I measured 9s and he measured a hard failure.+ #+ # The one thing that must not happen is closing an editor a HUMAN opened.+ # The ownership ledger already answers that, so: rescan automatically+ # when the editor is ours, and only ask when it is theirs.+ if stale and not args.get("rescan") and not args.get("_autoRescanned"):+ _mine = False+ try:+ from handlers.win_focus import is_bridge_window+ _mine = bool(sym_hwnd) and is_bridge_window(sym_hwnd)+ except Exception:+ _mine = False+ if _mine:+ _r = handle_open_symbol_editor(+ kicad_info, {**args, "rescan": True, "_autoRescanned": True})+ if isinstance(_r, dict):+ _r["autoRescanned"] = True+ _r.setdefault("_autoRescanHint",+ "This editor's library index predated the requested symbol, so "+ "the bridge reopened the editor to re-index (the cold library "+ "scan is why this call took about a minute). The editor was "+ "bridge-owned; an editor YOU opened is never closed automatically.")+ return _r+ if stale: return { "success": False, "editorOpened": True, "symbolLoaded": False,@@ -873,9 +904,11 @@ def handle_open_symbol_editor(kicad_info: dict, args: dict) -> dict: f"(title: {_get_symbol_editor_title() or 'unknown'})", "_hint": ("This is not a search-timing failure and retrying will never fix it. " "The Symbol Editor has to re-index, which only happens when it opens. "- "Close the Symbol Editor and call again, or pass rescan:true to have "- "the bridge close and reopen it for you (that costs the cold "- "library-index time, roughly a minute - wiki issue #35)."),+ "This editor was opened by a HUMAN, so the bridge will not close it "+ "automatically. Close it and call again, or pass rescan:true to have "+ "the bridge reopen it for you (that costs the cold library-index "+ "time, roughly a minute - wiki issue #35). A bridge-owned editor is "+ "re-indexed automatically and needs no argument."), } return { "success": False, "editorOpened": True, "symbolLoaded": False,