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.117: update-nudge attachment moved to the HTTP funnel (readiness/bridge_status return via early dispatch paths and never reached the deep-site injection)
5 files changed
+21−19
BRIDGE_VERSION+1−1@@ -1 +1 @@-0.9.116+0.9.117
adom-bridge-kicad-manifest.json+5−5@@ -1,15 +1,15 @@ { "manifest_version": 1, "name": "kicad",- "version": "0.9.116",- "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.116/adom-bridge-kicad-v0.9.116.zip",- "sha256": "bb1c9f8d334e299e69ea75099bc020815baf327e02eba97b3f1e9ca1078c4fd6",- "size": 410551,+ "version": "0.9.117",+ "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.117/adom-bridge-kicad-v0.9.117.zip",+ "sha256": "1410532b2055a94eb051e5a74836c06c8ae70b6b5d4de845905107b90dd58103",+ "size": 410596, "verbPrefixes": [ "kicad_" ], "healthEndpoint": "/status",- "released_at": "2026-08-16T13:47:30Z",+ "released_at": "2026-08-16T13:49:12Z", "hero": "https://wiki.adom.inc/blob/app/kicad-bridge/kicad-hero.png", "languages": [ "Python",
adom-bridge-kicad-v0.9.117.zipadded⋯ 1 unchanged line ⋯
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "kicad", "displayName": "KiCad EDA",- "version": "0.9.116",+ "version": "0.9.117", "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.",
server.py+14−12@@ -755,18 +755,6 @@ def dispatch_command(command: str, args: dict) -> dict: # Stamp the version actually used so callers can see which install ran if isinstance(result, dict): result.setdefault("kicadVersionUsed", selected_info.get("version"))- # Proactive update nudge (0.9.116): at most one network check per 24h- # (async), surfaced on the everyday status verbs so the AI can OFFER the- # user an update — the AI only ever reads verb output.- if isinstance(result, dict) and command in ("status", "readiness", "state",- "bridge_status", "window_info"):- try:- from handlers.upgrade import kicad_update_nudge- nudge = kicad_update_nudge(selected_info)- if nudge:- result.setdefault("kicadUpdate", nudge)- except Exception:- pass # CONSTANT DIALOG COVERAGE: after EVERY GUI-affecting verb, sweep for KiCad # dialogs (KiCad throws modal error boxes constantly — "Cannot enumerate # ...Templates (Access denied)", save prompts, format warnings — that@@ -968,6 +956,20 @@ class KiCadBridgeHandler(BaseHTTPRequestHandler): try: result = dispatch_command(command, args)+ # Proactive update nudge (0.9.116): at most one network check per+ # 24h (async), surfaced on the everyday status verbs so the AI can+ # OFFER the user an update — the AI only ever reads verb output.+ if isinstance(result, dict) and command.split("_", 1)[-1] in (+ "status", "readiness", "state", "window_info") or (+ isinstance(result, dict) and command in ("status", "readiness", "state",+ "bridge_status", "window_info")):+ try:+ from handlers.upgrade import kicad_update_nudge+ nudge = kicad_update_nudge(kicad_info)+ if nudge:+ result.setdefault("kicadUpdate", nudge)+ except Exception:+ pass self._respond(200, result) except Exception as e: print(f"[KiCad Bridge] ERROR: {e}")