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.23.5: coverage reads Fusion 1.13.21 (213)
5 files changed
+52−26
README.md+4−3@@ -60,12 +60,12 @@ verb by verb: [docs/coverage.md](docs/coverage.md). <!-- coverage:start (tools/generate.py writes this) --> | Tier | Verbs | Altium | KiCad | Fusion 360 | |---|---|---|---|---|-| **core** | 93 | 93 | 90 | 85 |-| **native** | 46 | 46 | 43 | 36 |+| **core** | 93 | 93 | 90 | 89 |+| **native** | 46 | 46 | 43 | 38 | | **checks** | 37 | 37 | 35 | 37 | | **app** | 62 | 62 | 44 | 49 | | **platform** | 19 | 19 | 0 | 1 |-| standard (all but platform) | 238 | 238 | 212 | 207 |+| standard (all but platform) | 238 | 238 | 212 | 213 | <!-- 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.23.5: coverage reads Fusion 360 bridge 1.13.21 (213 of 238: replicate_layout, symbol_prims, set_visibility, and partial place_on_pcb, place_on_sch, pcb_report). Version 0.23.4: the reference is Altium bridge 0.2.83 (engine 0.20.0, turned bodies, simulate noise and monteCarlo, a 20x faster board model on large boards). Version 0.23.3: coverage reads KiCad bridge 1.0.87 (engine 0.20.0, turned bodies, simulate noise and monteCarlo). Version 0.23.2: coverage reads Fusion 360 bridge 1.13.20 (engine 0.20.0, turned bodies, simulate noise and monteCarlo).
docs/coverage.md+11−11@@ -1,17 +1,17 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.83 (the reference), KiCad bridge 1.0.87, Fusion 360 bridge 1.13.20. 56 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.83 (the reference), KiCad bridge 1.0.87, Fusion 360 bridge 1.13.21. 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. | Tier | Verbs | Altium | KiCad | Fusion 360 | |---|---|---|---|---|-| **core** | 93 | 93 | 90 | 85 |-| **native** | 46 | 46 | 43 | 36 |+| **core** | 93 | 93 | 90 | 89 |+| **native** | 46 | 46 | 43 | 38 | | **checks** | 37 | 37 | 35 | 37 | | **app** | 62 | 62 | 44 | 49 | | **platform** | 19 | 19 | 0 | 1 |-| standard (all but platform) | 238 | 238 | 212 | 207 |+| standard (all but platform) | 238 | 238 | 212 | 213 | ## core @@ -53,8 +53,8 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `net_connections` | Every pad on the board with its net and owner (Designator.Pad), plus a bounding span and the airline length (minimum spanning tree over its pads, airlineMm)... | `altium_net_connections` | `kicad_trace_net / kicad_find_connections` (partial) | `fusion_net_connections` | | `normalize_bodies` | Move every 3D body of a PcbLib's footprints (or one footprint) onto its pad cluster. A body added through the canvas lands 50000 mil from the pads in the... | `altium_normalize_bodies` | | | | `part_parameters` | The parameter names a project's parts carry (with how many parts carry each), or with name, that parameter's value on every part. | `altium_part_parameters` | `kicad_part_parameters` | `fusion_part_parameters` |-| `place_on_pcb` | Place ONE footprint from a PcbLib on a new board and return a proof frame. The single-part predecessor of altium_test_board. | `altium_place_on_pcb` | `kicad_place_footprint / kicad_add_footprint` | |-| `place_on_sch` | Place one symbol, or a ';' list of symbols, from the open SchLib on ONE new sheet (sheet sized FROM the measured parts: 500 mil gaps, 600 mil margins, A4... | `altium_place_on_sch` | `kicad_place_on_sch` | |+| `place_on_pcb` | Place ONE footprint from a PcbLib on a new board and return a proof frame. The single-part predecessor of altium_test_board. | `altium_place_on_pcb` | `kicad_place_footprint / kicad_add_footprint` | `fusion_test_board` (partial) |+| `place_on_sch` | Place one symbol, or a ';' list of symbols, from the open SchLib on ONE new sheet (sheet sized FROM the measured parts: 500 mil gaps, 600 mil margins, A4... | `altium_place_on_sch` | `kicad_place_on_sch` | `fusion_make_showcase_project` (partial) | | `place_vias` | Place vias (through, top to bottom). One undo step, read back. | `altium_place_vias` | `kicad_add_via` | `fusion_place_vias` | | `plate_vias` | Make every drilled pad in a PcbLib a plated MULTI-LAYER pad (all footprints, or footprintName). adom-lbr writes heatsink vias as pads with a hole; Altium... | `altium_plate_vias` | | unsupported | | `project_create` *proposed* | Create a new project folder with a project file, an empty schematic and an empty board (2 to 32 copper layers), with a title and text variables. | `altium_project_create` | `kicad_project_create` | `fusion_project_create` (partial) |@@ -106,11 +106,11 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `set_outline` | Reshape the current board's outline (a rectangle with rounded corners, or a polygon). One undo step. | `altium_set_outline` | `kicad_board_outline` | `fusion_set_outline` | | `set_params` | Set parameters on a SchLib component, optionally its comment, and optionally link a footprint by name. | `altium_set_params` | `kicad_set_params` | `fusion_set_params` (partial) | | `set_track_width` | Set the width of the EXISTING tracks and arcs on nets or a net class (rules only steer new routing). Widen power nets after routing, or thin a net that... | `altium_set_track_width` | `kicad_modify_track` (partial) | `fusion_set_track_width` |-| `set_visibility` | Show or hide one named parameter on a SchLib component. | `altium_set_visibility` | `kicad_set_visibility` | |+| `set_visibility` | Show or hide one named parameter on a SchLib component. | `altium_set_visibility` | `kicad_set_visibility` | `fusion_set_visibility` | | `sheet_params` | Write parameters onto PLACED parts on the schematic sheets (the BOM write-back): MPN, Manufacturer, Mouser/DigiKey/LCSC numbers, anything. A missing... | `altium_sheet_params` | `kicad_sheet_params` | `fusion_sheet_params` | | `silk_state` | The silkscreen as it stands: every part's body box, its designator and comment (text, location, size, rotation, shown, Altium's measured box), and the free... | `altium_silk_state` | `kicad_silk_state` | `fusion_silk_state` | | `swap_footprint` | Replace the FIRST component on the current board with a footprint from a PcbLib at the same position, re-assigning nets by pad designator. Tracks are... | `altium_swap_footprint` | `kicad_update_footprints_from_library` (partial) | `fusion_swap_footprint` |-| `symbol_prims` | Read a SchLib component's drawing: primitive counts by kind, body rectangle, polyline bounding box, display mode and the footprint models. Read-only, use it... | `altium_symbol_prims` | `kicad_symbol_prims` | |+| `symbol_prims` | Read a SchLib component's drawing: primitive counts by kind, body rectangle, polyline bounding box, display mode and the footprint models. Read-only, use it... | `altium_symbol_prims` | `kicad_symbol_prims` | `fusion_symbol_prims` | | `xcopy_footprint` | Copy a footprint ACROSS libraries: from fromLib into toLib (opened and made current), optionally under a new name. | `altium_xcopy_footprint` | `kicad_xcopy_footprint` | `fusion_xcopy_footprint` (partial) | ## native@@ -126,7 +126,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `build_symbol_modes` | Build ONE SchLib component with N display modes (Normal + Alternate 1..N-1) from a symbol_modes spec file on this machine, and return a proof frame. | `altium_build_symbol_modes` | | `fusion_import_part` (partial) | | `cleanup_libs` | Remove the factory-default stray every fresh library carries: Component_1 from the current SchLib and an empty (no pads) PCBComponent_1 from the current PcbLib. | `altium_cleanup_libs` | | unsupported | | `compile` | Compile a project and return Altium's Messages panel (ERC + connectivity) with counts by class. With no path it compiles Altium's bundled example project. | `altium_compile` | `kicad_compile` | `fusion_run_erc` (partial) |-| `component_classes` | List, make or remove component classes on the board, each optionally with a room: a placement area that keeps its parts together (fitted around the parts or... | `altium_component_classes` | `kicad_component_classes` | |+| `component_classes` | List, make or remove component classes on the board, each optionally with a room: a placement area that keeps its parts together (fitted around the parts or... | `altium_component_classes` | `kicad_component_classes` | unsupported | | `create_part_project` *proposed* | Generate a small real project (schematic and board) around one library part, so the part can be shown and tested in every view: schematic, 2D board and 3D... | `altium_create_part_project` | `kicad_create_part_project` (partial) | `fusion_make_test_project` (partial) | | `diff_pairs` | Differential pairs on the current board: list them, define one from two nets (replacing a pair of that name), or remove one. Altium's differential-pair... | `altium_diff_pairs` | `kicad_diff_pairs` (partial) | `fusion_diff_pairs` (partial) | | `export_bom` | Bill of materials export: altium_run_outjob with the assembly OutJob and the 'Folder Structure' medium as defaults. | `altium_export_bom` | `kicad_export_bom_csv` (partial) | `fusion_export_bom` |@@ -146,14 +146,14 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `net_classes` | Net classes on the current board: list them with their nets, or make one (replacing a class of that name) with an optional width and clearance rule scoped... | `altium_net_classes` | `kicad_net_classes` | `fusion_net_classes` | | `netlist` | The compiled netlist of a project: every net with its pins (Designator.Pin) across every sheet, the hierarchy resolved; or one net; or compare with the nets... | `altium_netlist` | `kicad_netlist` | `fusion_netlist` | | `panelize` | Step and repeat a board into a manufacturing panel: a new .PcbDoc holding Altium's own embedded board array of the board (rows x cols), with rails, the... | `altium_panelize` | `kicad_panelize` (partial) | `fusion_panelize` |-| `pcb_report` | Numbers instead of pixels: for a PcbLib, every footprint's pads, pad bounding box, primitive census and 3D bodies; for a board, outline, components with... | `altium_pcb_report` | `kicad_errors` (partial) | |+| `pcb_report` | Numbers instead of pixels: for a PcbLib, every footprint's pads, pad bounding box, primitive census and 3D bodies; for a board, outline, components with... | `altium_pcb_report` | `kicad_errors` (partial) | `fusion_read_footprint / fusion_read_board` (partial) | | `pour_state` | Every polygon pour with the copper it actually poured: filled area per pour and per layer, and the pours that poured nothing. | `altium_pour_state` | `kicad_pour_state` | `fusion_pour_state` | | `project_snapshot` *proposed* | A dated copy of the project's documents into <project>/snapshots/<stamp>[-label]/, with PDFs of the schematic and the board made by the tool. | `altium_project_snapshot` | `kicad_project_snapshot` | `fusion_project_snapshot` (partial) | | `remove_pours` | Delete polygon pours by net (and layer), or all of them, and the pour keepouts (cutouts) apply_pours made. Tracks and vias are untouched. | `altium_remove_pours` | `kicad_remove_zone` | `fusion_remove_pours` | | `render_board_3d` *proposed* | Render a 3D picture of the board from one side to an image file, through the tool's own renderer, without opening a window. | `altium_render_board_3d` | `kicad_render_board_3d` | `fusion_render_board_3d` | | `render_board_layers` *proposed* | Render chosen board layers to an image file without opening a window: a preset view (copper, silkscreen, solder mask, paste, outline, drill, assembly or... | `altium_render_board_layers` | `kicad_export_svg` (partial) | `fusion_export_board_image` (partial) | | `render_schematic` *proposed* | Render a sheet to an image without opening a window, through the tool's own plotter, and keep visual baselines: baseline set stores the image, baseline... | `altium_render_schematic` | `kicad_render_schematic` | `fusion_render_schematic` |-| `replicate_layout` | Copy one channel's placement to matching channels: each target keeps its anchor part where it is and every other part takes the source's offset and rotation... | `altium_replicate_layout` | `kicad_replicate_layout` | |+| `replicate_layout` | Copy one channel's placement to matching channels: each target keeps its anchor part where it is and every other part takes the source's offset and rotation... | `altium_replicate_layout` | `kicad_replicate_layout` | `fusion_replicate_layout` | | `repour` | Repour every polygon on the board (Altium's Repour All) and answer the copper after. Runs outside the script engine so scoped rules apply. | `altium_repour` | `kicad_repour` | `fusion_repour` | | `routing_drc` | Design-rule violations on the current board WITH locations, plus the unrouted (ratsnest) count, as one clean/not-clean answer. | `altium_routing_drc` | `kicad_routing_validate` (partial) | `fusion_routing_drc` | | `run_drc` | Run the design rule check on a board and read the violation markers back. PCB:DesignRuleCheck opens a MODAL; the bridge clicks 'Run Design Rule Check'... | `altium_run_drc` | `kicad_run_drc` | `fusion_run_drc` |
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "eda-bridge-standard",- "version": "0.23.4",+ "version": "0.23.5", "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.",
verbs/coverage.json+34−9@@ -1,5 +1,5 @@ {- "standard": "0.23.4",+ "standard": "0.23.5", "reference": { "bridge": "altium", "version": "0.2.83"@@ -7,7 +7,7 @@ "proposed": 56, "compared": { "kicad": "1.0.87",- "fusion360": "1.13.20"+ "fusion360": "1.13.21" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",@@ -606,7 +606,11 @@ "verb": "kicad_place_footprint / kicad_add_footprint", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_test_board",+ "match": "partial",+ "note": "one footprint from a .lbr on a new board kept as EAGLE source, opened as a local design and read back; the proof frame is fusion_show_2d_board {capture:true}"+ } }, { "name": "place_on_sch",@@ -620,7 +624,11 @@ "verb": "kicad_place_on_sch", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_make_showcase_project",+ "match": "partial",+ "note": "a library's components (or the ones named) on a new sheet with a board beside it; Fusion sizes and titles the sheet itself"+ } }, { "name": "place_vias",@@ -1512,7 +1520,10 @@ "verb": "kicad_set_visibility", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_set_visibility",+ "match": "exact"+ } }, { "name": "sheet_params",@@ -1578,7 +1589,10 @@ "verb": "kicad_symbol_prims", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_symbol_prims",+ "match": "exact"+ } }, { "name": "xcopy_footprint",@@ -1727,7 +1741,11 @@ "verb": "kicad_component_classes", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_not_supported",+ "match": "unsupported",+ "note": "an EAGLE board has net classes (fusion_net_classes, fusion_add_rule) but no component classes or rooms: group a channel by its designators (fusion_replicate_layout takes them as lists)"+ } }, { "name": "create_part_project",@@ -2067,7 +2085,11 @@ "verb": "kicad_errors", "match": "partial" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_read_footprint / fusion_read_board",+ "match": "partial",+ "note": "a library footprint's pads, layers, courtyard and graphics (read_footprint), or the live board's sections (read_board); not one call for a whole library"+ } }, { "name": "pour_state",@@ -2184,7 +2206,10 @@ "verb": "kicad_replicate_layout", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_replicate_layout",+ "match": "exact"+ } }, { "name": "repour",
verbs/standard.json+2−2@@ -1,5 +1,5 @@ {- "standard": "0.23.4",+ "standard": "0.23.5", "reference": { "bridge": "altium", "version": "0.2.83"@@ -7,7 +7,7 @@ "proposed": 56, "compared": { "kicad": "1.0.87",- "fusion360": "1.13.20"+ "fusion360": "1.13.21" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",