app
Altium - the Altium Bridge
Public Made by Adomby adom
Adom Bridge for Altium Designer: a resident DelphiScript agent gives the AI eval, the 1,100-command process launcher, all 8 EDA surfaces with screenshots, compile/ERC, DRC, OutJob outputs, native SchLib/PcbLib authoring with STEP 3D bodies, and dialog handling by PID.
← Commit history
v0.2.21 (insiders): 0.2.21: a script runtime error can no longer wedge Altium silently (reaper photographs the Error box, agent call auto-sends EditScript:Stop and returns agent_script_error with errorShot); fix symbol_prims/set_models on AD 26.9.1 (eImplementation iterator); release lint refuses engine-halting identifiers; every verb documented, altium-a365 skill, install.sh ships all skills; internal material removed from the public repo
4 files changed
+19−6
CHANGELOG.md+15−3@@ -1,5 +1,17 @@ # Changelog +## 0.2.21 (2026-09-20)+- **A script runtime error can no longer wedge Altium silently.** Found by running the 0.2.20 suite on a second machine (AD 26.9.1 trial; SOIC-8, QFN-24 with 9 heatsink vias, BGA-36): a DelphiScript runtime error raises a lone-OK `Error` box, the standing reaper pressed OK within a second, and the script was left STOPPED ON A BREAKPOINT in Altium's script debugger. The agent loop was dead, every later verb timed out, Altium refused to close ("cannot close the current document when a script is stopped on a breakpoint"), and the error text was gone. Now: the reaper photographs an `Error` box before pressing it; `agent::call` sees it within 400 ms, sends `EditScript:Stop` itself (the `altium_agent_recover` steps) and returns `errorCode: agent_script_error` with `errorShot` (the PNG of Altium's message), `autoRecovered` and `recoverSteps`. The next verb restarts the agent.+- FIX the error that exposed it: `altium_symbol_prims {models:true}` and `altium_set_models` read `Comp.ImplementationCount` / `Comp.Implementation[i]`, which AD 26.9.1 does not expose to DelphiScript. Both now walk a component's models with the `eImplementation` child iterator.+- `scripts/release.py` refuses to build an agent template that uses an identifier measured to halt the engine (`ENGINE_HALTING`: the list from the dev skill, as code).+- Docs: every declared verb is in the README and a skill (21 were in neither); `altium_plate_vias`, `altium_add_symbol_art`, `altium_symbol_prims`, `altium_set_models` documented; new `altium-a365` skill; `install.sh` installs all user skills (instances, licensing, uia, wiki-import, a365 were packaged but never copied).+- Internal material removed from the public repo: machine names, an account display name and a private workspace hostname in `PLAN.md` / the plan skill / code comments and error strings; `docs/HANDOFF-COLBY.md` deleted.+- `place_on_sch` describe text matches the agent (sheet sized from the measured parts, not "A4 or B"). Repo-root `bridge.json` synced to the shipped `src/bridge.json` (it was a stale 0.1.41 leftover).++## 0.2.20 (2026-09-20)+- New verb `altium_plate_vias {libraryPath, footprintName?}`: every drilled pad in a PcbLib (all footprints, or the one named) that sits on a layer other than Multi-Layer becomes a plated Multi-Layer pad (`Pad.Layer := eMultiLayer`, `Pad.Plated := True`). adom-lbr writes heatsink vias as pads with a hole and Altium loaded them on the Top Layer, so a thermal pad's vias arrived with their holes but were not through-holes (John, 2026-09-20: "did Altium support bringing in those heatsink vias?"). The reply carries `holes` (drilled pads seen), `plated` (pads changed) and `fixed` (`Footprint:Pad;...`). Modifies the open library in place: `altium_save` the PcbLib afterwards; `altium_footprint_primitives` on a placed part then reports layerId 74 for the vias. Pads already on Multi-Layer are left alone, so a second run changes nothing.+- Version number: 0.2.19 was consumed by an interrupted publish, so this shipped as 0.2.20.+ ## 0.2.19 (2026-09-20) - `altium_test_board` silkscreen part name: its top now sits 2.5 mm below the part centre, clear of a 3 mm part's courtyard (0.2.18 overlapped it). @@ -26,7 +38,7 @@ ## 0.2.13 (2026-09-19) - **Several parts on ONE document** (John's ToF demo: three VL53Lx sensors on one schematic and one board). `altium_test_board` and `altium_place_on_sch` now accept a `;` list in `footprintName` / `symbolName`: every part lands on the same new board (spread evenly along X inside the wMm x hMm outline) or the same new sheet (U1..Un, 5000 mil apart), and both save to `pcbPath` / `schPath` when given. Single-part calls are unchanged; `assigns`/`stubs` apply to the last part placed. Both verbs finally have `describe` entries. Agent template only: deploy the tmpl beside the exe and `altium_agent_stop` + `_start`; the 0.2.9 exe keeps working with it.-- Measured on ConfRoomROG (ADDevelop): `altium_eval` scripts that call `PCBServer.PreProcess` / `PostProcess` or even `TStringList.SaveToFile` halt before their first statement completes and leave an X2 error modal whose text is not readable (`dialogs[].body` empty); clear with `altium_dismiss_dialogs {Cancel}` + `altium_agent_recover`, twice. adom/altium-bridge#11 asks for readable eval errors and for append-to-existing placement.+- Measured on a second test machine (ADDevelop): `altium_eval` scripts that call `PCBServer.PreProcess` / `PostProcess` or even `TStringList.SaveToFile` halt before their first statement completes and leave an X2 error modal whose text is not readable (`dialogs[].body` empty); clear with `altium_dismiss_dialogs {Cancel}` + `altium_agent_recover`, twice. adom/altium-bridge#11 asks for readable eval errors and for append-to-existing placement. ## 0.2.12 (2026-09-08)@@ -42,7 +54,7 @@ ## 0.2.9 — 2026-09-02-The dedicated freeze-fix release (adom/altium-bridge#6, #7, #8). Every mechanism here traces to the evidence gathered on Colby-ROG2 on 2026-09-02: three hard desktop freezes, all enabled by a resident agent loop the per-instance views could not see.+The dedicated freeze-fix release (adom/altium-bridge#6, #7, #8). Every mechanism here traces to the evidence gathered on a colleague's machine on 2026-09-02: three hard desktop freezes, all enabled by a resident agent loop the per-instance views could not see. - **The workspace split-brain is closed.** The agent REFUSES to bootstrap without a resolved instance (with a 12s resolve retry for just-launched windows) instead of silently landing in the legacy root where status and teardown were blind to it. `altium_close` now stops EVERY workspace's live loop (legacy included) before its WM_CLOSE; readiness/agent_status report `agentResidentAnywhere` + `liveWorkspaces`; `altium_state` (#8) answers from the union too, naming the workspace its `logical` read came from. `install_library_bundle` re-resolves the instance after its own auto-launch. - **Close watchdog v2 detects natively and can end a wedged shutdown.** 0.2.8's watchdog missed both freezes it watched because its detection ran through ab, whose enumeration hangs or returns empty exactly mid-freeze. v2 asks Win32 directly (non-messaging calls only; "cannot answer" is distinguished from "none"), drops stop files into every live workspace the instant the main window vanishes, and after 45s of "window gone, X2 alive, our loop was involved" it warns by toast and terminates the wedged process, recording the seat consequence. A ten-second blip instead of a bricked desktop.@@ -299,7 +311,7 @@ The dedicated freeze-fix release (adom/altium-bridge#6, #7, #8). Every mechanism - FIX: bridge.json verbs[] must be plain strings — 0.1.5–0.1.7 shipped four entries as objects, which ab's bridge_registry could not parse (the bridge vanished from the registry after its next reap while bridge_install still reported ok). Release assets are now uploaded explicitly (release create --binary-path does not attach). ## 0.1.7 — 2026-08-31-- altium_install_library_bundle: the no-AI web-control lane (kicad-parity envelope, zip-slip hardened, restart contract, proof frame). Handoff to Colby in docs/HANDOFF-COLBY.md + acceptance test docs/webcontrol-altium-test.html; ab allowlist request filed as adom/adom-bridge#964.+- altium_install_library_bundle: the no-AI web-control lane (kicad-parity envelope, zip-slip hardened, restart contract, proof frame). Acceptance test: docs/webcontrol-altium-test.html. ## 0.1.6 — 2026-08-30 - Full skill slate (10): added altium-install (the install recipe, finally packed), altium-libraries, altium-boards, altium-outputs, altium-bridge-dev, altium-bridge-publish — matching the kicad-bridge fleet depth.
package.json+2−1@@ -1,6 +1,6 @@ { "slug": "altium-bridge",- "version": "0.2.20",+ "version": "0.2.21", "type": "app", "description": "Skills for your container so your AI knows how to drive the Altium Designer bridge (altium_* verbs). The bridge runtime itself is the release zip; Adom Bridge loads that.", "tags": [@@ -32,6 +32,7 @@ "dockbar.json", "install.sh", "package.json",+ "skills/altium-a365/SKILL.md", "skills/altium-boards/SKILL.md", "skills/altium-bridge-plan/SKILL.md", "skills/altium-install/SKILL.md",
src/BRIDGE_VERSION+1−1@@ -1 +1 @@-0.2.20+0.2.21
src/bridge.json+1−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "altium", "displayName": "Altium Designer",- "version": "0.2.20",+ "version": "0.2.21", "description": "Drive Altium Designer from Adom: a resident DelphiScript agent (eval + the 1,100-command process launcher), the X2 -R command line, UIA over the VCL shell, dialogs by PID, screenshots of every Altium window, and Altium 365.", "homepage": "https://wiki.adom.inc/adom/altium-bridge", "docs": "https://wiki.adom.inc/adom/altium-bridge",