← Commit history

standard 0.22.1: regenerate with fusion 1.13.15

Colby Knox ·571f13cc34 ·12d ago ·parent 986b612
5 files changed +241−92
README.md+7−6
@@ -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 | 82 |-| **native** | 46 | 46 | 43 | 33 |-| **checks** | 37 | 37 | 35 | 36 |-| **app** | 62 | 62 | 44 | 45 |-| **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 238 | 238 | 212 | 196 |+| **core** | 93 | 93 | 90 | 85 |+| **native** | 46 | 46 | 43 | 34 |+| **checks** | 37 | 37 | 35 | 37 |+| **app** | 62 | 62 | 44 | 49 |+| **platform** | 19 | 19 | 0 | 1 |+| standard (all but platform) | 238 | 238 | 212 | 205 | <!-- 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.22.1: regenerated with fusion-bridge 1.13.15 (Altium-only verbs marked unsupported; swap_footprint, set_models, add_models). Version 0.22.0: the engine (0.19.0) adds `panelize` (the Altium bridge's panel plan: V-score or mouse bites, rails, tooling and JLCPCB's rules) and `teardrops` (a planner of its own: Altium uses its built-in command), as plans every bridge can apply (fusion-lane). On the Bluetooth Sentinel, 117 teardrops keep the board's 0.1 mm from other copper (checked
docs/coverage.md+44−44
@@ -1,17 +1,17 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.81 (the reference), KiCad bridge 1.0.84, Fusion 360 bridge 1.13.14. 56 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.81 (the reference), KiCad bridge 1.0.84, Fusion 360 bridge 1.13.15. 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 | 82 |-| **native** | 46 | 46 | 43 | 33 |-| **checks** | 37 | 37 | 35 | 36 |-| **app** | 62 | 62 | 44 | 45 |-| **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 238 | 238 | 212 | 196 |+| **core** | 93 | 93 | 90 | 85 |+| **native** | 46 | 46 | 43 | 34 |+| **checks** | 37 | 37 | 35 | 37 |+| **app** | 62 | 62 | 44 | 49 |+| **platform** | 19 | 19 | 0 | 1 |+| standard (all but platform) | 238 | 238 | 212 | 205 |  ## core @@ -20,7 +20,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | Verb | What it does | Altium | KiCad | Fusion 360 | |---|---|---|---|---| | `add_body` | Put a 3D body on a footprint of a PcbLib: a STEP model, or an extruded box when no step is given. It REPLACES the footprint's existing 3D bodies (a... | `altium_add_body` | `kicad_add_body` (partial) | `fusion_attach_3d_package` (partial) |-| `add_models` | Attach one or more PCBLIB footprint models, parameters, comment and description to a SchLib component (Altium's several-footprints-per-symbol mechanism). | `altium_add_models` | `kicad_footprint_models` (partial) |  |+| `add_models` | Attach one or more PCBLIB footprint models, parameters, comment and description to a SchLib component (Altium's several-footprints-per-symbol mechanism). | `altium_add_models` | `kicad_footprint_models` (partial) | `fusion_add_models` | | `add_symbol_art` | Draw the chip-outline artwork (the chip-thumbnailer polylines adom-symbol baked into the KiCad symbol) into a SchLib component, fitted to its body... | `altium_add_symbol_art` |  |  | | `align_parts` *proposed* | Line parts up on a common left, right, top, bottom or centre line, or space them evenly, by courtyard box or by anchor point. One undo step, with... | `altium_align_parts` | `kicad_align_parts` | `fusion_align_parts` | | `apply_silkscreen` | Land a silkscreen plan in one undo step: designators and comments moved, sized and turned (or hidden), free overlay texts and lines added (bottom texts... | `altium_apply_silkscreen` | `kicad_silk_fields_batch / kicad_silk_text_batch / kicad_silk_graphics_batch` | `fusion_apply_silkscreen` |@@ -56,7 +56,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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_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` |  |  |+| `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) | | `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` | `fusion_project_info` (partial) | | `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` | `fusion_project_rename` (partial) |@@ -102,14 +102,14 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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) | | `set_layer_count` *proposed* | Set the board's copper layer count (2, 4, 6 or 8): the layer table and the stack-up, keeping the board thickness. | `altium_set_layer_count` | `kicad_set_layer_count` | `fusion_set_layer_count` |-| `set_models` | Replace every footprint model on a SchLib component with ONE PCBLIB model (set_params footprint and add_models APPEND, which is how a symbol ends up with two). | `altium_set_models` | `kicad_footprint_models` (partial) |  |+| `set_models` | Replace every footprint model on a SchLib component with ONE PCBLIB model (set_params footprint and add_models APPEND, which is how a symbol ends up with two). | `altium_set_models` | `kicad_footprint_models` (partial) | `fusion_set_models` | | `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` |  | | `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) |  |+| `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` |  | | `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) | @@ -123,8 +123,8 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `annotate` | Number every '?' designator (R?, C?, U?) across the project's sheets: the lowest free number per prefix, top-left first on each sheet. dryRun shows the plan. | `altium_annotate` | `kicad_annotate` | `fusion_annotate` | | `apply_pours` | Add solid polygon pours from outlines and pour them, each with its own connect style (solid joints or thermal spokes), plus pour keepouts (polygon cutouts);... | `altium_apply_pours` | `kicad_add_zone / kicad_apply_zone_plan` | `fusion_change_pours` (partial) | | `autoroute` | Altium's own autorouter (Situs) on the current board: picks a strategy, keeps existing routing locked by default, routes, and answers the unconnected count... | `altium_autoroute` | `kicad_autoroute` | `fusion_autoroute` |-| `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` |  |  |-| `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` |  |  |+| `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` |  | | `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) | `fusion_make_test_project` (partial) |@@ -161,7 +161,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `sch_update_from_library` *proposed* | Update the placed symbols on a sheet from their libraries (all, or the listed ones) and report which changed, which already matched and which no library has. | `altium_sch_update_from_library` | `kicad_sch_update_from_library` | unsupported | | `set_design_rules` | Write a fab's design rules into the current board: clearance, track width, routing via style, hole size, annular ring, hole-to-hole and board-edge clearance... | `altium_set_design_rules` | `kicad_set_design_rules` | `fusion_set_design_rules` | | `silkscreen_prep` | Clean the silkscreen off the copper with Altium's own Tools > Silkscreen Preparation: silk clipped clear of every mask opening (pad) by the board's silk... | `altium_silkscreen_prep` | `kicad_silkscreen_prep` |  |-| `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` |  |  |+| `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` |  | 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) |  | | `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` |  | | `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_from_schematic` (partial) | `fusion_cross_check` (partial) |@@ -178,7 +178,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` |  |  |+| `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_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` |@@ -217,16 +217,16 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | Verb | What it does | Altium | KiCad | Fusion 360 | |---|---|---|---|---| | `activate_document` | Make a document current - the quiet lane (one in-process agent call, no cursor, no OS foreground). Board and schematic read verbs act on the CURRENT document. | `altium_activate_document` |  | `fusion_activate_document` |-| `agent_recover` | Un-halt the script engine: clear the PCB transaction, press OK on open Altium dialogs, send EditScript:Stop, reap the busy notice and delete stale request... | `altium_agent_recover` |  |  |-| `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` |  |  |+| `agent_recover` | Un-halt the script engine: clear the PCB transaction, press OK on open Altium dialogs, send EditScript:Stop, reap the busy notice and delete stale request... | `altium_agent_recover` |  | unsupported |+| `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` |  | unsupported |+| `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` |  | `fusion_addin_status` (partial) |+| `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` |  | unsupported | | `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` | | `close_document` | Close ONE open document by path through its document handle. Never saves. | `altium_close_document` | `kicad_close_symbol_editor / kicad_close_footprint_editor / kicad_close_3d_viewer` (partial) | `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` |  |  |+| `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` |  | unsupported | | `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` | `fusion_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` |@@ -234,14 +234,14 @@ 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_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` |  |  |+| `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) | | `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` |  |  |+| `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) | | `foreground` | Bring Altium in front of the user - the sanctioned exception to the never-foreground rule. | `altium_foreground` | `kicad_foreground` |  | | `install` | Install Altium Designer on this machine, STAGED, with the rules in the verb (from 0.2.29). stage: preflight / get_installer / launch / wait / license, or... | `altium_install` | `kicad_upgrade` (partial) | `fusion_install_fusion` |-| `install_extension` | Install, update or remove the AdomBridge .NET extension (the PowerShell installer shipped beside the bridge). Altium must be CLOSED. | `altium_install_extension` |  |  |-| `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` |  |  |+| `install_extension` | Install, update or remove the AdomBridge .NET extension (the PowerShell installer shipped beside the bridge). Altium must be CLOSED. | `altium_install_extension` |  | unsupported |+| `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` |  | unsupported | | `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` |@@ -259,9 +259,9 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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` |  |  |+| `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` |  |  |+| `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) | | `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` |@@ -285,22 +285,22 @@ Specific to one tool's platform (Altium 365, OutJobs, integrated libraries). Not  | Verb | What it does | Altium | KiCad | Fusion 360 | |---|---|---|---|---|-| `a365_configure` | Store the Altium 365 workspace domain and, optionally, a Bearer token created by hand in the workspace web UI (Admin - Developer). Local-only; tokens never... | `altium_a365_configure` |  |  |-| `a365_files_upload` | Upload one local file to the workspace's Files Service and get a temporary opaque file id to pass to a library mutation. | `altium_a365_files_upload` |  |  |-| `a365_library_overview` | One fixed read-only query: the workspace library's name, description, update time, component ids/names and footprint/symbol totals. | `altium_a365_library_overview` |  |  |-| `a365_library_schema` | Read-only schema map: the GraphQL queries and mutations whose names mention lib, component, symbol, footprint, part or datasheet, with mutation argument types. | `altium_a365_library_schema` |  |  |-| `a365_logout` | Revoke the refresh grant at Altium and remove every cached OAuth token. Workspace and client id stay configured. | `altium_a365_logout` |  |  |-| `a365_oauth_begin` | Start the Altium 365 OAuth (PKCE + ActionWait) sign-in: the bridge starts listening FIRST, then returns the authorize URL for the user's browser. Works with... | `altium_a365_oauth_begin` |  |  |-| `a365_oauth_cancel` | Cancel a waiting OAuth flow. | `altium_a365_oauth_cancel` |  |  |-| `a365_oauth_status` | State of the OAuth flow started by altium_a365_oauth_begin: idle / waiting / authorized / cancelled / error. | `altium_a365_oauth_status` |  |  |-| `a365_query` | Run one GraphQL query or mutation against the workspace's GraphQL gateway (https://<workspace>/svc/napi/gateway/graphql/) with the stored token. | `altium_a365_query` |  |  |-| `a365_refresh` | Exchange the stored refresh token for a new access token (and store a rotated refresh token if one comes back). | `altium_a365_refresh` |  |  |-| `a365_status` | Is the Altium 365 lane configured, is there a token, and is it LIVE (probed with a one-row GraphQL query)? | `altium_a365_status` |  |  |-| `compile_intlib` | Compile a .LibPkg into an integrated library (.IntLib). | `altium_compile_intlib` |  |  |-| `extract_intlib` | Extract the editable .SchLib/.PcbLib sources from a compiled .IntLib (Altium writes them next to the IntLib and opens them). | `altium_extract_intlib` |  |  |-| `import_kicad` | Import a KiCad file with Altium's own KiCad importer, driven through the AdomBridge .NET extension. | `altium_import_kicad` |  |  |-| `outjob_info` | An OutJob's containers (output media), the outputs in each, and their key settings (units, decimals, plotted layer count), read from the .OutJob file:... | `altium_outjob_info` |  |  |-| `run_outjob` | Run one output medium of an .OutJob (gerbers, drill, BOM, PDFs...) and list what it wrote under 'Project Outputs for <project>'. | `altium_run_outjob` |  |  |+| `a365_configure` | Store the Altium 365 workspace domain and, optionally, a Bearer token created by hand in the workspace web UI (Admin - Developer). Local-only; tokens never... | `altium_a365_configure` |  | unsupported |+| `a365_files_upload` | Upload one local file to the workspace's Files Service and get a temporary opaque file id to pass to a library mutation. | `altium_a365_files_upload` |  | unsupported |+| `a365_library_overview` | One fixed read-only query: the workspace library's name, description, update time, component ids/names and footprint/symbol totals. | `altium_a365_library_overview` |  | unsupported |+| `a365_library_schema` | Read-only schema map: the GraphQL queries and mutations whose names mention lib, component, symbol, footprint, part or datasheet, with mutation argument types. | `altium_a365_library_schema` |  | unsupported |+| `a365_logout` | Revoke the refresh grant at Altium and remove every cached OAuth token. Workspace and client id stay configured. | `altium_a365_logout` |  | unsupported |+| `a365_oauth_begin` | Start the Altium 365 OAuth (PKCE + ActionWait) sign-in: the bridge starts listening FIRST, then returns the authorize URL for the user's browser. Works with... | `altium_a365_oauth_begin` |  | unsupported |+| `a365_oauth_cancel` | Cancel a waiting OAuth flow. | `altium_a365_oauth_cancel` |  | unsupported |+| `a365_oauth_status` | State of the OAuth flow started by altium_a365_oauth_begin: idle / waiting / authorized / cancelled / error. | `altium_a365_oauth_status` |  | unsupported |+| `a365_query` | Run one GraphQL query or mutation against the workspace's GraphQL gateway (https://<workspace>/svc/napi/gateway/graphql/) with the stored token. | `altium_a365_query` |  | unsupported |+| `a365_refresh` | Exchange the stored refresh token for a new access token (and store a rotated refresh token if one comes back). | `altium_a365_refresh` |  | unsupported |+| `a365_status` | Is the Altium 365 lane configured, is there a token, and is it LIVE (probed with a one-row GraphQL query)? | `altium_a365_status` |  | unsupported |+| `compile_intlib` | Compile a .LibPkg into an integrated library (.IntLib). | `altium_compile_intlib` |  | unsupported |+| `extract_intlib` | Extract the editable .SchLib/.PcbLib sources from a compiled .IntLib (Altium writes them next to the IntLib and opens them). | `altium_extract_intlib` |  | unsupported |+| `import_kicad` | Import a KiCad file with Altium's own KiCad importer, driven through the AdomBridge .NET extension. | `altium_import_kicad` |  | `fusion_create_library` (partial) |+| `outjob_info` | An OutJob's containers (output media), the outputs in each, and their key settings (units, decimals, plotted layer count), read from the .OutJob file:... | `altium_outjob_info` |  | unsupported |+| `run_outjob` | Run one output medium of an .OutJob (gerbers, drill, BOM, PDFs...) and list what it wrote under 'Project Outputs for <project>'. | `altium_run_outjob` |  | unsupported | | `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` |  |  |-| `workspace_place` | Put a part from the Altium 365 workspace on a sheet: search, pick a result, place it (Altium's own placement, so the part keeps its workspace link,... | `altium_workspace_place` |  |  |-| `workspace_search` | Search the Altium 365 workspace's components (the shared cloud library Altium is signed in to) through Altium's own Components panel: name, description and... | `altium_workspace_search` |  |  |+| `workspace_place` | Put a part from the Altium 365 workspace on a sheet: search, pick a result, place it (Altium's own placement, so the part keeps its workspace link,... | `altium_workspace_place` |  | unsupported |+| `workspace_search` | Search the Altium 365 workspace's components (the shared cloud library Altium is signed in to) through Altium's own Components panel: name, description and... | `altium_workspace_search` |  | unsupported |
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "eda-bridge-standard",-  "version": "0.22.0",+  "version": "0.22.1",   "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+187−39
@@ -1,5 +1,5 @@ {- "standard": "0.22.0",+ "standard": "0.22.1",  "reference": {   "bridge": "altium",   "version": "0.2.81"@@ -7,7 +7,7 @@  "proposed": 56,  "compared": {   "kicad": "1.0.84",-  "fusion360": "1.13.14"+  "fusion360": "1.13.15"  },  "tiers": {   "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",@@ -47,7 +47,11 @@     "verb": "kicad_footprint_models",     "match": "partial"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_add_models",+    "match": "exact",+    "note": "each footprint becomes another device of the component; one already attached is skipped, not stacked"+   }   },   {    "name": "add_symbol_art",@@ -642,7 +646,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "EAGLE pads are always plated: an unplated hole is a separate hole object"+   }   },   {    "name": "project_create",@@ -1431,7 +1439,11 @@     "verb": "kicad_footprint_models",     "match": "partial"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_set_models",+    "match": "exact",+    "note": "a Fusion component's devices are its footprints: every other device is removed"+   }   },   {    "name": "set_outline",@@ -1545,7 +1557,11 @@     "verb": "kicad_update_footprints_from_library",     "match": "partial"    },-   "fusion360": null+   "fusion360": {+    "verb": "fusion_swap_footprint",+    "match": "exact",+    "note": "on a board kept as EAGLE source (.brd); designator picks the part (default: the first)"+   }   },   {    "name": "symbol_prims",@@ -1656,7 +1672,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_import_part",+    "match": "partial",+    "note": "the same symbol spec, through import_part; an EAGLE symbol has one look, so one display mode is drawn"+   }   },   {    "name": "cleanup_libs",@@ -1667,7 +1687,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "a new Fusion library starts empty: there is no factory-default part to remove"+   }   },   {    "name": "compile",@@ -2279,7 +2303,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "an EAGLE symbol has one look: there are no display modes to show"+   }   },   {    "name": "teardrops",@@ -2441,7 +2469,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_import_part",+    "match": "partial",+    "note": "the same footprint spec, through import_part with footprintSpec only"+   }   },   {    "name": "build_schematic",@@ -2976,7 +3008,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Fusion has no script engine to halt: a blocking dialog is cleared with fusion_dismiss_blocking_dialogs, and fusion_addin_status says whether the add-in answers"+   }   },   {    "name": "agent_start",@@ -2987,7 +3023,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Fusion has no script agent to start: the bridge's add-in loads with Fusion (fusion_start), and fusion_restart_for_addin reloads it"+   }   },   {    "name": "agent_status",@@ -2998,7 +3038,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_addin_status",+    "match": "partial",+    "note": "Fusion has no script agent: the bridge's add-in is its resident code, and this says whether it is loaded and answering"+   }   },   {    "name": "agent_stop",@@ -3009,7 +3053,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Fusion has no script agent: the add-in lives as long as Fusion does"+   }   },   {    "name": "animate_view",@@ -3106,7 +3154,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium's workspace picker; Fusion works in the signed-in Autodesk account's hub (fusion_account)"+   }   },   {    "name": "cross_probe",@@ -3234,7 +3286,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_signin",+    "match": "partial",+    "note": "launches Fusion if needed and signs in; the seat comes with the Autodesk account (fusion_account shows it)"+   }   },   {    "name": "eval",@@ -3280,7 +3336,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_addin_status",+    "match": "partial",+    "note": "the add-in (Fusion's counterpart of the .NET extension) answering or not, with its port and version"+   }   },   {    "name": "foreground",@@ -3323,7 +3383,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "the bridge deploys its Fusion add-in itself on every start"+   }   },   {    "name": "install_receipt",@@ -3334,7 +3398,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "no installer receipt: fusion_install_library_bundle answers with what it installed"+   }   },   {    "name": "instances",@@ -3619,7 +3687,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "a test of Altium's DelphiScript agent; Fusion runs none"+   }   },   {    "name": "set_layer_visibility",@@ -3647,7 +3719,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_install_fusion",+    "match": "partial",+    "note": "downloads Autodesk's installer and streams the free trial; fusion_signin finishes it"+   }   },   {    "name": "show_2d_board",@@ -3925,7 +4001,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "a365_files_upload",@@ -3936,7 +4016,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "a365_library_overview",@@ -3947,7 +4031,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "a365_library_schema",@@ -3958,7 +4046,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "a365_logout",@@ -3969,7 +4061,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "a365_oauth_begin",@@ -3980,7 +4076,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "a365_oauth_cancel",@@ -3991,7 +4091,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "a365_oauth_status",@@ -4002,7 +4106,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "a365_query",@@ -4013,7 +4121,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "a365_refresh",@@ -4024,7 +4136,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "a365_status",@@ -4035,7 +4151,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Altium 365 is Altium's cloud; Fusion's cloud is the Autodesk hub (fusion_aps_* search and browse, fusion_open_cloud_file, fusion_save_to_cloud)"+   }   },   {    "name": "compile_intlib",@@ -4046,7 +4166,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "a Fusion library is one .lbr holding symbols, footprints and components together: there is nothing to compile"+   }   },   {    "name": "extract_intlib",@@ -4057,7 +4181,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "a Fusion library is one .lbr holding symbols, footprints and components together: there is nothing to extract"+   }   },   {    "name": "import_kicad",@@ -4068,7 +4196,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_create_library",+    "match": "partial",+    "note": "KiCad parts (footprint + symbol) into a Fusion library; not KiCad boards or schematics"+   }   },   {    "name": "outjob_info",@@ -4079,7 +4211,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Fusion has no OutJob: each output is its own verb (fusion_export_gerbers with the JLCPCB CAM job, fusion_export_bom, fusion_export_pdf, fusion_export_odb ...)"+   }   },   {    "name": "run_outjob",@@ -4090,7 +4226,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "Fusion has no OutJob: each output is its own verb (fusion_export_gerbers with the JLCPCB CAM job, fusion_export_bom, fusion_export_pdf, fusion_export_odb ...)"+   }   },   {    "name": "variants",@@ -4112,7 +4252,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "the Altium 365 workspace library; place a part from a library the design holds with fusion_sch_place_part"+   }   },   {    "name": "workspace_search",@@ -4123,7 +4267,11 @@     "match": "exact"    },    "kicad": null,-   "fusion360": null+   "fusion360": {+    "verb": "fusion_not_supported",+    "match": "unsupported",+    "note": "the Altium 365 workspace library; Fusion's shared libraries are library.io (fusion_managed_library_*) and hub files (fusion_aps_search)"+   }   }  ] }
verbs/standard.json+2−2
@@ -1,5 +1,5 @@ {- "standard": "0.22.0",+ "standard": "0.22.1",  "reference": {   "bridge": "altium",   "version": "0.2.81"@@ -7,7 +7,7 @@  "proposed": 56,  "compared": {   "kicad": "1.0.84",-  "fusion360": "1.13.14"+  "fusion360": "1.13.15"  },  "tiers": {   "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",