← Commit history

standard 0.24.4: Fusion 1.13.26, KiCad #29 equivalents (219), tiers for #27 and #28

Colby Knox ·9e9b50ffb2 ·11d ago ·parent 2e5c62b
6 files changed +45−22
README.md+4−3
@@ -62,10 +62,10 @@ verb by verb: [docs/coverage.md](docs/coverage.md). |---|---|---|---|---| | **core** | 93 | 93 | 89 | 90 | | **native** | 47 | 47 | 44 | 42 |-| **checks** | 37 | 37 | 35 | 37 |-| **app** | 62 | 62 | 46 | 53 |+| **checks** | 37 | 37 | 37 | 37 |+| **app** | 62 | 62 | 49 | 53 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 239 | 239 | 214 | 222 |+| standard (all but platform) | 239 | 239 | 219 | 222 | <!-- 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.24.4: coverage reads Fusion 360 bridge 1.13.26 and kicad-lane's first #29 equivalents (KiCad 219); tiers for `update_footprints_from_library` (core, #27) and `lint_library` (checks, #28), which enter the standard with Altium's 0.2.84 reference. Version 0.24.3: coverage reads KiCad bridge 1.0.89 (214 of 239: animate_view). Version 0.24.2: engine 0.21.1: `duplicate_pad_number` counts touching or overlapping pads as one land (a split exposed pad is not a duplicate; KiCad #28). KiCad's `swap_footprint` is no longer counted as `update_footprints_from_library`, which does a different job (#27). Version 0.24.1: coverage reads Fusion 360 bridge 1.13.24 (222 of 239: add_symbol_art, list_installed_libraries and install_library partial; uninstall_library, normalize_bodies and sch_sheet_symbol unsupported).
docs/coverage.md+9−9
@@ -1,6 +1,6 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.83 (the reference), KiCad bridge 1.0.89, Fusion 360 bridge 1.13.24. 56 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.83 (the reference), KiCad bridge 1.0.89, Fusion 360 bridge 1.13.26. 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. @@ -8,10 +8,10 @@ Generated by `tools/generate.py` from `verbs/coverage.json`; do not edit by hand |---|---|---|---|---| | **core** | 93 | 93 | 89 | 90 | | **native** | 47 | 47 | 44 | 42 |-| **checks** | 37 | 37 | 35 | 37 |-| **app** | 62 | 62 | 46 | 53 |+| **checks** | 37 | 37 | 37 | 37 |+| **app** | 62 | 62 | 49 | 53 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 239 | 239 | 214 | 222 |+| standard (all but platform) | 239 | 239 | 219 | 222 |  ## core @@ -179,7 +179,7 @@ Engineering computed from the board model, not by the tool: one shared engine, s | `board_report` | One shareable page per board: every check run against the live board and its project (Altium's DRC, JLCPCB fab limits and assembly tiers, the schematic... | `altium_board_report` | `kicad_board_report` | `fusion_board_report` | | `bom` | The project's bill of materials read straight from Altium: every schematic sheet the .PrjPcb lists (placed parts and their parameters) merged with the board... | `altium_bom` | `kicad_bom` | `fusion_board_bom` (partial) | | `build_board` | Build a NEW board from a parts list and a netlist: outline (rounded corners allowed), every footprint from one PcbLib placed by its own origin, pad nets... | `altium_build_board` | `kicad_build_board` | `fusion_build_board` |-| `build_footprint` | Build a complete footprint (pads, silkscreen, courtyard, arcs) in a PcbLib from a kicad2altium spec file on this machine, and return a proof frame. | `altium_build_footprint` |  | `fusion_import_part` (partial) |+| `build_footprint` | Build a complete footprint (pads, silkscreen, courtyard, arcs) in a PcbLib from a kicad2altium spec file on this machine, and return a proof frame. | `altium_build_footprint` | `kicad_fp_create` (partial) | `fusion_import_part` (partial) | | `build_schematic` | Draw a design's schematic from its netlist with the project library's symbols, inside a new project (.PrjPcb with the board and libraries), compile it, and... | `altium_build_schematic` | `kicad_build_schematic` | `fusion_schematic_plan / fusion_schematic_run` (partial) | | `check_clearance` *proposed* | Measure the gaps between parts, courtyard to courtyard or pad copper to pad copper, for the listed parts or the whole board, and report every pair under a... | `altium_check_clearance` | `kicad_check_clearance` | `fusion_check_clearance` | | `check_orientation` | Advisory: 2-pad parts whose rotation could be better. Each orthogonal rotation is scored in place by airline length (a routable net's MST with the pad... | `altium_check_orientation` | `kicad_check_orientation` | `fusion_check_orientation` |@@ -192,7 +192,7 @@ Engineering computed from the board model, not by the tool: one shared engine, s | `footprint_from_land_pattern` | Build a complete footprint from the land pattern a datasheet prints: pads numbered the standard way (chip, dual SOIC/TSSOP/DFN, SOT, quad QFP/QFN, BGA), an... | `altium_footprint_from_land_pattern` | `kicad_footprint_from_land_pattern` | `fusion_footprint_from_land_pattern` (partial) | | `height_check` | Will it fit the enclosure? Each part's height from its 3D bodies (top and bottom side), the parts over a height limit board-wide or under a lid feature in a... | `altium_height_check` | `kicad_height_check` | `fusion_height_check` | | `impedance` | Controlled impedance from the board's own stack-up: the track width each copper layer needs for a single-ended target (50 ohm default) and the width and gap... | `altium_impedance` | `kicad_impedance` | `fusion_impedance` |-| `import_part` | One call imports a whole part: footprint spec + STEP + symbol modes + models + params + save. | `altium_import_part` |  | `fusion_import_part` (partial) |+| `import_part` | One call imports a whole part: footprint spec + STEP + symbol modes + models + params + save. | `altium_import_part` | `kicad_install_footprint / kicad_install_symbol` (partial) | `fusion_import_part` (partial) | | `jlcpcb_order` | A JLCPCB order in one call: the board checked against JLCPCB's fab limits, the Gerbers and drill zipped the way JLCPCB's order page takes them, the JLCPCB... | `altium_jlcpcb_order` | `kicad_jlcpcb_order` | `fusion_jlcpcb_order` | | `length_tune` | Lengthen a routed net to a target length, or to match another net (a pair's skew, a DDR byte lane): a serpentine in its longest straight track that has room... | `altium_length_tune` | `kicad_length_tune` | `fusion_length_tune` | | `net_lengths` | Routed length of every net (or the ones named) on the live board, by layer with its vias; the skew inside each differential pair; and the spread of... | `altium_net_lengths` | `kicad_net_lengths` | `fusion_net_lengths` |@@ -235,7 +235,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `dialog_log` | What the standing dialog reaper (and the bridge's own recoveries) pressed, newest last: nuisance boxes, script-error boxes, discarded save prompts, silent... | `altium_dialog_log` | `kicad_dialog_log` | `fusion_dialog_log` | | `dismiss_dialogs` | Press one named button (default OK) on the detected Altium dialogs through UIA - no cursor, no focus steal. titles narrows it to dialogs whose title... | `altium_dismiss_dialogs` | `kicad_dismiss_dialogs` | `fusion_dismiss_dialogs` | | `document_info` *proposed* | The active document: its name, what kind it is, whether it has unsaved changes, where it is saved and which version it is. Read only; opens nothing. | `altium_document_info` | `kicad_state` (partial) | `fusion_document_info` |-| `ensure_licensed` | One call to get a usable Altium: launch if needed, then claim a seat (Use License via UIA). Optional escalations: sign out to force a seat release, or start... | `altium_ensure_licensed` |  | `fusion_signin` (partial) |+| `ensure_licensed` | One call to get a usable Altium: launch if needed, then claim a seat (Use License via UIA). Optional escalations: sign out to force a seat release, or start... | `altium_ensure_licensed` | `kicad_readiness` (partial) | `fusion_signin` (partial) | | `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` |  | `fusion_addin_status` (partial) |@@ -262,7 +262,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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 | | `set_layer_visibility` | Show or hide one layer of the current board (by layer id) and refresh the view and the layer tabs. | `altium_set_layer_visibility` | `kicad_set_layer_visibility` | `fusion_set_layer_visibility` |-| `setup_trial` | Onboarding state machine: from nothing to a working trial. Each call reports the stage it found (install / launch / signin / done) and the ONE next action;... | `altium_setup_trial` |  | `fusion_install_fusion` (partial) |+| `setup_trial` | Onboarding state machine: from nothing to a working trial. Each call reports the stage it found (install / launch / signin / done) and the ONE next action;... | `altium_setup_trial` | `kicad_upgrade` (partial) | `fusion_install_fusion` (partial) | | `show_2d_board` | Open a .PcbDoc, switch to 2D, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel board. | `altium_show_2d_board` | `kicad_show_2d_board` | `fusion_show_2d_board` | | `show_3d_board` | Open a .PcbDoc, switch to 3D, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel board. | `altium_show_3d_board` | `kicad_show_3d_board` | `fusion_show_3d_board` | | `show_3d_chip` | Open a PcbLib member in the footprint editor in 3D, zoom to fit, and capture a proof frame of the part's 3D body. | `altium_show_3d_chip` | `kicad_show_3d_chip` | `fusion_show_3d_chip` |@@ -272,7 +272,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `show_schematic` | Open a .SchDoc, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel top sheet. | `altium_show_schematic` | `kicad_show_schematic` | `fusion_show_schematic` | | `show_symbol` | Open a SchLib member in the Symbol editor and capture a background proof. | `altium_show_symbol` | `kicad_show_symbol` | `fusion_show_symbol` | | `signin` | Report-only alias of altium_signin_status: it does NOT sign anyone in. Signing in to Altium is a browser flow only the human can complete. | `altium_signin` |  | `fusion_signin` |-| `signin_status` | Account and Altium 365 workspace connection as Altium's own UI reports it: licence state from the title, and whether the workspace menu reads 'Not Connected'. | `altium_signin_status` |  | `fusion_signin_status` |+| `signin_status` | Account and Altium 365 workspace connection as Altium's own UI reports it: licence state from the title, and whether the workspace menu reads 'Not Connected'. | `altium_signin_status` | `kicad_license_status` (partial) | `fusion_signin_status` | | `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` |
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "eda-bridge-standard",-  "version": "0.24.3",+  "version": "0.24.4",   "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.",
tools/tiers.json+2
@@ -95,6 +95,7 @@  "length_tune": "checks",  "license": "app",  "license_status": "app",+ "lint_library": "checks",  "list_commands": "app",  "list_designators": "core",  "list_installed_libraries": "native",@@ -192,6 +193,7 @@  "thermal_vias": "checks",  "uninstall": "app",  "uninstall_library": "native",+ "update_footprints_from_library": "core",  "update_pcb": "native",  "variants": "native",  "via_fence": "checks",
verbs/coverage.json+27−7
@@ -1,5 +1,5 @@ {- "standard": "0.24.3",+ "standard": "0.24.4",  "reference": {   "bridge": "altium",   "version": "0.2.83"@@ -7,7 +7,7 @@  "proposed": 56,  "compared": {   "kicad": "1.0.89",-  "fusion360": "1.13.24"+  "fusion360": "1.13.26"  },  "tiers": {   "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",@@ -2550,7 +2550,11 @@     "verb": "altium_build_footprint",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_fp_create",+    "match": "partial",+    "note": "from arguments (pads, graphics, courtyard, model) instead of a kicad2altium spec file; kicad_footprint_from_land_pattern builds one from a datasheet's numbers"+   },    "fusion360": {     "verb": "fusion_import_part",     "match": "partial",@@ -2770,7 +2774,11 @@     "verb": "altium_import_part",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_install_footprint / kicad_install_symbol",+    "match": "partial",+    "note": "two calls: the footprint (with its STEP wired as the 3D model) into Adom.pretty, the symbol into Adom.kicad_sym, both registered in KiCad's tables; no spec files or symbol modes"+   },    "fusion360": {     "verb": "fusion_import_part",     "match": "partial",@@ -3374,7 +3382,11 @@     "verb": "altium_ensure_licensed",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_readiness",+    "match": "partial",+    "note": "KiCad needs no licence or seat: kicad_readiness says it is installed and usable, kicad_launch starts it"+   },    "fusion360": {     "verb": "fusion_signin",     "match": "partial",@@ -3833,7 +3845,11 @@     "verb": "altium_setup_trial",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_upgrade",+    "match": "partial",+    "note": "KiCad is free with no trial or sign-in: kicad_upgrade installs it with the official installer, kicad_readiness reports whether it is ready"+   },    "fusion360": {     "verb": "fusion_install_fusion",     "match": "partial",@@ -3998,7 +4014,11 @@     "verb": "altium_signin_status",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_license_status",+    "match": "partial",+    "note": "KiCad has no account or cloud workspace: kicad_license_status says so, with the installed version"+   },    "fusion360": {     "verb": "fusion_signin_status",     "match": "exact"
verbs/standard.json+2−2
@@ -1,5 +1,5 @@ {- "standard": "0.24.3",+ "standard": "0.24.4",  "reference": {   "bridge": "altium",   "version": "0.2.83"@@ -7,7 +7,7 @@  "proposed": 56,  "compared": {   "kicad": "1.0.89",-  "fusion360": "1.13.24"+  "fusion360": "1.13.26"  },  "tiers": {   "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",