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.30.14: coverage reads Fusion 360 bridge 1.13.55
5 files changed
+20−19
README.md+1@@ -158,6 +158,7 @@ Decisions so far (proposals from the KiCad and Fusion bridges, 2026-10-27; issue ## Status +Version 0.30.14: coverage reads Fusion 360 bridge 1.13.55 (sch_place_part, sch_swap_part and edit_parts exact). Version 0.30.13: coverage reads Fusion 360 bridge 1.13.52 (public; urgent fix for fusion-bridge#136, no verb changes). Version 0.30.12: coverage reads Fusion 360 bridge 1.13.49 (public; urgent fix for fusion-bridge#136, no verb changes). Version 0.30.11: coverage reads Fusion 360 bridge 1.13.47 (public; .lbr files without line breaks are rewritten before USE, fusion-bridge#135).
docs/coverage.md+5−5@@ -1,6 +1,6 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.88 (the reference), KiCad bridge 1.0.98, Fusion 360 bridge 1.13.52. 67 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.88 (the reference), KiCad bridge 1.0.98, Fusion 360 bridge 1.13.55. 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. @@ -38,7 +38,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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` | `fusion_create_symbol` | | `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` | `fusion_doc_params` (partial) | | `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... | `altium_edit_footprint` | `kicad_fp_edit` | `fusion_edit_footprint` (partial) |-| `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` | `fusion_edit_parts` (partial) |+| `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` | `fusion_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` | `fusion_find_symbol` (partial) | | `footprint_primitives` | Geometry dump of one PLACED component: its tracks, arcs, pads (with solder and paste mask expansion in um) and texts in mils with layer ids; other primitive... | `altium_footprint_primitives` | `kicad_footprint_primitives` | `fusion_footprint_primitives` | | `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... | `altium_generate_body` | `kicad_generate_body` | `fusion_generate_body` |@@ -93,12 +93,12 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `sch_move_region` *proposed* | Move everything inside a box by (dx, dy): parts, wire ends inside the box (wires crossing its edge stretch), labels, junctions, no-connect markers, texts,... | `altium_sch_move_region` | `kicad_sch_move_region` | `fusion_sch_move_region` | | `sch_page` *proposed* | Read or set a sheet's page: paper size, orientation and title block (title, date, revision, company, comment lines). | `altium_sch_page` | `kicad_sch_page` | `fusion_sch_page` (partial) | | `sch_pins` *proposed* | Every pin of the named parts on a sheet: its absolute position (rotation and mirror applied), number, name, electrical type, the side it leaves the body,... | `altium_sch_pins` | `kicad_sch_pins` | `fusion_sch_pins` |-| `sch_place_part` | Place a component from a .SchLib onto an EXISTING sheet at a position, with its library parameters (MPN, Manufacturer, distributor numbers) and its... | `altium_sch_place_part` | `kicad_sch_place_part` | `fusion_sch_place_part` (partial) |+| `sch_place_part` | Place a component from a .SchLib onto an EXISTING sheet at a position, with its library parameters (MPN, Manufacturer, distributor numbers) and its... | `altium_sch_place_part` | `kicad_sch_place_part` | `fusion_sch_place_part` | | `sch_reset_fields` *proposed* | Put parts' designator and value text (or the named fields) back where the library symbol places them, through each part's rotation and mirror. One undo step. | `altium_sch_reset_fields` | `kicad_sch_reset_fields` | `fusion_sch_reset_fields` | | `sch_sheet_pins` *proposed* | A sheet symbol's pins: list, add, edit (rename, kind, move along an edge) or delete. import:true adds a pin for every hierarchical port inside the child... | `altium_sch_sheet_pins` | `kicad_sch_sheet_pins` | `fusion_sch_sheet_pins` (partial) | | `sch_sheet_symbol` | Make a design hierarchical: a sheet symbol on the parent sheet for a child sheet, its entries joined to the parent's nets, and matching ports on the child.... | `altium_sch_sheet_symbol` | `kicad_sch_sheet_symbol` (partial) | unsupported | | `sch_split_wire` *proposed* | Split the wire through a point into two wires there, with a junction dot at the cut, so a new branch can end on a wire end. One undo step. | `altium_sch_split_wire` | `kicad_sch_split_wire` | `fusion_sch_split_wire` (partial) |-| `sch_swap_part` | Replace a placed part with another library part (a different value, package or symbol) at the same place, designator and rotation, keeping its connections:... | `altium_sch_swap_part` | `kicad_sch_swap_part` | `fusion_sch_swap_part` (partial) |+| `sch_swap_part` | Replace a placed part with another library part (a different value, package or symbol) at the same place, designator and rotation, keeping its connections:... | `altium_sch_swap_part` | `kicad_sch_swap_part` | `fusion_sch_swap_part` | | `sch_text` *proposed* | Add free text to a sheet (a note, a title, a design comment) with size, angle, justification, bold and italic. Text has no electrical meaning. One undo step. | `altium_sch_text` | `kicad_sch_text` | `fusion_sch_text` | | `sch_trace_point` *proposed* | Everything electrically connected at a point on a sheet: the wires, labels, pins, junctions, sheet pins and no-connect markers there, and for each net they... | `altium_sch_trace_point` | `kicad_sch_trace_point` | `fusion_sch_trace_point` | | `schematic_data` | Components on a schematic sheet (filePath, else the CURRENT sheet) with their pins (number, name, electrical type), position and orientation. designator... | `altium_schematic_data` | `kicad_sch_components` (partial) | `fusion_schematic_data` (partial) |@@ -172,7 +172,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `symbol_mode` | Show one display mode (0 = Normal, 1.. = alternates) of the CURRENT SchLib component in the editor and capture a frame. Drives the editor's own mode toggle,... | `altium_symbol_mode` | `kicad_symbol_mode` | unsupported | | `teardrops` | Add (or remove) teardrops with Altium's own Tools > Teardrops: on vias and through-hole pads, SMD pads, track width changes and T-junctions, for the whole... | `altium_teardrops` | `kicad_teardrops` (partial) | `fusion_teardrops` (partial) | | `uninstall_library` | Remove libraries from Altium's Installed Libraries: the inverse of install_library / install_library_bundle. Library files are never touched. | `altium_uninstall_library` | `kicad_uninstall_library` | unsupported |-| `update_pcb` | Design > Update PCB Document from the schematic (the engineering change order): parts added, removed or renamed, nets and footprints updated on the board.... | `altium_update_pcb` | `kicad_update_pcb` (partial) | `fusion_cross_check` (partial) |+| `update_pcb` | Design > Update PCB Document from the schematic (the engineering change order): parts added, removed or renamed, nets and footprints updated on the board.... | `altium_update_pcb` | `kicad_update_pcb` (partial) | `fusion_update_pcb` (partial) | | `variants` | Assembly variants of a project (which parts are fitted on which build): list them, make or change one with not-fitted parts (or put parts back), or remove... | `altium_variants` | `kicad_variants` | `fusion_variants` (partial) | ## checks
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "eda-bridge-standard",- "version": "0.30.13",+ "version": "0.30.14", "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+11−11@@ -1,5 +1,5 @@ {- "standard": "0.30.13",+ "standard": "0.30.14", "reference": { "bridge": "altium", "version": "0.2.88"@@ -7,7 +7,7 @@ "proposed": 67, "compared": { "kicad": "1.0.98",- "fusion360": "1.13.52"+ "fusion360": "1.13.55" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",@@ -361,8 +361,8 @@ }, "fusion360": { "verb": "fusion_edit_parts",- "match": "partial",- "note": "value, designator, fields and lock; dnp, excludeFromBom, excludeFromPos and mount refused (Fusion keeps them in assembly variants)"+ "match": "exact",+ "note": "value, designator, fields and lock; dnp, excludeFromBom, excludeFromPos and mount are attributes on the part (DNP, EXCLUDE_FROM_BOM, EXCLUDE_FROM_POS, MOUNT), honoured by fusion_board_bom, fusion_bom and fusion_export_pos; Fusion's own assembly variants and CAM outputs do not read them (its VARIANT command does nothing on 2706)" } }, {@@ -1070,7 +1070,7 @@ "fusion360": { "verb": "fusion_sch_connect", "match": "partial",- "note": "power is a net label (Fusion power symbols are library parts; nets join by name), port is an XREF label, and noerc is refused (Fusion has no No-ERC marker)"+ "note": "power is a net label (Fusion power symbols are library parts; nets join by name), port is an XREF label, and noerc is refused (Fusion has no No-ERC or no-connect marker: its text commands were checked on 2706)" } }, {@@ -1311,8 +1311,8 @@ }, "fusion360": { "verb": "fusion_sch_place_part",- "match": "partial",- "note": "the library is one the design holds (by name; Fusion 2706 does not add from a local .lbr through USE) and a variant named with parentheses cannot be added from a text command; save is false by default (each Fusion save is a cloud version)"+ "match": "exact",+ "note": "a deviceset from a .lbr on this machine (one file holds symbol and footprint, so pcbLib does not apply); footprint picks the variant by package; partId places that gate; a position past 1950 mm is refused (off_the_sheet); save is false by default (each Fusion save is a cloud version); a variant named with parentheses cannot be added from a text command" } }, {@@ -1401,8 +1401,8 @@ }, "fusion360": { "verb": "fusion_sch_swap_part",- "match": "partial",- "note": "REPLACE from a library the design holds; pins that lose their net are listed (lostConnections), not rewired; multi-gate devices refused"+ "match": "exact",+ "note": "REPLACE from a .lbr on this machine; the designator stays; pins are matched by pad number; where a pin ends elsewhere Fusion keeps its net, or a wire joins it (pinsJoined); multi-gate devices refused, as the standard says; without keepComment an EAGLE part keeps its old value (a device has no value of its own)" } }, {@@ -2574,9 +2574,9 @@ "note": "compares the schematic with any board (kicad_update_pcb_from_schematic) but applies the changes to a closed board file only; KiCad's API has no Update PCB from Schematic" }, "fusion360": {- "verb": "fusion_cross_check",+ "verb": "fusion_update_pcb", "match": "partial",- "note": "Fusion forward-annotates the board from the schematic as you edit, so there is no change order to execute: the preview is the cross check (designators on the sheet and not the board, and the reverse); a broken forward/back annotation is reported, not repaired"+ "note": "the standard's preview shape: Fusion forward-annotates the board as you edit, so there is no change order to run (changeOrder is empty); execute reports executed only when sheet and board agree; removals are refused, as DELETE does nothing on a linked board" } }, {
verbs/standard.json+2−2@@ -1,5 +1,5 @@ {- "standard": "0.30.13",+ "standard": "0.30.14", "reference": { "bridge": "altium", "version": "0.2.88"@@ -7,7 +7,7 @@ "proposed": 67, "compared": { "kicad": "1.0.98",- "fusion360": "1.13.52"+ "fusion360": "1.13.55" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",