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.122: background demo beats sweep modal dialogs before retrying (staged calls get the dispatcher's sweep, the job thread's internal steps did not - a 10.0.5 editor-open dialog stalled beats 1-3)
5 files changed
+21−7
BRIDGE_VERSION+1−1@@ -1 +1 @@-0.9.121+0.9.122
adom-bridge-kicad-manifest.json+5−5@@ -1,15 +1,15 @@ { "manifest_version": 1, "name": "kicad",- "version": "0.9.121",- "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.121/adom-bridge-kicad-v0.9.121.zip",- "sha256": "c7821a33815e60a5f6b5f5d6b605ba82f7280ac9dde5ea30ea8ed0b707fdb0fb",- "size": 411783,+ "version": "0.9.122",+ "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.122/adom-bridge-kicad-v0.9.122.zip",+ "sha256": "f6ef6aac978f097aaea1340fa7ec2215d6ab7fc2d7912e69a48ad9dd21347041",+ "size": 412059, "verbPrefixes": [ "kicad_" ], "healthEndpoint": "/status",- "released_at": "2026-08-16T17:41:36Z",+ "released_at": "2026-08-16T17:48:35Z", "hero": "https://wiki.adom.inc/blob/app/kicad-bridge/kicad-hero.png", "languages": [ "Python",
adom-bridge-kicad-v0.9.122.zipadded⋯ 1 unchanged line ⋯
bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "kicad", "displayName": "KiCad EDA",- "version": "0.9.121",+ "version": "0.9.122", "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/demo.py+14@@ -421,6 +421,7 @@ def _run_step(kicad_info: dict, step: str, prep: dict) -> dict: # ── #24: long-running background demo with STRUCTURED PROGRESS ──────────────── # A web front-end wants a real progress bar (percent + ETA), not a spinner, and # the bridge is the only party that knows its own timings. One job at a time.+import sys as _sys import threading as _threading _BEAT_EST = {"prepare": 18, "symbol": 12, "footprint": 12, "part_3d": 16,@@ -503,6 +504,19 @@ def _run_demo_background(kicad_info: dict) -> None: elapsedSec=round(_t.monotonic() - t0)) r = _run_step(kicad_info, s_, prep) if not r.get("ok"):+ # 10.0.5 regression (found live 2026-08-16): a modal dialog at+ # editor-open stalled the first beats. STAGED calls get the+ # dispatcher's post-verb dialog sweep; this thread's internal+ # steps did NOT — sweep before retrying, and log what blocked.+ try:+ from handlers.close_windows import auto_sweep_dialogs+ swept = auto_sweep_dialogs(kicad_info, screenshot=False,+ settle_rounds=2)+ if swept and (swept.get("dismissed") or swept.get("dialogs")):+ print(f"[demo] beat '{s_}' blocked by dialog(s): "+ f"{str(swept)[:300]}", file=_sys.stderr)+ except Exception:+ pass _t.sleep(3) r = _run_step(kicad_info, s_, prep) r["retried"] = True