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
standard 0.26.1: two duplicate #29 verbs withdrawn
5 files changed
+17−135
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** | 95 | 94 | 90 | 91 |-| **native** | 50 | 47 | 47 | 42 |+| **core** | 94 | 94 | 90 | 91 |+| **native** | 49 | 47 | 46 | 42 | | **checks** | 38 | 38 | 38 | 38 | | **app** | 64 | 62 | 53 | 55 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 247 | 241 | 228 | 226 |+| standard (all but platform) | 245 | 241 | 227 | 226 | <!-- 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.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). Version 0.25.1: regenerated on kicad-lane's latest #29 equivalents (panel, activate_document). Version 0.25.0: the reference is Altium bridge 0.2.84, which brings two verbs into the standard: `update_footprints_from_library` (core, #27) and `lint_library` (checks, #28). The standard is 241 verbs.
docs/coverage.md+4−6@@ -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. 62 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+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*. `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** | 95 | 94 | 90 | 91 |-| **native** | 50 | 47 | 47 | 42 |+| **core** | 94 | 94 | 90 | 91 |+| **native** | 49 | 47 | 46 | 42 | | **checks** | 38 | 38 | 38 | 38 | | **app** | 64 | 62 | 53 | 55 | | **platform** | 18 | 18 | 0 | 1 |-| standard (all but platform) | 247 | 241 | 228 | 226 |+| standard (all but platform) | 245 | 241 | 227 | 226 | ## core @@ -39,7 +39,6 @@ Read and edit the design. Every bridge provides these: they are how an AI sees a | `doc_params` | Read or set a sheet's document parameters: the title block (Title, DocumentNumber, Revision, DrawnBy, Author, CompanyName, ...). | `altium_doc_params` | `kicad_doc_params` (partial) | `fusion_doc_params` (partial) | | `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) |-| `edit_placed_footprint` *proposed* | Edit parts placed on a board: value, reference, any field (add, change, remove), DNP, exclude from BOM or position files, the mounting type, and the lock.... | | | | | `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` | | `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` |@@ -122,7 +121,6 @@ Wraps the EDA tool's own feature (its DRC, ERC, Gerbers, pours, Update PCB). Eve | Verb | What it does | Altium | KiCad | Fusion 360 | |---|---|---|---|---| | `add_rule` | Add one SCOPED design rule that set_design_rules' board-wide values cannot express: a net's or class's clearance or width, a length limit, a matched-length... | `altium_add_rule` | `kicad_add_rule` | `fusion_add_rule` |-| `align_footprints` *proposed* | Align placed parts on a common left, right, top, bottom or centre line, or distribute them evenly, by courtyard box or anchor, through the bridge's checked... | | `kicad_align_footprints` | | | `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` |
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "eda-bridge-standard",- "version": "0.26.0",+ "version": "0.26.1", "type": "skill", "title": "EDA Bridge Standard: one way for an AI to drive every PCB tool", "description": "The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.",
verbs/coverage.json+2−21@@ -1,10 +1,10 @@ {- "standard": "0.26.0",+ "standard": "0.26.1", "reference": { "bridge": "altium", "version": "0.2.84" },- "proposed": 62,+ "proposed": 60, "compared": { "kicad": "1.0.89", "fusion360": "1.13.26"@@ -364,14 +364,6 @@ "note": "value, designator, fields and lock; dnp, excludeFromBom, excludeFromPos and mount refused (Fusion keeps them in assembly variants)" } },- {- "name": "edit_placed_footprint",- "tier": "core",- "source": "proposed",- "altium": null,- "kicad": null,- "fusion360": null- }, { "name": "find_symbol", "tier": "core",@@ -1664,17 +1656,6 @@ "match": "exact" } },- {- "name": "align_footprints",- "tier": "native",- "source": "proposed",- "altium": null,- "kicad": {- "verb": "kicad_align_footprints",- "match": "exact"- },- "fusion360": null- }, { "name": "annotate", "tier": "native",
verbs/standard.json+6−104@@ -1,10 +1,10 @@ {- "standard": "0.26.0",+ "standard": "0.26.1", "reference": { "bridge": "altium", "version": "0.2.84" },- "proposed": 62,+ "proposed": 60, "compared": { "kicad": "1.0.89", "fusion360": "1.13.26"@@ -805,57 +805,6 @@ "altium-lane" ] },- {- "name": "edit_placed_footprint",- "tier": "core",- "source": "proposed",- "summary": "Edit parts placed on a board: value, reference, any field (add, change, remove), DNP, exclude from BOM or position files, the mounting type, and the lock. (edit_footprint edits a library footprint; this edits the board's copies.)",- "input": {- "filePath": "the board (required)",- "refs": "[ref] or ref (required)",- "value": "string",- "newReference": "string",- "fields": "{name: value | null to remove}",- "dnp": "bool",- "excludeFromBom": "bool",- "excludeFromPosFiles": "bool",- "attributes": "{type: smd | through_hole | unspecified, ...}",- "locked": "bool",- "expectedRevision": "string",- "dryRun": "bool"- },- "output": {- "edited": "[{ref, before, after}]",- "revision": "string",- "mutated": "bool"- },- "hint": "One undo step live, or one write. The schematic is not changed: the next update from the schematic overwrites value and fields that differ there.",- "pitfalls": [- "A mandatory field (Reference, Value, Footprint) cannot be removed."- ],- "related": [- "edit_footprint",- "sheet_params",- "part_parameters"- ],- "example": {- "filePath": "C:/proj/board.kicad_pcb",- "refs": [- "R7"- ],- "dnp": true,- "fields": {- "LCSC": "C25804"- }- },- "longRunning": false,- "timeoutSeconds": null,- "proposedBy": "kicad-lane",- "since": "0.25.1",- "agreedBy": [- "standard-lane"- ]- }, { "name": "find_symbol", "tier": "core",@@ -3723,55 +3672,6 @@ "longRunning": false, "timeoutSeconds": 60 },- {- "name": "align_footprints",- "tier": "native",- "source": "proposed",- "summary": "Align placed parts on a common left, right, top, bottom or centre line, or distribute them evenly, by courtyard box or anchor, through the bridge's checked move (revision, courtyard collisions, board outline, one undo step).",- "input": {- "filePath": "the board (required)",- "refs": "[ref], at least two (required)",- "mode": "left | right | top | bottom | centerX | centerY | distributeX | distributeY (required)",- "by": "courtyard | anchor, default courtyard",- "to": "mm: the line to align on; default the group's own edge or centre",- "gap": "mm between neighbours (distribute)",- "expectedRevision": "string",- "dryRun": "bool",- "allowOverlap": "bool, default false",- "allowOutside": "bool, default false"- },- "output": {- "moves": "[{ref, from, to}]",- "revision": "string",- "mutated": "bool"- },- "hint": "Without to, left and top take the group's minimum edge, right and bottom its maximum, centerX and centerY the mean centre; distribute keeps the outer two in place unless gap is given.",- "pitfalls": [- "A move that would collide or leave the outline is refused unless allowOverlap or allowOutside."- ],- "related": [- "move_footprint",- "placement_check",- "find_space"- ],- "example": {- "filePath": "C:/proj/board.kicad_pcb",- "refs": [- "C1",- "C2",- "C3"- ],- "mode": "distributeX",- "gap": 1.0- },- "longRunning": false,- "timeoutSeconds": null,- "proposedBy": "kicad-lane",- "since": "0.25.1",- "agreedBy": [- "standard-lane"- ]- }, { "name": "annotate", "tier": "native",@@ -4547,7 +4447,8 @@ }, "hint": "Pair it with a BOM and Gerbers for an assembly order; export_manufacturing writes all three in one call.", "pitfalls": [- "Rotations follow the tool's convention; a fab may need its own offsets per package."+ "Rotations follow the tool's convention; a fab may need its own offsets per package.",+ "A format the tool cannot write (Altium's pick-and-place generator has no Gerber form) is answered unsupported with the reason." ], "related": [ "export_manufacturing",@@ -4563,7 +4464,8 @@ "proposedBy": "kicad-lane", "since": "0.25.1", "agreedBy": [- "standard-lane"+ "standard-lane",+ "altium-lane" ] }, {