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-lane: the seven accepted verbs from #29, and KiCad's answers for place_parts, edit_tracks, extensions and physical_properties
2 files changed
+301
tools/equivalents/kicad.json+20@@ -88,6 +88,11 @@ "exact", "a library footprint (.kicad_mod); kicad_edit_footprint is another job: it edits footprints placed on a board (fields, attributes, lock)" ],+ "edit_tracks": [+ "modify_track",+ "partial",+ "the standard's tracks list is KiCad's changes list; the verb under the standard's name is coming"+ ], "ensure_licensed": [ "readiness", "partial",@@ -102,6 +107,11 @@ "unsupported", "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" ],+ "extensions": [+ "pcm_list / pcm_install / pcm_uninstall",+ "partial",+ "three verbs for KiCad's Plugin and Content Manager; one verb under the standard's name is coming"+ ], "import_part": [ "install_footprint + install_symbol", "partial",@@ -155,10 +165,20 @@ "errors", "partial" ],+ "physical_properties": [+ "physical_properties",+ "unsupported",+ "KiCad has no materials or masses on a part"+ ], "place_on_pcb": [ "place_footprint / add_footprint", "exact" ],+ "place_parts": [+ "add_footprint",+ "partial",+ "one footprint or one row per call, not a parts list; the verb under the standard's name is coming"+ ], "place_vias": [ "add_via", "exact"
tools/proposed/kicad-lane.json+281@@ -2305,5 +2305,286 @@ "standard-lane", "fusion-lane" ]+ },+ {+ "name": "sch_no_connect",+ "tier": "core",+ "summary": "Put a no-connect marker on a sheet, at a point or on a pin, or remove one by its sch_items id. One undo step.",+ "input": {+ "sheet": "path to the schematic sheet file (required)",+ "at": "[x, y] mm: a point",+ "points": "[[x, y]] mm: several points",+ "pin": "designator.pin, e.g. U1.12",+ "pins": "[designator.pin]",+ "id": "a marker's id from sch_items (with remove)",+ "remove": "bool, default false: remove the marker at id or at",+ "dryRun": "bool, default false: answer the plan and change nothing",+ "save": "bool, default true: save the sheet after the edit"+ },+ "output": {+ "added": "[{id, at}]",+ "removed": "[id]",+ "failed": "[{item, error}]",+ "saved": "bool"+ },+ "hint": "Use it for a pin left open on purpose, so the ERC stops reporting it. sch_items {kinds:[noConnects]} lists the markers with their ids.",+ "pitfalls": [+ "A bridge whose tool has no such marker answers not_supported, with the reason (Fusion's schematic has none)."+ ],+ "related": [+ "sch_items",+ "sch_connect",+ "run_erc"+ ],+ "example": {+ "sheet": "C:/proj/board.kicad_sch",+ "pin": "U1.12"+ },+ "proposedBy": "kicad-lane",+ "since": "0.30.15",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "sch_label",+ "tier": "core",+ "summary": "Put a net label on an existing wire at a point, or delete one. sch_connect labels a pin through a new stub, and sch_edit_label changes labels that already exist.",+ "input": {+ "sheet": "path to the schematic sheet file (required)",+ "text": "the net name (required to add)",+ "at": "[x, y] mm: a point on the wire",+ "kind": "local|global|hierarchical, default local",+ "rotation": "0|90|180|270, default 0",+ "remove": "bool, default false: delete the label named by id, or by text with at",+ "id": "a label's id from sch_items (with remove)",+ "dryRun": "bool, default false: answer the plan and change nothing",+ "save": "bool, default true: save the sheet after the edit"+ },+ "output": {+ "label": "{id, text, kind, at, rotation} when added",+ "removed": "[id]",+ "saved": "bool"+ },+ "hint": "The label names the net of the wire it touches: check with sch_trace_point at the same point, or netlist.",+ "pitfalls": [+ "A label placed where no wire runs connects nothing, and is reported by the ERC, not by this verb."+ ],+ "related": [+ "sch_connect",+ "sch_edit_label",+ "sch_items",+ "sch_trace_point"+ ],+ "example": {+ "sheet": "C:/proj/board.kicad_sch",+ "text": "VIN",+ "at": [+ 63.5,+ 54.61+ ]+ },+ "proposedBy": "kicad-lane",+ "since": "0.30.15",+ "agreedBy": [+ "altium-lane",+ "fusion-lane"+ ]+ },+ {+ "name": "sch_wire",+ "tier": "core",+ "summary": "Draw a wire through given points on a sheet, in the same units as the other sch_* wiring verbs. One undo step.",+ "input": {+ "sheet": "path to the schematic sheet file (required)",+ "points": "[[x, y], ...] mm, two or more (required)",+ "junctions": "bool, default true: add a junction where the wire ends on another wire",+ "dryRun": "bool, default false: answer the plan and change nothing",+ "save": "bool, default true: save the sheet after the edit"+ },+ "output": {+ "wires": "[{id, from, to}] one per segment",+ "junctionsAdded": "[{id, at}]",+ "saved": "bool"+ },+ "hint": "For wiring between points that aren't pins, such as a bus of stubs or a route around a part. sch_connect_pins draws between two pins and works out the path.",+ "pitfalls": [+ "Points that are not on the sheet's grid may not reach a pin: read the pin's position first with sch_pins."+ ],+ "related": [+ "sch_connect_pins",+ "sch_split_wire",+ "sch_delete_wire",+ "sch_items"+ ],+ "example": {+ "sheet": "C:/proj/board.kicad_sch",+ "points": [+ [+ 50.8,+ 54.61+ ],+ [+ 76.2,+ 54.61+ ]+ ]+ },+ "proposedBy": "kicad-lane",+ "since": "0.30.15",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "place_parts",+ "tier": "core",+ "summary": "Put footprints from a library onto the current board, each with its position, rotation and side, and read them back. One undo step.",+ "input": {+ "filePath": "the board (default the current one)",+ "parts": "[{library, footprint, ref?, value?, x, y, rotation?: 0, side?: top|bottom, nets?: {pad: net}}] mm and degrees (required)",+ "dryRun": "bool, default false: answer the plan and change nothing",+ "expectedRevision": "optional: refused with stale_board if the board changed"+ },+ "output": {+ "results": "[ok|err:...] per part",+ "placed": "[{ref, x, y, rotation, side}]",+ "revision": "string"+ },+ "hint": "For parts with no sheet behind them: mounting hardware, test points, or a board built without a schematic. A taken designator is refused and the next free one is named.",+ "pitfalls": [+ "On a board with a schematic, parts normally arrive through update_pcb: a part placed here is on no sheet, and the next update_pcb lists it in removeParts.",+ "Fusion's linked board is partial: only a standalone board takes a direct add."+ ],+ "related": [+ "update_pcb",+ "move_parts",+ "remove_parts",+ "routing_state"+ ],+ "example": {+ "parts": [+ {+ "library": "Resistor_SMD",+ "footprint": "R_0603_1608Metric",+ "ref": "R12",+ "x": 120.0,+ "y": 95.0+ }+ ]+ },+ "proposedBy": "kicad-lane",+ "since": "0.30.15",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "edit_tracks",+ "tier": "native",+ "summary": "Change given tracks by the handle routing_state returns: width, layer and ends. One undo step, read back.",+ "input": {+ "filePath": "the board (default the current one)",+ "tracks": "[{id, width?, layer?, start?: [x, y], end?: [x, y]}] mm; id is the track's handle from routing_state (required)",+ "dryRun": "bool, default false: answer the plan and change nothing",+ "expectedRevision": "optional: refused with stale_board if the board changed"+ },+ "output": {+ "results": "[ok|err:...] per track",+ "changes": "[{id, before, after}]",+ "verified": "bool: every change read back",+ "revision": "string"+ },+ "hint": "set_track_width works by net or class; this works on the tracks you name, for one neck or one layer swap. A track that moves off its pad is refused or shows in routing_drc, depending on the bridge.",+ "pitfalls": [+ "Changing a track's layer does not add the vias its ends now need: check with routing_drc."+ ],+ "related": [+ "routing_state",+ "set_track_width",+ "remove_items",+ "routing_drc"+ ],+ "example": {+ "tracks": [+ {+ "id": "<handle>",+ "width": 0.5+ }+ ]+ },+ "proposedBy": "kicad-lane",+ "since": "0.30.15",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "model_check",+ "tier": "checks",+ "summary": "Per part: is there a 3D model, where is it, is the file found, and does it hold geometry. For a library footprint or a whole board. Read only.",+ "input": {+ "filePath": "a board: every part on it",+ "library": "a footprint library (with footprint)",+ "footprint": "one footprint's name",+ "limit": "int, default 50: parts reported on a board"+ },+ "output": {+ "parts": "[{name, models: [{path, location: embedded|file|cloud, found: bool, hasGeometry: bool}], issues: [string]}]",+ "checked": "int",+ "ok": "bool: every part has a model that is found and holds geometry"+ },+ "hint": "Run it before a 3D export or a fab handoff. Whether the body sits in the right place stays with bodies: this verb only says the model is there and usable.",+ "pitfalls": [+ "A bridge whose models live in the cloud reports found as whether the reference resolves."+ ],+ "related": [+ "bodies",+ "lint_library",+ "export_3d"+ ],+ "example": {+ "filePath": "C:/proj/board.kicad_pcb"+ },+ "proposedBy": "kicad-lane",+ "since": "0.30.15",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "extensions",+ "tier": "app",+ "summary": "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.",+ "input": {+ "action": "list|install|remove, default list",+ "id": "the package's identifier (install, remove)",+ "source": "a repository URL or a local package file (install)",+ "version": "optional (install)",+ "checkUpdates": "bool, default true (list)"+ },+ "output": {+ "extensions": "[{id, name, version, kind, updateAvailable?, latestVersion?}]",+ "count": "int",+ "installed": "{id, version} after install",+ "removed": "id after remove"+ },+ "hint": "Read the list before installing, and restart the tool if the reply says the plugin loads at startup.",+ "pitfalls": [+ "Altium and Fusion list, and refuse install and remove by name: their pages can't be driven."+ ],+ "related": [+ "install_extension",+ "extension_ping",+ "state"+ ],+ "example": {+ "action": "list"+ },+ "proposedBy": "kicad-lane",+ "since": "0.30.15",+ "agreedBy": [+ "altium-lane"+ ] } ]