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.29.5: coverage reads Fusion 1.13.34
5 files changed
+23−25
README.md+1@@ -158,6 +158,7 @@ Decisions so far (proposals from the KiCad and Fusion bridges, 2026-10-27; issue ## Status +Version 0.29.5: coverage reads Fusion 360 bridge 1.13.34 (five partials now exact: board_summary, read_schematic, list_library, export_pos, window_info). Version 0.29.4: coverage reads Fusion 360 bridge 1.13.33 (239 of 252: panel now real; export_3d, import_step and tool_update exact). Version 0.29.3: coverage reads KiCad bridge 1.0.93 (sends sheetDrawing); `sheetDrawing` entries may carry `sizeMm` (the sheet's width and height). Version 0.29.2: Altium's `import_kicad` counts as `import_design` (partial, kicad only).
docs/coverage.md+6−6@@ -1,6 +1,6 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.86 (the reference), KiCad bridge 1.0.93, Fusion 360 bridge 1.13.33. 67 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.87 (the reference), KiCad bridge 1.0.93, Fusion 360 bridge 1.13.34. 67 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. @@ -26,7 +26,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `apply_silkscreen` | Land a silkscreen plan in one undo step: designators and comments moved, sized and turned (or hidden), free overlay texts and lines added (bottom texts... | `altium_apply_silkscreen` | `kicad_silk_fields_batch / kicad_silk_text_batch / kicad_silk_graphics_batch` | `fusion_apply_silkscreen` | | `board_outline` | Draw the board shape as tracks and arcs on a mechanical layer: the outline a fab house reads from the Gerbers. A board built by script has its shape but... | `altium_board_outline` | `kicad_board_outline` | `fusion_board_outline` | | `board_shape` | Redefine the CURRENT board's outline as a wMm x hMm rectangle at (x0Mm, y0Mm) by rewriting the board outline's segments. | `altium_board_shape` | `kicad_board_outline` | `fusion_board_shape` |-| `board_summary` | One-screen summary of the current board, shaped from one read_board round trip: component counts by side, nets, copper layers actually in use, rule counts. | `altium_board_summary` | `kicad_board_summary` | `fusion_board_summary` (partial) |+| `board_summary` | One-screen summary of the current board, shaped from one read_board round trip: component counts by side, nets, copper layers actually in use, rule counts. | `altium_board_summary` | `kicad_board_summary` | `fusion_board_summary` | | `bodies` *proposed* | Every part's 3D body as a box: its footprint rectangle on the board and its height range above the surface it sits on (a bottom part measures down from the... | `altium_bodies` | `kicad_bodies` | `fusion_bodies` | | `clone_symbol` | Copy a symbol inside the current SchLib under a new name, all display modes included. | `altium_clone_symbol` | `kicad_clone_symbol` | `fusion_clone_symbol` (partial) | | `component_data` | Placement data for one board component, or for all of them: footprint pattern, comment, layer/side, position, rotation, size, pad count and the nets on its... | `altium_component_data` | `kicad_component_data` | `fusion_component_data` |@@ -47,7 +47,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `layers` | The current board's layer set with ids, names, kind and whether each is displayed. | `altium_layers` | `kicad_layers` | `fusion_layers` | | `layers_in_use` | Which layers of the current board actually carry primitives: copper layers with copper (densest first) and every layer with anything on it. | `altium_layers_in_use` | `kicad_layers_in_use` | `fusion_layers_in_use` | | `list_designators` | Every component designator on the current board. | `altium_list_designators` | `kicad_list_designators` | `fusion_list_designators` |-| `list_library` | Names of every component in a .SchLib or every footprint in a .PcbLib (kind taken from the extension). Opens the library; no screenshot. | `altium_list_library` | `kicad_list_footprints / kicad_list_symbols` (partial) | `fusion_library_parts` (partial) |+| `list_library` | Names of every component in a .SchLib or every footprint in a .PcbLib (kind taken from the extension). Opens the library; no screenshot. | `altium_list_library` | `kicad_list_footprints / kicad_list_symbols` (partial) | `fusion_list_library` | | `list_nets` | Every net on the current board with its pad count. | `altium_list_nets` | `kicad_list_nets` | `fusion_list_nets` | | `move_parts` | Move, rotate and flip placed components (side top or bottom; flip:true turns a part over); each part is read back to 0.001 mm, the exact rotation and its... | `altium_move_parts` | `kicad_move_footprint / kicad_flip_footprint` | `fusion_move_parts` | | `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` |@@ -63,7 +63,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `read_board` | ONE round trip: components, nets, layers, copper, rules, occupancy, outline. | `altium_read_board` | `kicad_board_summary` (partial) | `fusion_read_board` | | `read_footprint` *proposed* | Every detail of one library footprint: pads (number, type, shape, position, size, drill, layers), the layers it uses, its courtyard box, graphics per layer,... | `altium_read_footprint` | `kicad_read_footprint` | `fusion_read_footprint` | | `read_rules` | Every design rule on the current board, flat, disabled ones included: name, kind ordinal, enabled, priority, both scope expressions, comment, and Altium's... | `altium_read_rules` | `kicad_list_design_rules` | `fusion_read_rules` |-| `read_schematic` | Components on the CURRENT schematic sheet (designator, library reference, comment, position, parameters) in one agent round trip. | `altium_read_schematic` | `kicad_sch_components` (partial) | `fusion_schematic` (partial) |+| `read_schematic` | Components on the CURRENT schematic sheet (designator, library reference, comment, position, parameters) in one agent round trip. | `altium_read_schematic` | `kicad_sch_components` (partial) | `fusion_read_schematic` | | `read_symbol` | Read a SchLib component back: description, display-mode count, the pins of mode 0 (designator, name, electrical type), every parameter with its hidden flag,... | `altium_read_symbol` | `kicad_read_symbol` | `fusion_read_symbol` (partial) | | `remove_footprint` | Delete one footprint from the current PcbLib. | `altium_remove_footprint` | `kicad_remove_footprint` | `fusion_remove_footprint` | | `remove_graphics` *proposed* | Remove board graphics (lines, rectangles, circles, arcs, polygons, texts, dimensions) by id, or every one on a layer and of a kind. One undo step. | `altium_remove_graphics` | `kicad_remove_graphics` | `fusion_remove_graphics` |@@ -143,7 +143,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `export_manufacturing` | A project's manufacturing set in one call: Gerbers, NC drill, pick and place (CSV, mm) and the BOM, from an OutJob the bridge writes beside the project... | `altium_export_manufacturing` | `kicad_export_manufacturing` | `fusion_export_gerbers / fusion_export_cpl / fusion_export_bom` (partial) | | `export_odb` *proposed* | Export the board as ODB++ (copper, drill, stack-up, netlist and parts in one archive) through the tool's own exporter. | `altium_export_odb` | `kicad_export_odb` | `fusion_export_odb` | | `export_pdf` | Every sheet of a project as one PDF, plus on request the board's composite print, Altium's assembly drawings (top and bottom, designators on the parts) and... | `altium_export_pdf` | `kicad_export_pdf` | `fusion_export_pdf` (partial) |-| `export_pos` *proposed* | Export the pick-and-place (component position, CPL) file of a board, optionally in a fab's assembly format (JLCPCB's columns). | `altium_export_pos` | `kicad_export_pos` | `fusion_export_cpl` (partial) |+| `export_pos` *proposed* | Export the pick-and-place (component position, CPL) file of a board, optionally in a fab's assembly format (JLCPCB's columns). | `altium_export_pos` | `kicad_export_pos` | `fusion_export_pos` | | `export_step` | Headless STEP export of a board. Default lane 'outjob': Altium's own ExportSTEP output run from a throwaway project in %TEMP% that points at the board - no... | `altium_export_step` | `kicad_export_step` | `fusion_export_step` | | `import_design` *proposed* | Bring a design from another tool into a NEW native design with the parts instantiated: an EAGLE .sch with its paired .brd, a KiCad project, or an Altium... | `altium_import_kicad` (partial) | | `fusion_new_electronics_from_eagle` (partial) | | `import_step` *proposed* | Bring a STEP model in as 3D geometry placed with the board: an enclosure, a bracket or a mating part, for fit and clearance checks. Not a footprint's own... | | | `fusion_import_step` |@@ -290,7 +290,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `tool_update` *proposed* | The tool's own updates: check whether one is offered, apply it in the background when no work would be lost, or read or set automatic updating. | | | `fusion_tool_update` | | `uninstall` | Remove the bridge's own cache directory (agent workspaces, rendered agent scripts, the Altium 365 token file). Altium Designer and the user's designs are... | `altium_uninstall` | `kicad_uninstall` | `fusion_uninstall` | | `verb_times` *proposed* | Measured run times of this bridge's verbs on this machine: per verb the count, p50, p90, max, last and failures, from its own run log, slowest p90 first. | `altium_verb_times` | `kicad_verb_times` | `fusion_verb_times` |-| `window_info` | Altium's top-level windows plus any open dialogs, without screenshots. The cheap way to ask 'is a modal blocking the engine?'. | `altium_window_info` | `kicad_window_info` | `fusion_check_dialogs` (partial) |+| `window_info` | Altium's top-level windows plus any open dialogs, without screenshots. The cheap way to ask 'is a modal blocking the engine?'. | `altium_window_info` | `kicad_window_info` | `fusion_window_info` | | `zoom_to` | Frame the PCB view on a rectangle, a part (or several) or a whole net, with a margin. | `altium_zoom_to` | `kicad_zoom_to` | `fusion_zoom_to` | ## platform
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "eda-bridge-standard",- "version": "0.29.4",+ "version": "0.29.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+12−15@@ -1,13 +1,13 @@ {- "standard": "0.29.4",+ "standard": "0.29.5", "reference": { "bridge": "altium",- "version": "0.2.86"+ "version": "0.2.87" }, "proposed": 67, "compared": { "kicad": "1.0.93",- "fusion360": "1.13.33"+ "fusion360": "1.13.34" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",@@ -153,8 +153,7 @@ }, "fusion360": { "verb": "fusion_board_summary",- "match": "partial",- "note": "fusion_board_info under the standard's name: its reply (parts, nets, layers, counts), not the standard's summary shaped from read_board (fusion_read_board gives those sections)"+ "match": "exact" } }, {@@ -518,8 +517,8 @@ "match": "partial" }, "fusion360": {- "verb": "fusion_library_parts",- "match": "partial"+ "verb": "fusion_list_library",+ "match": "exact" } }, {@@ -797,8 +796,8 @@ "match": "partial" }, "fusion360": {- "verb": "fusion_schematic",- "match": "partial"+ "verb": "fusion_read_schematic",+ "match": "exact" } }, {@@ -2057,9 +2056,8 @@ "match": "exact" }, "fusion360": {- "verb": "fusion_export_cpl",- "match": "partial",- "note": "the Component Placement List CSV in mm, side all, top or bottom; JLCPCB's own CPL columns come from fusion_jlcpcb_order (cpl-jlcpcb.csv). No ascii or gerber format, inch units, smdOnly or excludeDnp filter"+ "verb": "fusion_export_pos",+ "match": "exact" } }, {@@ -4379,9 +4377,8 @@ "match": "exact" }, "fusion360": {- "verb": "fusion_check_dialogs",- "match": "partial",- "note": "every open Fusion dialog with title, text and buttons, without a screenshot; fusion_state adds the window and a background screenshot"+ "verb": "fusion_window_info",+ "match": "exact" } }, {
verbs/standard.json+3−3@@ -1,13 +1,13 @@ {- "standard": "0.29.4",+ "standard": "0.29.5", "reference": { "bridge": "altium",- "version": "0.2.86"+ "version": "0.2.87" }, "proposed": 67, "compared": { "kicad": "1.0.93",- "fusion360": "1.13.33"+ "fusion360": "1.13.34" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",