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: fusion 1.13.11
4 files changed
+69−31
README.md+3−3@@ -62,10 +62,10 @@ verb by verb: [docs/coverage.md](docs/coverage.md). |---|---|---|---|---| | **core** | 93 | 93 | 90 | 82 | | **native** | 46 | 46 | 43 | 33 |-| **checks** | 37 | 37 | 35 | 21 |-| **app** | 62 | 60 | 44 | 39 |+| **checks** | 37 | 37 | 35 | 26 |+| **app** | 62 | 60 | 44 | 45 | | **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 238 | 236 | 212 | 175 |+| standard (all but platform) | 238 | 236 | 212 | 186 | <!-- 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+15−15@@ -1,6 +1,6 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.80 (the reference), KiCad bridge 1.0.82, Fusion 360 bridge 1.13.10. 56 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.80 (the reference), KiCad bridge 1.0.82, Fusion 360 bridge 1.13.11. 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 | 90 | 82 | | **native** | 46 | 46 | 43 | 33 |-| **checks** | 37 | 37 | 35 | 21 |-| **app** | 62 | 60 | 44 | 39 |+| **checks** | 37 | 37 | 35 | 26 |+| **app** | 62 | 60 | 44 | 45 | | **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 238 | 236 | 212 | 175 |+| standard (all but platform) | 238 | 236 | 212 | 186 | ## core @@ -173,7 +173,7 @@ Engineering computed from the board model, not by the tool: one shared engine, s | Verb | What it does | Altium | KiCad | Fusion 360 | |---|---|---|---|---| | `assembly_check` | Ready for JLCPCB assembly? The board against both JLCPCB PCBA tiers as published (Economic and Standard): board or panel size, thickness and layers, parts... | `altium_assembly_check` | `kicad_assembly_check` | `fusion_assembly_check` |-| `auto_classes` | Net classes from the nets' own names: GND, Power (VCC, VDD, 3V3, VBAT...), Clock, HighSpeed (USB, Ethernet, HDMI, PCIe, DDR, MIPI, LVDS, SATA...) and the... | `altium_auto_classes` | `kicad_auto_classes` | |+| `auto_classes` | Net classes from the nets' own names: GND, Power (VCC, VDD, 3V3, VBAT...), Clock, HighSpeed (USB, Ethernet, HDMI, PCIe, DDR, MIPI, LVDS, SATA...) and the... | `altium_auto_classes` | `kicad_auto_classes` | `fusion_auto_classes` | | `board_features` | Add the furniture every real board needs in one undo step: mounting holes (at points or the four corners), fiducials, keepout areas, and a stitching-via... | `altium_board_features` | `kicad_add_mounting_hole` (partial) | `fusion_board_features` (partial) | | `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` | | | `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) |@@ -181,18 +181,18 @@ Engineering computed from the board model, not by the tool: one shared engine, s | `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` | | | | `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` | |+| `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` | | `copper_balance` | How much of each copper layer is copper (tracks, pads, vias and what Altium actually poured, inside the outline; a plane counts full), and how far apart... | `altium_copper_balance` | `kicad_copper_balance` | `fusion_copper_balance` | | `cross_check` | Compare one schematic sheet's designators with a board's. Altium holds ONE current document, so the verb activates the board, reads it, then activates the... | `altium_cross_check` | `kicad_analyze_connections` (partial) | `fusion_cross_check` | | `current_capacity` | Will this trace carry the current? For each power net and its current: the narrowest track on every layer it is routed on against the width IPC-2221 needs... | `altium_current_capacity` | `kicad_current_capacity` | `fusion_current_capacity` | | `estimate_cost` *proposed* | The board's numbers a fab quote needs (size, layers, thickness, smallest track, gap and drill, holes, SMD and through-hole parts and joints, unique parts)... | `altium_estimate_cost` | `kicad_estimate_cost` | `fusion_estimate_cost` | | `fab_check` | Before ordering: the board's fab-relevant minimums measured from the live board (narrowest track, smallest via drill, diameter and annular ring, smallest... | `altium_fab_check` | `kicad_fab_check` | `fusion_fab_check` |-| `find_space` | Free spots on the board for a part near another (clear of every other part on that side, of that side's tracks and vias, and inside the outline), nearest... | `altium_find_space` | `kicad_find_space` | |+| `find_space` | Free spots on the board for a part near another (clear of every other part on that side, of that side's tracks and vias, and inside the outline), nearest... | `altium_find_space` | `kicad_find_space` | `fusion_find_space` | | `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` | | | `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` | | |-| `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` | |+| `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` | | | `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` | | `pin_pad_check` | Do the footprints fit their symbols? Part by part, the symbol's pin numbers (from the sheet files) against the footprint's pad names (from the board): pins... | `altium_pin_pad_check` | `kicad_pin_pad_check` | |@@ -205,7 +205,7 @@ Engineering computed from the board model, not by the tool: one shared engine, s | `review_board` | Design-review checks (14) over one board read; schematic checks with includeSchematic. | `altium_review_board` | `kicad_lint_board` (partial) | | | `route_pair` | Route a differential pair as a pair: one centreline from the source pads' midpoint through waypoints to the destination pads' midpoint, each net offset to... | `altium_route_pair` | `kicad_route_pair` | | | `schematic_review` | Review the schematic before Update PCB: every placed pin (read from the sheet files, with its electrical type) against Altium's compiled netlist. Errors:... | `altium_schematic_review` | `kicad_sch_check / kicad_design_review / kicad_lint_schematic` (partial) | |-| `silk_designators` | Place every reference designator the way assembly houses want: one size, upright, beside its own part, clear of every pad (JLCPCB: 0.15 mm), every other... | `altium_silk_designators` | `kicad_silk_designators` | |+| `silk_designators` | Place every reference designator the way assembly houses want: one size, upright, beside its own part, clear of every pad (JLCPCB: 0.15 mm), every other... | `altium_silk_designators` | `kicad_silk_designators` | `fusion_silk_designators` | | `test_board` | Place one footprint, or a ';' list, from the open PcbLib on ONE board: a NEW board (wMm x hMm outline) when pcbPath is new or omitted, APPENDED to the... | `altium_test_board` | `kicad_test_board` | | | `thermal_vias` | A thermal via grid in a part's exposed pad (the ground or thermal pad under a QFN, DFN, PowerPAD or regulator): centred, inset from the pad's edge, sized by... | `altium_thermal_vias` | `kicad_thermal_vias` | `fusion_thermal_vias` | | `via_fence` | A via fence for EMC: a row of ground vias on both sides of RF or fast nets' tracks, and/or round the board edge, at a pitch from the frequency (lambda/20)... | `altium_via_fence` | `kicad_via_fence` | `fusion_via_fence` |@@ -221,7 +221,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `agent_start` | Bootstrap the resident DelphiScript agent inside Altium (renders the script, runs it through the -R lane, waits for the heartbeat). Optional: every... | `altium_agent_start` | | | | `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` | | | | `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` | | |-| `animate_view` | Camera/zoom choreography on the current document - native Altium camera commands, animated by Altium itself. | `altium_animate_view` | | |+| `animate_view` | Camera/zoom choreography on the current document - native Altium camera commands, animated by Altium itself. | `altium_animate_view` | | `fusion_view` (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_state / kicad_dismiss_dialogs` (partial) | `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` (partial) | `fusion_close_all_documents` |@@ -235,7 +235,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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_blocking_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` | | |-| `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` | |+| `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. | | `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` | | | | `foreground` | Bring Altium in front of the user - the sanctioned exception to the never-foreground rule. | `altium_foreground` | `kicad_foreground` | |@@ -245,18 +245,18 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `instances` | Every running Altium (Designer + Designer Develop can run together). | `altium_instances` | `kicad_state` (partial) | | | `launch` | Start Altium (the newest numbered install, or the one install names) and wait for its main window, then hand the user's own window back. Answers... | `altium_launch` | `kicad_launch` | `fusion_start` | | `library_views` *proposed* | Pictures of library parts for review, each as an image file: the schematic symbol, the footprint (pads and layers), the 3D body seated on the footprint, and... | `altium_library_views` | `kicad_library_views` | `fusion_library_views` |-| `license` | Drive the License Management page (UIA first - no cursor, no foreground). | `altium_license` | | |+| `license` | Drive the License Management page (UIA first - no cursor, no foreground). | `altium_license` | | `fusion_account` (partial) | | `license_status` | Plain-language answer to 'what Altium licence am I on?': the state from the window title plus a capture of the License Management page. | `altium_license_status` | `kicad_license_status` | `fusion_license_status` | | `list_commands` | Search Altium's process-launcher catalog (about 1,100 Server:Command entries parsed from the install's System/*.rcs files) by text and/or server. | `altium_list_commands` | `kicad_menu_items` (partial) | `fusion_list_commands` | | `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_board / kicad_open_schematic` (partial) | `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_board / kicad_open_schematic` (partial) | |+| `open_project` | Open a project (.PrjPcb / .PrjScr / .PrjMbd / .PrjHar / .LibPkg) by path. Same handler as altium_open_document. | `altium_open_project` | `kicad_open_board / kicad_open_schematic` (partial) | `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` | | | | `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` | | | `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` | | `run_command` | Run an Altium process (Server:Command) through the agent, on the CURRENT document or on filePath opened first. | `altium_run_command` | `kicad_send_key` (partial) | `fusion_run_command` | | `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_board` (partial) | `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` | | |+| `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` | | `fusion_sch_zoom` | | `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_clear` (partial) | `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_get_selection / kicad_select_items` | | | `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` | | |@@ -276,7 +276,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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` | | `uninstall` | Remove the bridge's own cache directory (agent workspaces, rendered agent scripts, the Altium 365 token file). Altium Designer and the user's designs are... | `altium_uninstall` | `kicad_uninstall` | `fusion_uninstall` |-| `window_info` | Altium's top-level windows plus any open dialogs, without screenshots. The cheap way to ask 'is a modal blocking the engine?'. | `altium_window_info` | `kicad_window_info` | |+| `window_info` | Altium's top-level windows plus any open dialogs, without screenshots. The cheap way to ask 'is a modal blocking the engine?'. | `altium_window_info` | `kicad_window_info` | `fusion_check_dialogs` (partial) | | `zoom_to` | Frame the PCB view on a rectangle, a part (or several) or a whole net, with a margin. | `altium_zoom_to` | `kicad_zoom_to` | `fusion_zoom_to` | ## platform
verbs/coverage.json+50−12@@ -7,7 +7,7 @@ "proposed": 56, "compared": { "kicad": "1.0.82",- "fusion360": "1.13.10"+ "fusion360": "1.13.11" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",@@ -2357,7 +2357,10 @@ "verb": "kicad_auto_classes", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_auto_classes",+ "match": "exact"+ } }, { "name": "board_features",@@ -2479,7 +2482,10 @@ "verb": "kicad_check_orientation", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_check_orientation",+ "match": "exact"+ } }, { "name": "copper_balance",@@ -2578,7 +2584,10 @@ "verb": "kicad_find_space", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_find_space",+ "match": "exact"+ } }, { "name": "footprint_from_land_pattern",@@ -2651,7 +2660,10 @@ "verb": "kicad_jlcpcb_order", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_jlcpcb_order",+ "match": "exact"+ } }, { "name": "length_tune",@@ -2854,7 +2866,10 @@ "verb": "kicad_silk_designators", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_silk_designators",+ "match": "exact"+ } }, { "name": "test_board",@@ -2971,7 +2986,11 @@ "match": "exact" }, "kicad": null,- "fusion360": null+ "fusion360": {+ "verb": "fusion_view",+ "match": "partial",+ "note": "Fusion's own camera with smooth transitions (fit, home, iso, orbit, zoom, pan) on the 3D view; the 2D board and schematic zoom with fusion_electron_zoom"+ } }, { "name": "check_dialogs",@@ -3195,7 +3214,11 @@ "verb": "kicad_eval", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_run_modeling_script",+ "match": "partial",+ "note": "a Python snippet with Fusion's adsk API in the live session, not DelphiScript"+ } }, { "name": "export_spice",@@ -3334,7 +3357,11 @@ "match": "exact" }, "kicad": null,- "fusion360": null+ "fusion360": {+ "verb": "fusion_account",+ "match": "partial",+ "note": "Fusion is licensed through the Autodesk account: the signed-in account, Autodesk's licence state and whether this machine holds the seat (there is no licence page to drive)"+ } }, { "name": "license_status",@@ -3401,7 +3428,11 @@ "match": "partial", "note": "opens the project's board or schematic in its editor" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_open_cloud_file",+ "match": "partial",+ "note": "opens the electronics design (its project document) from the Fusion hub by name or URN: Fusion has no project files on disk"+ } }, { "name": "panel",@@ -3506,7 +3537,10 @@ "match": "exact" }, "kicad": null,- "fusion360": null+ "fusion360": {+ "verb": "fusion_sch_zoom",+ "match": "exact"+ } }, { "name": "select_net",@@ -3819,7 +3853,11 @@ "verb": "kicad_window_info", "match": "exact" },- "fusion360": null+ "fusion360": {+ "verb": "fusion_check_dialogs",+ "match": "partial",+ "note": "every open Fusion dialog with title, text and buttons, without a screenshot; fusion_state adds the window and a background screenshot"+ } }, { "name": "zoom_to",
verbs/standard.json+1−1@@ -7,7 +7,7 @@ "proposed": 56, "compared": { "kicad": "1.0.82",- "fusion360": "1.13.10"+ "fusion360": "1.13.11" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",