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 40 file(s)
4 files changed
+59−17
BRIDGE_VERSION+1−1@@ -1 +1 @@-0.9.271+0.9.272
adom-bridge-kicad-manifest.json+5−5@@ -1,15 +1,15 @@ { "manifest_version": 1, "name": "kicad",- "version": "0.9.271",- "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.271/adom-bridge-kicad-v0.9.271.zip",- "sha256": "6245ed3354e7b5144684c0398374da7eb761a7c4d438179187ab96583c31d5ef",- "size": 1045024,+ "version": "0.9.272",+ "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.272/adom-bridge-kicad-v0.9.272.zip",+ "sha256": "fbbf84049530142fee04f6b92ecc9a14ef8e492cc927dafd999f37028e92fb69",+ "size": 1046162, "verbPrefixes": [ "kicad_" ], "healthEndpoint": "/status",- "released_at": "2026-09-01T02:57:17Z",+ "released_at": "2026-09-03T01:05:59Z", "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.271",+ "version": "0.9.272", "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+52−10@@ -581,6 +581,34 @@ def handle_open_symbol_editor(kicad_info: dict, args: dict) -> dict: return (time.monotonic() - _t0) > _budget_s def _starting_contract(phase):+ # WHY THIS CHECKS FOR A WINDOW FIRST (wiki #71, Ray, 2026-09-02).+ # This contract said "the Symbol Editor is still coming up (cold start+ # indexes every library)" for THREE consecutive calls over 12 minutes+ # while desktop_list_windows showed no Symbol Editor at all. Reporting+ # progress on a window that was never created makes a polling caller+ # wait forever, because the thing it is waiting for is not happening.+ # "Starting" is only honest if something is actually starting.+ try:+ _existing = _find_symbol_editor()+ except Exception: # pylint: disable=broad-except+ _existing = None+ if not _existing:+ return {+ "success": False,+ "errorCode": "symbol_editor_did_not_open",+ "retryable": True,+ "retryAfterMs": 5000,+ "phase": phase,+ "elapsedSec": int(time.monotonic() - _t0),+ "error": ("No Symbol Editor window exists. The bridge asked KiCad to open one "+ "and none appeared, so this is not a slow cold start - nothing is "+ "coming up."),+ "_hint": ("Call kicad_open_symbol_editor first and check it returns a window, "+ "then re-call this verb. If the editor never opens, KiCad is usually "+ "busy with a human (it is single-instance and will not service our "+ "menu command while someone is driving it) - kicad_window_info shows "+ "what is actually open."),+ } return { "success": False, "errorCode": "symbol_editor_starting",@@ -1002,17 +1030,31 @@ def handle_open_symbol_editor(kicad_info: dict, args: dict) -> dict: "success": False, "editorOpened": True, "symbolLoaded": False, "attempts": 2, "errorCode": "library_cache_stale",- "error": f"'{search_text}' exists in the Adom library on disk but the open "- f"Symbol Editor cannot see it: that editor indexed its libraries when "- f"it opened, before this symbol was added "+ # WHY THIS MESSAGE NO LONGER NAMES A CAUSE IT HAS NOT CHECKED+ # (wiki #71, Ray, 2026-09-02). It used to assert "that editor+ # indexed its libraries when it opened, BEFORE this symbol was+ # added". Ray's transcript disproves that ordering outright: he+ # installed the symbol, THEN closed the editor, THEN opened a+ # fresh one, and still got this error. The editor did not+ # predate the symbol; the explanation was invented.+ #+ # The real model, from #44/#47/#51: KiCad caches library indexes+ # PROCESS-WIDE, not per editor window. Closing and reopening the+ # Symbol Editor inside the same kicad.exe re-uses the cached+ # table, so a fresh window is not a fresh index. Only a process+ # restart rebuilds it (kicad_rescan_libraries force:true).+ "error": f"'{search_text}' is in the Adom library on disk, but this running "+ f"KiCad cannot see it: KiCad caches library indexes PROCESS-WIDE, so "+ f"a symbol added after kicad.exe started stays invisible until the "+ f"process re-indexes " 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. "- "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."),+ "_hint": ("Retrying will not fix it, and neither will closing and reopening the "+ "Symbol Editor WINDOW - the cache belongs to the KiCad process, not "+ "the window (wiki #71 proved a fresh editor still cannot see it). "+ "Call kicad_rescan_libraries force:true for the process restart that "+ "does rebuild the index (~1 min, wiki #35/#51), or pass rescan:true "+ "here to have the bridge do it. The bridge will not restart a KiCad a "+ "human launched: close it first and the restart is free."), } return { "success": False, "editorOpened": True, "symbolLoaded": False,