← Commit history

standard 0.30.4: coverage reads KiCad 1.0.95

Colby Knox ·245144a149 ·11d ago ·parent 904fe6c
5 files changed +40−41
README.md+1
@@ -158,6 +158,7 @@ Decisions so far (proposals from the KiCad and Fusion bridges, 2026-10-27; issue  ## Status +Version 0.30.4: coverage reads KiCad bridge 1.0.95 (public): eleven partials now exact, cross_check from the engine. Version 0.30.3: coverage reads Fusion 360 bridge 1.13.38 (public; export_manufacturing and pcb_report exact). Version 0.30.2: coverage reads KiCad bridge 1.0.94 (public): export_3d, import_design, edit_pours, tool_update, and the schematic verbs in the standard's own arguments. Version 0.30.1: coverage reads Fusion 360 bridge 1.13.37 (engine 0.24.0: bom from the engine; render_board and render_board_layers exact).
docs/coverage.md+12−12
@@ -1,6 +1,6 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.87 (the reference), KiCad bridge 1.0.94, Fusion 360 bridge 1.13.38. 67 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.87 (the reference), KiCad bridge 1.0.95, Fusion 360 bridge 1.13.38. 67 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. @@ -40,14 +40,14 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `edit_footprint` *proposed* | Edit a library footprint in place: change, delete, add or renumber pads; add, replace or delete graphics on a layer; set its description, tags and... | `altium_edit_footprint` | `kicad_fp_edit` | `fusion_edit_footprint` (partial) | | `edit_parts` *proposed* | Edit placed parts: value, designator, any field (add, change, remove), do-not-populate, exclusion from the BOM or position files, mounting type and the... | `altium_edit_parts` | `kicad_edit_parts` | `fusion_edit_parts` (partial) | | `find_symbol` | Find symbols (or footprints with kind:'footprint') by part of their name across libraries: the given ones, or every installed .SchLib/.PcbLib. | `altium_find_symbol` | `kicad_find_symbol` | `fusion_find_symbol` (partial) |-| `footprint_primitives` | Geometry dump of one PLACED component: its tracks, arcs, pads (with solder and paste mask expansion in um) and texts in mils with layer ids; other primitive... | `altium_footprint_primitives` | `kicad_footprint_graphics` (partial) | `fusion_footprint_primitives` |+| `footprint_primitives` | Geometry dump of one PLACED component: its tracks, arcs, pads (with solder and paste mask expansion in um) and texts in mils with layer ids; other primitive... | `altium_footprint_primitives` | `kicad_footprint_primitives` | `fusion_footprint_primitives` | | `generate_body` *proposed* | Make a part's 3D body from its package family and its datasheet dimensions (chip, SOIC, QFN, QFP, BGA, SOT-23, DFN, MELF, electrolytic can, crystal, pin... | `altium_generate_body` | `kicad_generate_body` | `fusion_generate_body` | | `import_svg` *proposed* | Import SVG artwork (a logo, a label) as filled polygons on a silkscreen, copper, mask or user layer, at a position and size; curves flattened, holes kept.... | `altium_import_svg` | `kicad_import_svg` | `fusion_import_svg` (partial) | | `layer_stack` | The CURRENT board's stack-up: copper layers in order with copper thickness and the dielectric under each (height, constant, material), and the total... | `altium_layer_stack` | `kicad_layer_stack` | `fusion_layer_stack` | | `layers` | The current board's layer set with ids, names, kind and whether each is displayed. | `altium_layers` | `kicad_layers` | `fusion_layers` | | `layers_in_use` | Which layers of the current board actually carry primitives: copper layers with copper (densest first) and every layer with anything on it. | `altium_layers_in_use` | `kicad_layers_in_use` | `fusion_layers_in_use` | | `list_designators` | Every component designator on the current board. | `altium_list_designators` | `kicad_list_designators` | `fusion_list_designators` |-| `list_library` | Names of every component in a .SchLib or every footprint in a .PcbLib (kind taken from the extension). Opens the library; no screenshot. | `altium_list_library` | `kicad_list_footprints / kicad_list_symbols` (partial) | `fusion_list_library` |+| `list_library` | Names of every component in a .SchLib or every footprint in a .PcbLib (kind taken from the extension). Opens the library; no screenshot. | `altium_list_library` | `kicad_list_library` | `fusion_list_library` | | `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` |@@ -75,7 +75,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `ripup_nets` | Delete every free track, arc and via on each named net. One undo step. | `altium_ripup_nets` | `kicad_ripup_nets` | `fusion_ripup_nets` | | `route_net` | Route one net as tracks, segment by segment; a waypoint on another layer drops a via there. One undo step, read back. | `altium_route_net` | `kicad_route_net` | `fusion_route_net` | | `routing_state` | The WHOLE current board as data, in mm: tracks, arcs, vias, pads (with owner and net), components (ref, x, y, rotation, side), polygon pours, the outline,... | `altium_routing_state` | `kicad_routing_state` | `fusion_routing_state` |-| `rules_by_kind` | The current board's ENABLED design rules grouped by rule kind (Clearance, Width, RoutingVias, ...), each group sorted by priority. Shaped from one... | `altium_rules_by_kind` | `kicad_board_rules` (partial) | `fusion_rules_by_kind` |+| `rules_by_kind` | The current board's ENABLED design rules grouped by rule kind (Clearance, Width, RoutingVias, ...), each group sorted by priority. Shaped from one... | `altium_rules_by_kind` | `kicad_rules_by_kind` | `fusion_rules_by_kind` | | `sch_batch` *proposed* | Apply a list of schematic edits to one sheet in one read and one write, all or nothing: each op is a standard schematic verb with its own arguments, seeing... | `altium_sch_batch` | `kicad_sch_batch` | `fusion_sch_batch` | | `sch_bus` *proposed* | Draw a bus as a polyline (one bus segment per pair of points), optionally with a bus label such as D[0..7] or a group {SDA SCL} at its first point. One undo... | `altium_sch_bus` | `kicad_sch_bus` | `fusion_sch_bus` | | `sch_bus_entry` *proposed* | Add 45-degree bus entries: the short diagonal that joins a member wire's end to a bus. One undo step. | `altium_sch_bus_entry` | `kicad_sch_bus_entry` | `fusion_sch_bus_entry` |@@ -106,7 +106,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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_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_set_track_width` | `fusion_set_track_width` | | `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` |@@ -133,7 +133,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `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) | `fusion_diff_pairs` (partial) | | `edit_pours` *proposed* | Change existing pours in place without redrawing them: clearance, minimum width, thermal relief (on/off, spoke width, gap), priority or rank, the net, and... |  | `kicad_edit_pours` | `fusion_edit_pours` (partial) | | `export_3d` *proposed* | Export the board's 3D model in a mesh or CAD format other than STEP (export_step has STEP), through the tool's own exporter, with an optional web-optimized... |  | `kicad_export_3d` | `fusion_export_3d` |-| `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` |+| `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` | `fusion_export_bom` | | `export_dxf` *proposed* | Export chosen board layers to DXF, one file per layer (the outline, panel drawings, stencils, enclosure work). | `altium_export_dxf` | `kicad_export_dxf` | `fusion_export_dxf` | | `export_gencad` *proposed* | Export the board as GenCAD 1.4, the input of test-fixture tools and some assembly houses' CAM. | `altium_export_gencad` | `kicad_export_gencad` | `fusion_export_gencad` | | `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_gerber` |@@ -159,11 +159,11 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `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` *proposed* | A rendered 3D picture (PNG or JPG) of a board from one side, made by the tool's own renderer with no window: optionally framed on parts, turned for an... | `altium_render_board` | `kicad_render_board` | `fusion_render_board_3d` | | `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_render_board_layers` |+| `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_render_board_layers` | `fusion_render_board_layers` | | `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_render_schematic` | `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` | `fusion_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` |-| `routing_drc` | Design-rule violations on the current board WITH locations, plus the unrouted (ratsnest) count, as one clean/not-clean answer. | `altium_routing_drc` | `kicad_routing_validate` (partial) | `fusion_routing_drc` |+| `routing_drc` | Design-rule violations on the current board WITH locations, plus the unrouted (ratsnest) count, as one clean/not-clean answer. | `altium_routing_drc` | `kicad_routing_drc` | `fusion_routing_drc` | | `run_drc` | Run the design rule check on a board and read the violation markers back. PCB:DesignRuleCheck opens a MODAL; the bridge clicks 'Run Design Rule Check'... | `altium_run_drc` | `kicad_run_drc` | `fusion_run_drc` | | `run_erc` | Electrical rules check. Same handler as altium_compile: in Altium, compiling the project IS the ERC. | `altium_run_erc` | `kicad_run_erc` | `fusion_run_erc` | | `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` | `fusion_sch_update_from_library` (partial) |@@ -192,7 +192,7 @@ Engineering computed from the board model, not by the tool: one shared engine, s | `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` | | `copper_balance` | How much of each copper layer is copper (tracks, pads, vias and what Altium actually poured, inside the outline; a plane counts full), and how far apart... | `altium_copper_balance` | `kicad_copper_balance` | `fusion_copper_balance` |-| `cross_check` | Compare one schematic sheet's designators with a board's. Altium holds ONE current document, so the verb activates the board, reads it, then activates the... | `altium_cross_check` | `kicad_analyze_connections` (partial) | `fusion_cross_check` |+| `cross_check` | Compare one schematic sheet's designators with a board's. Altium holds ONE current document, so the verb activates the board, reads it, then activates the... | `altium_cross_check` | `kicad_cross_check` | `fusion_cross_check` | | `current_capacity` | Will this trace carry the current? For each power net and its current: the narrowest track on every layer it is routed on against the width IPC-2221 needs... | `altium_current_capacity` | `kicad_current_capacity` | `fusion_current_capacity` | | `estimate_cost` *proposed* | The board's numbers a fab quote needs (size, layers, thickness, smallest track, gap and drill, holes, SMD and through-hole parts and joints, unique parts)... | `altium_estimate_cost` | `kicad_estimate_cost` | `fusion_estimate_cost` | | `fab_check` | Before ordering: the board's fab-relevant minimums measured from the live board (narrowest track, smallest via drill, diameter and annular ring, smallest... | `altium_fab_check` | `kicad_fab_check` | `fusion_fab_check` |@@ -226,7 +226,7 @@ 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` |+| `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_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` | 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) |@@ -259,8 +259,8 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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` | | `log_tail` *proposed* | What the tool said about itself since an offset: its own log lines and alerts (warnings and errors), so a verb that looks successful while the tool... | `altium_log_tail` | `kicad_log_tail` | `fusion_log_tail` |-| `open_document` | Open a document or project by path through the agent and show it without focusing it. An already-open document is activated, not reloaded. | `altium_open_document` | `kicad_open_board / kicad_open_schematic` (partial) | `fusion_open_document` |-| `open_project` | Open a project (.PrjPcb / .PrjScr / .PrjMbd / .PrjHar / .LibPkg) by path. Same handler as altium_open_document. | `altium_open_project` | `kicad_open_board / kicad_open_schematic` (partial) | `fusion_open_cloud_file` (partial) |+| `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_document` | `fusion_open_document` |+| `open_project` | Open a project (.PrjPcb / .PrjScr / .PrjMbd / .PrjHar / .LibPkg) by path. Same handler as altium_open_document. | `altium_open_project` | `kicad_open_project` | `fusion_open_cloud_file` (partial) | | `panel` | Activate a docked panel TAB (SCH Library, PCB Library, Components, Projects, Properties) in the BACKGROUND - the 'ganged-up view' needs the right panels in... | `altium_panel` | `kicad_send_key` (partial) | `fusion_panel` | | `prewarm` *proposed* | Get this machine ready for a fast first call: detect the tool, seed its first-run settings, dismiss first-run wizards and repair what the first real call... | `altium_prewarm` | `kicad_prewarm` | `fusion_prewarm` | | `progress` | The bridge's timing book: phases in flight right now (percent/ETA blocks ab paints on the taskbar), measured phase history and per-verb run statistics. | `altium_progress` | `kicad_progress` | `fusion_progress` |
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "eda-bridge-standard",-  "version": "0.30.3",+  "version": "0.30.4",   "type": "skill",   "title": "EDA Bridge Standard: one way for an AI to drive every PCB tool",   "description": "The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.",
verbs/coverage.json+24−26
@@ -1,12 +1,12 @@ {- "standard": "0.30.3",+ "standard": "0.30.4",  "reference": {   "bridge": "altium",   "version": "0.2.87"  },  "proposed": 67,  "compared": {-  "kicad": "1.0.94",+  "kicad": "1.0.95",   "fusion360": "1.13.38"  },  "tiers": {@@ -393,8 +393,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_footprint_graphics",-    "match": "partial"+    "verb": "kicad_footprint_primitives",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_footprint_primitives",@@ -513,8 +513,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_list_footprints / kicad_list_symbols",-    "match": "partial"+    "verb": "kicad_list_library",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_list_library",@@ -997,8 +997,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_board_rules",-    "match": "partial"+    "verb": "kicad_rules_by_kind",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_rules_by_kind",@@ -1537,8 +1537,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_modify_track",-    "match": "partial"+    "verb": "kicad_set_track_width",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_set_track_width",@@ -1884,8 +1884,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_export_bom_csv",-    "match": "partial"+    "verb": "kicad_export_bom",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_export_bom",@@ -2334,8 +2334,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_export_svg",-    "match": "partial"+    "verb": "kicad_render_board_layers",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_render_board_layers",@@ -2402,8 +2402,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_routing_validate",-    "match": "partial"+    "verb": "kicad_routing_drc",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_routing_drc",@@ -2789,8 +2789,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_analyze_connections",-    "match": "partial"+    "verb": "kicad_cross_check",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_cross_check",@@ -3253,9 +3253,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_open_board / kicad_open_schematic",-    "match": "partial",-    "note": "KiCad's verbs take the file's path, so there is no current document to switch; kicad_open_board {foreground: false} makes a board the one the PCB editor's API serves, kicad_open_schematic opens a sheet"+    "verb": "kicad_activate_document",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_activate_document",@@ -3847,8 +3846,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_open_board / kicad_open_schematic",-    "match": "partial"+    "verb": "kicad_open_document",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_open_document",@@ -3864,9 +3863,8 @@     "match": "exact"    },    "kicad": {-    "verb": "kicad_open_board / kicad_open_schematic",-    "match": "partial",-    "note": "opens the project's board or schematic in its editor"+    "verb": "kicad_open_project",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_open_cloud_file",
verbs/standard.json+2−2
@@ -1,12 +1,12 @@ {- "standard": "0.30.3",+ "standard": "0.30.4",  "reference": {   "bridge": "altium",   "version": "0.2.87"  },  "proposed": 67,  "compared": {-  "kicad": "1.0.94",+  "kicad": "1.0.95",   "fusion360": "1.13.38"  },  "tiers": {