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: batches 2-4 proposals (26 entries, since 0.3.0, agreed by altium-lane) and KiCad equivalents
2 files changed
+1123−5
tools/equivalents/kicad.json+57−5@@ -28,7 +28,7 @@ "partial" ], "move_parts": [- "move_footprint",+ "move_footprint / flip_footprint", "exact" ], "net_connections": [@@ -44,7 +44,7 @@ "partial" ], "place_on_pcb": [- "place_footprint",+ "place_footprint / add_footprint", "exact" ], "place_vias": [@@ -52,7 +52,7 @@ "exact" ], "placement_check": [- "placement_validate",+ "placement_validate / score_placement", "partial" ], "pour_state": [@@ -160,11 +160,11 @@ "exact" ], "footprint_primitives": [- "fp_info",+ "footprint_graphics", "partial" ], "selection": [- "get_selection",+ "get_selection / select_items", "exact" ], "save": [@@ -206,5 +206,57 @@ "open_document": [ "open_board / open_schematic", "partial"+ ],+ "set_models": [+ "footprint_models",+ "partial"+ ],+ "add_models": [+ "footprint_models",+ "partial"+ ],+ "select_net": [+ "select_clear",+ "partial"+ ],+ "render_board_3d": [+ "render_board",+ "exact"+ ],+ "render_board_layers": [+ "export_svg",+ "partial"+ ],+ "remove_parts": [+ "delete_footprint",+ "exact"+ ],+ "edit_parts": [+ "edit_footprint",+ "exact"+ ],+ "align_parts": [+ "align_footprints",+ "exact"+ ],+ "remove_graphics": [+ "delete_graphics",+ "exact"+ ],+ "read_footprint": [+ "fp_info",+ "exact"+ ],+ "edit_footprint": [+ "fp_edit",+ "exact"+ ],+ "export_library_part": [+ "export_part",+ "partial"+ ],+ "create_part_project": [+ "make_part_project",+ "partial" ] }
tools/proposed/kicad-lane.json+1066@@ -920,5 +920,1071 @@ "agreedBy": [ "altium-lane" ]+ },+ {+ "name": "export_odb",+ "tier": "native",+ "summary": "Export the board as ODB++ (copper, drill, stack-up, netlist and parts in one archive) through the tool's own exporter.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "outputDir": "folder for the output (default beside the board)",+ "units": "mm|in, default mm",+ "compression": "zip|tgz|none, default zip"+ },+ "output": {+ "files": "[path]",+ "outputDir": "path"+ },+ "hint": "Send the archive to a fab that takes ODB++ instead of Gerbers. export_manufacturing makes the Gerber set.",+ "pitfalls": [+ "Run run_drc first: the file carries the board's errors with it."+ ],+ "related": [+ "export_manufacturing",+ "export_ipc2581",+ "run_drc"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc"+ },+ "longRunning": true,+ "timeoutSeconds": 300,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "export_ipc2581",+ "tier": "native",+ "summary": "Export the board as IPC-2581: one XML file with copper, drill, stack-up, netlist and BOM, through the tool's own exporter.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "outputDir": "folder for the output (default beside the board)",+ "version": "B|C, default C",+ "units": "mm|in, default mm",+ "compress": "bool, default false: zip the XML",+ "bomFields": "{mpn, manufacturer, distributorPn, distributor}: the part field names that carry these, so the embedded BOM is useful to the fab"+ },+ "output": {+ "file": "path"+ },+ "hint": "Name the part fields with bomFields, or the BOM inside the file carries no part numbers.",+ "pitfalls": [+ "Run run_drc first: the file carries the board's errors with it."+ ],+ "related": [+ "export_odb",+ "export_manufacturing",+ "run_drc"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "bomFields": {+ "mpn": "MPN"+ }+ },+ "longRunning": true,+ "timeoutSeconds": 300,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "export_ipc356",+ "tier": "native",+ "summary": "Export the IPC-D-356 netlist of the board, for bare-board electrical test (flying probe or bed of nails).",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "outputDir": "folder for the output (default beside the board)"+ },+ "output": {+ "file": "path"+ },+ "hint": "Send it with the Gerbers when the fab tests boards against the netlist.",+ "pitfalls": [+ "Run run_drc first: the file carries the board's errors with it."+ ],+ "related": [+ "export_manufacturing",+ "netlist"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc"+ },+ "longRunning": true,+ "timeoutSeconds": 300,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "export_gencad",+ "tier": "native",+ "summary": "Export the board as GenCAD 1.4, the input of test-fixture tools and some assembly houses' CAM.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "outputDir": "folder for the output (default beside the board)",+ "uniquePins": "bool, default false: rename duplicate pad numbers (several fixture tools need it)",+ "flipBottomPads": "bool, default false",+ "useDrillOrigin": "bool, default false: coordinates from the drill origin instead of the board's origin"+ },+ "output": {+ "file": "path"+ },+ "hint": "Ask the fixture or assembly house which options it needs; uniquePins is the common one.",+ "pitfalls": [+ "Run run_drc first: the file carries the board's errors with it."+ ],+ "related": [+ "export_manufacturing",+ "export_ipc356"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "uniquePins": true+ },+ "longRunning": true,+ "timeoutSeconds": 300,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "export_dxf",+ "tier": "native",+ "summary": "Export chosen board layers to DXF, one file per layer (the outline, panel drawings, stencils, enclosure work).",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "layers": "[\"Edge.Cuts\", \"F.Cu\"]: layer names (required; there is no sensible default)",+ "outputDir": "folder for the output (default beside the board)",+ "units": "mm|in, default mm",+ "contours": "bool, default false: join outline segments into polylines (most CAM and laser tools want it)",+ "titleBlock": "bool, default false",+ "excludeDesignators": "bool, default false",+ "excludeValues": "bool, default false",+ "useDrillOrigin": "bool, default false"+ },+ "output": {+ "files": "[{layer, path}]"+ },+ "hint": "One file per layer, named after the board and the layer. For an enclosure drawing export Edge.Cuts with contours:true.",+ "pitfalls": [+ "The board's DXF only: a mechanical DXF of a 3D design is a different job and not this verb."+ ],+ "related": [+ "render_board_layers",+ "export_step"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "layers": [+ "Edge.Cuts"+ ],+ "contours": true+ },+ "longRunning": true,+ "timeoutSeconds": 300,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "render_board_3d",+ "tier": "native",+ "summary": "Render a 3D picture of the board from one side to an image file, through the tool's own renderer, without opening a window.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "side": "top|bottom|left|right|front|back, default top",+ "width": "int px, default 1600",+ "height": "int px, default 900",+ "quality": "basic|high, default basic (high raytraces and is much slower)",+ "background": "default|transparent|opaque",+ "zoom": "number, default 1.0",+ "perspective": "bool, default false",+ "format": "png|jpg, default png",+ "outputDir": "folder for the output (default beside the board)"+ },+ "output": {+ "image": "path",+ "width": "int",+ "height": "int",+ "side": "string"+ },+ "hint": "One call per side: top and bottom for a review. A flat image of chosen layers is render_board_layers; show_3d_board opens a window instead.",+ "pitfalls": [+ "Parts without a 3D model render as bare pads: check them with bodies first."+ ],+ "related": [+ "render_board_layers",+ "render_schematic",+ "bodies",+ "show_3d_board"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "side": "top"+ },+ "longRunning": true,+ "timeoutSeconds": 600,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "estimate_cost",+ "tier": "checks",+ "summary": "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) and a rough price table at the quantities asked, with every assumption stated and the price source named with the date it was read.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "quantities": "[5, 10, 30, 100] (default)",+ "assembly": "bool, default false: add an assembly estimate",+ "fab": "the price list to use, default jlcpcb"+ },+ "output": {+ "board": "{sizeMm, layers, thicknessMm, minTrackMm, minGapMm, minDrillMm, holes, smdParts, thtParts, smdJoints, thtJoints, uniqueParts}",+ "prices": "[{quantity, board, assembly, total, currency}]",+ "assumptions": "[string]",+ "source": "{name, url, read: date}"+ },+ "hint": "An order of magnitude, not a quote: parts, shipping and options are left out. For a real quote send the manufacturing files to the fab.",+ "pitfalls": [+ "Prices change: source names the price list and the date it was read; an old date means an old price."+ ],+ "related": [+ "fab_check",+ "export_manufacturing",+ "bom"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "quantities": [+ 5,+ 50+ ]+ },+ "longRunning": false,+ "timeoutSeconds": 60,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "remove_parts",+ "tier": "core",+ "summary": "Remove placed parts from the board by designator, as one undo step. The library is not touched (that is remove_footprint).",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "expectedRevision": "string: the revision you last read (routing_state); refused with stale_board if the board changed",+ "refs": "[\"R7\", \"R8\"] (required)",+ "allowLocked": "bool, default false",+ "dryRun": "bool, default false: answer the plan and change nothing"+ },+ "output": {+ "removed": "[{ref, nets: [string]}]",+ "failed": "[{ref, error}]",+ "revision": "string: the board's new revision"+ },+ "hint": "Each removed part lists the nets its pads carried. A locked part is refused (part_locked) unless allowLocked:true.",+ "pitfalls": [+ "Tracks and vias that met the pads stay: routing_state shows what is left dangling.",+ "A part still in the schematic comes back at the next update_pcb."+ ],+ "related": [+ "move_parts",+ "routing_state",+ "update_pcb"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "refs": [+ "TP3"+ ],+ "expectedRevision": "<rev>"+ },+ "longRunning": true,+ "timeoutSeconds": 130,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "edit_parts",+ "tier": "core",+ "summary": "Edit placed parts: value, designator, any field (add, change, remove), do-not-populate, exclusion from the BOM or position files, mounting type and the lock. One undo step.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "expectedRevision": "string: the revision you last read (routing_state); refused with stale_board if the board changed",+ "edits": "[{ref, value?, newRef?, fields?: {name: value | null (remove)}, dnp?: bool, excludeFromBom?: bool, excludeFromPos?: bool, mount?: smd|through_hole|other, locked?: bool}] (required)",+ "dryRun": "bool, default false: answer the plan and change nothing"+ },+ "output": {+ "edited": "[{ref, before, after}]",+ "failed": "[{ref, error}]",+ "revision": "string: the board's new revision"+ },+ "hint": "Fields the tool requires (designator, value) cannot be removed. Read the parts first with component_data.",+ "pitfalls": [+ "Board-side edits of what the schematic owns are lost at the next update_pcb: change the schematic instead (sch_edit).",+ "A designator already taken is refused."+ ],+ "related": [+ "component_data",+ "part_parameters",+ "sch_edit"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "edits": [+ {+ "ref": "R7",+ "value": "4k7",+ "dnp": true+ }+ ],+ "expectedRevision": "<rev>"+ },+ "longRunning": true,+ "timeoutSeconds": 130,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "align_parts",+ "tier": "core",+ "summary": "Line parts up on a common left, right, top, bottom or centre line, or space them evenly, by courtyard box or by anchor point. One undo step, with move_parts' checks.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "expectedRevision": "string: the revision you last read (routing_state); refused with stale_board if the board changed",+ "refs": "[\"C1\", \"C2\", \"C3\"] (required)",+ "mode": "left|right|top|bottom|centerX|centerY|distributeX|distributeY (required)",+ "by": "courtyard|anchor, default courtyard",+ "to": "mm: the line to align on (default from the group)",+ "gapMm": "number: the spacing for distribute (default even spacing between the outer two)",+ "allowOverlap": "bool, default false",+ "allowOutside": "bool, default false",+ "dryRun": "bool, default false: answer the plan and change nothing"+ },+ "output": {+ "targets": "[{ref, x, y}]",+ "mismatches": "[{ref, asked, got}]",+ "revision": "string: the board's new revision"+ },+ "hint": "Without to, left takes the group's smallest x, right the largest, top the highest edge and bottom the lowest (y up); centre lines take the mean. distribute keeps the outer two in place.",+ "pitfalls": [+ "Rotation and side are kept: align parts of the same orientation for a clean row.",+ "A courtyard collision or a part off the board is refused, as in move_parts."+ ],+ "related": [+ "move_parts",+ "placement_check"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "refs": [+ "C4",+ "C5",+ "C6"+ ],+ "mode": "top",+ "expectedRevision": "<rev>"+ },+ "longRunning": true,+ "timeoutSeconds": 130,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "set_layer_count",+ "tier": "core",+ "summary": "Set the board's copper layer count (2, 4, 6 or 8): the layer table and the stack-up, keeping the board thickness.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "count": "2|4|6|8 (required)",+ "expectedRevision": "string: the revision you last read (routing_state); refused with stale_board if the board changed",+ "dryRun": "bool, default false: answer the plan and change nothing"+ },+ "output": {+ "layers": "[string]: the copper layers now",+ "stackup": "the new stack-up, as layer_stack answers it",+ "revision": "string: the board's new revision"+ },+ "hint": "New inner layers are signal layers In1.Cu ... Read the result with layer_stack.",+ "pitfalls": [+ "A layer being removed that still carries copper or graphics is refused (layers_in_use, with the counts per layer).",+ "New dielectrics are generic: re-check an impedance-controlled stack-up with layer_stack.",+ "Net classes and design rules are not changed."+ ],+ "related": [+ "layer_stack",+ "copper_layers",+ "layers_in_use"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "count": 4+ },+ "longRunning": false,+ "timeoutSeconds": 60,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "remove_graphics",+ "tier": "core",+ "summary": "Remove board graphics (lines, rectangles, circles, arcs, polygons, texts, dimensions) by id, or every one on a layer and of a kind. One undo step.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "expectedRevision": "string: the revision you last read (routing_state); refused with stale_board if the board changed",+ "ids": "[id]",+ "layer": "\"F.SilkS\": every graphic on this layer",+ "kinds": "[line|rect|circle|arc|polygon|text|dimension]",+ "dryRun": "bool, default false: answer the plan and change nothing"+ },+ "output": {+ "removed": "[{id, kind, layer, points}]",+ "revision": "string: the board's new revision"+ },+ "hint": "Board-level graphics only; graphics inside parts are footprint_primitives. An unknown id refuses the whole call (unknown_ids).",+ "pitfalls": [+ "Removing Edge.Cuts graphics removes the board outline.",+ "A layer or kind filter without ids removes every match: dry-run it first."+ ],+ "related": [+ "remove_items",+ "footprint_primitives",+ "silk_state"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "layer": "Dwgs.User",+ "dryRun": true+ },+ "longRunning": true,+ "timeoutSeconds": 130,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "import_svg",+ "tier": "core",+ "summary": "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. One undo step.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "expectedRevision": "string: the revision you last read (routing_state); refused with stale_board if the board changed",+ "svgPath": "path to the .svg",+ "svg": "the SVG text (instead of svgPath)",+ "at": "[x, y] mm (required)",+ "widthMm": "number: the artwork's width (or scale)",+ "scale": "number, default 1",+ "anchor": "topleft|center, default topleft: which point of the artwork at names",+ "layer": "default F.SilkS",+ "mirror": "bool, default true on bottom layers",+ "net": "a net for artwork on copper",+ "toleranceMm": "number, default 0.02: curve flattening",+ "dryRun": "bool, default false: answer the plan and change nothing"+ },+ "output": {+ "polygons": "int",+ "sizeMm": "[w, h]",+ "ids": "[id]",+ "skipped": "[{element, why}]",+ "revision": "string: the board's new revision"+ },+ "hint": "Filled shapes import; text and images are listed in skipped (convert text to paths first). A shape inside another becomes a hole.",+ "pitfalls": [+ "Stroke-only artwork imports nothing: give the SVG filled shapes.",+ "On copper the shapes are graphics: give net to tie them to a net, and run run_drc.",+ "On a bottom layer the artwork is mirrored so it reads correctly from the back; mirror:false keeps it as drawn."+ ],+ "related": [+ "apply_silkscreen",+ "silk_state",+ "run_drc"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "svgPath": "C:/proj/logo.svg",+ "at": [+ 120,+ 95+ ],+ "widthMm": 10,+ "layer": "F.SilkS",+ "expectedRevision": "<rev>"+ },+ "longRunning": true,+ "timeoutSeconds": 130,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "copy_routing",+ "tier": "core",+ "summary": "Copy the tracks and vias inside a box to an offset, remapping nets by pairing parts (a designator map or pattern), so a repeated channel gets the same routing. One undo step.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "expectedRevision": "string: the revision you last read (routing_state); refused with stale_board if the board changed",+ "box": "[x1, y1, x2, y2] mm (required): the source",+ "offset": "[dx, dy] mm (required)",+ "refMap": "{\"U1\": \"U5\"}: pair parts, so each pad's net maps to the partner pad's net",+ "refPattern": "{from: \"CH1_*\", to: \"CH2_*\"}: pair parts by designator pattern",+ "netMap": "{\"SIG\": \"SIG2\"}: overrides",+ "keepUnmappedNets": "bool, default false",+ "layers": "[layer]: copy only these",+ "validate": "bool, default true: run the tool's DRC on the result before committing",+ "dryRun": "bool, default false: answer the plan and change nothing"+ },+ "output": {+ "copied": "{tracks: int, vias: int}",+ "netMap": "{from: to}: the pairing used",+ "skipped": "[{item, why}]",+ "drc": "{ran, newErrors}",+ "revision": "string: the board's new revision"+ },+ "hint": "A track is copied when both ends are in the box, a via when its centre is. Without a remap the copy keeps its nets. Dry-run first and check netMap.",+ "pitfalls": [+ "Only through vias are copied: blind and buried vias are skipped.",+ "The copy connects only where the target pads sit at the same offset: place the target channel identically first (replicate_layout).",+ "One source net mapping to two target nets is refused (net_map_conflict) unless netMap settles it."+ ],+ "related": [+ "replicate_layout",+ "route_net",+ "routing_state"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "box": [+ 10,+ 10,+ 30,+ 25+ ],+ "offset": [+ 25,+ 0+ ],+ "refPattern": {+ "from": "CH1_*",+ "to": "CH2_*"+ },+ "expectedRevision": "<rev>"+ },+ "longRunning": true,+ "timeoutSeconds": 130,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "cross_probe",+ "tier": "app",+ "summary": "From a schematic part to the board part linked to it, and back, by designator, the schematic symbol's id or its sheet path; optionally select them in the tool.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "ref": "\"U1\"",+ "symbolId": "the schematic symbol's id",+ "path": "the symbol's sheet path",+ "schematic": "path to a sheet of the project (default the project's)",+ "select": "bool, default false: also select the matches in the tool"+ },+ "output": {+ "matches": "[{board: {ref, id, side, x, y, rotation}, schematic: {sheet, id, ref, symbol, value}, linked: bool}]",+ "symbolWithoutPart": "[ref]"+ },+ "hint": "Reads the open board when the tool serves it, else the file.",+ "pitfalls": [+ "linked:false means the board part has no link to a symbol: placed by hand, or update_pcb never ran."+ ],+ "related": [+ "selection",+ "update_pcb",+ "component_data"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "ref": "U3"+ },+ "longRunning": false,+ "timeoutSeconds": 60,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "check_clearance",+ "tier": "checks",+ "summary": "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 threshold, closest first.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "refs": "[\"U1\", \"C3\"]: keep pairs that involve one of these (default every part)",+ "mode": "courtyard|pads, default courtyard",+ "thresholdMm": "number, default 0.25 (courtyard) or 0.2 (pads)",+ "includeSameNet": "bool, default false (pads)",+ "maxPairs": "int, default 200"+ },+ "output": {+ "pairs": "[{a, b, distanceMm, overlapping: bool, touching: bool}]",+ "clean": "bool",+ "thresholdMm": "number",+ "measuredOn": "courtyard outline|courtyard box|pads"+ },+ "hint": "Computed from the board model: courtyards compare only parts on the same side, pads only copper that shares a side.",+ "pitfalls": [+ "Rounded pads may be measured as their full rectangle, so a gap can read a little small: the tool's DRC (run_drc) is the authority."+ ],+ "related": [+ "placement_check",+ "run_drc",+ "align_parts"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "refs": [+ "U1"+ ],+ "mode": "pads",+ "thresholdMm": 0.2+ },+ "longRunning": false,+ "timeoutSeconds": 60,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "place_decoupling",+ "tier": "checks",+ "summary": "Plan positions for decoupling capacitors beside an IC's power pins (each cap just outside the courtyard, its power pad facing the pin), answered as move_parts arguments; dryRun:false applies them through move_parts.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "ic": "\"U1\" (required)",+ "caps": "[\"C1\", \"C2\"] (default every capacitor across ground and one of the IC's power nets)",+ "gapMm": "number, default 0.3",+ "dryRun": "bool, default TRUE",+ "expectedRevision": "string: the revision you last read (routing_state); refused with stale_board if the board changed (to apply)"+ },+ "output": {+ "placements": "[{cap, pin, side, x, y, rotation, padToPinMm}]",+ "skipped": "[{cap, why: other_side|no_shared_power_net|no_free_spot}]",+ "moveArgs": "move_parts arguments",+ "validation": "move_parts' courtyard and outline check of the plan",+ "revision": "string, when applied"+ },+ "hint": "Read the plan, then apply it with dryRun:false and expectedRevision, or send moveArgs to move_parts yourself.",+ "pitfalls": [+ "Caps on the other side of the board are skipped: move them to the IC's side first (move_parts with side).",+ "It places; it does not route: route the stubs with route_net."+ ],+ "related": [+ "move_parts",+ "route_net",+ "placement_check"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "ic": "U1"+ },+ "longRunning": true,+ "timeoutSeconds": 130,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "plan_fanout",+ "tier": "checks",+ "summary": "Plan the fanout of a BGA or QFN/QFP: the pad pitch, dogbone or via-in-pad per pad, the escape layer, surface stubs for the outer ring and a via grid for an exposed pad, answered as route_net arguments, one call per net.",+ "input": {+ "filePath": "path to the board file (default: the board open in the tool)",+ "ref": "\"U3\" (required)",+ "style": "auto|dogbone|via-in-pad, default auto",+ "escapeLayer": "a layer name (default the first inner layer, else the opposite side)",+ "viaMm": "via diameter",+ "viaDrillMm": "via drill",+ "widthMm": "track width",+ "clearanceMm": "number, default 0.1",+ "pitchMm": "override the detected pitch",+ "stubMm": "number, default 0.4",+ "surfaceOuterRing": "bool, default true"+ },+ "output": {+ "package": "bga|perimeter",+ "pitchMm": "number",+ "style": "string",+ "pads": "[{pad, net, action: surface|dogbone|via-in-pad|stub+via|thermal-via-grid|skip}]",+ "calls": "[route_net arguments]",+ "minViaToPadMm": "number"+ },+ "hint": "auto picks dogbone when a via fits between four pads with the clearance, else via-in-pad. Send each call to route_net with filePath and expectedRevision, dry run first.",+ "pitfalls": [+ "Via-in-pad needs filled and capped vias (IPC-4761 type VII): tell the user before committing it.",+ "The plan does not check stubs against other parts' copper; route_net checks each call before it commits."+ ],+ "related": [+ "route_net",+ "place_vias",+ "fab_check"+ ],+ "example": {+ "filePath": "C:/proj/Board.PcbDoc",+ "ref": "U3"+ },+ "longRunning": false,+ "timeoutSeconds": 60,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "project_create",+ "tier": "core",+ "summary": "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.",+ "input": {+ "parentDir": "folder to create the project in (required)",+ "name": "string (required): the project and folder name",+ "title": "string",+ "layers": "int, default 2",+ "fabRules": "a fab name from adom/pcb-design-rules, recorded to apply once the board has content",+ "textVariables": "{\"REV\": \"A\"}",+ "dryRun": "bool, default false: answer the plan and change nothing"+ },+ "output": {+ "project": "path",+ "files": "[path]"+ },+ "hint": "Next: draw the outline (set_outline), then place and route. fabRules is recorded, not applied.",+ "pitfalls": [+ "A folder that already holds a project is refused.",+ "The board has no outline yet: set it before routing or exporting."+ ],+ "related": [+ "project_info",+ "sch_create",+ "set_outline"+ ],+ "example": {+ "parentDir": "C:/Users/me/Documents/Projects",+ "name": "widget",+ "layers": 4+ },+ "longRunning": false,+ "timeoutSeconds": 30,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "project_info",+ "tier": "core",+ "summary": "A project at a glance: name, files with sizes and dates, the sheet tree, the board (layers, parts, nets, size), text variables, net classes, last change, and whether the tool has it open. Read only.",+ "input": {+ "project": "path to the project file, its folder or any of its documents (required)"+ },+ "output": {+ "name": "string",+ "files": "[{path, bytes, modified}]",+ "sheets": "the sheet tree, as sch_hierarchy answers it",+ "board": "{layers, parts, nets, sizeMm}",+ "textVariables": "{name: value}",+ "netClasses": "[string]",+ "modified": "date",+ "open": "bool: the tool has a document of this project open"+ },+ "hint": "Read this before renaming, snapshotting or editing a project.",+ "pitfalls": [],+ "related": [+ "sch_hierarchy",+ "board_summary",+ "open_project"+ ],+ "example": {+ "project": "C:/proj/Board.PrjPcb"+ },+ "longRunning": false,+ "timeoutSeconds": 30,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "project_rename",+ "tier": "core",+ "summary": "Rename a project: the project file, the root sheet, the board and the tool's side files, with the references inside them updated. Refused while the tool has the project open.",+ "input": {+ "project": "path to the project file (required)",+ "newName": "string (required)",+ "dryRun": "bool, default false: answer the plan and change nothing"+ },+ "output": {+ "renamed": "[{from, to}]",+ "changed": "[{file, what}]"+ },+ "hint": "Dry-run first: the plan lists every file renamed and what changes inside each. Close the project in the tool first.",+ "pitfalls": [+ "Child sheet files keep their names; only the documents named after the project are renamed.",+ "The folder keeps its name.",+ "Take a project_snapshot first if the project is not under version control."+ ],+ "related": [+ "project_snapshot",+ "project_info",+ "close"+ ],+ "example": {+ "project": "C:/proj/Old.PrjPcb",+ "newName": "widget-v2",+ "dryRun": true+ },+ "longRunning": false,+ "timeoutSeconds": 60,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "project_snapshot",+ "tier": "native",+ "summary": "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.",+ "input": {+ "project": "path to the project file (required)",+ "label": "string: added to the folder name",+ "pdfs": "bool, default true"+ },+ "output": {+ "folder": "path",+ "files": "[path]",+ "pdfs": "{made: [path], skipped: why}"+ },+ "hint": "Take one before a risky edit (a rename, a big re-route). Libraries in sub-folders are referenced, not copied.",+ "pitfalls": [+ "A snapshot of an open project holds what is saved on disk, not unsaved edits: save first."+ ],+ "related": [+ "project_rename",+ "export_pdf",+ "save"+ ],+ "example": {+ "project": "C:/proj/Board.PrjPcb",+ "label": "before-routing"+ },+ "longRunning": true,+ "timeoutSeconds": 300,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "read_footprint",+ "tier": "core",+ "summary": "Every detail of one library footprint: pads (number, type, shape, position, size, drill, layers), the layers it uses, its courtyard box, graphics per layer, attributes, properties and 3D models. The library mirror of read_symbol; footprint_primitives reads a part placed on the board.",+ "input": {+ "libraryPath": "path to the footprint library",+ "name": "the footprint's name (with libraryPath)",+ "libId": "\"Lib:Name\": resolved through the project's and then the global library table",+ "project": "path to the project, for libId"+ },+ "output": {+ "name": "string",+ "pads": "[{number, type, shape, at, sizeMm, drillMm, layers, rotation}]",+ "layers": "[string]",+ "courtyardMm": "[x1, y1, x2, y2]",+ "graphics": "{layer: count}",+ "attributes": "{mount, excludeFromBom, excludeFromPos, dnp}",+ "properties": "{name: value}",+ "models": "[{path, offset, scale, rotate}]"+ },+ "hint": "Read before edit_footprint, and to check pin 1 and the pad numbers against the symbol.",+ "pitfalls": [],+ "related": [+ "edit_footprint",+ "read_symbol",+ "footprint_primitives",+ "list_library"+ ],+ "example": {+ "libId": "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm"+ },+ "longRunning": false,+ "timeoutSeconds": 60,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "edit_footprint",+ "tier": "core",+ "summary": "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 attributes; replace, add or delete 3D models. Everything not edited stays as it was.",+ "input": {+ "libraryPath": "path to the footprint library (required)",+ "name": "the footprint's name (required)",+ "pads": "[{number, set?: {sizeMm, at, shape, drillMm, layers, rotation, type, newNumber}, delete?: true}]",+ "addPads": "[pad]",+ "renumber": "{map: {\"1\": \"A1\"}} | {sequential: true, start?: 1}",+ "graphics": "[{layer, mode: append|replace|delete, widthMm?, shapes: [{type: line|arc|rect|circle|poly, ...}]}]",+ "metadata": "{description?, tags?, attributes?: {mount, excludeFromBom, excludeFromPos, dnp}}",+ "models": "{mode: replace|append|delete, list: [{path, offset, scale, rotate}]}",+ "dryRun": "bool, default false: answer the plan and change nothing"+ },+ "output": {+ "changes": "[string]: what was done, in order"+ },+ "hint": "Operations run in the order pads, addPads, renumber, graphics, metadata, models. An edited pad keeps its id.",+ "pitfalls": [+ "Boards that already use the footprint keep their own copy: update them with swap_footprint.",+ "Graphics replace and delete touch shapes only, never text on that layer."+ ],+ "related": [+ "read_footprint",+ "create_footprint",+ "swap_footprint",+ "add_body"+ ],+ "example": {+ "libraryPath": "C:/lib/Mine.PcbLib",+ "name": "SOT-23_Mine",+ "pads": [+ {+ "number": "1",+ "set": {+ "sizeMm": [+ 1.0,+ 0.8+ ]+ }+ }+ ]+ },+ "longRunning": false,+ "timeoutSeconds": 30,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "export_library_part",+ "tier": "native",+ "summary": "Export one library part into its own small library files: a symbol library with only its symbol, a footprint library with only its footprint, and its 3D model file.",+ "input": {+ "part": "the part's symbol name or library id (required)",+ "footprint": "a footprint name (default the symbol's own)",+ "what": "[symbol, footprint, model] (default all three)",+ "outputDir": "folder for the files"+ },+ "output": {+ "exports": "{symbol: path, footprint: path, model: path}",+ "missing": "[what]"+ },+ "hint": "Use it to hand one part to another project or another tool.",+ "pitfalls": [+ "success is false when any piece asked for is missing; exports still carries what was written."+ ],+ "related": [+ "read_symbol",+ "read_footprint",+ "import_part"+ ],+ "example": {+ "part": "IN-S42ATA"+ },+ "longRunning": true,+ "timeoutSeconds": 130,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ]+ },+ {+ "name": "create_part_project",+ "tier": "native",+ "summary": "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 board.",+ "input": {+ "part": "the part's symbol name or library id (required)",+ "footprint": "a footprint name (default the symbol's own)",+ "projectName": "string (default from the part)",+ "outputDir": "folder (default the user's projects folder)",+ "overwrite": "bool, default false: replace a project of that name"+ },+ "output": {+ "project": "path",+ "schematic": "path",+ "board": "path"+ },+ "hint": "The board keeps the footprint's 3D model, so render_board_3d and show_3d_board show the real part. One part by design.",+ "pitfalls": [+ "The part's symbol and footprint must both be in a library the tool can find.",+ "An existing project of that name is refused unless overwrite:true."+ ],+ "related": [+ "export_library_part",+ "render_board_3d",+ "show_3d_board",+ "import_part"+ ],+ "example": {+ "part": "IN-S42ATR"+ },+ "longRunning": true,+ "timeoutSeconds": 130,+ "proposedBy": "kicad-lane",+ "since": "0.3.0",+ "agreedBy": [+ "altium-lane"+ ] } ]