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.1: tool_update and import_step join (#29)
5 files changed
+129−17
README.md+4−3@@ -61,11 +61,11 @@ verb by verb: [docs/coverage.md](docs/coverage.md). | Tier | Verbs | Altium | KiCad | Fusion 360 | |---|---|---|---|---| | **core** | 95 | 95 | 95 | 93 |-| **native** | 52 | 49 | 49 | 49 |+| **native** | 53 | 49 | 49 | 50 | | **checks** | 38 | 38 | 38 | 38 |-| **app** | 65 | 65 | 54 | 56 |+| **app** | 66 | 65 | 54 | 57 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 250 | 247 | 236 | 236 |+| standard (all but platform) | 252 | 247 | 236 | 238 | <!-- 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.1: `tool_update` (app) and `import_step` (native) join from fusion-lane (#29). 252 verbs. Version 0.29.0: three verbs from fusion-lane join the standard (#29): `export_3d`, `import_design` and `edit_pours` (native). 250 verbs. Version 0.28.2: the reference is Altium bridge 0.2.86, which answers all 247 standard verbs (sch_batch and log_tail added). Version 0.28.1: coverage reads Fusion 360 bridge 1.13.31 (engine 0.23.0, sends sheetDrawing).
docs/coverage.md+6−4@@ -1,17 +1,17 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.86 (the reference), KiCad bridge 1.0.92, Fusion 360 bridge 1.13.31. 65 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.86 (the reference), KiCad bridge 1.0.92, Fusion 360 bridge 1.13.31. 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. | Tier | Verbs | Altium | KiCad | Fusion 360 | |---|---|---|---|---| | **core** | 95 | 95 | 95 | 93 |-| **native** | 52 | 49 | 49 | 49 |+| **native** | 53 | 49 | 49 | 50 | | **checks** | 38 | 38 | 38 | 38 |-| **app** | 65 | 65 | 54 | 56 |+| **app** | 66 | 65 | 54 | 57 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 250 | 247 | 236 | 236 |+| standard (all but platform) | 252 | 247 | 236 | 238 | ## core @@ -146,6 +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... | | | `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) | | `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) |@@ -286,6 +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) | | `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.0",+ "version": "0.29.1", "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+26−2@@ -1,10 +1,10 @@ {- "standard": "0.29.0",+ "standard": "0.29.1", "reference": { "bridge": "altium", "version": "0.2.86" },- "proposed": 65,+ "proposed": 67, "compared": { "kicad": "1.0.92", "fusion360": "1.13.31"@@ -2092,6 +2092,18 @@ "note": "format eagle only: an EAGLE .sch and its .brd into a new Fusion electronics design with the parts instantiated (Fusion's own import, run in the background)" } },+ {+ "name": "import_step",+ "tier": "native",+ "source": "proposed",+ "altium": null,+ "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"+ }+ }, { "name": "install_library", "tier": "native",@@ -4308,6 +4320,18 @@ "match": "exact" } },+ {+ "name": "tool_update",+ "tier": "app",+ "source": "proposed",+ "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"+ }+ }, { "name": "uninstall", "tier": "app",
verbs/standard.json+92−7@@ -1,10 +1,10 @@ {- "standard": "0.29.0",+ "standard": "0.29.1", "reference": { "bridge": "altium", "version": "0.2.86" },- "proposed": 65,+ "proposed": 67, "compared": { "kicad": "1.0.92", "fusion360": "1.13.31"@@ -4141,7 +4141,8 @@ }, "hint": "pour_state lists the pours and their ids first. One undo step; a pour that refills to nothing is reported, not hidden.", "pitfalls": [- "Changing the net of a pour reconnects copper: run_drc afterwards."+ "Changing the net of a pour reconnects copper: run_drc afterwards.",+ "A tool that keeps a pour's clearance and thermals in its design rules (Altium) writes rules scoped to that pour rather than changing the pour itself; the reply says which." ], "related": [ "pour_state",@@ -4164,7 +4165,8 @@ "since": "0.28.1", "agreedBy": [ "standard-lane",- "kicad-lane"+ "kicad-lane",+ "altium-lane" ] }, {@@ -4205,7 +4207,8 @@ "since": "0.28.1", "agreedBy": [ "standard-lane",- "kicad-lane"+ "kicad-lane",+ "altium-lane" ] }, {@@ -4667,7 +4670,7 @@ "source": "proposed", "summary": "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 project, through the tool's own importer.", "input": {- "format": "the source tool, an open list (eagle, kicad, altium, pads, cadstar, fabmaster, pcad, ...); required",+ "format": "the source tool, an open list (eagle, kicad, altium, pads, orcad, cadstar, fabmaster, pcad, ...); required", "filePath": "the schematic or project file (required)", "boardPath": "the paired board file, when the format keeps it separate", "name": "the new design's name"@@ -4699,7 +4702,51 @@ "since": "0.28.1", "agreedBy": [ "standard-lane",- "kicad-lane"+ "kicad-lane",+ "altium-lane"+ ]+ },+ {+ "name": "import_step",+ "tier": "native",+ "source": "proposed",+ "summary": "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 model (that is add_body).",+ "input": {+ "filePath": "the STEP on the tool's machine (required)",+ "at": "[x, y, z] mm relative to the board origin, default [0, 0, 0]",+ "rotation": "[rx, ry, rz] degrees",+ "name": "what to call it"+ },+ "output": {+ "id": "the placed model",+ "bboxMm": "[x0, y0, z0, x1, y1, z1]",+ "bodies": "int"+ },+ "hint": "height_check and the bodies companion can then measure the board against it.",+ "pitfalls": [+ "A tool that can only open the STEP as a separate design answers partial and says so."+ ],+ "related": [+ "add_body",+ "height_check",+ "bodies",+ "export_step"+ ],+ "example": {+ "filePath": "C:/mech/enclosure.step",+ "at": [+ 0,+ 0,+ -3+ ]+ },+ "longRunning": true,+ "timeoutSeconds": 300,+ "proposedBy": "fusion-lane",+ "since": "0.28.1",+ "agreedBy": [+ "standard-lane",+ "altium-lane" ] }, {@@ -9262,6 +9309,44 @@ "longRunning": false, "timeoutSeconds": 15 },+ {+ "name": "tool_update",+ "tier": "app",+ "source": "proposed",+ "summary": "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.",+ "input": {+ "action": "check | apply | auto (required)",+ "on": "bool (auto): turn automatic updating on or off; omitted, the setting is read"+ },+ "output": {+ "current": "the installed version",+ "offered": "the version offered, or null",+ "applied": "bool",+ "auto": "bool",+ "needsRestart": "bool"+ },+ "hint": "apply never closes unsaved work: it refuses with the documents that need saving. Updating the tool is the user's machine changing, so say so before apply.",+ "pitfalls": [+ "An update offered only through the tool's own dialog is read from that dialog and answered in the background, never left open.",+ "apply refuses while documents are unsaved, and an installer that needs a person at the Windows UAC prompt answers needs_user with what to approve."+ ],+ "related": [+ "readiness",+ "diagnostics",+ "install"+ ],+ "example": {+ "action": "check"+ },+ "longRunning": true,+ "timeoutSeconds": 600,+ "proposedBy": "fusion-lane",+ "since": "0.28.1",+ "agreedBy": [+ "standard-lane",+ "altium-lane"+ ]+ }, { "name": "uninstall", "tier": "app",