app
adom-desktop-altium-bridge
Public Unreviewedby barrett-land
Adom Desktop bridge for Altium Designer — build and edit file-based symbol/footprint/Integrated libraries with LCSC/JLCPCB part numbers attached, and generate batch outputs (STEP, PDF, Gerber, BOM, CPL) from an OutJob, by driving Altium via DelphiScript.
← Commit history
Publish 0.0.43
11 files changed
+71−17
README.md+1−1SKILL.md+36−1altium-bridge-manifest.json+3−3altium-bridge-v0.0.43.zipbridge-src/BRIDGE_VERSION+1−1bridge-src/bridge.json+1−1bridge-src/extension/AdomBridge/AdomBridge.dllbridge-src/extension/AdomBridge/AdomBridge.ins+5bridge-src/extension/AdomBridge/AdomBridge.rcs+8package.json+5−3page.json+11−7README.md+1−1@@ -11,7 +11,7 @@ verbs. ```bash adom-wiki pkg install barrett-land/adom-desktop-altium-bridge # the skill, in the container-adom-desktop bridge_install '{"manifestUrl":"https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.42/altium-bridge-manifest.json"}'+adom-desktop bridge_install '{"manifestUrl":"https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.43/altium-bridge-manifest.json"}' adom-desktop --ai-thread "<your thread>" altium_ping '{}' ```
SKILL.md+36−1@@ -12,7 +12,7 @@ forwards work into the running GUI as DelphiScript via `X2.EXE`. ## Install ```bash-adom-desktop bridge_install '{"manifestUrl":"https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.42/altium-bridge-manifest.json"}'+adom-desktop bridge_install '{"manifestUrl":"https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.43/altium-bridge-manifest.json"}' adom-desktop --ai-thread "<your thread>" altium_ping '{}' # -> {"altiumInstalled": true, "version": "..."} ``` @@ -65,6 +65,9 @@ Be straight with the user about the boundary rather than attempting a workaround - **No DRC or ERC.** Altium's rule engine is not scriptable through this path. - **Not concurrent.** One command at a time. Overlapping calls make Altium raise a modal "another instance is busy" dialog that then blocks *every* subsequent command until dismissed.+ They can also wedge the bridge's own Python module-lock: `request.txt` stops updating and every+ later verb times out. Recover by killing the bridge's `python.exe` — Adom Desktop respawns it,+ and Altium does not need restarting. - **Windows only**, and only while Altium is actually running. ## Batch output (STEP / PDF / Gerber / BOM / CPL)@@ -172,6 +175,15 @@ on the agent being reachable. Altium forwards this to the already-running instance and **loads the server lazily**, on first use — so an absent load log right after startup is normal, not a failure. +🔴 **If every verb times out, count your `X2.EXE` processes before blaming Altium.** A `-R` call is+meant to hand off to the running instance and exit immediately. When the handoff breaks, each+attempt instead leaves an orphan launcher — **~9 threads, no window** — and the script command never+reaches the real instance (the one with ~90 threads and a window). The oldest orphan blocks the+handoff and every later call queues behind it, so Altium stays perfectly usable while automation is+dead, which reads exactly like a wedged script engine and is not. Kill the windowless orphans,+keep the real instance, and dispatch recovers immediately. A stray instance launched from a+**path containing spaces** is a common way to start the pile-up.+ 🔴 **Altium's `-R` parser splits on WHITESPACE.** A path containing a space is truncated at the first space *and* the remaining tokens are treated as files to open, at which point Altium tries to start a second instance and Windows returns `ERROR_INVALID_STATE (0x8007139F)`. **Never put data on@@ -220,6 +232,29 @@ otherwise leave it `None` and composite the pads from Gerbers. The export opens the board with `ShowDocumentDontFocus` and resolves it via `GetPCBBoardByPath`, so it neither steals the user's screen nor depends on which document happens to be focused. +### `AdomBridge:ImportKiCad` — KiCad import with no wizard++`Mode=List` enumerates every importer controller and the document kinds it accepts — the fastest+way to find out whether a format is supported at all. `Mode=Import` + `File=<path>` calls+`CanImportFile` then `ImportFile`, the UI-free method that is otherwise unreachable from outside+Altium's process.++```+Mode=Import+File=C:\Users\Public\Staging\part.kicad_sym+```++Output lands in `Imported <stem>\<stem>.SchLib` beside the source, with a `.LOG` naming every+field the importer did not understand.++Two limits worth knowing before you rely on it:+- **It imports no footprints.** `.kicad_mod` / `.pretty` are unsupported; only a `.SchLib` and+ `.PrjPcb` come out. Link an existing in-house footprint afterwards with `altium_copy_sch_component`.+- **The footprint model comes out empty** — `ModelType=PCBLIB` with no `ModelName`. The `Footprint`+ value survives only as a text parameter, which Altium does not use for placement.+- **Altium 26 supports KiCad through 9.** A KiCad 10 source still imports but silently loses+ property visibility, so hidden fields land visible. See the **kicad10-to-altium** skill.+ ### `AdomBridge:Ping` — connectivity `-RAdomBridge:Ping(Msg=hello)` writes `adombridge_ping.txt`. Use it to prove the extension loaded
altium-bridge-manifest.json+3−3@@ -1,3 +1,3 @@-{ "manifest_version": 1, "name": "altium", "version": "0.0.42",- "url": "https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.42/altium-bridge-v0.0.42.zip",- "sha256": "cba583cb0e56b776769b3f0c21812fc62b3d3e974a17cc223a1fe2d22036d7b2", "size": 37658, "released_at": "2026-08-05T23:40:39Z" }+{ "manifest_version": 1, "name": "altium", "version": "0.0.43",+ "url": "https://wiki.adom.inc/download/barrett-land/adom-desktop-altium-bridge/0.0.43/altium-bridge-v0.0.43.zip",+ "sha256": "cf4dcef4b76bfc2aec67b919d1450870bab4c04de7cfc96a3c65374e290ebcde", "size": 39197, "released_at": "2026-08-12T15:56:16Z" }
altium-bridge-v0.0.43.zipadded⋯ 1 unchanged line ⋯
bridge-src/BRIDGE_VERSION+1−1@@ -1 +1 @@-0.0.42+0.0.43
bridge-src/bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "altium", "displayName": "Altium Bridge",- "version": "0.0.42",+ "version": "0.0.43", "description": "Drives Altium Designer from a container: build, clone and edit file-based symbol/footprint/Integrated libraries with LCSC/JLCPCB part numbers attached, and generate batch outputs (STEP, PDF, Gerber, BOM, CPL) from an OutJob. Pairs with the container-side altium-jlc orchestrator (adom-jlcpcb + chip-fetcher).", "homepage": "https://wiki.adom.inc/adom/adom-desktop-altium-bridge", "author": "Adom Inc.",
bridge-src/extension/AdomBridge/AdomBridge.dll⋯ 1 unchanged line ⋯
bridge-src/extension/AdomBridge/AdomBridge.ins+5@@ -19,3 +19,8 @@ Command Name = 'ExportStep' LongSummary = 'Export a PcbDoc 3D model to STEP. PcbDoc=<path>|Out=<path>' End++Command+ Name = 'ImportKiCad'+ LongSummary = 'Import a KiCad file with no wizard. Req=<request file>'+End
bridge-src/extension/AdomBridge/AdomBridge.rcs+8@@ -13,3 +13,11 @@ PL PLAdomBridge_ExportStep Params='' Description='Export a PcbDoc 3D model to STEP' End++PL PLAdomBridge_ImportKiCad+ Command='AdomBridge:ImportKiCad'+ Caption='Adom Import KiCad'+ Image=''+ Params=''+ Description='Import a KiCad file with no wizard'+End
package.json+5−3@@ -1,8 +1,8 @@ { "slug": "adom-desktop-altium-bridge",- "version": "0.0.42",+ "version": "0.0.43", "type": "app",- "description": "Adom Desktop bridge for Altium Designer: file-based symbol/footprint/IntLib authoring with LCSC/JLCPCB part numbers, Gerber/BOM/CPL batch output, and an in-process .NET extension that adds parameterized headless verbs including STEP export with hole and copper options.",+ "description": "Adom Desktop bridge for Altium Designer: file-based symbol/footprint/IntLib authoring with LCSC/JLCPCB part numbers, Gerber/BOM/CPL batch output, and an in-process .NET extension adding parameterized headless verbs - STEP export with hole and copper options, and KiCad import with no wizard.", "tags": [ "app", "adom-desktop",@@ -28,7 +28,9 @@ "altium extension", "install altium extension", "altium step export",- "run an altium outjob"+ "run an altium outjob",+ "import kicad into altium",+ "altium kicad importer" ], "discovery_pitch": "Use when the user wants Claude to author or edit Altium libraries, or to generate STEP/PDF/Gerber/BOM/CPL from an Altium board on their Windows machine.", "sample_prompts": [
page.json+11−7@@ -1,8 +1,8 @@ { "slug": "adom-desktop-altium-bridge",- "version": "0.0.42",+ "version": "0.0.43", "type": "app",- "description": "Adom Desktop bridge for Altium Designer \u2014 build and edit file-based symbol/footprint/Integrated libraries with LCSC/JLCPCB part numbers attached, and generate batch outputs (STEP, PDF, Gerber, BOM, CPL) from an OutJob, by driving Altium via DelphiScript.",+ "description": "Adom Desktop bridge for Altium Designer: file-based symbol/footprint/IntLib authoring with LCSC/JLCPCB part numbers, Gerber/BOM/CPL batch output, and an in-process .NET extension adding parameterized headless verbs - STEP export with hole and copper options, and KiCad import with no wizard.", "tags": [ "app", "adom-desktop",@@ -18,6 +18,7 @@ }, "needs_sudo": false, "hero": {+ "type": "image", "path": "docs/hero.png" }, "author": {@@ -25,13 +26,16 @@ "email": "[email protected]" }, "discovery_triggers": [- "add a part to my altium library", "drive altium from claude", "altium bridge",- "export step from altium",+ "export step from altium headless",+ "add a part to my altium library",+ "altium extension",+ "install altium extension",+ "altium step export", "run an altium outjob",- "build an altium footprint",- "altium symbol library"+ "import kicad into altium",+ "altium kicad importer" ], "discovery_pitch": "Use when the user wants Claude to author or edit Altium libraries, or to generate STEP/PDF/Gerber/BOM/CPL from an Altium board on their Windows machine.", "sample_prompts": [@@ -48,4 +52,4 @@ "prompt": "Is the Altium bridge connected and what version is it?" } ]-}+}