← Commit history

0.31.6: coverage reads KiCad bridge 1.0.100

Colby Knox ·591b6b14fa ·8d ago ·parent 645faad
5 files changed +40−30
README.md+3−2
@@ -63,9 +63,9 @@ verb by verb: [docs/coverage.md](docs/coverage.md). | **core** | 99 | 95 | 99 | 96 | | **native** | 55 | 53 | 54 | 52 | | **checks** | 39 | 38 | 39 | 39 |-| **app** | 70 | 66 | 57 | 62 |+| **app** | 70 | 66 | 59 | 62 | | **platform** | 40 | 18 | 0 | 23 |-| standard (all but platform) | 263 | 252 | 249 | 249 |+| standard (all but platform) | 263 | 252 | 251 | 249 | <!-- 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.31.6: coverage reads KiCad bridge 1.0.100 (place_parts, edit_tracks, extensions, preferences, select_items, cancel_run; physical_properties refused with the reason). Version 0.31.5: coverage reads KiCad bridge 1.0.99 (twelve verbs answered under their own names). Version 0.31.4: coverage reads Fusion 360 bridge 1.13.59 (public; answers the 0.31 verbs). Version 0.31.3: the reference is Altium 0.2.89 (import_design and tool_update exact).
docs/coverage.md+10−10
@@ -1,6 +1,6 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.89 (the reference), KiCad bridge 1.0.99, Fusion 360 bridge 1.13.59. 100 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.89 (the reference), KiCad bridge 1.0.100, Fusion 360 bridge 1.13.59. 100 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. @@ -9,9 +9,9 @@ Generated by `tools/generate.py` from `verbs/coverage.json`; do not edit by hand | **core** | 99 | 95 | 99 | 96 | | **native** | 55 | 53 | 54 | 52 | | **checks** | 39 | 38 | 39 | 39 |-| **app** | 70 | 66 | 57 | 62 |+| **app** | 70 | 66 | 59 | 62 | | **platform** | 40 | 18 | 0 | 23 |-| standard (all but platform) | 263 | 252 | 249 | 249 |+| standard (all but platform) | 263 | 252 | 251 | 249 |  ## core @@ -55,7 +55,7 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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_parts` *proposed* | Put footprints from a library onto the current board, each with its position, rotation and side, and read them back. One undo step. |  | `kicad_add_footprint` (partial) | `fusion_place_parts` (partial) |+| `place_parts` *proposed* | Put footprints from a library onto the current board, each with its position, rotation and side, and read them back. One undo step. |  | `kicad_place_parts` | `fusion_place_parts` (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` | `kicad_plate_vias` | `fusion_plate_vias` | | `project_create` *proposed* | Create a new project folder with a project file, an empty schematic and an empty board (2 to 32 copper layers), with a title and text variables. | `altium_project_create` | `kicad_project_create` | `fusion_project_create` (partial) |@@ -136,7 +136,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `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) | | `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... | `altium_edit_pours` | `kicad_edit_pours` | `fusion_edit_pours` (partial) |-| `edit_tracks` *proposed* | Change given tracks by the handle routing_state returns: width, layer and ends. One undo step, read back. |  | `kicad_modify_track` (partial) | `fusion_edit_tracks` (partial) |+| `edit_tracks` *proposed* | Change given tracks by the handle routing_state returns: width, layer and ends. One undo step, read back. |  | `kicad_edit_tracks` | `fusion_edit_tracks` (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... | `altium_export_3d` | `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` | `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` |@@ -159,7 +159,7 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `netlist` | The compiled netlist of a project: every net with its pins (Designator.Pin) across every sheet, the hierarchy resolved; or one net; or compare with the nets... | `altium_netlist` | `kicad_netlist` | `fusion_netlist` | | `panelize` | Step and repeat a board into a manufacturing panel: a new .PcbDoc holding Altium's own embedded board array of the board (rows x cols), with rails, the... | `altium_panelize` | `kicad_panelize` (partial) | `fusion_panelize` | | `pcb_report` | Numbers instead of pixels: for a PcbLib, every footprint's pads, pad bounding box, primitive census and 3D bodies; for a board, outline, components with... | `altium_pcb_report` | `kicad_pcb_report` | `fusion_pcb_report` |-| `physical_properties` *proposed* | Per component: volume, mass, density, surface area and centre of mass, from the tool's own materials. A tool with no materials or part masses answers... |  |  | `fusion_physical_properties` |+| `physical_properties` *proposed* | Per component: volume, mass, density, surface area and centre of mass, from the tool's own materials. A tool with no materials or part masses answers... |  | unsupported | `fusion_physical_properties` | | `pour_state` | Every polygon pour with the copper it actually poured: filled area per pour and per layer, and the pours that poured nothing. | `altium_pour_state` | `kicad_pour_state` | `fusion_pour_state` | | `project_snapshot` *proposed* | A dated copy of the project's documents into <project>/snapshots/<stamp>[-label]/, with PDFs of the schematic and the board made by the tool. | `altium_project_snapshot` | `kicad_project_snapshot` | `fusion_project_snapshot` (partial) | | `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` |@@ -239,7 +239,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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) |-| `cancel_run` *proposed* | Stop the bridge's own long job, between steps, keeping what is done. With nothing to stop it answers cancelRequested:false and a reason. It never claims to... |  |  | `fusion_cancel_run` (partial) |+| `cancel_run` *proposed* | Stop the bridge's own long job, between steps, keeping what is done. With nothing to stop it answers cancelRequested:false and a reason. It never claims to... |  | `kicad_cancel_run` (partial) | `fusion_cancel_run` (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_check_dialogs` | `fusion_check_dialogs` | | `close` | Polite close (releases the licence seat). Frees a script engine parked on a breakpoint first (Altium refuses to close over one). discardChanges:true answers... | `altium_close` | `kicad_close` | `fusion_stop` | | `close_all_documents` *proposed* | Close every open document without a save dialog. Unsaved work is never lost by default: a document with unsaved changes stays open and is listed, unless... | `altium_close_all_documents` | `kicad_close_all_documents` | `fusion_close_all_documents` |@@ -256,7 +256,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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` | unsupported | `fusion_addin_status` (partial) |-| `extensions` *proposed* | The tool's own plugins and add-ons: list what is installed, install one, remove one. Not install_extension, which is the bridge's own helper inside the tool. |  | `kicad_pcm_list / kicad_pcm_install / kicad_pcm_uninstall` (partial) | `fusion_extensions` (partial) |+| `extensions` *proposed* | The tool's own plugins and add-ons: list what is installed, install one, remove one. Not install_extension, which is the bridge's own helper inside the tool. |  | `kicad_extensions` | `fusion_extensions` (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 | unsupported |@@ -271,7 +271,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `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` |-| `preferences` *proposed* | Read the tool's own settings (all, or one by key), or change them with set. Reports per key what was applied. A tool that rewrites its settings on exit... |  |  | `fusion_preferences` |+| `preferences` *proposed* | Read the tool's own settings (all, or one by key), or change them with set. Reports per key what was applied. A tool that rewrites its settings on exit... |  | `kicad_preferences` | `fusion_preferences` | | `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` | | `readiness` | The one-call gate: is Altium installed, running, licensed, and is the resident agent alive? Answers with Altium closed and never touches the script engine. | `altium_readiness` | `kicad_readiness` | `fusion_readiness` |@@ -279,7 +279,7 @@ Driving the application itself (launch, licence, dialogs, windows, views). Each | `run_script` | One shot: run a procedure of YOUR OWN .PrjScr through Altium's -R command line. Only for when the agent is NOT resident. | `altium_run_script` | `kicad_run_script` | `fusion_run_script` | | `save` | Save the focused document, or the document at filePath (opened first if need be, saved by its path, never whatever happens to have focus). | `altium_save` | `kicad_save` | `fusion_save` | | `sch_zoom` | Find parts on a sheet: select them (everything else deselected), frame the view on them and return a proof frame. The schematic half of cross-probing (the... | `altium_sch_zoom` | `kicad_sch_zoom` (partial) | `fusion_sch_zoom` |-| `select_items` *proposed* | Select parts by designator on the board or the sheet, or clear the selection. A bridge that cannot select on one of them refuses it by name. verified says... |  | `kicad_select_items` | `fusion_select_items` (partial) |+| `select_items` *proposed* | Select parts by designator on the board or the sheet, or clear the selection. A bridge that cannot select on one of them refuses it by name. verified says... |  | `kicad_select_items` (partial) | `fusion_select_items` (partial) | | `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 | unsupported |
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "eda-bridge-standard",-  "version": "0.31.5",+  "version": "0.31.6",   "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−15
@@ -1,12 +1,12 @@ {- "standard": "0.31.5",+ "standard": "0.31.6",  "reference": {   "bridge": "altium",   "version": "0.2.89"  },  "proposed": 100,  "compared": {-  "kicad": "1.0.99",+  "kicad": "1.0.100",   "fusion360": "1.13.59"  },  "tiers": {@@ -649,9 +649,8 @@    "source": "proposed",    "altium": null,    "kicad": {-    "verb": "kicad_add_footprint",-    "match": "partial",-    "note": "one footprint or one row per call, not a parts list; the verb under the standard's name is coming"+    "verb": "kicad_place_parts",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_place_parts",@@ -1931,9 +1930,8 @@    "source": "proposed",    "altium": null,    "kicad": {-    "verb": "kicad_modify_track",-    "match": "partial",-    "note": "the standard's tracks list is KiCad's changes list; the verb under the standard's name is coming"+    "verb": "kicad_edit_tracks",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_edit_tracks",@@ -2328,7 +2326,11 @@    "tier": "native",    "source": "proposed",    "altium": null,-   "kicad": null,+   "kicad": {+    "verb": "kicad_physical_properties",+    "match": "unsupported",+    "note": "KiCad has no materials or masses on a part"+   },    "fusion360": {     "verb": "fusion_physical_properties",     "match": "exact"@@ -3471,7 +3473,11 @@    "tier": "app",    "source": "proposed",    "altium": null,-   "kicad": null,+   "kicad": {+    "verb": "kicad_cancel_run",+    "match": "partial",+    "note": "stops kicad_autoroute's Freerouting job, the only long job that can stop; a real stop isn't tested yet, because Freerouting isn't on the test laptop"+   },    "fusion360": {     "verb": "fusion_cancel_run",     "match": "partial",@@ -3764,9 +3770,8 @@    "source": "proposed",    "altium": null,    "kicad": {-    "verb": "kicad_pcm_list / kicad_pcm_install / kicad_pcm_uninstall",-    "match": "partial",-    "note": "three verbs for KiCad's Plugin and Content Manager; one verb under the standard's name is coming"+    "verb": "kicad_extensions",+    "match": "exact"    },    "fusion360": {     "verb": "fusion_extensions",@@ -4029,7 +4034,10 @@    "tier": "app",    "source": "proposed",    "altium": null,-   "kicad": null,+   "kicad": {+    "verb": "kicad_preferences",+    "match": "exact"+   },    "fusion360": {     "verb": "fusion_preferences",     "match": "exact",@@ -4165,7 +4173,8 @@    "altium": null,    "kicad": {     "verb": "kicad_select_items",-    "match": "exact"+    "match": "partial",+    "note": "on the board only; where:\"sheet\" is refused, because KiCad's Schematic Editor has no API for its selection"    },    "fusion360": {     "verb": "fusion_select_items",
verbs/standard.json+2−2
@@ -1,12 +1,12 @@ {- "standard": "0.31.5",+ "standard": "0.31.6",  "reference": {   "bridge": "altium",   "version": "0.2.89"  },  "proposed": 100,  "compared": {-  "kicad": "1.0.99",+  "kicad": "1.0.100",   "fusion360": "1.13.59"  },  "tiers": {