skill
EDA Bridge Standard: one way for an AI to drive every PCB tool
Public Made by Adomby adom
The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.
← Commit history
standard 0.24.4: Fusion 1.13.26, KiCad #29 equivalents (219), tiers for #27 and #28
6 files changed
+45−22
README.md+4−3@@ -62,10 +62,10 @@ verb by verb: [docs/coverage.md](docs/coverage.md). |---|---|---|---|---| | **core** | 93 | 93 | 89 | 90 | | **native** | 47 | 47 | 44 | 42 |-| **checks** | 37 | 37 | 35 | 37 |-| **app** | 62 | 62 | 46 | 53 |+| **checks** | 37 | 37 | 37 | 37 |+| **app** | 62 | 62 | 49 | 53 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 239 | 239 | 214 | 222 |+| standard (all but platform) | 239 | 239 | 219 | 222 | <!-- coverage:end --> The **checks** tier is where the other bridges are furthest behind, and it is the cheapest to close: those verbs are@@ -158,6 +158,7 @@ Decisions so far (proposals from the KiCad and Fusion bridges, 2026-10-27; issue ## Status +Version 0.24.4: coverage reads Fusion 360 bridge 1.13.26 and kicad-lane's first #29 equivalents (KiCad 219); tiers for `update_footprints_from_library` (core, #27) and `lint_library` (checks, #28), which enter the standard with Altium's 0.2.84 reference. Version 0.24.3: coverage reads KiCad bridge 1.0.89 (214 of 239: animate_view). Version 0.24.2: engine 0.21.1: `duplicate_pad_number` counts touching or overlapping pads as one land (a split exposed pad is not a duplicate; KiCad #28). KiCad's `swap_footprint` is no longer counted as `update_footprints_from_library`, which does a different job (#27). Version 0.24.1: coverage reads Fusion 360 bridge 1.13.24 (222 of 239: add_symbol_art, list_installed_libraries and install_library partial; uninstall_library, normalize_bodies and sch_sheet_symbol unsupported).
docs/coverage.md+9−9@@ -1,6 +1,6 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.83 (the reference), KiCad bridge 1.0.89, Fusion 360 bridge 1.13.24. 56 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.83 (the reference), KiCad bridge 1.0.89, Fusion 360 bridge 1.13.26. 56 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*. `exact` is the same job under the same or an equivalent name; `partial` does part of it or does it differently (`verbs/coverage.json` names what in `note`); `unsupported` answers `not_supported` for the whole job and is not counted; blank is missing. Generated by `tools/generate.py` from `verbs/coverage.json`; do not edit by hand. @@ -8,10 +8,10 @@ Generated by `tools/generate.py` from `verbs/coverage.json`; do not edit by hand |---|---|---|---|---| | **core** | 93 | 93 | 89 | 90 | | **native** | 47 | 47 | 44 | 42 |-| **checks** | 37 | 37 | 35 | 37 |-| **app** | 62 | 62 | 46 | 53 |+| **checks** | 37 | 37 | 37 | 37 |+| **app** | 62 | 62 | 49 | 53 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 239 | 239 | 214 | 222 |+| standard (all but platform) | 239 | 239 | 219 | 222 | ## core @@ -179,7 +179,7 @@ Engineering computed from the board model, not by the tool: one shared engine, s | `board_report` | One shareable page per board: every check run against the live board and its project (Altium's DRC, JLCPCB fab limits and assembly tiers, the schematic... | `altium_board_report` | `kicad_board_report` | `fusion_board_report` | | `bom` | The project's bill of materials read straight from Altium: every schematic sheet the .PrjPcb lists (placed parts and their parameters) merged with the board... | `altium_bom` | `kicad_bom` | `fusion_board_bom` (partial) | | `build_board` | Build a NEW board from a parts list and a netlist: outline (rounded corners allowed), every footprint from one PcbLib placed by its own origin, pad nets... | `altium_build_board` | `kicad_build_board` | `fusion_build_board` |-| `build_footprint` | Build a complete footprint (pads, silkscreen, courtyard, arcs) in a PcbLib from a kicad2altium spec file on this machine, and return a proof frame. | `altium_build_footprint` | | `fusion_import_part` (partial) |+| `build_footprint` | Build a complete footprint (pads, silkscreen, courtyard, arcs) in a PcbLib from a kicad2altium spec file on this machine, and return a proof frame. | `altium_build_footprint` | `kicad_fp_create` (partial) | `fusion_import_part` (partial) | | `build_schematic` | Draw a design's schematic from its netlist with the project library's symbols, inside a new project (.PrjPcb with the board and libraries), compile it, and... | `altium_build_schematic` | `kicad_build_schematic` | `fusion_schematic_plan / fusion_schematic_run` (partial) | | `check_clearance` *proposed* | Measure the gaps between parts, courtyard to courtyard or pad copper to pad copper, for the listed parts or the whole board, and report every pair under a... | `altium_check_clearance` | `kicad_check_clearance` | `fusion_check_clearance` | | `check_orientation` | Advisory: 2-pad parts whose rotation could be better. Each orthogonal rotation is scored in place by airline length (a routable net's MST with the pad... | `altium_check_orientation` | `kicad_check_orientation` | `fusion_check_orientation` |@@ -192,7 +192,7 @@ Engineering computed from the board model, not by the tool: one shared engine, s | `footprint_from_land_pattern` | Build a complete footprint from the land pattern a datasheet prints: pads numbered the standard way (chip, dual SOIC/TSSOP/DFN, SOT, quad QFP/QFN, BGA), an... | `altium_footprint_from_land_pattern` | `kicad_footprint_from_land_pattern` | `fusion_footprint_from_land_pattern` (partial) | | `height_check` | Will it fit the enclosure? Each part's height from its 3D bodies (top and bottom side), the parts over a height limit board-wide or under a lid feature in a... | `altium_height_check` | `kicad_height_check` | `fusion_height_check` | | `impedance` | Controlled impedance from the board's own stack-up: the track width each copper layer needs for a single-ended target (50 ohm default) and the width and gap... | `altium_impedance` | `kicad_impedance` | `fusion_impedance` |-| `import_part` | One call imports a whole part: footprint spec + STEP + symbol modes + models + params + save. | `altium_import_part` | | `fusion_import_part` (partial) |+| `import_part` | One call imports a whole part: footprint spec + STEP + symbol modes + models + params + save. | `altium_import_part` | `kicad_install_footprint / kicad_install_symbol` (partial) | `fusion_import_part` (partial) | | `jlcpcb_order` | A JLCPCB order in one call: the board checked against JLCPCB's fab limits, the Gerbers and drill zipped the way JLCPCB's order page takes them, the JLCPCB... | `altium_jlcpcb_order` | `kicad_jlcpcb_order` | `fusion_jlcpcb_order` | | `length_tune` | Lengthen a routed net to a target length, or to match another net (a pair's skew, a DDR byte lane): a serpentine in its longest straight track that has room... | `altium_length_tune` | `kicad_length_tune` | `fusion_length_tune` | | `net_lengths` | Routed length of every net (or the ones named) on the live board, by layer with its vias; the skew inside each differential pair; and the spread of... | `altium_net_lengths` | `kicad_net_lengths` | `fusion_net_lengths` |@@ -235,7 +235,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `dialog_log` | What the standing dialog reaper (and the bridge's own recoveries) pressed, newest last: nuisance boxes, script-error boxes, discarded save prompts, silent... | `altium_dialog_log` | `kicad_dialog_log` | `fusion_dialog_log` | | `dismiss_dialogs` | Press one named button (default OK) on the detected Altium dialogs through UIA - no cursor, no focus steal. titles narrows it to dialogs whose title... | `altium_dismiss_dialogs` | `kicad_dismiss_dialogs` | `fusion_dismiss_dialogs` | | `document_info` *proposed* | The active document: its name, what kind it is, whether it has unsaved changes, where it is saved and which version it is. Read only; opens nothing. | `altium_document_info` | `kicad_state` (partial) | `fusion_document_info` |-| `ensure_licensed` | One call to get a usable Altium: launch if needed, then claim a seat (Use License via UIA). Optional escalations: sign out to force a seat release, or start... | `altium_ensure_licensed` | | `fusion_signin` (partial) |+| `ensure_licensed` | One call to get a usable Altium: launch if needed, then claim a seat (Use License via UIA). Optional escalations: sign out to force a seat release, or start... | `altium_ensure_licensed` | `kicad_readiness` (partial) | `fusion_signin` (partial) | | `eval` | Run a DelphiScript snippet inside Altium (optional Var block, then Begin ... End;) on the CURRENT document, or on filePath opened first. | `altium_eval` | `kicad_eval` | `fusion_run_modeling_script` (partial) | | `export_spice` *proposed* | Write the design's SPICE netlist with the tool's own exporter, and say what it holds. | `altium_export_spice` | `kicad_export_spice` | `fusion_export_spice` | | `extension_ping` | Does the AdomBridge .NET extension answer? Sends AdomBridge:Ping through the -R lane and waits up to 30 s for its result file. | `altium_extension_ping` | | `fusion_addin_status` (partial) |@@ -262,7 +262,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `selection` | What the user has selected in the current board (components with position mm, rotation, side, footprint, size) or sheet (components with location mils and... | `altium_selection` | `kicad_selection` (partial) | unsupported | | `selftest_script_error` | Regression test for the script-error safety net (from 0.2.23): makes the agent raise a REAL DelphiScript runtime error on purpose and checks that the bridge... | `altium_selftest_script_error` | | unsupported | | `set_layer_visibility` | Show or hide one layer of the current board (by layer id) and refresh the view and the layer tabs. | `altium_set_layer_visibility` | `kicad_set_layer_visibility` | `fusion_set_layer_visibility` |-| `setup_trial` | Onboarding state machine: from nothing to a working trial. Each call reports the stage it found (install / launch / signin / done) and the ONE next action;... | `altium_setup_trial` | | `fusion_install_fusion` (partial) |+| `setup_trial` | Onboarding state machine: from nothing to a working trial. Each call reports the stage it found (install / launch / signin / done) and the ONE next action;... | `altium_setup_trial` | `kicad_upgrade` (partial) | `fusion_install_fusion` (partial) | | `show_2d_board` | Open a .PcbDoc, switch to 2D, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel board. | `altium_show_2d_board` | `kicad_show_2d_board` | `fusion_show_2d_board` | | `show_3d_board` | Open a .PcbDoc, switch to 3D, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel board. | `altium_show_3d_board` | `kicad_show_3d_board` | `fusion_show_3d_board` | | `show_3d_chip` | Open a PcbLib member in the footprint editor in 3D, zoom to fit, and capture a proof frame of the part's 3D body. | `altium_show_3d_chip` | `kicad_show_3d_chip` | `fusion_show_3d_chip` |@@ -272,7 +272,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `show_schematic` | Open a .SchDoc, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel top sheet. | `altium_show_schematic` | `kicad_show_schematic` | `fusion_show_schematic` | | `show_symbol` | Open a SchLib member in the Symbol editor and capture a background proof. | `altium_show_symbol` | `kicad_show_symbol` | `fusion_show_symbol` | | `signin` | Report-only alias of altium_signin_status: it does NOT sign anyone in. Signing in to Altium is a browser flow only the human can complete. | `altium_signin` | | `fusion_signin` |-| `signin_status` | Account and Altium 365 workspace connection as Altium's own UI reports it: licence state from the title, and whether the workspace menu reads 'Not Connected'. | `altium_signin_status` | | `fusion_signin_status` |+| `signin_status` | Account and Altium 365 workspace connection as Altium's own UI reports it: licence state from the title, and whether the workspace menu reads 'Not Connected'. | `altium_signin_status` | `kicad_license_status` (partial) | `fusion_signin_status` | | `simulate` *proposed* | Run a circuit simulation of the design's schematic and return the signals as data: an operating point, a DC sweep, an AC sweep or a transient, with the nets... | `altium_simulate` | `kicad_simulate` | `fusion_simulate` | | `state` | The whole picture in one call: licence state, windows, dialogs, a screenshot of every main/dialog window, and the agent's logical state (focused document,... | `altium_state` | `kicad_state` | `fusion_state` | | `status` | Is Altium running, licensed, and is the resident agent alive? | `altium_status` | `kicad_status` | `fusion_status` |
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "eda-bridge-standard",- "version": "0.24.3",+ "version": "0.24.4", "type": "skill", "title": "EDA Bridge Standard: one way for an AI to drive every PCB tool", "description": "The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.",
tools/tiers.json+2@@ -95,6 +95,7 @@ "length_tune": "checks", "license": "app", "license_status": "app",+ "lint_library": "checks", "list_commands": "app", "list_designators": "core", "list_installed_libraries": "native",@@ -192,6 +193,7 @@ "thermal_vias": "checks", "uninstall": "app", "uninstall_library": "native",+ "update_footprints_from_library": "core", "update_pcb": "native", "variants": "native", "via_fence": "checks",
verbs/coverage.json+27−7@@ -1,5 +1,5 @@ {- "standard": "0.24.3",+ "standard": "0.24.4", "reference": { "bridge": "altium", "version": "0.2.83"@@ -7,7 +7,7 @@ "proposed": 56, "compared": { "kicad": "1.0.89",- "fusion360": "1.13.24"+ "fusion360": "1.13.26" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",@@ -2550,7 +2550,11 @@ "verb": "altium_build_footprint", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_fp_create",+ "match": "partial",+ "note": "from arguments (pads, graphics, courtyard, model) instead of a kicad2altium spec file; kicad_footprint_from_land_pattern builds one from a datasheet's numbers"+ }, "fusion360": { "verb": "fusion_import_part", "match": "partial",@@ -2770,7 +2774,11 @@ "verb": "altium_import_part", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_install_footprint / kicad_install_symbol",+ "match": "partial",+ "note": "two calls: the footprint (with its STEP wired as the 3D model) into Adom.pretty, the symbol into Adom.kicad_sym, both registered in KiCad's tables; no spec files or symbol modes"+ }, "fusion360": { "verb": "fusion_import_part", "match": "partial",@@ -3374,7 +3382,11 @@ "verb": "altium_ensure_licensed", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_readiness",+ "match": "partial",+ "note": "KiCad needs no licence or seat: kicad_readiness says it is installed and usable, kicad_launch starts it"+ }, "fusion360": { "verb": "fusion_signin", "match": "partial",@@ -3833,7 +3845,11 @@ "verb": "altium_setup_trial", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_upgrade",+ "match": "partial",+ "note": "KiCad is free with no trial or sign-in: kicad_upgrade installs it with the official installer, kicad_readiness reports whether it is ready"+ }, "fusion360": { "verb": "fusion_install_fusion", "match": "partial",@@ -3998,7 +4014,11 @@ "verb": "altium_signin_status", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_license_status",+ "match": "partial",+ "note": "KiCad has no account or cloud workspace: kicad_license_status says so, with the installed version"+ }, "fusion360": { "verb": "fusion_signin_status", "match": "exact"
verbs/standard.json+2−2@@ -1,5 +1,5 @@ {- "standard": "0.24.3",+ "standard": "0.24.4", "reference": { "bridge": "altium", "version": "0.2.83"@@ -7,7 +7,7 @@ "proposed": 56, "compared": { "kicad": "1.0.89",- "fusion360": "1.13.24"+ "fusion360": "1.13.26" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",