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.
main
Colby Knox
0.31.1: sch_no_connect, sch_label, sch_wire, place_parts, edit_tracks, model_check, extensions join (#29); 263 verbs
43003f6
8d ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590
[
{
"name": "sch_connect_pins",
"tier": "core",
"summary": "Wire pins to pins on a sheet by Ref.Pin: an L-shaped route (one horizontal and one vertical leg) for each pair, with a junction dot wherever a route meets an existing wire in a T. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"pairs": "[{from: \"U1.1\", to: \"R5.2\", first?: h|v (the leg to draw first; default along the axis the from pin points), via?: [[x, y], ...] mm waypoints}] (required)",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"wired": "int",
"routes": "[{from, to, points: [[x, y]], ids: [wire id]}]",
"junctionsAdded": "[[x, y]]",
"failed": "[{from, to, error}]",
"saved": "bool"
},
"hint": "Pins are matched by number, then by name. Aligned pins get one straight wire; otherwise the route turns once. Check the result with sch_pins (connectedPins) or run_erc.",
"pitfalls": [
"The route does not avoid part bodies or other wires: a leg running along another wire merges the two nets. Steer with first or via, and check with sch_pins."
],
"related": [
"sch_pins",
"sch_connect",
"sch_delete_wire",
"run_erc"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"pairs": [
{
"from": "U1.1",
"to": "R2.1"
},
{
"from": "U1.2",
"to": "C3.1",
"first": "v"
}
]
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_connect_to_bus",
"tier": "core",
"summary": "Fan pins onto a bus: for each pin a wire running to the bus, a 45-degree bus entry onto it and a member label (D0, D1 ...) on the wire. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"pins": "[\"U1.1\", \"U1.2\"] Ref.Pin, in member order (required)",
"bus": "id of the bus segment (default the only bus on the sheet)",
"members": "[\"D0\", \"D1\"]: the member names in pin order",
"prefix": "\"D\": or name members prefix + number",
"start": "int, default 0: the first number with prefix",
"entry": "up|down (a vertical bus) or left|right (a horizontal bus): the way the entries lean",
"busLabel": "\"D[0..7]\": also label the bus",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"connected": "[{pin, member, wireId, entryId}]",
"busLabel": "string or null",
"failed": "[{pin, error}]",
"saved": "bool"
},
"hint": "Members name the nets: members lists them in pin order, or prefix plus start counts up. Refused with entry_off_bus when an entry would miss the bus: extend the bus with sch_bus first.",
"pitfalls": [
"Pins should face the bus; a pin facing away gets a wire across its own part.",
"Two pins at the same height on a vertical bus share an entry point and collide: offset them or lean the entries differently."
],
"related": [
"sch_bus",
"sch_bus_entry",
"sch_pins"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"pins": [
"U1.1",
"U1.7"
],
"prefix": "D",
"busLabel": "D[0..1]"
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_junction",
"tier": "core",
"summary": "Add junction dots at points, or remove dots by id or point. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"points": "[[x, y], ...] mm: where to add dots",
"remove": "[id or [x, y], ...]: dots to remove",
"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]",
"skipped": "[[x, y]]: points that already had a dot",
"notNeeded": "[[x, y]]: added dots where fewer than three items meet (legal, but they join nothing extra)",
"saved": "bool"
},
"hint": "The wiring verbs add the dots they need on their own; use this for a T made by hand, or to clean up.",
"pitfalls": [
"Items join only where their coordinates match exactly: use pin ends from sch_pins, or points on the sheet's grid."
],
"related": [
"sch_items",
"sch_split_wire",
"sch_delete_wire"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"points": [
[
110.49,
60.96
]
]
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_bus",
"tier": "core",
"summary": "Draw a bus as a polyline (one bus segment per pair of points), optionally with a bus label such as D[0..7] or a group {SDA SCL} at its first point. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"points": "[[x, y], [x, y], ...] mm (required)",
"label": "\"D[0..7]\" or \"{SDA SCL}\": the nets the bus carries",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"ids": "[bus segment id]",
"label": "{id, text} or null",
"saved": "bool"
},
"hint": "A bus carries the nets its label names, and each member wire needs its own label. sch_connect_to_bus does the member wires, entries and labels for a set of pins.",
"pitfalls": [
"A bus with no label carries nothing: ERC reports its members as unconnected."
],
"related": [
"sch_bus_entry",
"sch_connect_to_bus",
"sch_delete_wire",
"sch_items"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"points": [
[
203.2,
50.8
],
[
203.2,
101.6
]
],
"label": "D[0..7]"
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_bus_entry",
"tier": "core",
"summary": "Add 45-degree bus entries: the short diagonal that joins a member wire's end to a bus. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"entries": "[{at: [x, y] mm (the wire end), direction: up-right|down-right|up-left|down-left as seen (default down-right)}] (required)",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"added": "[{id, at, end: [x, y] (the bus side), onBus: bool}]",
"saved": "bool"
},
"hint": "end is the bus side of each entry; onBus says whether it lands on a bus segment.",
"pitfalls": [
"The bus side must touch a bus and the other end a wire end, exactly, or ERC reports the entry as unconnected."
],
"related": [
"sch_bus",
"sch_connect_to_bus",
"sch_items"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"entries": [
{
"at": [
200.66,
63.5
],
"direction": "up-right"
}
]
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_split_wire",
"tier": "core",
"summary": "Split the wire through a point into two wires there, with a junction dot at the cut, so a new branch can end on a wire end. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"at": "[x, y] mm on the sheet (the tool's sheet origin, y up) (required)",
"id": "the wire's id, when several wires pass through the point",
"junction": "bool, default true",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"ids": "[first half (keeps the wire's id), second half (new id)]",
"junction": "{id, at} or null",
"saved": "bool"
},
"hint": "Split a wire where a new branch should join it, then wire to the cut.",
"pitfalls": [
"The point must lie on the wire and not at either end (not_on_wire otherwise)."
],
"related": [
"sch_delete_wire",
"sch_junction",
"sch_items"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"at": [
110.49,
60.96
]
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_delete_wire",
"tier": "core",
"summary": "Delete wires or bus segments by id, by their two ends, or every wire through a point, and remove junction dots that no longer join three or more items. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"ids": "[wire id, ...]",
"from": "[x, y] mm, with to: the wire with exactly these ends (either order)",
"to": "[x, y] mm",
"at": "[x, y] mm: every wire passing through the point",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"deleted": "[{id, from, to}]",
"junctionsRemoved": "[[x, y]]",
"saved": "bool"
},
"hint": "Read ids with sch_items. from/to matches one segment, not a whole route.",
"pitfalls": [
"A polyline drawn in the editor is several wires sharing ends: from/to names one segment of it."
],
"related": [
"sch_items",
"sch_split_wire",
"sch_junction",
"sch_connect_pins"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"from": [
100.33,
60.96
],
"to": [
120.65,
60.96
]
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_edit_label",
"tier": "core",
"summary": "Edit net labels: rotate, move to a point or by a delta, rename, or move every label of a net at once. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"edits": "[{id | text (with at?: [x, y] to pick one) | net (every label of the net), rotation?: 0|90|180|270, to?: [x, y] mm (one label only), by?: [dx, dy] mm, rename?: string}] (required)",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"edited": "[{id, text, at, rotation}]",
"failed": "[{edit, error}]",
"saved": "bool"
},
"hint": "text picks every label with that text (or the one at at); net picks every label of the net. Read ids with sch_items.",
"pitfalls": [
"A label joins a net only where it sits on a wire or a pin end: moving it off disconnects it.",
"rename changes only the labels picked: other labels with the old name stay on the old net."
],
"related": [
"sch_items",
"sch_connect",
"sch_edit"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"edits": [
{
"net": "VOUT",
"by": [
0,
2.54
]
}
]
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_move_region",
"tier": "core",
"summary": "Move everything inside a box by (dx, dy): parts, wire ends inside the box (wires crossing its edge stretch), labels, junctions, no-connect markers, texts, bus entries and sheet symbols. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"box": "[x1, y1, x2, y2] mm (required)",
"by": "[dx, dy] mm (required)",
"wires": "bool, default true: move wires, buses and bus entries",
"labels": "bool, default true: move labels and texts",
"junctions": "bool, default true: move junctions and no-connect markers",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"moved": "{parts, wires, buses, busEntries, labels, texts, junctions, noConnects, sheets: [id]}",
"saved": "bool"
},
"hint": "Parts move by their anchor point. Move by a pure dx or a pure dy to keep stretched wires straight.",
"pitfalls": [
"A wire with one end in the box stretches diagonally when dx and dy are both non-zero.",
"Keep the move on the sheet's grid, or pins and wires stop meeting.",
"A multi-part component whose parts sit on both sides of the edge splits up."
],
"related": [
"sch_edit",
"sch_items"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"box": [
90,
40,
160,
120
],
"by": [
25.4,
0
]
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_text",
"tier": "core",
"summary": "Add free text to a sheet (a note, a title, a design comment) with size, angle, justification, bold and italic. Text has no electrical meaning. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"texts": "[{text, at: [x, y] mm, rotation?: 0|90|180|270, sizeMm?: 1.27, justify?: \"left bottom\", bold?: false, italic?: false}] (required)",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"added": "[{id, text, at}]",
"saved": "bool"
},
"hint": "Net names are labels, not text: use sch_connect for them. Newlines in text become line breaks.",
"pitfalls": [],
"related": [
"sch_items",
"sch_edit_label"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"texts": [
{
"text": "USB input stage",
"at": [
50.8,
30.48
],
"sizeMm": 2.54,
"bold": true
}
]
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_page",
"tier": "core",
"summary": "Read or set a sheet's page: paper size, orientation and title block (title, date, revision, company, comment lines).",
"input": {
"sheet": "path to the schematic sheet file (required)",
"paper": "A5 to A0, A to E, USLetter, USLegal, USLedger or custom",
"orientation": "portrait|landscape",
"widthMm": "number (custom paper)",
"heightMm": "number (custom paper)",
"title": "string",
"date": "string",
"rev": "string",
"company": "string",
"comments": "[string]: comment lines in order",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"paper": "string",
"widthMm": "number",
"heightMm": "number",
"orientation": "string",
"titleBlock": "{title, date, rev, company, comments}",
"changed": "bool",
"saved": "bool"
},
"hint": "With no change arguments it only reads. An empty string removes a title-block field. Each sheet of a hierarchy has its own page.",
"pitfalls": [
"Shrinking the paper moves nothing: items outside the new frame stay where they are (render_schematic shows it)."
],
"related": [
"sch_create",
"render_schematic"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"paper": "A3",
"title": "Main board",
"rev": "B"
},
"longRunning": false,
"timeoutSeconds": 30,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_items",
"tier": "core",
"summary": "List a sheet's wiring items with ids and coordinates: wires, buses, bus entries, net labels (local, global, hierarchical), power ports, junctions, no-connect markers, texts and sheet symbols. Read only.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"kinds": "[wires, buses, busEntries, labels, powerPorts, junctions, noConnects, texts, sheets] (default all)"
},
"output": {
"wires": "[{id, from, to}]",
"buses": "[{id, from, to}]",
"busEntries": "[{id, at, end}]",
"labels": "[{id, text, kind: local|global|hierarchical, at, rotation}]",
"powerPorts": "[{id, net, at}]",
"junctions": "[{id, at}]",
"noConnects": "[{id, at}]",
"texts": "[{id, text, at}]",
"sheets": "[{id, name, file, at, sizeMm}]",
"counts": "{kind: int}"
},
"hint": "The ids feed sch_delete_wire, sch_edit_label, sch_junction and sch_edit. Parts are in schematic_data.",
"pitfalls": [
"A wire is one straight segment: a polyline drawn in the editor is several wires sharing ends."
],
"related": [
"schematic_data",
"sch_pins",
"sch_delete_wire",
"sch_edit_label"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"kinds": [
"wires",
"labels"
]
},
"longRunning": false,
"timeoutSeconds": 30,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_pins",
"tier": "core",
"summary": "Every pin of the named parts on a sheet: its absolute position (rotation and mirror applied), number, name, electrical type, the side it leaves the body, and the wires, labels and nets touching it. Read only.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"references": "[\"U1\", \"R5\"] (default every part)",
"connections": "bool, default true: add what touches each pin"
},
"output": {
"pins": "[{ref, number, name, type, at: [x, y], direction: right|left|up|down as seen, hidden, touching: [{kind, id}], nets: [string], connectedPins: [Ref.Pin]}]"
},
"hint": "at is where a wire or label must land on the pin. connectedPins lists the other pins on the same copper on this sheet.",
"pitfalls": [
"Nets here come from this sheet's wires and labels only: netlist gives the project-wide nets.",
"Hidden power pins (hidden:true) connect by name, not by wire."
],
"related": [
"sch_connect_pins",
"sch_connect",
"schematic_data",
"netlist"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"references": [
"U1",
"R5"
]
},
"longRunning": false,
"timeoutSeconds": 30,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_trace_point",
"tier": "core",
"summary": "Everything electrically connected at a point on a sheet: the wires, labels, pins, junctions, sheet pins and no-connect markers there, and for each net they belong to the whole net with its name. Read only.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"at": "[x, y] mm on the sheet (the tool's sheet origin, y up) (required)",
"toleranceMm": "number, default 0.05"
},
"output": {
"items": "[{kind, id, at}]",
"nets": "[{name, pins: [Ref.Pin], labels, powerPorts, wires, leavesSheet: bool}]",
"crossingWithoutJunction": "bool: two wires cross here without connecting",
"nearest": "[x, y]: the nearest connectable point, when nothing is within tolerance"
},
"hint": "Read with the tool's own rules: wire ends join wires and wire middles (a T), labels and junction dots join a wire anywhere along it, pins join wire ends.",
"pitfalls": [
"One sheet only: a net that leaves through a global, hierarchical or power label (leavesSheet:true) continues on other sheets. netlist gives the compiled net."
],
"related": [
"sch_pins",
"net_connections",
"netlist"
],
"example": {
"sheet": "C:/proj/Power.SchDoc",
"at": [
109.22,
73.66
]
},
"longRunning": false,
"timeoutSeconds": 30,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_hierarchy",
"tier": "core",
"summary": "The sheet tree of a design, recursively: each sheet's name, file, id, instance path, page number, position, size and pins. renumber:true renumbers pages depth-first from the root.",
"input": {
"sheet": "path to the root sheet",
"project": "path to the project (instead of sheet)",
"renumber": "bool, default false",
"dryRun": "bool, default false: answer the plan and change nothing"
},
"output": {
"tree": "[{name, file, id, path, page, at, sizeMm, pins: [{name, kind}], children: [...]}]",
"problems": "[{sheet, problem: missing|unreadable|recursive}]",
"duplicatePages": "[int]",
"renumbered": "[{sheet, from, to}]"
},
"hint": "Pass the root sheet or the project. renumber writes only the numbers that change.",
"pitfalls": [
"A sheet file used by two sheet symbols appears twice in the tree (one instance each) but is one file."
],
"related": [
"sch_sheet_pins",
"sch_sheet_symbol",
"sch_create"
],
"example": {
"project": "C:/proj/Board.PrjPcb",
"renumber": true
},
"longRunning": false,
"timeoutSeconds": 30,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_sheet_pins",
"tier": "core",
"summary": "A sheet symbol's pins: list, add, edit (rename, kind, move along an edge) or delete. import:true adds a pin for every hierarchical port inside the child sheet that the symbol lacks; validate:true reports ports without pins, pins without ports and kind mismatches.",
"input": {
"sheet": "path to the parent sheet (required)",
"sheetSymbol": "the sheet symbol's name or id (default: validate checks every one)",
"action": "list|add|edit|delete, default list",
"name": "string: the pin",
"kind": "input|output|bidirectional|tri_state|passive",
"side": "left|right|top|bottom",
"at": "[x, y] mm: snapped to the nearest edge point",
"newName": "string (edit)",
"import": "bool",
"validate": "bool",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"pins": "[{id, name, kind, side, at}]",
"added": "[name]",
"problems": "[{sheetSymbol, pin, problem: no_port|no_pin|kind_mismatch}]",
"saved": "bool"
},
"hint": "Inputs go on the left edge and outputs on the right by default, in the first free slot. A pin joins the child's hierarchical port of the same name; wire it on the parent side at its at.",
"pitfalls": [
"Renaming a pin does not rename the port inside the child sheet: validate afterwards.",
"A pin moved or deleted leaves its parent-side wire dangling."
],
"related": [
"sch_sheet_symbol",
"sch_hierarchy",
"sch_connect"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"sheetSymbol": "Power",
"import": true
},
"longRunning": false,
"timeoutSeconds": 30,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_reset_fields",
"tier": "core",
"summary": "Put parts' designator and value text (or the named fields) back where the library symbol places them, through each part's rotation and mirror. One undo step.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"references": "[\"R5\", \"C3\"]",
"all": "bool: every part on the sheet",
"fields": "[designator, value] by default; other field names as the tool names them",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"reset": "[{ref, field}]",
"saved": "bool"
},
"hint": "Font and visibility stay as they are; only position, angle and justification move.",
"pitfalls": [
"The library's offsets are what the symbol's author drew; the tool's automatic field placement may put them elsewhere."
],
"related": [
"sch_edit",
"schematic_data"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"references": [
"R5",
"C3"
]
},
"longRunning": true,
"timeoutSeconds": 120,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_update_from_library",
"tier": "native",
"summary": "Update the placed symbols on a sheet from their libraries (all, or the listed ones) and report which changed, which already matched and which no library has.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"symbols": "[library symbol name or id, ...] (default all)",
"library": "path to one library to take them all from (with symbols)",
"force": "bool, default false: update even when a placed pin would be dropped",
"dryRun": "bool, default false: answer the plan and change nothing",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"changed": "[{symbol, pinsAdded, pinsRemoved}]",
"unchanged": "[symbol]",
"notFound": "[symbol]",
"refused": "[{symbol, droppedPins}]",
"saved": "bool"
},
"hint": "Run with dryRun first. A symbol whose new version drops a placed pin is refused unless force:true. Check the sheet afterwards with run_erc.",
"pitfalls": [
"A pin that moved in the library moves off its wire: check with sch_pins or run_erc after an update that reports changes."
],
"related": [
"sch_swap_part",
"schematic_data",
"run_erc"
],
"example": {
"sheet": "C:/proj/Main.SchDoc",
"dryRun": true
},
"longRunning": true,
"timeoutSeconds": 180,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_fix_connectivity",
"tier": "core",
"summary": "Snap near-miss wire ends onto the pin, label, sheet pin or wire end they almost touch, within a tolerance. dryRun (the default) lists the moves; dryRun:false makes them.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"toleranceMm": "number, default 0.5",
"dryRun": "bool, default TRUE",
"save": "bool, default true: save the sheet after the edit"
},
"output": {
"moves": "[{wireId, from, to, onto: {kind, id}, diagonal: bool}]",
"unresolved": "[[x, y]]: dangling ends with nothing close",
"saved": "bool"
},
"hint": "Only dangling wire ends move. Read the moves before applying them: diagonal:true means the snapped wire is no longer horizontal or vertical. Check with run_erc after.",
"pitfalls": [
"dryRun defaults to true: nothing changes until dryRun:false.",
"A wide tolerance can snap onto the wrong pin: keep it under half the sheet's grid."
],
"related": [
"sch_trace_point",
"run_erc"
],
"example": {
"sheet": "C:/proj/Power.SchDoc",
"toleranceMm": 0.5,
"dryRun": false
},
"longRunning": false,
"timeoutSeconds": 60,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "render_schematic",
"tier": "native",
"summary": "Render a sheet to an image without opening a window, through the tool's own plotter, and keep visual baselines: baseline set stores the image, baseline compare reports the pixel drift, the changed region and a diff image.",
"input": {
"sheet": "path to the schematic sheet file (required)",
"width": "int px, default 2000",
"outputDir": "folder for the image (default beside the project)",
"baseline": "set|compare",
"threshold": "percent of pixels, default 0.5 (compare)",
"drawingSheet": "bool, default true: include the frame and title block"
},
"output": {
"png": "path",
"width": "int",
"height": "int",
"driftPercent": "number (compare)",
"pass": "bool (compare)",
"changedRegionMm": "[x1, y1, x2, y2] (compare)",
"diffPng": "path: the changed pixels in red (compare)",
"rendererChanged": "bool: the tool's plotter changed since the baseline"
},
"hint": "A sub-sheet renders with its real designators. compare renders at the baseline's width and passes when driftPercent <= threshold. show_* verbs open a window; this one does not.",
"pitfalls": [
"Anti-aliasing differs between tool versions: rendererChanged:true means drift may not be a design change.",
"A baseline is per sheet and per width; a paper size change reads as 100 percent drift."
],
"related": [
"sch_page",
"export_pdf"
],
"example": {
"sheet": "C:/proj/Power.SchDoc",
"baseline": "compare"
},
"longRunning": true,
"timeoutSeconds": 300,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"agreedBy": [
"altium-lane"
]
},
{
"name": "sch_create",
"tier": "core",
"summary": "Create an empty schematic sheet with a paper size and title block; optionally add it to a project as a child sheet of the root. It places no parts or nets (build_schematic does).",
"input": {
"sheet": "path of the sheet to create (required)",
"paper": "A4, A3 ... USLetter or custom",
"orientation": "portrait|landscape",
"widthMm": "number (custom)",
"heightMm": "number (custom)",
"title": "string",
"date": "string",
"rev": "string",
"company": "string",
"comments": "[string]",
"project": "path: add the sheet to this project under its root sheet",
"sheetName": "string: the sheet symbol's name in the root",
"at": "[x, y] mm: where the sheet symbol goes on the root",
"dryRun": "bool, default false: answer the plan and change nothing"
},
"output": {
"sheet": "path",
"page": "int",
"sheetSymbol": "{id, name, at} or null",
"created": "bool"
},
"hint": "Without project the sheet stands alone. With project it is linked from the root sheet as a child sheet with the next page number.",
"pitfalls": [
"Never overwrites: an existing file is refused.",
"A new child sheet has no pins on its symbol: add hierarchical ports inside, then sch_sheet_pins {import:true}."
],
"related": [
"sch_page",
"sch_hierarchy",
"sch_sheet_pins",
"sch_place_part"
],
"example": {
"sheet": "C:/proj/Power.SchDoc",
"project": "C:/proj/Board.PrjPcb",
"sheetName": "Power",
"title": "Power"
},
"longRunning": false,
"timeoutSeconds": 30,
"proposedBy": "kicad-lane",
"since": "0.2.0",
"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"
]
},
{
"name": "simulate",
"tier": "app",
"summary": "Run a circuit simulation of the design's schematic and return the signals as data: an operating point, a DC sweep, an AC sweep or a transient, with the nets and source currents asked for.",
"input": {
"schematic": "the design or sheet to simulate (the bridge's own path or id) (required)",
"analysis": "{type: op} | {type: dc, source, start, stop, step} | {type: ac, sweep: dec|oct|lin, points, start, stop} (Hz) | {type: tran, step, stop, start?} (s) | {type: noise, source, output, reference?, sweep: dec|oct|lin, points, start, stop} (Hz: the output and input-referred noise of output against reference, driven from source) | {type: raw, text: \".ac dec 20 10 1meg\"} (a bridge that cannot run raw SPICE refuses it with not_supported); default the analysis the design carries",
"probes": "[{net: \"OUT\"} | {current: \"V1\"}]; default every net (a bridge may cap the count)",
"sweep": "{parameter, start, stop, step, scale?: \"lin\" | \"dec\" | \"oct\"}: optional; steps a part's value (\"R4\") or a model parameter (\"Q1.BF\"), one run per value; for lin, step is the increment, for dec and oct the points per decade or octave; a bridge may cap the number of runs",
"temperatures": "{start, stop, step} (°C): optional; one run per temperature",
"monteCarlo": "{runs, distribution?: \"uniform\" | \"gaussian\", seed?, tolerances: {resistor?, capacitor?, inductor?, transistor?, dcSource?, digital?} (%)}: optional; the analysis runs again with every part drawn within its kind's tolerance, each run its own signal; the same seed draws the same values",
"points": "int, default 200: a ceiling on the points returned per signal; decimation keeps the first and last points and every extremum (the run itself is not coarsened)"
},
"output": {
"signals": "[{signal: \"V(OUT)\", x: [..], y: [..], xUnit: s|Hz|V, yUnit: V|A|dB, phase?: [..] (AC, degrees, unwrapped)}]; an op gives one point per signal; with sweep or temperatures each run is its own signal, with step saying which run it is (\"R4 = 300\", \"T = 85\"), so a reader groups runs by signal + step; a Monte Carlo run's step lists the values drawn (\"R3 = 9038.1, C6 = 1.0004e-10\"), so any run can be reproduced; a noise analysis answers onoise and inoise (yUnit V/rtHz) over frequency",
"totals": "noise analysis: {onoise, inoise}, the integrated output and input-referred noise in V",
"missing": "[probe]: probes the run did not have",
"notSimulated": "[ref]: parts the run left out for want of a simulation model, when the sheet is only partly modelled, so a reader knows the result covers only part of the circuit (empty when every part was simulated)",
"available": "[signal name]",
"engine": "the simulator and its version, e.g. \"ngspice 46 (KiCad 10.0.7)\""
},
"hint": "AC signals are the magnitude in dB with phase in degrees beside it. Every part needs a simulation model: passives work from their values, sources come from the tool's simulation library, ICs need a model file.",
"pitfalls": [
"simulation_failed carries the simulator's own message: a part without a model, a node with no DC path to ground, or a bad analysis.",
"points thins the reply, not the run: a long transient with a tiny step still takes its time.",
"A partly modelled sheet still runs and names the parts it left out in notSimulated; a sheet with no modelled parts refuses with no_model.",
"A bridge that cannot sweep refuses sweep or temperatures with not_supported; it never runs once and returns a single trace as if it were the sweep (ngspice has no .step: loop with alter per value).",
"A bridge that cannot run a noise analysis or a Monte Carlo (or draw one of its tolerance kinds) refuses with not_supported; it never answers something else in its place."
],
"related": [
"export_spice",
"run_erc",
"sch_place_part"
],
"example": {
"schematic": "C:/proj/filter.kicad_sch",
"analysis": {
"type": "ac",
"sweep": "dec",
"points": 20,
"start": 10,
"stop": 1000000
},
"probes": [
{
"net": "OUT"
}
]
},
"proposedBy": "kicad-lane",
"since": "0.14.0",
"agreedBy": [
"standard-lane",
"altium-lane",
"fusion-lane"
]
},
{
"name": "export_spice",
"tier": "app",
"summary": "Write the design's SPICE netlist with the tool's own exporter, and say what it holds.",
"input": {
"schematic": "the design or sheet (required)",
"outputPath": "path for the netlist (default beside the design)"
},
"output": {
"path": "the netlist file",
"dialect": "ngspice | pspice | ltspice | xspice",
"elements": "int: parts in the netlist",
"analyses": "[the analysis lines the design carries]",
"includes": "[the model files it includes]"
},
"hint": "A part without a simulation model is left out or becomes a comment: give it one before simulating.",
"pitfalls": [
"Model files are included by the path the part's model field gives: keep them where every machine finds them."
],
"related": [
"simulate"
],
"example": {
"schematic": "C:/proj/filter.kicad_sch"
},
"proposedBy": "kicad-lane",
"since": "0.14.0",
"agreedBy": [
"standard-lane",
"altium-lane",
"fusion-lane"
]
},
{
"name": "verb_times",
"tier": "app",
"summary": "Measured run times of this bridge's verbs on this machine: per verb the count, p50, p90, max, last and failures, from its own run log, slowest p90 first.",
"input": {
"limit": "int, default 40: how many verbs"
},
"output": {
"verbs": "[{verb, count, p50Sec, p90Sec, maxSec, lastSec, failures}]",
"since": "when the log starts"
},
"hint": "p90 is the headline: a p50 of 15 s next to a p90 of 400 s is two code paths under one name. failures counts runs that returned success:false; a verb that fails fast is a different bug from a slow one.",
"pitfalls": [
"Times are this machine's: a slower box or a bigger board moves them."
],
"related": [
"prewarm"
],
"example": {
"limit": 20
},
"proposedBy": "kicad-lane",
"since": "0.25.1",
"agreedBy": [
"standard-lane",
"fusion-lane"
]
},
{
"name": "prewarm",
"tier": "app",
"summary": "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 would otherwise do slowly. Idempotent.",
"input": {},
"output": {
"steps": "[{step, done, skipped?, why?}]",
"ready": "bool"
},
"hint": "The bridge host may run it once after an install or update; running it again changes nothing. Everything it does is what the first real verb would otherwise do in the user's face.",
"pitfalls": [
"It never opens a document or takes the foreground."
],
"related": [
"verb_times"
],
"example": {},
"proposedBy": "kicad-lane",
"since": "0.25.1",
"agreedBy": [
"standard-lane",
"fusion-lane"
]
},
{
"name": "render_board",
"tier": "native",
"summary": "A rendered 3D picture (PNG or JPG) of a board from one side, made by the tool's own renderer with no window: optionally framed on parts, turned for an isometric view, raytraced.",
"input": {
"filePath": "the board (required)",
"side": "top | bottom | left | right | front | back, default top",
"width": "px, default 1600",
"height": "px, default 900",
"quality": "basic | high (raytraced)",
"background": "default | transparent | opaque",
"zoom": "float",
"perspective": "bool",
"format": "png | jpg",
"refs": "[ref]: frame these parts (camera on their pads' centre, zoomed to them)",
"marginMm": "mm round framed parts, default 2",
"rotate": "'x,y,z' degrees, e.g. '-45,0,45' for isometric",
"outputDir": "folder for the image"
},
"output": {
"path": "the image",
"framed": "{refs, pivot, zoom} when refs was given"
},
"hint": "One call per side (top and bottom for a review). refs frames parts for a close look; quality high raytraces and takes longer.",
"pitfalls": [
"The picture is of the saved board file: unsaved edits are not in it."
],
"related": [
"zoom_to",
"library_views",
"render_schematic"
],
"example": {
"filePath": "C:/proj/board.kicad_pcb",
"side": "top",
"refs": [
"J1"
],
"rotate": "-45,0,45"
},
"proposedBy": "kicad-lane",
"since": "0.25.1",
"agreedBy": [
"standard-lane",
"fusion-lane"
]
},
{
"name": "export_pos",
"tier": "native",
"summary": "Export the pick-and-place (component position, CPL) file of a board, optionally in a fab's assembly format (JLCPCB's columns).",
"input": {
"filePath": "the board (required)",
"side": "both | front | back, default both",
"format": "csv | ascii | gerber, default csv",
"units": "mm | in, default mm",
"smdOnly": "bool",
"excludeDnp": "bool, default true",
"fab": "jlcpcb: also write the fab's own CPL columns",
"outputDir": "folder"
},
"output": {
"files": "[path]",
"parts": "int per side"
},
"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.",
"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",
"bom",
"assembly_check"
],
"example": {
"filePath": "C:/proj/board.kicad_pcb",
"fab": "jlcpcb"
},
"proposedBy": "kicad-lane",
"since": "0.25.1",
"agreedBy": [
"standard-lane",
"altium-lane",
"fusion-lane"
]
},
{
"name": "sch_batch",
"tier": "core",
"summary": "Apply a list of schematic edits to one sheet in one read and one write, all or nothing: each op is a standard schematic verb with its own arguments, seeing the sheet as the earlier ops left it.",
"input": {
"filePath": "the sheet (required)",
"ops": "[{op: a standard schematic verb's name (sch_place_part, sch_connect_pins, sch_connect, sch_edit, sch_edit_label, sch_junction, sch_bus, sch_bus_entry, sch_text, sch_delete_wire, sch_split_wire, sch_move_region, sch_reset_fields, sch_update_from_library, annotate, ...), ...that verb's arguments}] (required)",
"dryRun": "bool: report the plan, write nothing"
},
"output": {
"results": "[{op, output, uuid?}] in order",
"ercBefore": "the sheet's ERC counts before",
"ercAfter": "and after",
"failedOp": "the index of the op that failed (nothing is written then)",
"mutated": "bool"
},
"hint": "A part placed in op 0 can be wired in op 1. A failing op aborts the whole batch: failedOp names it and the sheet is unchanged.",
"pitfalls": [
"A bridge whose tool cannot undo a partial batch answers partial: it says which ops ran before the failure."
],
"related": [
"build_schematic",
"sch_place_part",
"sch_connect_pins",
"run_erc"
],
"example": {
"filePath": "C:/proj/board.kicad_sch",
"ops": [
{
"op": "sch_place_part",
"libId": "Device:R",
"reference": "R9",
"at": [
100,
80
]
},
{
"op": "sch_connect_pins",
"pairs": [
[
"R9.1",
"U1.3"
]
]
}
]
},
"proposedBy": "kicad-lane",
"since": "0.26.4",
"agreedBy": [
"standard-lane",
"fusion-lane"
]
},
{
"name": "log_tail",
"tier": "app",
"summary": "What the tool said about itself since an offset: its own log lines and alerts (warnings and errors), so a verb that looks successful while the tool complains is caught.",
"input": {
"sinceOffset": "int, default 0: where the last call stopped (its next)",
"maxBytes": "int, default 200000",
"errorsOnly": "bool: only errors and warnings"
},
"output": {
"entries": "[{level, text}] newest last",
"next": "the offset to pass as sinceOffset next time",
"truncated": "bool"
},
"hint": "Carry next from call to call to see only what is new. Read it after a verb that succeeded but left the tool looking unhappy.",
"pitfalls": [
"A tool that writes no log of its own answers what the bridge captured from the instances it launched."
],
"related": [
"dialog_log",
"state",
"diagnostics"
],
"example": {
"sinceOffset": 0,
"errorsOnly": true
},
"proposedBy": "kicad-lane",
"since": "0.26.4",
"agreedBy": [
"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.31.1",
"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.31.1",
"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.31.1",
"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.31.1",
"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.31.1",
"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.31.1",
"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.31.1",
"agreedBy": [
"altium-lane"
]
}
]