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
regenerate after kicad-lane (reference/kicad-1.0.64.json: 17 standard verbs under their own names): KiCad 160 of 236
4 files changed
+92−41
README.md+2−2@@ -57,12 +57,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 | 86 | 72 | 48 |+| **core** | 93 | 86 | 89 | 48 | | **native** | 46 | 36 | 35 | 19 | | **checks** | 37 | 33 | 11 | 4 | | **app** | 60 | 56 | 25 | 35 | | **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 236 | 211 | 143 | 106 |+| standard (all but platform) | 236 | 211 | 160 | 106 | <!-- coverage:end --> The **checks** tier is where the other bridges are furthest behind, and it is the cheapest to close: those verbs are
docs/coverage.md+20−20@@ -1,17 +1,17 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.76 (the reference), KiCad bridge 1.0.63, Fusion 360 bridge 1.12.2. 54 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.76 (the reference), KiCad bridge 1.0.64, Fusion 360 bridge 1.12.2. 54 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 | 86 | 72 | 48 |+| **core** | 93 | 86 | 89 | 48 | | **native** | 46 | 36 | 35 | 19 | | **checks** | 37 | 33 | 11 | 4 | | **app** | 60 | 56 | 25 | 35 | | **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 236 | 211 | 143 | 106 |+| standard (all but platform) | 236 | 211 | 160 | 106 | ## core @@ -19,7 +19,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | Verb | What it does | Altium | KiCad | Fusion 360 | |---|---|---|---|---|-| `add_body` | Put a 3D body on a footprint of a PcbLib: a STEP model, or an extruded box when no step is given. It REPLACES the footprint's existing 3D bodies (a... | `altium_add_body` | | `fusion_attach_3d_package` (partial) |+| `add_body` | Put a 3D body on a footprint of a PcbLib: a STEP model, or an extruded box when no step is given. It REPLACES the footprint's existing 3D bodies (a... | `altium_add_body` | `kicad_add_body` | `fusion_attach_3d_package` (partial) | | `add_models` | Attach one or more PCBLIB footprint models, parameters, comment and description to a SchLib component (Altium's several-footprints-per-symbol mechanism). | `altium_add_models` | `kicad_footprint_models` (partial) | | | `add_symbol_art` | Draw the chip-outline artwork (the chip-thumbnailer polylines adom-symbol baked into the KiCad symbol) into a SchLib component, fitted to its body... | `altium_add_symbol_art` | | | | `align_parts` *proposed* | Line parts up on a common left, right, top, bottom or centre line, or space them evenly, by courtyard box or by anchor point. One undo step, with... | `altium_align_parts` | `kicad_align_parts` | |@@ -28,15 +28,15 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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_info` (partial) | | `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` | | |+| `clone_symbol` | Copy a symbol inside the current SchLib under a new name, all display modes included. | `altium_clone_symbol` | `kicad_clone_symbol` | | | `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` | | `component_pins` | Every pad of one board component with its net, position, layer, size and hole. | `altium_component_pins` | `kicad_component_pins` | `fusion_component_pins` | | `copper_layers` | Every copper layer Altium can address on the current board (top, mid 1-30, planes 1-16, bottom) with names and visibility. | `altium_copper_layers` | `kicad_copper_layers` | `fusion_copper_layers` |-| `copy_footprint` | Duplicate a footprint inside the current PcbLib under a new name (every primitive replicated). | `altium_copy_footprint` | | |+| `copy_footprint` | Duplicate a footprint inside the current PcbLib under a new name (every primitive replicated). | `altium_copy_footprint` | `kicad_copy_footprint` | | | `copy_routing` *proposed* | Copy the tracks and vias inside a box to an offset, remapping nets by pairing parts (a designator map or pattern), so a repeated channel gets the same... | `altium_copy_routing` | `kicad_copy_routing` | | | `create_footprint` | Create one footprint from a pad list in a PcbLib (the library is created and saved if the path does not exist) and return a proof frame. | `altium_create_footprint` | `kicad_create_footprint` | | | `create_symbol` | Create one rectangular symbol from a pin list in a SchLib (the library is created and saved if the path does not exist) and return a proof frame. | `altium_create_symbol` | `kicad_create_symbol` | |-| `doc_params` | Read or set a sheet's document parameters: the title block (Title, DocumentNumber, Revision, DrawnBy, Author, CompanyName, ...). | `altium_doc_params` | | |+| `doc_params` | Read or set a sheet's document parameters: the title block (Title, DocumentNumber, Revision, DrawnBy, Author, CompanyName, ...). | `altium_doc_params` | `kicad_doc_params` | | | `edit_footprint` *proposed* | Edit a library footprint in place: change, delete, add or renumber pads; add, replace or delete graphics on a layer; set its description, tags and... | | `kicad_fp_edit` | | | `edit_parts` *proposed* | Edit placed parts: value, designator, any field (add, change, remove), do-not-populate, exclusion from the BOM or position files, mounting type and the... | `altium_edit_parts` | `kicad_edit_parts` | | | `find_symbol` | Find symbols (or footprints with kind:'footprint') by part of their name across libraries: the given ones, or every installed .SchLib/.PcbLib. | `altium_find_symbol` | `kicad_find_symbol` | |@@ -44,7 +44,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `generate_body` *proposed* | Make a part's 3D body from its package family and its datasheet dimensions (chip, SOIC, QFN, QFP, BGA, SOT-23, DFN, MELF, electrolytic can, crystal, pin... | | | | | `import_svg` *proposed* | Import SVG artwork (a logo, a label) as filled polygons on a silkscreen, copper, mask or user layer, at a position and size; curves flattened, holes kept.... | | `kicad_import_svg` | | | `layer_stack` | The CURRENT board's stack-up: copper layers in order with copper thickness and the dielectric under each (height, constant, material), and the total... | `altium_layer_stack` | `kicad_layer_stack` | `fusion_board_stackup` |-| `layers` | The current board's layer set with ids, names, kind and whether each is displayed. | `altium_layers` | | `fusion_layers` |+| `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) |@@ -52,9 +52,9 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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` | | `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` | | |+| `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` | | | `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` | | |+| `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_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` | | | | `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. | | `kicad_project_create` | |@@ -65,14 +65,14 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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_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` | |-| `remove_footprint` | Delete one footprint from the current PcbLib. | `altium_remove_footprint` | | |+| `remove_footprint` | Delete one footprint from the current PcbLib. | `altium_remove_footprint` | `kicad_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` | | | `remove_items` | Delete specific free tracks and vias, given exactly as altium_routing_state returned them. One undo step. | `altium_remove_items` | `kicad_remove_route` (partial) | `fusion_remove_items` | | `remove_parts` *proposed* | Remove placed parts from the board by designator, as one undo step. The library is not touched (that is remove_footprint). | `altium_remove_parts` | `kicad_remove_parts` | | | `remove_symbol` | Delete one component from the current SchLib. | `altium_remove_symbol` | `kicad_remove_symbol` | |-| `rename_footprint` | Rename a footprint in the current PcbLib. | `altium_rename_footprint` | | |-| `rename_symbol` | Rename a component (LibReference) in the current SchLib. | `altium_rename_symbol` | | |-| `ripup_nets` | Delete every free track, arc and via on each named net. One undo step. | `altium_ripup_nets` | | `fusion_ripup_nets` |+| `rename_footprint` | Rename a footprint in the current PcbLib. | `altium_rename_footprint` | `kicad_rename_footprint` | |+| `rename_symbol` | Rename a component (LibReference) in the current SchLib. | `altium_rename_symbol` | `kicad_rename_symbol` | |+| `ripup_nets` | Delete every free track, arc and via on each named net. One undo step. | `altium_ripup_nets` | `kicad_ripup_nets` | `fusion_ripup_nets` | | `route_net` | Route one net as tracks, segment by segment; a waypoint on another layer drops a via there. One undo step, read back. | `altium_route_net` | `kicad_route_net / kicad_add_track` | `fusion_route_net` | | `routing_state` | The WHOLE current board as data, in mm: tracks, arcs, vias, pads (with owner and net), components (ref, x, y, rotation, side), polygon pours, the outline,... | `altium_routing_state` | `kicad_routing_state` | `fusion_routing_state` | | `rules_by_kind` | The current board's ENABLED design rules grouped by rule kind (Clearance, Width, RoutingVias, ...), each group sorted by priority. Shaped from one... | `altium_rules_by_kind` | `kicad_board_rules` (partial) | `fusion_rules_by_kind` |@@ -104,14 +104,14 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `set_layer_count` *proposed* | Set the board's copper layer count (2, 4, 6 or 8): the layer table and the stack-up, keeping the board thickness. | `altium_set_layer_count` | `kicad_set_layer_count` | | | `set_models` | Replace every footprint model on a SchLib component with ONE PCBLIB model (set_params footprint and add_models APPEND, which is how a symbol ends up with two). | `altium_set_models` | `kicad_footprint_models` (partial) | | | `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` | | |+| `set_params` | Set parameters on a SchLib component, optionally its comment, and optionally link a footprint by name. | `altium_set_params` | `kicad_set_params` | | | `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` | | |-| `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` | | |-| `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` | | `fusion_silk_state` |+| `set_visibility` | Show or hide one named parameter on a SchLib component. | `altium_set_visibility` | `kicad_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` | |+| `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) | |-| `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` | | |-| `xcopy_footprint` | Copy a footprint ACROSS libraries: from fromLib into toLib (opened and made current), optionally under a new name. | `altium_xcopy_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` | |+| `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` | | ## native
verbs/coverage.json+69−18@@ -6,7 +6,7 @@ }, "proposed": 54, "compared": {- "kicad": "1.0.63",+ "kicad": "1.0.64", "fusion360": "1.12.2" }, "tiers": {@@ -25,7 +25,10 @@ "verb": "altium_add_body", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_add_body",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_attach_3d_package", "match": "partial"@@ -163,7 +166,10 @@ "verb": "altium_clone_symbol", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_clone_symbol",+ "match": "exact"+ }, "fusion360": null }, {@@ -225,7 +231,10 @@ "verb": "altium_copy_footprint", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_copy_footprint",+ "match": "exact"+ }, "fusion360": null }, {@@ -278,7 +287,10 @@ "verb": "altium_doc_params", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_doc_params",+ "match": "exact"+ }, "fusion360": null }, {@@ -378,7 +390,10 @@ "verb": "altium_layers", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_layers",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_layers", "match": "exact"@@ -505,7 +520,10 @@ "verb": "altium_part_parameters", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_part_parameters",+ "match": "exact"+ }, "fusion360": null }, {@@ -530,7 +548,10 @@ "verb": "altium_place_on_sch", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_place_on_sch",+ "match": "exact"+ }, "fusion360": null }, {@@ -678,7 +699,10 @@ "verb": "altium_remove_footprint", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_remove_footprint",+ "match": "exact"+ }, "fusion360": null }, {@@ -748,7 +772,10 @@ "verb": "altium_rename_footprint", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_rename_footprint",+ "match": "exact"+ }, "fusion360": null }, {@@ -759,7 +786,10 @@ "verb": "altium_rename_symbol", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_rename_symbol",+ "match": "exact"+ }, "fusion360": null }, {@@ -770,7 +800,10 @@ "verb": "altium_ripup_nets", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_ripup_nets",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_ripup_nets", "match": "exact"@@ -1292,7 +1325,10 @@ "verb": "altium_set_params", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_set_params",+ "match": "exact"+ }, "fusion360": null }, {@@ -1320,7 +1356,10 @@ "verb": "altium_set_visibility", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_set_visibility",+ "match": "exact"+ }, "fusion360": null }, {@@ -1331,7 +1370,10 @@ "verb": "altium_sheet_params", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_sheet_params",+ "match": "exact"+ }, "fusion360": null }, {@@ -1342,7 +1384,10 @@ "verb": "altium_silk_state", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_silk_state",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_silk_state", "match": "exact"@@ -1370,7 +1415,10 @@ "verb": "altium_symbol_prims", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_symbol_prims",+ "match": "exact"+ }, "fusion360": null }, {@@ -1381,7 +1429,10 @@ "verb": "altium_xcopy_footprint", "match": "exact" },- "kicad": null,+ "kicad": {+ "verb": "kicad_xcopy_footprint",+ "match": "exact"+ }, "fusion360": null }, {
verbs/standard.json+1−1@@ -6,7 +6,7 @@ }, "proposed": 54, "compared": {- "kicad": "1.0.63",+ "kicad": "1.0.64", "fusion360": "1.12.2" }, "tiers": {