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
0.31.6: coverage reads KiCad bridge 1.0.100
5 files changed
+40−30
README.md+3−2@@ -63,9 +63,9 @@ verb by verb: [docs/coverage.md](docs/coverage.md). | **core** | 99 | 95 | 99 | 96 | | **native** | 55 | 53 | 54 | 52 | | **checks** | 39 | 38 | 39 | 39 |-| **app** | 70 | 66 | 57 | 62 |+| **app** | 70 | 66 | 59 | 62 | | **platform** | 40 | 18 | 0 | 23 |-| standard (all but platform) | 263 | 252 | 249 | 249 |+| standard (all but platform) | 263 | 252 | 251 | 249 | <!-- 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.31.6: coverage reads KiCad bridge 1.0.100 (place_parts, edit_tracks, extensions, preferences, select_items, cancel_run; physical_properties refused with the reason). Version 0.31.5: coverage reads KiCad bridge 1.0.99 (twelve verbs answered under their own names). Version 0.31.4: coverage reads Fusion 360 bridge 1.13.59 (public; answers the 0.31 verbs). Version 0.31.3: the reference is Altium 0.2.89 (import_design and tool_update exact).
docs/coverage.md+10−10@@ -1,6 +1,6 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.89 (the reference), KiCad bridge 1.0.99, Fusion 360 bridge 1.13.59. 100 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.89 (the reference), KiCad bridge 1.0.100, Fusion 360 bridge 1.13.59. 100 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** | 99 | 95 | 99 | 96 | | **native** | 55 | 53 | 54 | 52 | | **checks** | 39 | 38 | 39 | 39 |-| **app** | 70 | 66 | 57 | 62 |+| **app** | 70 | 66 | 59 | 62 | | **platform** | 40 | 18 | 0 | 23 |-| standard (all but platform) | 263 | 252 | 249 | 249 |+| standard (all but platform) | 263 | 252 | 251 | 249 | ## core @@ -55,7 +55,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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` | `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_parts` *proposed* | Put footprints from a library onto the current board, each with its position, rotation and side, and read them back. One undo step. | | `kicad_add_footprint` (partial) | `fusion_place_parts` (partial) |+| `place_parts` *proposed* | Put footprints from a library onto the current board, each with its position, rotation and side, and read them back. One undo step. | | `kicad_place_parts` | `fusion_place_parts` (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` | `kicad_plate_vias` | `fusion_plate_vias` | | `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) |@@ -136,7 +136,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `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... | `altium_edit_pours` | `kicad_edit_pours` | `fusion_edit_pours` (partial) |-| `edit_tracks` *proposed* | Change given tracks by the handle routing_state returns: width, layer and ends. One undo step, read back. | | `kicad_modify_track` (partial) | `fusion_edit_tracks` (partial) |+| `edit_tracks` *proposed* | Change given tracks by the handle routing_state returns: width, layer and ends. One undo step, read back. | | `kicad_edit_tracks` | `fusion_edit_tracks` (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... | `altium_export_3d` | `kicad_export_3d` | `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` | `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` |@@ -159,7 +159,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `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_pcb_report` | `fusion_pcb_report` |-| `physical_properties` *proposed* | Per component: volume, mass, density, surface area and centre of mass, from the tool's own materials. A tool with no materials or part masses answers... | | | `fusion_physical_properties` |+| `physical_properties` *proposed* | Per component: volume, mass, density, surface area and centre of mass, from the tool's own materials. A tool with no materials or part masses answers... | | unsupported | `fusion_physical_properties` | | `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` |@@ -239,7 +239,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `agent_status` | Is the agent loop alive and responsive, in which workspace, and is any loop resident anywhere? Read-only; never starts the agent. | `altium_agent_status` | unsupported | `fusion_addin_status` (partial) | | `agent_stop` | Stop the selected instance's resident agent loop (drops a stop file and waits up to 12 s for the heartbeat to go stale). | `altium_agent_stop` | unsupported | unsupported | | `animate_view` | Camera/zoom choreography on the current document - native Altium camera commands, animated by Altium itself. | `altium_animate_view` | `kicad_animate_view` | `fusion_view` (partial) |-| `cancel_run` *proposed* | Stop the bridge's own long job, between steps, keeping what is done. With nothing to stop it answers cancelRequested:false and a reason. It never claims to... | | | `fusion_cancel_run` (partial) |+| `cancel_run` *proposed* | Stop the bridge's own long job, between steps, keeping what is done. With nothing to stop it answers cancelRequested:false and a reason. It never claims to... | | `kicad_cancel_run` (partial) | `fusion_cancel_run` (partial) | | `check_dialogs` | List every Altium dialog currently open, classified, each with a screenshot (the only way to READ one: Altium paints its dialog text). | `altium_check_dialogs` | `kicad_check_dialogs` | `fusion_check_dialogs` | | `close` | Polite close (releases the licence seat). Frees a script engine parked on a breakpoint first (Altium refuses to close over one). discardChanges:true answers... | `altium_close` | `kicad_close` | `fusion_stop` | | `close_all_documents` *proposed* | Close every open document without a save dialog. Unsaved work is never lost by default: a document with unsaved changes stays open and is listed, unless... | `altium_close_all_documents` | `kicad_close_all_documents` | `fusion_close_all_documents` |@@ -256,7 +256,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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` | unsupported | `fusion_addin_status` (partial) |-| `extensions` *proposed* | The tool's own plugins and add-ons: list what is installed, install one, remove one. Not install_extension, which is the bridge's own helper inside the tool. | | `kicad_pcm_list / kicad_pcm_install / kicad_pcm_uninstall` (partial) | `fusion_extensions` (partial) |+| `extensions` *proposed* | The tool's own plugins and add-ons: list what is installed, install one, remove one. Not install_extension, which is the bridge's own helper inside the tool. | | `kicad_extensions` | `fusion_extensions` (partial) | | `foreground` | Bring Altium in front of the user - the sanctioned exception to the never-foreground rule. | `altium_foreground` | `kicad_foreground` | `fusion_foreground` | | `install` | Install Altium Designer on this machine, STAGED, with the rules in the verb (from 0.2.29). stage: preflight / get_installer / launch / wait / license, or... | `altium_install` | `kicad_upgrade` (partial) | `fusion_install` | | `install_extension` | Install, update or remove the AdomBridge .NET extension (the PowerShell installer shipped beside the bridge). Altium must be CLOSED. | `altium_install_extension` | unsupported | unsupported |@@ -271,7 +271,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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_document` | `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_project` | `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) | `fusion_panel` |-| `preferences` *proposed* | Read the tool's own settings (all, or one by key), or change them with set. Reports per key what was applied. A tool that rewrites its settings on exit... | | | `fusion_preferences` |+| `preferences` *proposed* | Read the tool's own settings (all, or one by key), or change them with set. Reports per key what was applied. A tool that rewrites its settings on exit... | | `kicad_preferences` | `fusion_preferences` | | `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` |@@ -279,7 +279,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `run_script` | One shot: run a procedure of YOUR OWN .PrjScr through Altium's -R command line. Only for when the agent is NOT resident. | `altium_run_script` | `kicad_run_script` | `fusion_run_script` | | `save` | Save the focused document, or the document at filePath (opened first if need be, saved by its path, never whatever happens to have focus). | `altium_save` | `kicad_save` | `fusion_save` | | `sch_zoom` | Find parts on a sheet: select them (everything else deselected), frame the view on them and return a proof frame. The schematic half of cross-probing (the... | `altium_sch_zoom` | `kicad_sch_zoom` (partial) | `fusion_sch_zoom` |-| `select_items` *proposed* | Select parts by designator on the board or the sheet, or clear the selection. A bridge that cannot select on one of them refuses it by name. verified says... | | `kicad_select_items` | `fusion_select_items` (partial) |+| `select_items` *proposed* | Select parts by designator on the board or the sheet, or clear the selection. A bridge that cannot select on one of them refuses it by name. verified says... | | `kicad_select_items` (partial) | `fusion_select_items` (partial) | | `select_net` | Select one net as a whole on the current board (tracks, arcs, vias, pads, pours) and nothing else, optionally framing it; no net clears the selection. | `altium_select_net` | `kicad_select_net` | `fusion_select_net` | | `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 | unsupported |
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "eda-bridge-standard",- "version": "0.31.5",+ "version": "0.31.6", "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+24−15@@ -1,12 +1,12 @@ {- "standard": "0.31.5",+ "standard": "0.31.6", "reference": { "bridge": "altium", "version": "0.2.89" }, "proposed": 100, "compared": {- "kicad": "1.0.99",+ "kicad": "1.0.100", "fusion360": "1.13.59" }, "tiers": {@@ -649,9 +649,8 @@ "source": "proposed", "altium": null, "kicad": {- "verb": "kicad_add_footprint",- "match": "partial",- "note": "one footprint or one row per call, not a parts list; the verb under the standard's name is coming"+ "verb": "kicad_place_parts",+ "match": "exact" }, "fusion360": { "verb": "fusion_place_parts",@@ -1931,9 +1930,8 @@ "source": "proposed", "altium": null, "kicad": {- "verb": "kicad_modify_track",- "match": "partial",- "note": "the standard's tracks list is KiCad's changes list; the verb under the standard's name is coming"+ "verb": "kicad_edit_tracks",+ "match": "exact" }, "fusion360": { "verb": "fusion_edit_tracks",@@ -2328,7 +2326,11 @@ "tier": "native", "source": "proposed", "altium": null,- "kicad": null,+ "kicad": {+ "verb": "kicad_physical_properties",+ "match": "unsupported",+ "note": "KiCad has no materials or masses on a part"+ }, "fusion360": { "verb": "fusion_physical_properties", "match": "exact"@@ -3471,7 +3473,11 @@ "tier": "app", "source": "proposed", "altium": null,- "kicad": null,+ "kicad": {+ "verb": "kicad_cancel_run",+ "match": "partial",+ "note": "stops kicad_autoroute's Freerouting job, the only long job that can stop; a real stop isn't tested yet, because Freerouting isn't on the test laptop"+ }, "fusion360": { "verb": "fusion_cancel_run", "match": "partial",@@ -3764,9 +3770,8 @@ "source": "proposed", "altium": null, "kicad": {- "verb": "kicad_pcm_list / kicad_pcm_install / kicad_pcm_uninstall",- "match": "partial",- "note": "three verbs for KiCad's Plugin and Content Manager; one verb under the standard's name is coming"+ "verb": "kicad_extensions",+ "match": "exact" }, "fusion360": { "verb": "fusion_extensions",@@ -4029,7 +4034,10 @@ "tier": "app", "source": "proposed", "altium": null,- "kicad": null,+ "kicad": {+ "verb": "kicad_preferences",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_preferences", "match": "exact",@@ -4165,7 +4173,8 @@ "altium": null, "kicad": { "verb": "kicad_select_items",- "match": "exact"+ "match": "partial",+ "note": "on the board only; where:\"sheet\" is refused, because KiCad's Schematic Editor has no API for its selection" }, "fusion360": { "verb": "fusion_select_items",
verbs/standard.json+2−2@@ -1,12 +1,12 @@ {- "standard": "0.31.5",+ "standard": "0.31.6", "reference": { "bridge": "altium", "version": "0.2.89" }, "proposed": 100, "compared": {- "kicad": "1.0.99",+ "kicad": "1.0.100", "fusion360": "1.13.59" }, "tiers": {