skill
EDA Bridge Standard: one way for an AI to drive every PCB tool
Public Made by Adomby adom
The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.
← Commit history
KiCad bridge 1.0.59 reference: 63 of 182 standard verbs (was 55); board model conformance (#1)
5 files changed
+189−27
README.md+2−2@@ -42,12 +42,12 @@ verb by verb: [docs/coverage.md](docs/coverage.md). <!-- coverage:start (tools/generate.py writes this) --> | Tier | Verbs | Altium | KiCad | Fusion 360 | |---|---|---|---|---|-| **core** | 60 | 60 | 12 | 20 |+| **core** | 60 | 60 | 20 | 20 | | **native** | 34 | 34 | 18 | 14 | | **checks** | 32 | 32 | 4 | 2 | | **app** | 56 | 56 | 21 | 20 | | **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 182 | 182 | 55 | 56 |+| standard (all but platform) | 182 | 182 | 63 | 56 | <!-- coverage:end --> The **checks** tier is where the other bridges are furthest behind, and it is the cheapest to close: those verbs are
docs/coverage.md+13−13@@ -1,17 +1,17 @@ # Coverage: every standard verb on each bridge -Reference: Altium bridge 0.2.75. Compared: KiCad bridge 1.0.58, Fusion 360 bridge 1.12.0.+Reference: Altium bridge 0.2.75. Compared: KiCad bridge 1.0.59, Fusion 360 bridge 1.12.0. `exact` is the same job under the same or an equivalent name; `partial` does part of it or does it differently; blank is missing. Generated by `tools/generate.py` from `verbs/coverage.json`; do not edit by hand. | Tier | Verbs | Altium | KiCad | Fusion 360 | |---|---|---|---|---|-| **core** | 60 | 60 | 12 | 20 |+| **core** | 60 | 60 | 20 | 20 | | **native** | 34 | 34 | 18 | 14 | | **checks** | 32 | 32 | 4 | 2 | | **app** | 56 | 56 | 21 | 20 | | **platform** | 19 | 19 | 0 | 0 |-| standard (all but platform) | 182 | 182 | 55 | 56 |+| standard (all but platform) | 182 | 182 | 63 | 56 | ## core @@ -25,23 +25,23 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `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... | | | | `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... | | | | `board_shape` | Redefine the CURRENT board's outline as a wMm x hMm rectangle at (x0Mm, y0Mm) by rewriting the board outline's segments. | | |-| `board_summary` | One-screen summary of the current board, shaped from one read_board round trip: component counts by side, nets, copper layers actually in use, rule counts. | | `fusion_board_summary` |+| `board_summary` | One-screen summary of the current board, shaped from one read_board round trip: component counts by side, nets, copper layers actually in use, rule counts. | `kicad_board_summary` | `fusion_board_summary` | | `clone_symbol` | Copy a symbol inside the current SchLib under a new name, all display modes included. | | |-| `component_data` | Placement data for one board component, or for all of them: footprint pattern, comment, layer/side, position, rotation, size, pad count and the nets on its... | | `fusion_component_data` |-| `component_pins` | Every pad of one board component with its net, position, layer, size and hole. | | `fusion_component_pins` |-| `copper_layers` | Every copper layer Altium can address on the current board (top, mid 1-30, planes 1-16, bottom) with names and visibility. | | `fusion_copper_layers` |+| `component_data` | Placement data for one board component, or for all of them: footprint pattern, comment, layer/side, position, rotation, size, pad count and the nets on its... | `kicad_component_data` | `fusion_component_data` |+| `component_pins` | Every pad of one board component with its net, position, layer, size and hole. | `kicad_component_pins` | `fusion_component_pins` |+| `copper_layers` | Every copper layer Altium can address on the current board (top, mid 1-30, planes 1-16, bottom) with names and visibility. | `kicad_copper_layers` | `fusion_copper_layers` | | `copy_footprint` | Duplicate a footprint inside the current PcbLib under a new name (every primitive replicated). | | | | `create_footprint` | Create one footprint from a pad list in a PcbLib (the library is created and saved if the path does not exist) and return a proof frame. | | | | `create_symbol` | Create one rectangular symbol from a pin list in a SchLib (the library is created and saved if the path does not exist) and return a proof frame. | | | | `doc_params` | Read or set a sheet's document parameters: the title block (Title, DocumentNumber, Revision, DrawnBy, Author, CompanyName, ...). | | | | `find_symbol` | Find symbols (or footprints with kind:'footprint') by part of their name across libraries: the given ones, or every installed .SchLib/.PcbLib. | | | | `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... | | |-| `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... | | `fusion_layer_stack` |+| `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... | `kicad_layer_stack` | `fusion_layer_stack` | | `layers` | The current board's layer set with ids, names, kind and whether each is displayed. | | `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. | | `fusion_layers_in_use` |-| `list_designators` | Every component designator on the current board. | | `fusion_list_designators` |+| `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. | `kicad_layers_in_use` | `fusion_layers_in_use` |+| `list_designators` | Every component designator on the current board. | `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. | `kicad_list_footprints / kicad_list_symbols` (partial) | |-| `list_nets` | Every net on the current board with its pad count. | | `fusion_list_nets` |+| `list_nets` | Every net on the current board with its pad count. | `kicad_list_nets` | `fusion_list_nets` | | `move_parts` | Move and rotate placed components; each part is read back to 0.001 mm and the exact rotation. One undo step. | `kicad_move_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)... | `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... | | |@@ -104,10 +104,10 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | `install_library_bundle` | One-click install of a wiki library bundle (zip of .SchLib/.PcbLib): unpack, register, open the library, prove it with a frame. | `kicad_install_library_bundle` | `fusion_install_library_bundle` | | `list_installed_libraries` | Every library in Altium's Installed Libraries list (read-only). | | | | `net_classes` | Net classes on the current board: list them with their nets, or make one (replacing a class of that name) with an optional width and clearance rule scoped... | | `fusion_net_classes` |-| `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... | `kicad_extract_netlist` | `fusion_netlist` |+| `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... | `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... | | | | `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... | `kicad_errors` (partial) | |-| `pour_state` | Every polygon pour with the copper it actually poured: filled area per pour and per layer, and the pours that poured nothing. | `kicad_zone_state` | `fusion_pour_state` |+| `pour_state` | Every polygon pour with the copper it actually poured: filled area per pour and per layer, and the pours that poured nothing. | `kicad_pour_state` | `fusion_pour_state` | | `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. | `kicad_remove_zone` | `fusion_remove_pours` | | `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... | | | | `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. | | `fusion_repour` |
reference/kicad-1.0.59.jsonadded+138@@ -0,0 +1,138 @@+{+ "bridge": "kicad",+ "version": "1.0.59",+ "verbs": [+ "kicad_3d_view",+ "kicad_3d_viewer_settings",+ "kicad_add_track",+ "kicad_add_via",+ "kicad_add_zone",+ "kicad_adom_library_heal",+ "kicad_adom_library_status",+ "kicad_analyze_connections",+ "kicad_apply_zone_plan",+ "kicad_autoroute",+ "kicad_board_pads",+ "kicad_board_summary",+ "kicad_bodies",+ "kicad_bridge_call",+ "kicad_bridge_status",+ "kicad_check_for_updates",+ "kicad_click",+ "kicad_close",+ "kicad_close_3d_viewer",+ "kicad_close_footprint_editor",+ "kicad_close_symbol_editor",+ "kicad_component_data",+ "kicad_component_pins",+ "kicad_copper_layers",+ "kicad_demo",+ "kicad_describe",+ "kicad_diagnostics",+ "kicad_dismiss_dialogs",+ "kicad_enable_software_opengl",+ "kicad_errors",+ "kicad_export_bom_csv",+ "kicad_export_gerber",+ "kicad_export_molecule",+ "kicad_export_part",+ "kicad_export_pdf",+ "kicad_export_pos",+ "kicad_export_step",+ "kicad_export_svg",+ "kicad_extract_netlist",+ "kicad_find_connections",+ "kicad_fix_keyboard",+ "kicad_format_upgrade",+ "kicad_freerouting",+ "kicad_get_settings",+ "kicad_install_footprint",+ "kicad_install_library",+ "kicad_install_library_bundle",+ "kicad_install_plugin",+ "kicad_install_symbol",+ "kicad_ipc_api",+ "kicad_launch",+ "kicad_layer_stack",+ "kicad_layers_in_use",+ "kicad_lint_board",+ "kicad_lint_library",+ "kicad_lint_schematic",+ "kicad_list_design_rules",+ "kicad_list_designators",+ "kicad_list_footprints",+ "kicad_list_nets",+ "kicad_list_symbols",+ "kicad_list_versions",+ "kicad_log_tail",+ "kicad_make_part_project",+ "kicad_menu_items",+ "kicad_model_check",+ "kicad_move_footprint",+ "kicad_netlist",+ "kicad_open_3d_viewer",+ "kicad_open_board",+ "kicad_open_editors",+ "kicad_open_footprint_editor",+ "kicad_open_schematic",+ "kicad_open_symbol_editor",+ "kicad_pcm_add_repository",+ "kicad_pcm_install",+ "kicad_pcm_list",+ "kicad_pcm_remove_repository",+ "kicad_pcm_uninstall",+ "kicad_place_footprint",+ "kicad_placement_state",+ "kicad_placement_validate",+ "kicad_plugin_diagnose",+ "kicad_pour_state",+ "kicad_prewarm",+ "kicad_progress",+ "kicad_readiness",+ "kicad_refresh_board_views",+ "kicad_remove_route",+ "kicad_remove_zone",+ "kicad_render_board",+ "kicad_rescan_libraries",+ "kicad_route",+ "kicad_route_net",+ "kicad_routing_state",+ "kicad_routing_validate",+ "kicad_run_drc",+ "kicad_run_erc",+ "kicad_sch_delete",+ "kicad_sch_label",+ "kicad_sch_move",+ "kicad_sch_place_symbol",+ "kicad_sch_set_property",+ "kicad_sch_wire",+ "kicad_screenshot_all",+ "kicad_select_clear",+ "kicad_select_net",+ "kicad_send_key",+ "kicad_set_design_rules",+ "kicad_set_settings",+ "kicad_show_2d_board",+ "kicad_show_3d_board",+ "kicad_show_3d_chip",+ "kicad_show_footprint",+ "kicad_show_library",+ "kicad_show_project",+ "kicad_show_schematic",+ "kicad_show_symbol",+ "kicad_silk_fields_batch",+ "kicad_silk_graphics_batch",+ "kicad_silk_text_batch",+ "kicad_state",+ "kicad_status",+ "kicad_taskbar_repair",+ "kicad_text_bounds",+ "kicad_trace_net",+ "kicad_uninstall",+ "kicad_uninstall_library",+ "kicad_upgrade",+ "kicad_verb_times",+ "kicad_window_info",+ "kicad_zone_state"+ ]+}
verbs/coverage.json+35−11@@ -4,7 +4,7 @@ "version": "0.2.75" }, "compared": {- "kicad": "1.0.58",+ "kicad": "1.0.59", "fusion360": "1.12.0" }, "tiers": {@@ -61,7 +61,10 @@ "name": "board_summary", "tier": "core", "altium": "altium_board_summary",- "kicad": null,+ "kicad": {+ "verb": "kicad_board_summary",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_board_summary", "match": "exact"@@ -78,7 +81,10 @@ "name": "component_data", "tier": "core", "altium": "altium_component_data",- "kicad": null,+ "kicad": {+ "verb": "kicad_component_data",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_component_data", "match": "exact"@@ -88,7 +94,10 @@ "name": "component_pins", "tier": "core", "altium": "altium_component_pins",- "kicad": null,+ "kicad": {+ "verb": "kicad_component_pins",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_component_pins", "match": "exact"@@ -98,7 +107,10 @@ "name": "copper_layers", "tier": "core", "altium": "altium_copper_layers",- "kicad": null,+ "kicad": {+ "verb": "kicad_copper_layers",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_copper_layers", "match": "exact"@@ -150,7 +162,10 @@ "name": "layer_stack", "tier": "core", "altium": "altium_layer_stack",- "kicad": null,+ "kicad": {+ "verb": "kicad_layer_stack",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_layer_stack", "match": "exact"@@ -170,7 +185,10 @@ "name": "layers_in_use", "tier": "core", "altium": "altium_layers_in_use",- "kicad": null,+ "kicad": {+ "verb": "kicad_layers_in_use",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_layers_in_use", "match": "exact"@@ -180,7 +198,10 @@ "name": "list_designators", "tier": "core", "altium": "altium_list_designators",- "kicad": null,+ "kicad": {+ "verb": "kicad_list_designators",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_list_designators", "match": "exact"@@ -200,7 +221,10 @@ "name": "list_nets", "tier": "core", "altium": "altium_list_nets",- "kicad": null,+ "kicad": {+ "verb": "kicad_list_nets",+ "match": "exact"+ }, "fusion360": { "verb": "fusion_list_nets", "match": "exact"@@ -710,7 +734,7 @@ "tier": "native", "altium": "altium_netlist", "kicad": {- "verb": "kicad_extract_netlist",+ "verb": "kicad_netlist", "match": "exact" }, "fusion360": {@@ -740,7 +764,7 @@ "tier": "native", "altium": "altium_pour_state", "kicad": {- "verb": "kicad_zone_state",+ "verb": "kicad_pour_state", "match": "exact" }, "fusion360": {
verbs/standard.json+1−1@@ -4,7 +4,7 @@ "version": "0.2.75" }, "compared": {- "kicad": "1.0.58",+ "kicad": "1.0.59", "fusion360": "1.12.0" }, "tiers": {