← Commit history

standard 0.26.3: coverage reads KiCad 1.0.90 (231, no blank cells)

Colby Knox ·13db52e12c ·11d ago ·parent b95ad2c
5 files changed +125−52
README.md+4−3
@@ -60,12 +60,12 @@ verb by verb: [docs/coverage.md](docs/coverage.md). <!-- coverage:start (tools/generate.py writes this) --> | Tier | Verbs | Altium | KiCad | Fusion 360 | |---|---|---|---|---|-| **core** | 94 | 94 | 90 | 91 |-| **native** | 49 | 47 | 46 | 44 |+| **core** | 94 | 94 | 93 | 91 |+| **native** | 49 | 47 | 47 | 44 | | **checks** | 38 | 38 | 38 | 38 | | **app** | 64 | 62 | 53 | 55 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 245 | 241 | 227 | 228 |+| standard (all but platform) | 245 | 241 | 231 | 228 | <!-- 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.26.3: coverage reads KiCad bridge 1.0.90, which answers every standard verb (swap_footprint, plate_vias, normalize_bodies, symbol_mode added; the Altium-only verbs refuse with a reason). Version 0.26.2: Fusion maps render_board and export_pos (partial), 228 of 245. Version 0.26.1: `align_footprints` and `edit_placed_footprint` withdrawn: they duplicated `align_parts` and `edit_parts` (#29). Four verbs from this round stay: `verb_times`, `prewarm`, `render_board`, `export_pos`. Version 0.26.0: six verbs from kicad-lane join the standard (#29): `verb_times` and `prewarm` (app), `render_board`, `align_footprints` and `export_pos` (native), `edit_placed_footprint` (core).
docs/coverage.md+22−22
@@ -1,17 +1,17 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.84 (the reference), KiCad bridge 1.0.89, Fusion 360 bridge 1.13.26. 60 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.84 (the reference), KiCad bridge 1.0.90, Fusion 360 bridge 1.13.26. 60 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** | 94 | 94 | 90 | 91 |-| **native** | 49 | 47 | 46 | 44 |+| **core** | 94 | 94 | 93 | 91 |+| **native** | 49 | 47 | 47 | 44 | | **checks** | 38 | 38 | 38 | 38 | | **app** | 64 | 62 | 53 | 55 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 245 | 241 | 227 | 228 |+| standard (all but platform) | 245 | 241 | 231 | 228 |  ## core @@ -21,7 +21,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a |---|---|---|---|---| | `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) | `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` |  | `fusion_add_symbol_art` |+| `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` | unsupported | `fusion_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` | | `board_outline` | Draw the board shape as tracks and arcs on a mechanical layer: the outline a fab house reads from the Gerbers. A board built by script has its shape but... | `altium_board_outline` | `kicad_board_outline` | `fusion_board_outline` |@@ -51,12 +51,12 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `list_nets` | Every net on the current board with its pad count. | `altium_list_nets` | `kicad_list_nets` | `fusion_list_nets` | | `move_parts` | Move, rotate and flip placed components (side top or bottom; flip:true turns a part over); each part is read back to 0.001 mm, the exact rotation and its... | `altium_move_parts` | `kicad_move_footprint / kicad_flip_footprint` | `fusion_move_parts` | | `net_connections` | Every pad on the board with its net and owner (Designator.Pad), plus a bounding span and the airline length (minimum spanning tree over its pads, airlineMm)... | `altium_net_connections` | `kicad_trace_net / kicad_find_connections` (partial) | `fusion_net_connections` |-| `normalize_bodies` | Move every 3D body of a PcbLib's footprints (or one footprint) onto its pad cluster. A body added through the canvas lands 50000 mil from the pads in the... | `altium_normalize_bodies` |  | unsupported |+| `normalize_bodies` | Move every 3D body of a PcbLib's footprints (or one footprint) onto its pad cluster. A body added through the canvas lands 50000 mil from the pads in the... | `altium_normalize_bodies` | `kicad_normalize_bodies` | unsupported | | `part_parameters` | The parameter names a project's parts carry (with how many parts carry each), or with name, that parameter's value on every part. | `altium_part_parameters` | `kicad_part_parameters` | `fusion_part_parameters` | | `place_on_pcb` | Place ONE footprint from a PcbLib on a new board and return a proof frame. The single-part predecessor of altium_test_board. | `altium_place_on_pcb` | `kicad_place_footprint / kicad_add_footprint` | `fusion_test_board` (partial) | | `place_on_sch` | Place one symbol, or a ';' list of symbols, from the open SchLib on ONE new sheet (sheet sized FROM the measured parts: 500 mil gaps, 600 mil margins, A4... | `altium_place_on_sch` | `kicad_place_on_sch` | `fusion_make_showcase_project` (partial) | | `place_vias` | Place vias (through, top to bottom). One undo step, read back. | `altium_place_vias` | `kicad_add_via` | `fusion_place_vias` |-| `plate_vias` | Make every drilled pad in a PcbLib a plated MULTI-LAYER pad (all footprints, or footprintName). adom-lbr writes heatsink vias as pads with a hole; Altium... | `altium_plate_vias` |  | unsupported |+| `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` | `kicad_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) |@@ -109,7 +109,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `set_visibility` | Show or hide one named parameter on a SchLib component. | `altium_set_visibility` | `kicad_set_visibility` | `fusion_set_visibility` | | `sheet_params` | Write parameters onto PLACED parts on the schematic sheets (the BOM write-back): MPN, Manufacturer, Mouser/DigiKey/LCSC numbers, anything. A missing... | `altium_sheet_params` | `kicad_sheet_params` | `fusion_sheet_params` | | `silk_state` | The silkscreen as it stands: every part's body box, its designator and comment (text, location, size, rotation, shown, Altium's measured box), and the free... | `altium_silk_state` | `kicad_silk_state` | `fusion_silk_state` |-| `swap_footprint` | Replace the FIRST component on the current board with a footprint from a PcbLib at the same position, re-assigning nets by pad designator. Tracks are... | `altium_swap_footprint` |  | `fusion_swap_footprint` |+| `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_swap_footprint` | `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` | `fusion_symbol_prims` | | `update_footprints_from_library` | Compare each placed footprint with its library's current one and, with apply:true, replace the ones that differ, keeping where the part sits (position,... | `altium_update_footprints_from_library` | `kicad_update_footprints_from_library` | `fusion_update_footprints_from_library` (partial) | | `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) |@@ -124,8 +124,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_apply_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` |  | `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 |+| `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` | unsupported | `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 | 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` | unsupported | | `create_part_project` *proposed* | Generate a small real project (schematic and board) around one library part, so the part can be shown and tested in every view: schematic, 2D board and 3D... | `altium_create_part_project` | `kicad_create_part_project` (partial) | `fusion_make_test_project` (partial) |@@ -164,7 +164,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` | `fusion_silkscreen_prep` (partial) |-| `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 |+| `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` | `kicad_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) | `fusion_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` | unsupported | | `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` (partial) | `fusion_cross_check` (partial) |@@ -222,16 +222,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` | `kicad_open_board / kicad_open_schematic` (partial) | `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` |  | 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 |+| `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 | 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 | 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` | unsupported | `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 | unsupported | | `animate_view` | Camera/zoom choreography on the current document - native Altium camera commands, animated by Altium itself. | `altium_animate_view` | `kicad_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` |  | unsupported |+| `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 | 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` |@@ -242,15 +242,15 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `ensure_licensed` | One call to get a usable Altium: launch if needed, then claim a seat (Use License via UIA). Optional escalations: sign out to force a seat release, or start... | `altium_ensure_licensed` | `kicad_readiness` (partial) | `fusion_signin` (partial) | | `eval` | Run a DelphiScript snippet inside Altium (optional Var block, then Begin ... End;) on the CURRENT document, or on filePath opened first. | `altium_eval` | `kicad_eval` | `fusion_run_modeling_script` (partial) | | `export_spice` *proposed* | Write the design's SPICE netlist with the tool's own exporter, and say what it holds. | `altium_export_spice` | `kicad_export_spice` | `fusion_export_spice` |-| `extension_ping` | Does the AdomBridge .NET extension answer? Sends AdomBridge:Ping through the -R lane and waits up to 30 s for its result file. | `altium_extension_ping` |  | `fusion_addin_status` (partial) |+| `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` | unsupported | `fusion_addin_status` (partial) | | `foreground` | Bring Altium in front of the user - the sanctioned exception to the never-foreground rule. | `altium_foreground` | `kicad_foreground` | `fusion_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` |-| `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 |+| `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 | 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 | unsupported | | `instances` | Every running Altium (Designer + Designer Develop can run together). | `altium_instances` | `kicad_state` (partial) | `fusion_instances` (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_launch` | | `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` |  | `fusion_account` (partial) |+| `license` | Drive the License Management page (UIA first - no cursor, no foreground). | `altium_license` | unsupported | `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` |@@ -265,7 +265,7 @@ 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` | `kicad_sch_zoom` (partial) | `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_net` | `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_selection` (partial) | unsupported |-| `selftest_script_error` | Regression test for the script-error safety net (from 0.2.23): makes the agent raise a REAL DelphiScript runtime error on purpose and checks that the bridge... | `altium_selftest_script_error` |  | unsupported |+| `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 | 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` | `kicad_upgrade` (partial) | `fusion_install_fusion` (partial) | | `show_2d_board` | Open a .PcbDoc, switch to 2D, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel board. | `altium_show_2d_board` | `kicad_show_2d_board` | `fusion_show_2d_board` |@@ -276,7 +276,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `show_project` | Open a project (.PrjPcb) through the agent and return a proof frame of Altium's main window. With no filePath it opens Altium's bundled example project... | `altium_show_project` | `kicad_show_project` | `fusion_show_project` | | `show_schematic` | Open a .SchDoc, zoom to fit, and return a proof frame. With no filePath it opens the bundled Bluetooth Sentinel top sheet. | `altium_show_schematic` | `kicad_show_schematic` | `fusion_show_schematic` | | `show_symbol` | Open a SchLib member in the Symbol editor and capture a background proof. | `altium_show_symbol` | `kicad_show_symbol` | `fusion_show_symbol` |-| `signin` | Report-only alias of altium_signin_status: it does NOT sign anyone in. Signing in to Altium is a browser flow only the human can complete. | `altium_signin` |  | `fusion_signin` |+| `signin` | Report-only alias of altium_signin_status: it does NOT sign anyone in. Signing in to Altium is a browser flow only the human can complete. | `altium_signin` | unsupported | `fusion_signin` | | `signin_status` | Account and Altium 365 workspace connection as Altium's own UI reports it: licence state from the title, and whether the workspace menu reads 'Not Connected'. | `altium_signin_status` | `kicad_license_status` (partial) | `fusion_signin_status` | | `simulate` *proposed* | Run a circuit simulation of the design's schematic and return the signals as data: an operating point, a DC sweep, an AC sweep or a transient, with the nets... | `altium_simulate` | `kicad_simulate` | `fusion_simulate` | | `state` | The whole picture in one call: licence state, windows, dialogs, a screenshot of every main/dialog window, and the agent's logical state (focused document,... | `altium_state` | `kicad_state` | `fusion_state` |
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "eda-bridge-standard",-  "version": "0.26.2",+  "version": "0.26.3",   "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+88−20
@@ -1,12 +1,12 @@ {- "standard": "0.26.2",+ "standard": "0.26.3",  "reference": {   "bridge": "altium",   "version": "0.2.84"  },  "proposed": 60,  "compared": {-  "kicad": "1.0.89",+  "kicad": "1.0.90",   "fusion360": "1.13.26"  },  "tiers": {@@ -61,7 +61,11 @@     "verb": "altium_add_symbol_art",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_add_symbol_art",+    "match": "unsupported",+    "note": "the chip outline is baked into the KiCad symbol itself by adom-symbol: KiCad shows it with no second copy to draw (Altium needs this because its symbol is rebuilt from KiCad's)"+   },    "fusion360": {     "verb": "fusion_add_symbol_art",     "match": "exact",@@ -578,7 +582,10 @@     "verb": "altium_normalize_bodies",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_normalize_bodies",+    "match": "exact"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -663,7 +670,10 @@     "verb": "altium_plate_vias",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_plate_vias",+    "match": "exact"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -1579,7 +1589,10 @@     "verb": "altium_swap_footprint",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_swap_footprint",+    "match": "exact"+   },    "fusion360": {     "verb": "fusion_swap_footprint",     "match": "exact",@@ -1716,7 +1729,11 @@     "verb": "altium_build_symbol_modes",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_build_symbol_modes",+    "match": "unsupported",+    "note": "KiCad symbols have two body styles (standard and De Morgan), not N display modes, and nothing reads Altium's symbol_modes spec; kicad_sym_create builds the standard body, kicad_symbol_mode shows either style"+   },    "fusion360": {     "verb": "fusion_import_part",     "match": "partial",@@ -1731,7 +1748,11 @@     "verb": "altium_cleanup_libs",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_cleanup_libs",+    "match": "unsupported",+    "note": "a new KiCad library starts empty (kicad_sym_create, kicad_fp_create), so there is no factory-default stray to remove"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -2405,7 +2426,10 @@     "verb": "altium_symbol_mode",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_symbol_mode",+    "match": "exact"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -3167,7 +3191,11 @@     "verb": "altium_agent_recover",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_agent_recover",+    "match": "unsupported",+    "note": "KiCad has no resident script agent to manage: the bridge reaches KiCad through kicad-cli, its built-in IPC API and KiCad's own Python per call (kicad_eval), so there is nothing to start, stop, check or recover"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -3182,7 +3210,11 @@     "verb": "altium_agent_start",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_agent_start",+    "match": "unsupported",+    "note": "KiCad has no resident script agent to manage: the bridge reaches KiCad through kicad-cli, its built-in IPC API and KiCad's own Python per call (kicad_eval), so there is nothing to start, stop, check or recover"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -3197,7 +3229,11 @@     "verb": "altium_agent_status",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_agent_status",+    "match": "unsupported",+    "note": "KiCad has no resident script agent to manage: the bridge reaches KiCad through kicad-cli, its built-in IPC API and KiCad's own Python per call (kicad_eval), so there is nothing to start, stop, check or recover"+   },    "fusion360": {     "verb": "fusion_addin_status",     "match": "partial",@@ -3212,7 +3248,11 @@     "verb": "altium_agent_stop",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_agent_stop",+    "match": "unsupported",+    "note": "KiCad has no resident script agent to manage: the bridge reaches KiCad through kicad-cli, its built-in IPC API and KiCad's own Python per call (kicad_eval), so there is nothing to start, stop, check or recover"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -3316,7 +3356,11 @@     "verb": "altium_connect_workspace",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_connect_workspace",+    "match": "unsupported",+    "note": "KiCad has no cloud workspace to connect to"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -3506,7 +3550,11 @@     "verb": "altium_extension_ping",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_extension_ping",+    "match": "unsupported",+    "note": "KiCad needs no extension installed inside it: its IPC API is built in (kicad_readiness reports ipcApi), so there is nothing to install, ping or keep a receipt for"+   },    "fusion360": {     "verb": "fusion_addin_status",     "match": "partial",@@ -3557,7 +3605,11 @@     "verb": "altium_install_extension",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_install_extension",+    "match": "unsupported",+    "note": "KiCad needs no extension installed inside it: its IPC API is built in (kicad_readiness reports ipcApi), so there is nothing to install, ping or keep a receipt for"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -3572,7 +3624,11 @@     "verb": "altium_install_receipt",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_install_receipt",+    "match": "unsupported",+    "note": "KiCad needs no extension installed inside it: its IPC API is built in (kicad_readiness reports ipcApi), so there is nothing to install, ping or keep a receipt for"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -3640,7 +3696,11 @@     "verb": "altium_license",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_license",+    "match": "unsupported",+    "note": "KiCad is GPL-3.0-or-later and has no licence page to drive; kicad_license_status reports that"+   },    "fusion360": {     "verb": "fusion_account",     "match": "partial",@@ -3901,7 +3961,11 @@     "verb": "altium_selftest_script_error",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_selftest_script_error",+    "match": "unsupported",+    "note": "KiCad runs no resident script engine to test: a failing kicad_eval snippet already comes back as eval_failed with its traceback"+   },    "fusion360": {     "verb": "fusion_not_supported",     "match": "unsupported",@@ -4088,7 +4152,11 @@     "verb": "altium_signin",     "match": "exact"    },-   "kicad": null,+   "kicad": {+    "verb": "kicad_signin",+    "match": "unsupported",+    "note": "KiCad has no account to sign in to"+   },    "fusion360": {     "verb": "fusion_signin",     "match": "exact"
verbs/standard.json+10−6
@@ -1,12 +1,12 @@ {- "standard": "0.26.2",+ "standard": "0.26.3",  "reference": {   "bridge": "altium",   "version": "0.2.84"  },  "proposed": 60,  "compared": {-  "kicad": "1.0.89",+  "kicad": "1.0.90",   "fusion360": "1.13.26"  },  "tiers": {@@ -4465,7 +4465,8 @@    "since": "0.25.1",    "agreedBy": [     "standard-lane",-    "altium-lane"+    "altium-lane",+    "fusion-lane"    ]   },   {@@ -4924,7 +4925,8 @@    "proposedBy": "kicad-lane",    "since": "0.25.1",    "agreedBy": [-    "standard-lane"+    "standard-lane",+    "fusion-lane"    ]   },   {@@ -8237,7 +8239,8 @@    "proposedBy": "kicad-lane",    "since": "0.25.1",    "agreedBy": [-    "standard-lane"+    "standard-lane",+    "fusion-lane"    ]   },   {@@ -9091,7 +9094,8 @@    "proposedBy": "kicad-lane",    "since": "0.25.1",    "agreedBy": [-    "standard-lane"+    "standard-lane",+    "fusion-lane"    ]   },   {