← Commit history

standard 0.23.5: coverage reads Fusion 1.13.21 (213)

Colby Knox ·6f92682f72 ·12d ago ·parent e315791
5 files changed +52−26
README.md+4−3
@@ -60,12 +60,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 | 93 | 90 | 85 |-| **native** | 46 | 46 | 43 | 36 |+| **core** | 93 | 93 | 90 | 89 |+| **native** | 46 | 46 | 43 | 38 | | **checks** | 37 | 37 | 35 | 37 | | **app** | 62 | 62 | 44 | 49 | | **platform** | 19 | 19 | 0 | 1 |-| standard (all but platform) | 238 | 238 | 212 | 207 |+| standard (all but platform) | 238 | 238 | 212 | 213 | <!-- 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.23.5: coverage reads Fusion 360 bridge 1.13.21 (213 of 238: replicate_layout, symbol_prims, set_visibility, and partial place_on_pcb, place_on_sch, pcb_report). Version 0.23.4: the reference is Altium bridge 0.2.83 (engine 0.20.0, turned bodies, simulate noise and monteCarlo, a 20x faster board model on large boards). Version 0.23.3: coverage reads KiCad bridge 1.0.87 (engine 0.20.0, turned bodies, simulate noise and monteCarlo). Version 0.23.2: coverage reads Fusion 360 bridge 1.13.20 (engine 0.20.0, turned bodies, simulate noise and monteCarlo).
docs/coverage.md+11−11
@@ -1,17 +1,17 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.83 (the reference), KiCad bridge 1.0.87, Fusion 360 bridge 1.13.20. 56 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.83 (the reference), KiCad bridge 1.0.87, Fusion 360 bridge 1.13.21. 56 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 | 93 | 90 | 85 |-| **native** | 46 | 46 | 43 | 36 |+| **core** | 93 | 93 | 90 | 89 |+| **native** | 46 | 46 | 43 | 38 | | **checks** | 37 | 37 | 35 | 37 | | **app** | 62 | 62 | 44 | 49 | | **platform** | 19 | 19 | 0 | 1 |-| standard (all but platform) | 238 | 238 | 212 | 207 |+| standard (all but platform) | 238 | 238 | 212 | 213 |  ## core @@ -53,8 +53,8 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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` | `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` |  |-| `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_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_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` |  | unsupported | | `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) |@@ -106,11 +106,11 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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` | `kicad_set_params` | `fusion_set_params` (partial) | | `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` | `kicad_set_visibility` |  |+| `set_visibility` | Show or hide one named parameter on a SchLib component. | `altium_set_visibility` | `kicad_set_visibility` | `fusion_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` | `fusion_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) | `fusion_swap_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` |  |+| `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` | `fusion_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` | `fusion_xcopy_footprint` (partial) |  ## native@@ -126,7 +126,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `build_symbol_modes` | Build ONE SchLib component with N display modes (Normal + Alternate 1..N-1) from a symbol_modes spec file on this machine, and return a proof frame. | `altium_build_symbol_modes` |  | `fusion_import_part` (partial) | | `cleanup_libs` | Remove the factory-default stray every fresh library carries: Component_1 from the current SchLib and an empty (no pads) PCBComponent_1 from the current PcbLib. | `altium_cleanup_libs` |  | unsupported | | `compile` | Compile a project and return Altium's Messages panel (ERC + connectivity) with counts by class. With no path it compiles Altium's bundled example project. | `altium_compile` | `kicad_compile` | `fusion_run_erc` (partial) |-| `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` |  |+| `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) | | `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` |@@ -146,14 +146,14 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `net_classes` | Net classes on the current board: list them with their nets, or make one (replacing a class of that name) with an optional width and clearance rule scoped... | `altium_net_classes` | `kicad_net_classes` | `fusion_net_classes` | | `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_errors` (partial) |  |+| `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_errors` (partial) | `fusion_read_footprint / fusion_read_board` (partial) | | `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` | | `render_board_3d` *proposed* | Render a 3D picture of the board from one side to an image file, through the tool's own renderer, without opening a window. | `altium_render_board_3d` | `kicad_render_board_3d` | `fusion_render_board_3d` | | `render_board_layers` *proposed* | Render chosen board layers to an image file without opening a window: a preset view (copper, silkscreen, solder mask, paste, outline, drill, assembly or... | `altium_render_board_layers` | `kicad_export_svg` (partial) | `fusion_export_board_image` (partial) | | `render_schematic` *proposed* | Render a sheet to an image without opening a window, through the tool's own plotter, and keep visual baselines: baseline set stores the image, baseline... | `altium_render_schematic` | `kicad_render_schematic` | `fusion_render_schematic` |-| `replicate_layout` | Copy one channel's placement to matching channels: each target keeps its anchor part where it is and every other part takes the source's offset and rotation... | `altium_replicate_layout` | `kicad_replicate_layout` |  |+| `replicate_layout` | Copy one channel's placement to matching channels: each target keeps its anchor part where it is and every other part takes the source's offset and rotation... | `altium_replicate_layout` | `kicad_replicate_layout` | `fusion_replicate_layout` | | `repour` | Repour every polygon on the board (Altium's Repour All) and answer the copper after. Runs outside the script engine so scoped rules apply. | `altium_repour` | `kicad_repour` | `fusion_repour` | | `routing_drc` | Design-rule violations on the current board WITH locations, plus the unrouted (ratsnest) count, as one clean/not-clean answer. | `altium_routing_drc` | `kicad_routing_validate` (partial) | `fusion_routing_drc` | | `run_drc` | Run the design rule check on a board and read the violation markers back. PCB:DesignRuleCheck opens a MODAL; the bridge clicks 'Run Design Rule Check'... | `altium_run_drc` | `kicad_run_drc` | `fusion_run_drc` |
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "eda-bridge-standard",-  "version": "0.23.4",+  "version": "0.23.5",   "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+34−9
@@ -1,5 +1,5 @@ {- "standard": "0.23.4",+ "standard": "0.23.5",  "reference": {   "bridge": "altium",   "version": "0.2.83"@@ -7,7 +7,7 @@  "proposed": 56,  "compared": {   "kicad": "1.0.87",-  "fusion360": "1.13.20"+  "fusion360": "1.13.21"  },  "tiers": {   "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",@@ -606,7 +606,11 @@     "verb": "kicad_place_footprint / kicad_add_footprint",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_test_board",+    "match": "partial",+    "note": "one footprint from a .lbr on a new board kept as EAGLE source, opened as a local design and read back; the proof frame is fusion_show_2d_board {capture:true}"+   }   },   {    "name": "place_on_sch",@@ -620,7 +624,11 @@     "verb": "kicad_place_on_sch",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_make_showcase_project",+    "match": "partial",+    "note": "a library's components (or the ones named) on a new sheet with a board beside it; Fusion sizes and titles the sheet itself"+   }   },   {    "name": "place_vias",@@ -1512,7 +1520,10 @@     "verb": "kicad_set_visibility",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_set_visibility",+    "match": "exact"+   }   },   {    "name": "sheet_params",@@ -1578,7 +1589,10 @@     "verb": "kicad_symbol_prims",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_symbol_prims",+    "match": "exact"+   }   },   {    "name": "xcopy_footprint",@@ -1727,7 +1741,11 @@     "verb": "kicad_component_classes",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "an EAGLE board has net classes (fusion_net_classes, fusion_add_rule) but no component classes or rooms: group a channel by its designators (fusion_replicate_layout takes them as lists)"+   }   },   {    "name": "create_part_project",@@ -2067,7 +2085,11 @@     "verb": "kicad_errors",     "match": "partial"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_read_footprint / fusion_read_board",+    "match": "partial",+    "note": "a library footprint's pads, layers, courtyard and graphics (read_footprint), or the live board's sections (read_board); not one call for a whole library"+   }   },   {    "name": "pour_state",@@ -2184,7 +2206,10 @@     "verb": "kicad_replicate_layout",     "match": "exact"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_replicate_layout",+    "match": "exact"+   }   },   {    "name": "repour",
verbs/standard.json+2−2
@@ -1,5 +1,5 @@ {- "standard": "0.23.4",+ "standard": "0.23.5",  "reference": {   "bridge": "altium",   "version": "0.2.83"@@ -7,7 +7,7 @@  "proposed": 56,  "compared": {   "kicad": "1.0.87",-  "fusion360": "1.13.20"+  "fusion360": "1.13.21"  },  "tiers": {   "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",