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.4: coverage reads Fusion 1.13.33 (239)
5 files changed
+26−29
README.md+3−2@@ -63,9 +63,9 @@ verb by verb: [docs/coverage.md](docs/coverage.md). | **core** | 95 | 95 | 95 | 93 | | **native** | 53 | 50 | 49 | 50 | | **checks** | 38 | 38 | 38 | 38 |-| **app** | 66 | 65 | 54 | 57 |+| **app** | 66 | 65 | 54 | 58 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 252 | 248 | 236 | 238 |+| standard (all but platform) | 252 | 248 | 236 | 239 | <!-- 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.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). Version 0.29.1: `tool_update` (app) and `import_step` (native) join from fusion-lane (#29). 252 verbs.
docs/coverage.md+8−8@@ -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.31. 67 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+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*. `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. @@ -9,9 +9,9 @@ Generated by `tools/generate.py` from `verbs/coverage.json`; do not edit by hand | **core** | 95 | 95 | 95 | 93 | | **native** | 53 | 50 | 49 | 50 | | **checks** | 38 | 38 | 38 | 38 |-| **app** | 66 | 65 | 54 | 57 |+| **app** | 66 | 65 | 54 | 58 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 252 | 248 | 236 | 238 |+| standard (all but platform) | 252 | 248 | 236 | 239 | ## core @@ -131,8 +131,8 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `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) |-| `edit_pours` *proposed* | Change existing pours in place without redrawing them: clearance, minimum width, thermal relief (on/off, spoke width, gap), priority or rank, the net, and... | | | `fusion_change_pours` (partial) |-| `export_3d` *proposed* | Export the board's 3D model in a mesh or CAD format other than STEP (export_step has STEP), through the tool's own exporter, with an optional web-optimized... | | | `fusion_export_cloud_file` (partial) |+| `edit_pours` *proposed* | Change existing pours in place without redrawing them: clearance, minimum width, thermal relief (on/off, spoke width, gap), priority or rank, the net, and... | | | `fusion_edit_pours` (partial) |+| `export_3d` *proposed* | Export the board's 3D model in a mesh or CAD format other than STEP (export_step has STEP), through the tool's own exporter, with an optional web-optimized... | | | `fusion_export_3d` | | `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` | | `export_dxf` *proposed* | Export chosen board layers to DXF, one file per layer (the outline, panel drawings, stencils, enclosure work). | `altium_export_dxf` | `kicad_export_dxf` | `fusion_export_dxf` | | `export_gencad` *proposed* | Export the board as GenCAD 1.4, the input of test-fixture tools and some assembly houses' CAM. | `altium_export_gencad` | `kicad_export_gencad` | `fusion_export_gencad` |@@ -146,7 +146,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `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_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` (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` | | `install_library` | Register a library file in Altium's Installed Libraries (IntegratedLibraryManager.InstallLibrary) so its parts appear in the Components panel. | `altium_install_library` | `kicad_install_library` | `fusion_install_library_bundle` (partial) | | `install_library_bundle` | One-click install of a wiki library bundle (zip of .SchLib/.PcbLib): unpack, register, open the library, prove it with a frame. | `altium_install_library_bundle` | `kicad_install_library_bundle` | `fusion_install_library_bundle` | | `list_installed_libraries` | Every library in Altium's Installed Libraries list (read-only). | `altium_list_installed_libraries` | `kicad_list_installed_libraries` | `fusion_list_installed_libraries` (partial) |@@ -261,7 +261,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `log_tail` *proposed* | What the tool said about itself since an offset: its own log lines and alerts (warnings and errors), so a verb that looks successful while the tool... | `altium_log_tail` | `kicad_log_tail` | `fusion_log_tail` | | `open_document` | Open a document or project by path through the agent and show it without focusing it. An already-open document is activated, not reloaded. | `altium_open_document` | `kicad_open_board / kicad_open_schematic` (partial) | `fusion_open_document` | | `open_project` | Open a project (.PrjPcb / .PrjScr / .PrjMbd / .PrjHar / .LibPkg) by path. Same handler as altium_open_document. | `altium_open_project` | `kicad_open_board / kicad_open_schematic` (partial) | `fusion_open_cloud_file` (partial) |-| `panel` | Activate a docked panel TAB (SCH Library, PCB Library, Components, Projects, Properties) in the BACKGROUND - the 'ganged-up view' needs the right panels in... | `altium_panel` | `kicad_send_key` (partial) | unsupported |+| `panel` | Activate a docked panel TAB (SCH Library, PCB Library, Components, Projects, Properties) in the BACKGROUND - the 'ganged-up view' needs the right panels in... | `altium_panel` | `kicad_send_key` (partial) | `fusion_panel` | | `prewarm` *proposed* | Get this machine ready for a fast first call: detect the tool, seed its first-run settings, dismiss first-run wizards and repair what the first real call... | `altium_prewarm` | `kicad_prewarm` | `fusion_prewarm` | | `progress` | The bridge's timing book: phases in flight right now (percent/ETA blocks ab paints on the taskbar), measured phase history and per-verb run statistics. | `altium_progress` | `kicad_progress` | `fusion_progress` | | `readiness` | The one-call gate: is Altium installed, running, licensed, and is the resident agent alive? Answers with Altium closed and never touches the script engine. | `altium_readiness` | `kicad_readiness` | `fusion_readiness` |@@ -287,7 +287,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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` |-| `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_apply_fusion_update` (partial) |+| `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) |
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "eda-bridge-standard",- "version": "0.29.3",+ "version": "0.29.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.",
verbs/coverage.json+12−16@@ -1,5 +1,5 @@ {- "standard": "0.29.3",+ "standard": "0.29.4", "reference": { "bridge": "altium", "version": "0.2.86"@@ -7,7 +7,7 @@ "proposed": 67, "compared": { "kicad": "1.0.93",- "fusion360": "1.13.31"+ "fusion360": "1.13.33" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",@@ -1855,9 +1855,9 @@ "altium": null, "kicad": null, "fusion360": {- "verb": "fusion_change_pours",+ "verb": "fusion_edit_pours", "match": "partial",- "note": "each pour's minimum width (EAGLE's pen width) and clearance (isolate), refilled and read back; thermals, rank and net are not changed yet"+ "note": "minimum width, clearance, thermals, rank and orphans, refilled and read back (net and layer name a pour when it is the only one there); a pour's net cannot be moved in place (a polygon belongs to its signal)" } }, {@@ -1867,9 +1867,8 @@ "altium": null, "kicad": null, "fusion360": {- "verb": "fusion_export_cloud_file",- "match": "partial",- "note": "the board's 3D PCB design in stl, iges, sat or f3d (obj, 3mf, fbx and usdz through fusion_export_obj, fusion_export_3mf, fusion_export_fbx, fusion_export_usdz; a web glb through fusion_export_optimized_glb); vrml and ply are not offered"+ "verb": "fusion_export_3d",+ "match": "exact" } }, {@@ -2104,8 +2103,7 @@ "kicad": null, "fusion360": { "verb": "fusion_import_step",- "match": "partial",- "note": "the STEP opens as a NEW Fusion design; it is not yet placed with the board's 3D PCB"+ "match": "exact" } }, {@@ -3882,9 +3880,8 @@ "note": "kicad_send_key {menu: \"Properties\" | \"Appearance\" | \"Search\" | \"Net Inspector\" | \"Design Blocks\"} fires View > Panels in the background; it is a toggle, and neither the menu nor KiCad's API reports whether a panel is showing (kicad_screenshot_all shows it)" }, "fusion360": {- "verb": "fusion_not_supported",- "match": "unsupported",- "note": "Altium's docked panel tabs; Fusion's editors show their own panels, and the bridge opens a surface (library, symbol, footprint, board, schematic, 3D) with fusion_show_* in the background"+ "verb": "fusion_panel",+ "match": "exact" } }, {@@ -4043,7 +4040,7 @@ "fusion360": { "verb": "fusion_not_supported", "match": "unsupported",- "note": "Fusion does not show the user's board selection to the bridge: a ULP's ingroup() reads no part even right after a GROUP (checked live on Fusion 2706, 2026-10-30). Name the parts instead; fusion_electron_select shows one to the user"+ "note": "Fusion does not show the user's board selection to the bridge, checked live on Fusion 2706 (2026-10-30) three ways: a ULP's ingroup() reads no part right after a GROUP, ui.activeSelections reads 0 right after a SELECT, and the electron Board's selectionSets raises InternalValidationError" } }, {@@ -4331,9 +4328,8 @@ "altium": null, "kicad": null, "fusion360": {- "verb": "fusion_apply_fusion_update",- "match": "partial",- "note": "apply takes the update Fusion offers in the background when auto-update is on; auto through fusion_set_auto_update; check is read from Fusion's own update offer"+ "verb": "fusion_tool_update",+ "match": "exact" } }, {
verbs/standard.json+2−2@@ -1,5 +1,5 @@ {- "standard": "0.29.3",+ "standard": "0.29.4", "reference": { "bridge": "altium", "version": "0.2.86"@@ -7,7 +7,7 @@ "proposed": 67, "compared": { "kicad": "1.0.93",- "fusion360": "1.13.31"+ "fusion360": "1.13.33" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",