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 altium-lane f87664f (reference/altium-0.2.77.json, insiders: 13 proposed verbs under their names, engine 0.1.4): Altium 226 of 236
4 files changed
+78−39
README.md+4−4@@ -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 | 89 | 54 |-| **native** | 46 | 38 | 41 | 24 |+| **core** | 93 | 90 | 89 | 54 |+| **native** | 46 | 43 | 41 | 24 | | **checks** | 37 | 33 | 24 | 9 |-| **app** | 60 | 56 | 25 | 36 |+| **app** | 60 | 60 | 25 | 36 | | **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 236 | 213 | 179 | 123 |+| standard (all but platform) | 236 | 226 | 179 | 123 | <!-- 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+19−19@@ -1,17 +1,17 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.76 (the reference), KiCad bridge 1.0.67, Fusion 360 bridge 1.12.7. 54 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.77 (the reference), KiCad bridge 1.0.67, Fusion 360 bridge 1.12.7. 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 | 89 | 54 |-| **native** | 46 | 38 | 41 | 24 |+| **core** | 93 | 90 | 89 | 54 |+| **native** | 46 | 43 | 41 | 24 | | **checks** | 37 | 33 | 24 | 9 |-| **app** | 60 | 56 | 25 | 36 |+| **app** | 60 | 60 | 25 | 36 | | **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 236 | 213 | 179 | 123 |+| standard (all but platform) | 236 | 226 | 179 | 123 | ## core @@ -57,11 +57,11 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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` | |-| `project_info` *proposed* | A project at a glance: name, files with sizes and dates, the sheet tree, the board (layers, parts, nets, size), text variables, net classes, last change,... | | `kicad_project_info` | |-| `project_rename` *proposed* | Rename a project: the project file, the root sheet, the board and the tool's side files, with the references inside them updated. Refused while the tool has... | | `kicad_project_rename` | |+| `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` | |+| `project_info` *proposed* | A project at a glance: name, files with sizes and dates, the sheet tree, the board (layers, parts, nets, size), text variables, net classes, last change,... | `altium_project_info` | `kicad_project_info` | |+| `project_rename` *proposed* | Rename a project: the project file, the root sheet, the board and the tool's side files, with the references inside them updated. Refused while the tool has... | `altium_project_rename` | `kicad_project_rename` | | | `read_board` | ONE round trip: components, nets, layers, copper, rules, occupancy, outline. | `altium_read_board` | `kicad_board_summary` (partial) | `fusion_board_info / fusion_get_design_info` (partial) |-| `read_footprint` *proposed* | Every detail of one library footprint: pads (number, type, shape, position, size, drill, layers), the layers it uses, its courtyard box, graphics per layer,... | | `kicad_read_footprint` | `fusion_read_footprint` |+| `read_footprint` *proposed* | Every detail of one library footprint: pads (number, type, shape, position, size, drill, layers), the layers it uses, its courtyard box, graphics per layer,... | `altium_read_footprint` | `kicad_read_footprint` | `fusion_read_footprint` | | `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` | |@@ -127,7 +127,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `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` | | | | `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` | | | `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` | | |-| `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... | | `kicad_make_part_project` (partial) | |+| `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_make_part_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) | | | `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 / fusion_board_bom` | | `export_dxf` *proposed* | Export chosen board layers to DXF, one file per layer (the outline, panel drawings, stencils, enclosure work). | | `kicad_export_dxf` | `fusion_export_dxf` |@@ -135,7 +135,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `export_gerber` | Gerber/drill export: altium_run_outjob with the fabrication OutJob and the 'Folder Structure' medium as defaults. | `altium_export_gerber` | `kicad_export_gerber` | `fusion_export_gerbers` | | `export_ipc2581` *proposed* | Export the board as IPC-2581: one XML file with copper, drill, stack-up, netlist and BOM, through the tool's own exporter. | `altium_export_ipc2581` | `kicad_export_ipc2581` | `fusion_export_ipc2581` (partial) | | `export_ipc356` *proposed* | Export the IPC-D-356 netlist of the board, for bare-board electrical test (flying probe or bed of nails). | | `kicad_export_ipc356` | `fusion_export_ipc356` |-| `export_library_part` *proposed* | Export one library part into its own small library files: a symbol library with only its symbol, a footprint library with only its footprint, and its 3D... | | `kicad_export_part` (partial) | |+| `export_library_part` *proposed* | Export one library part into its own small library files: a symbol library with only its symbol, a footprint library with only its footprint, and its 3D... | `altium_export_library_part` | `kicad_export_part` (partial) | | | `export_manufacturing` | A project's manufacturing set in one call: Gerbers, NC drill, pick and place (CSV, mm) and the BOM, from an OutJob the bridge writes beside the project... | `altium_export_manufacturing` | `kicad_export_gerber / kicad_export_pos` (partial) | `fusion_export_gerbers / fusion_export_cpl / fusion_export_bom` (partial) | | `export_odb` *proposed* | Export the board as ODB++ (copper, drill, stack-up, netlist and parts in one archive) through the tool's own exporter. | `altium_export_odb` | `kicad_export_odb` | `fusion_export_odb` | | `export_pdf` | Every sheet of a project as one PDF, plus on request the board's composite print, Altium's assembly drawings (top and bottom, designators on the parts) and... | `altium_export_pdf` | `kicad_export_pdf` | |@@ -148,10 +148,10 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `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) | | | `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) | | | `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_zone_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. | | `kicad_project_snapshot` | |+| `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` | | | `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. | | `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... | | `kicad_export_svg` (partial) | `fusion_export_board_image` (partial) |+| `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_show_schematic` (partial) | `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` | | | `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` |@@ -224,16 +224,16 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `animate_view` | Camera/zoom choreography on the current document - native Altium camera commands, animated by Altium itself. | `altium_animate_view` | | | | `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` | | `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... | | | `fusion_close_all_documents` |+| `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` | | `fusion_close_all_documents` | | `close_document` | Close ONE open document by path through its document handle. Never saves. | `altium_close_document` | | `fusion_close_document` | | `connect_workspace` | Open Altium's workspace picker (the 'Not Connected' menu) and return a screenshot with a coordMap. The list is a custom control with no UIA children, so the... | `altium_connect_workspace` | | |-| `cross_probe` *proposed* | From a schematic part to the board part linked to it, and back, by designator, the schematic symbol's id or its sheet path; optionally select them in the tool. | | `kicad_cross_probe` | |+| `cross_probe` *proposed* | From a schematic part to the board part linked to it, and back, by designator, the schematic symbol's id or its sheet path; optionally select them in the tool. | `altium_cross_probe` | `kicad_cross_probe` | | | `demo` | The tour. Default: one background beat per call with a screenshot. live:true = the narrated FOREGROUND show: ab caption + document + in-bridge camera... | `altium_demo` | `kicad_demo` | `fusion_demo` | | `describe` | This list - the bridge's verbs and schemas for ab's Verbs tab. | `altium_describe` | `kicad_describe` | `fusion_describe` | | `diagnostics` | Bridge-side facts for a bug report: environment variables, every Altium install found, Altium's windows, the agent status block and the cache directory. | `altium_diagnostics` | `kicad_diagnostics` | | | `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` | | `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_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. | | | `fusion_document_info` |+| `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` | | `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` | | | | `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` | | |@@ -243,7 +243,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `install_receipt` | The last bundle install's full receipt (proof frame included), for a client whose install call outlived ab's budget. | `altium_install_receipt` | | | | `instances` | Every running Altium (Designer + Designer Develop can run together). | `altium_instances` | | | | `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... | | | `fusion_library_views` |+| `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` | | `fusion_library_views` | | `license` | Drive the License Management page (UIA first - no cursor, no foreground). | `altium_license` | | | | `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` | | `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` | | `fusion_list_commands` |@@ -254,7 +254,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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` | | `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` | | `fusion_run_script` |-| `save` | Save the focused document, or open filePath first and save that (WorkspaceManager:SaveObject on the focused document). | `altium_save` | `kicad_save_board` (partial) | `fusion_save` |+| `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` | | | | `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` | |
verbs/coverage.json+53−14@@ -2,7 +2,7 @@ "standard": "0.4.5", "reference": { "bridge": "altium",- "version": "0.2.76"+ "version": "0.2.77" }, "proposed": 54, "compared": {@@ -598,7 +598,10 @@ "name": "project_create", "tier": "core", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_project_create",+ "match": "exact"+ }, "kicad": { "verb": "kicad_project_create", "match": "exact"@@ -609,7 +612,10 @@ "name": "project_info", "tier": "core", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_project_info",+ "match": "exact"+ }, "kicad": { "verb": "kicad_project_info", "match": "exact"@@ -620,7 +626,10 @@ "name": "project_rename", "tier": "core", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_project_rename",+ "match": "exact"+ }, "kicad": { "verb": "kicad_project_rename", "match": "exact"@@ -648,7 +657,10 @@ "name": "read_footprint", "tier": "core", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_read_footprint",+ "match": "exact"+ }, "kicad": { "verb": "kicad_read_footprint", "match": "exact"@@ -1569,7 +1581,10 @@ "name": "create_part_project", "tier": "native", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_create_part_project",+ "match": "exact"+ }, "kicad": { "verb": "kicad_make_part_project", "match": "partial"@@ -1689,7 +1704,10 @@ "name": "export_library_part", "tier": "native", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_export_library_part",+ "match": "exact"+ }, "kicad": { "verb": "kicad_export_part", "match": "partial"@@ -1890,7 +1908,10 @@ "name": "project_snapshot", "tier": "native", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_project_snapshot",+ "match": "exact"+ }, "kicad": { "verb": "kicad_project_snapshot", "match": "exact"@@ -1918,7 +1939,10 @@ "name": "render_board_3d", "tier": "native", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_render_board_3d",+ "match": "exact"+ }, "kicad": { "verb": "kicad_render_board_3d", "match": "exact"@@ -1932,7 +1956,10 @@ "name": "render_board_layers", "tier": "native", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_render_board_layers",+ "match": "exact"+ }, "kicad": { "verb": "kicad_export_svg", "match": "partial"@@ -2740,7 +2767,10 @@ "name": "close_all_documents", "tier": "app", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_close_all_documents",+ "match": "exact"+ }, "kicad": null, "fusion360": { "verb": "fusion_close_all_documents",@@ -2776,7 +2806,10 @@ "name": "cross_probe", "tier": "app", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_cross_probe",+ "match": "exact"+ }, "kicad": { "verb": "kicad_cross_probe", "match": "exact"@@ -2866,7 +2899,10 @@ "name": "document_info", "tier": "app", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_document_info",+ "match": "exact"+ }, "kicad": null, "fusion360": { "verb": "fusion_document_info",@@ -2985,7 +3021,10 @@ "name": "library_views", "tier": "app", "source": "proposed",- "altium": null,+ "altium": {+ "verb": "altium_library_views",+ "match": "exact"+ }, "kicad": null, "fusion360": { "verb": "fusion_library_views",
verbs/standard.json+2−2@@ -2,7 +2,7 @@ "standard": "0.4.5", "reference": { "bridge": "altium",- "version": "0.2.76"+ "version": "0.2.77" }, "proposed": 54, "compared": {@@ -8085,7 +8085,7 @@ "name": "save", "tier": "app", "source": "altium",- "summary": "Save the focused document, or open filePath first and save that (WorkspaceManager:SaveObject on the focused document).",+ "summary": "Save the focused document, or the document at filePath (opened first if need be, saved by its path, never whatever happens to have focus).", "input": { "filePath": "path - optional; opened and made current before the save" },