Designer commands

Every command of the designer as the edsnx command line, JSON-RPC, MCP and the script API see it.

Every command of the designer, as the edsnx CLI (edsnx <cli words> <path> --flag value), JSON-RPC (method = id), MCP (tool = id) and the script API see it. Units: millimetres (KiCad coordinates, y grows downwards) and degrees. Edit commands return newIds (ids of created objects, for chaining), revision and hash; queries return concise JSON (counts first, limit 200 by default, numbers rounded to 3 decimals). See board AUT-1…AUT-4.

449 commands: Board edits 71, Schematic edits 54, Project 25, Queries 13, Libraries 29, Checks 2, Custom tools 2, Rendering 3, Session 19, Timeline and export 6, Overlays and probes 4, Documentation sheets 7, Review 10, Simulation 10, Footprint edits 19, Symbol edits 16, Requirements and solving 8, Solve loop 7, Multi-board systems 12, Assembly variants 8, Rooms 9, Reuse blocks 6, Pin and gate swap 4, Manufacturer parts 2, BOM cost 1, Rigid-flex and HDI 18, DFM / DFA / DFF profiles 9, Output jobs 6, Releases 4, Panelization 6, Test points 6, Comments 6, Web viewer 1, MCAD co-design 21, Signal and power integrity 16, Gerber engine and viewer 9.

UI-only commands#

These need the open editor (dialogs, view modes); headless runs (edsnx without --attach) refuse them with ui-only.

  • block.showPanel (softforge.edsnx.reuse.show): Reuse Panel
  • comment.showPanel (softforge.edsnx.comments.show): Comments and Design Review Panel
  • gerber.compareReview (softforge.edsnx.gerber.compareReview): Review Gerber vs Gerber
  • gerber.openSet (softforge.edsnx.gerber.openSet): Open fab set…
  • lib.footprintModels (softforge.edsnx.model3d.footprintModels): 3D models of the footprint
  • lib.manage (softforge.edsnx.libraries.manage): Manage libraries
  • lib.openModel3d (softforge.edsnx.model3d.open): Open 3D model
  • pcb.addComponentDialog (softforge.edsnx.addComponent): Add Component dialog
  • pcb.autorouteDialog (softforge.edsnx.autoroute): Autoroute dialog
  • pcb.editInPlace (softforge.edsnx.editInPlace): Edit in Place
  • pcb.openBoardSetup (softforge.edsnx.boardSetup): Board Setup dialog
  • pcb.routersPage (softforge.edsnx.routers.show): Routers page
  • pcb.routingOptions (softforge.edsnx.routingOptions): Routing options
  • pcb.view2d (softforge.edsnx.view2d): 2D view
  • pcb.view3d (softforge.edsnx.view3d): 3D view
  • project.details (softforge.edsnx.project.details): Project details
  • project.importReport (softforge.edsnx.interop.showReport): Show import report
  • project.openBom (softforge.edsnx.bom): BOM dialog
  • project.openFabOutputs (softforge.edsnx.fabOutputs): Fabrication Outputs dialog
  • release.openDialog (softforge.edsnx.release): Release…
  • sch.cleanupWiresDialog (softforge.edsnx.cleanupWires): Clean up wires
  • sch.editInPlace (softforge.edsnx.editInPlace): Edit in Place
  • sch.openFieldsTable (softforge.edsnx.fieldsTable): Symbol Fields Table
  • sch.pageSettings (softforge.edsnx.pageSettings): Page settings
  • sch.wiresPanel (softforge.edsnx.wiresPanel): Wires panel
  • session.gettingStarted (softforge.edsnx.gettingStarted): Getting started
  • session.openDesignFile (softforge.edsnx.design.openDesignFile): Open design file
  • session.panels.reveal (softforge.edsnx.panels.reveal): Show a workbench view
  • session.preferences (softforge.edsnx.preferences): Preferences
  • session.toolGallery (softforge.edsnx.toolGallery): Tool gallery
  • session.welcome (softforge.edsnx.welcome): Welcome
  • si.showPanel (softforge.edsnx.si.show): SI/PI Panel
  • solve.openDialog (softforge.edsnx.solve): Solve Requirements…
  • system.open3d (softforge.edsnx.system.open3d): Open 3D assembly
  • timeline.export: Export playback
  • timeline.pause: Pause
  • timeline.play: Play
  • timeline.seek: Seek
  • variant.openDialog (softforge.edsnx.variants): Variants…

Board edits#

CommandCLIKindDescriptionArgsResult
pcb.addArcTrackedsnx pcb add-arc-trackeditAdd arc track. Add an arc track through start, mid and end (mm). Edits the board as one undo step; returns newIds, revision and hash.path: string, layer: string, start: [x, y], mid: [x, y], end: [x, y], width: number, net?: string | integernewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.addComponentDialog
softforge.edsnx.addComponent
edsnx pcb add-component-dialoguiAdd Component dialog. Open the Add Component dialog. Agents: use lib.search then pcb.placeFootprint / sch.placeSymbol. UI-only: needs the open editor.path?: stringobject
pcb.addDimensionedsnx pcb add-dimensioneditAdd dimension. Add a dimension (aligned, orthogonal, leader, center, radial) through pts (mm). Edits the board as one undo step; returns newIds, revision and hash.path: string, kind: “aligned” | “orthogonal” | “leader” | “center” | “radial”, layer: string, pts: [x, y][], height?: number, units?: “mm” | “in” | “mils”, precision?: integer, orientation?: “horizontal” | “vertical”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.addGraphicedsnx pcb add-graphiceditAdd graphic. Add a line, rect (2 points), circle (centre, point on circle), arc (start, mid, end), poly or (schematic) bezier. Width in mm; board footprint graphics with footprintId. Edits the board as one undo step; returns newIds, revision and hash.path: string, kind: “line” | “rect” | “circle” | “arc” | “poly” | “bezier”, layer: string, pts: [x, y][], width: number, fill?: boolean, footprintId?: string, style?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.addNetedsnx pcb add-neteditAdd net. Add a net by name (KiCad ≤ 9 net table; KiCad 10 boards create nets when an item names them). Edits the board as one undo step; returns newIds, revision and hash.path: string, name: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.addTextedsnx pcb add-texteditAdd text. Add a text at at (mm), rotation in degrees, size [w, h] mm. Edits the board as one undo step; returns newIds, revision and hash.path: string, layer: string, at: [x, y], rot: number, text: string, size: [x, y], thickness: number, mirror?: boolean, footprintId?: string, knockout?: boolean, bold?: boolean, italic?: boolean, justify?: “left” | “center” | “right”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.addTextBoxedsnx pcb add-text-boxeditAdd text box. Add a text box between corners a and b (mm); the text word-wraps to the box. Board: knockout, border, margins [l, t, r, b], justify, valign, rot, footprintId. Edits the board as one undo step; returns newIds, revision and hash.path: string, layer: string, a: [x, y], b: [x, y], text: string, size: [x, y], thickness: number, style?: object, knockout?: boolean, border?: boolean, margins?: [x0, y0, x1, y1], justify?: “left” | “center” | “right”, valign?: “top” | “center” | “bottom”, rot?: number, footprintId?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.addTrackedsnx pcb add-trackeditAdd track. Add a track polyline: one segment per consecutive pair of points, on one copper layer. Width in mm. newIds are the segments. Edits the board as one undo step; returns newIds, revision and hash.path: string, layer: string, pts: [x, y][], width: number, net?: string | integernewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.addViaedsnx pcb add-viaeditAdd via. Add a via at at (mm) between two copper layers; size and drill in mm; kind through (default), blind or micro. Edits the board as one undo step; returns newIds, revision and hash.path: string, at: [x, y], size: number, drill: number, layers: string[], net?: string | integer, kind?: “through” | “blind” | “micro”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.addZoneedsnx pcb add-zoneeditAdd zone. Add a copper zone or rule area (keepout) with the given outline (≥ 3 points, mm). Fill it with pcb.fillZones. Edits the board as one undo step; returns newIds, revision and hash.path: string, pts: [x, y][], zone: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.alignedsnx pcb aligneditAlign. Align board items (footprints, tracks, vias, graphics, zones) by their bounding boxes read from the board: left/right/top/bottom edges or centres (centerX: same x, centerY: same y), to the extent of the selection (default) or of the first item, which then stays. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], mode: “left” | “right” | “top” | “bottom” | “centerX” | “centerY”, to?: “selection” | “first” = “selection”, bounds?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.alignItemsedsnx pcb align-itemseditAlign items. Align items: left/right/top/bottom edges or centres (centerX: same x, centerY: same y) to the extent of the selection (default) or of the first item. bounds (id → [minX, minY, maxX, maxY] mm) gives item boxes; without it the anchors are used (pcb.align fills it from the board). Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], mode: “left” | “right” | “top” | “bottom” | “centerX” | “centerY”, to?: “selection” | “first” = “selection”, bounds?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.applyNetlistedsnx pcb apply-netlisteditApply netlist. Update the board from a KiCad s-expression netlist text (prefer project.updatePcb, which exports it). Edits the board as one undo step; returns newIds, revision and hash.path: string, netlistText: string, options?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.arrayedsnx pcb arrayeditCreate array. KiCad’s Create Array: copies of the items on a grid (cols × rows cells at pitch [dx, dy] mm, the original is cell (0, 0), copies row by row) or on a circle (count items in all over angle degrees about center: a full turn spreads them by angle / count, a partial arc by angle / (count − 1); rotate turns the copies). Footprint copies get the next free references of their prefix unless renumber is false. newIds are the copies. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], kind: “grid” | “circular”, cols?: integer, rows?: integer, pitch?: [x, y], count?: integer, center?: [x, y], angle?: number, rotate?: boolean, renumber?: boolean = truenewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.arrayItemsedsnx pcb array-itemseditCreate array. KiCad’s Create Array: copies of the items on a grid (cols × rows, pitch [dx, dy] mm) or on a circle (count copies over angle degrees about center, rotate turns the copies). The originals are the first cell; newIds are the copies. renumber gives footprint copies the next free references. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], kind: “grid” | “circular”, cols?: integer, rows?: integer, pitch?: [x, y], count?: integer, center?: [x, y], angle?: number, rotate?: boolean, renumber?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.autopositionedsnx pcb autopositioneditAutoposition labels. Place the labels of symbols / footprints around their group box: Altium’s eight positions (leftAbove, centerAbove, rightAbove, leftCenter, rightCenter, leftBelow, centerBelow, rightBelow) or KiCad’s default (kicad: the side with the fewest pins); horizontal, justified away from the box, stacked. fields defaults to the visible, unlocked labels. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], preset: “leftAbove” | “centerAbove” | “rightAbove” | “leftCenter” | “rightCenter” | “leftBelow” | “centerBelow” | “rightBelow” | “kicad”, fields?: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.autorouteedsnx pcb autorouteeditAutoroute. Route a board (or nets, net classes, an area, given items) with a router provider (built-in, Freerouting, add-ons: see pcb.autoroute.providers) and apply the result as one undo step “Autoroute ()”. The board text in the session is routed (unsaved edits included); locked copper is excluded and existing routing preserved by default. Returns stats (routed/total connections, vias, length mm, passes, seconds), the connections left unrouted, newIds and removedIds (rip-ups). With –check the edit is refused when the routed board has new DRC violations; –dry-run returns the diff; apply false only reports. conformance runs the provider conformance suite (7 cases) on the board or the sample project and prints a table (format json: the report).path?: string, provider?: string = “builtin”, nets?: string[], classes?: string[], area?: [x, y][], areaLayers?: string[], ids?: string[], options?: object, budget?: any, passes?: integer, preserve?: boolean = true, excludeLocked?: boolean = true, apply?: boolean = true, conformance?: string, format?: “table” | “json” = “table”object
pcb.autoroute.canceledsnx pcb autoroute cancelsessionCancel autoroute. Cancel autoroute runs in progress in this session or the attached editor: the run with runId, or all. Returns the cancelled run ids.runId?: stringobject
pcb.autoroute.providersedsnx pcb autoroute providersqueryRouter providers. The router providers available to pcb.autoroute: id, name, vendor, version, origin (builtin, addon, tool), capabilities (diff pairs, length matching, shove, blind/buried and micro vias, layers, area, incremental, cancel, progress), licence state (free, licensed, trial with days left, unlicensed with buy/trial links, error) and the options schema; plus known providers that are not installed (catalogue). Conformance cases: routes-sample-board, respects-scope-nets, respects-locked, cancels, reports-progress, drc-clean-result, preserves-existing.catalogue?: boolean = trueobject
pcb.autorouteDialog
softforge.edsnx.autoroute
edsnx pcb autoroute-dialoguiAutoroute dialog. Open the Autoroute dialog (provider, scope, options, budget, progress, review). Agents: use pcb.autoroute. UI-only: needs the open editor.path?: stringobject
pcb.batchedsnx pcb batcheditBatch. Apply several intents as one undo step (rolled back entirely on the first failure). Edits the board as one undo step; returns newIds, revision and hash.path: string, label: string, intents: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.deleteedsnx pcb deleteeditDelete. Delete items. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.distributeedsnx pcb distributeeditDistribute. Distribute board items along x or y by their bounding boxes read from the board: equal gaps between the boxes (default) or equal spacing of the centres. The two outer items stay; fewer than three items do not move. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], axis: “x” | “y”, by?: “gaps” | “centers” = “gaps”, bounds?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.distributeItemsedsnx pcb distribute-itemseditDistribute items. Distribute items along x or y with equal gaps between their boxes (default) or equal spacing of their centres; the two outer items stay. bounds as for alignItems. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], axis: “x” | “y”, by?: “gaps” | “centers” = “gaps”, bounds?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.dragSegmentedsnx pcb drag-segmenteditDrag segment. Drag board copper with the interactive drag engine, DRC-aware: action drag (a segment along its normal, or an arc’s bulge) | corner | via | run (collinear chain) | net (every track and via of a net; pad ends stretch) | bus (parallel segments ids, pitch kept) | break | moveEnd | slide | toArc | retrace (net class width and via size along the run) | reroute (pts replaces the old path between its ends, loop removal). The grip is grip, else end (start | end), else the item’s middle; the cursor goes to to or grip + by (mm). mode: ignore (collisions allowed only with allowViolations) | stop (up to the first obstacle) | walkaround | hug | shove | shoveHug; angle: keep45 | free | keepArcs. Zones of the dirty region are healed (heal). One undo step; drag reports the resolved mode, shoved items and collisions; a refused move fails with check-failed.path: string, action?: “drag” | “corner” | “via” | “run” | “net” | “bus” | “break” | “moveEnd” | “slide” | “toArc” | “retrace” | “reroute” = “drag”, id?: string, ids?: string[], net?: string, grip?: [x, y], end?: “start” | “end”, to?: [x, y], by?: [x, y], mode?: “ignore” | “stop” | “walkaround” | “hug” | “shove” | “shoveHug” = “shove”, angle?: “keep45” | “free” | “keepArcs” = “keep45”, heal?: boolean = true, allowViolations?: boolean = false, pts?: [x, y][], layer?: string, width?: numbernewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps, drag
pcb.dragTrackedsnx pcb drag-trackeditDrag track. KiCad’s 45° drag: move a segment by by along its normal; connected segments follow. Edits the board as one undo step; returns newIds, revision and hash.path: string, id: string, by: [x, y]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.duplicateedsnx pcb duplicateeditDuplicate. Copy items, offset by by (mm); newIds are the copies. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], by: [x, y], withWires?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.editGroupedsnx pcb edit-groupeditEdit symbol / footprint in place. Apply library editor intents (sym.* / fp.* ops and move / rotate / flip / delete, in the library editor’s frame: symbol mm y up, footprint mm) to the instance’s own symbol :_ (the sheet’s lib_symbols) or to the board footprint: a local override, marked on the instance. Wires on moved pins follow. newIds: the library editor ids of new pins / pads / graphics. Edits the board as one undo step; returns newIds, revision and hash.path: string, id: string, intents: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.editInPlace
softforge.edsnx.editInPlace
edsnx pcb edit-in-placeuiEdit in Place. Enter isolation mode on the selected footprint (double-click it): pads, graphics and texts edited in place with the courtyard handles, the rest of the board dimmed. Agents: use pcb.editGroup / pcb.resizeGroup / pcb.setLabelAnchor / pcb.updateLibraryFromInstance. UI-only: needs the open editor.path?: stringobject
pcb.fillZones
softforge.edsnx.fillZones
edsnx pcb fill-zoneseditFill zones. Recompute the filled areas of zones (all when ids is omitted) with the native zone filler. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids?: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.flipedsnx pcb flipeditFlip. Flip items to the other board side (mirrored about the vertical axis through about or their centre). Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], about?: [x, y], wires?: “rubberband” | “reroute” | “detach”, vertical?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.flipToBackedsnx pcb flip-to-backeditFlip to back. Flip the front-side items among ids to the back side, each about its own position (layers swapped, geometry mirrored); items already on the back are left alone. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.groupedsnx pcb groupeditGroup. Group board items (a pad or a footprint text stands for its footprint; a group uuid nests that group). Items leave the group they were in; a group left empty is removed. Writes (group "name" (uuid …) (members …)); newIds = [group uuid]. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], name?: string, locked?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.groupItemsedsnx pcb group-itemseditGroup. Group board items: writes a (group "name" (uuid …) (members …)); newIds = [group uuid]. Items already in a group leave it. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], name?: string, locked?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.healZonesedsnx pcb heal-zoneseditHeal zones. Refill the filled zones whose outline meets region inside that region only (the rest of each fill is kept; islands removed by the zone rule), as a drag commit does. layers limits the copper layers, ids the zones. Unfilled zones and keepouts are left alone. Edits the board as one undo step; returns newIds, revision and hash.path: string, region: [x0, y0, x1, y1], layers?: string[], ids?: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.lockedsnx pcb lockeditLock. Lock board items so tools do not move them (locked false unlocks). Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], locked?: boolean = truenewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.moveedsnx pcb moveeditMove. Move items by a vector (mm). Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], by: [x, y], wires?: “rubberband” | “reroute” | “detach”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.moveFootprintedsnx pcb move-footprinteditMove footprint with its tracks. Move, rotate and flip footprints (by ids or refs) with their attached copper, as the move tool does: by [dx, dy] mm or to [x, y] (the first footprint’s origin), rotate degrees counter-clockwise and flip (other side) about the first footprint (or about). tracks adapts the attached tracks: rubberBand (stretch and re-corner at 45°, default), reroute (rip and route again with the walkaround router), ripUp (delete; the ratsnest shows), keep (leave them). A pad that changes side reaches its track through a via of the net class. Tracks between the moved footprints move rigidly. shove pushes footprints whose courtyards overlap; checks warn (default: apply and list the placement issues), strict (refuse a move with issues) or off. One undo step.path: string, ids?: string[], refs?: string[], by?: [x, y], to?: [x, y], rotate?: number, flip?: boolean, about?: [x, y], tracks?: “rubberBand” | “reroute” | “ripUp” | “keep”, shove?: boolean, checks?: “warn” | “strict” | “off”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps, issues, runs, shoved
pcb.moveTracksedsnx pcb move-trackseditMove tracks. Replace segment polylines (pts [] deletes) and move vias, as push-and-shove does. Edits the board as one undo step; returns newIds, revision and hash.path: string, changes: object[], vias?: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.openBoardSetup
softforge.edsnx.boardSetup
edsnx pcb open-board-setupuiBoard Setup dialog. Open the Board Setup dialog (layers, stack-up, rules, net classes). Agents: use project.boardSetup.get/set. UI-only: needs the open editor.path?: stringobject
pcb.placeFootprintedsnx pcb place-footprinteditPlace footprint. Place library footprint lib:name at at (mm) with rotation rot (degrees) on F.Cu or B.Cu, with reference/value and optional pad nets ({ “1”: “GND” }). newIds = [footprint uuid]. Edits the board as one undo step; returns newIds, revision and hash.path: string, lib: string, name: string, at: [x, y], rot?: number = 0, layer?: “F.Cu” | “B.Cu” = “F.Cu”, ref?: string, value?: string, padNets?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.replaceFootprintedsnx pcb replace-footprinteditChange footprint. Replace a footprint by library footprint lib:name, keeping position, reference, value and pad nets. Edits the board as one undo step; returns newIds, revision and hash.path: string, id: string, lib: string, name: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.resizeGroupedsnx pcb resize-groupeditResize group box. Resize the group box of a symbol (body rectangle, edges on the 1.27 mm grid) or footprint (courtyard / fabrication outline) to [minX, minY, maxX, maxY] in the group’s local frame (mm, y down, unrotated): pins and pads on an edge follow it, labels keep their offset to their anchor (auto: re-placed with their preset). A local override. Edits the board as one undo step; returns newIds, revision and hash.path: string, id: string, box: [x0, y0, x1, y1], auto?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.revertToLibraryedsnx pcb revert-to-libraryeditRevert to library. Drop the local override of a symbol / footprint: it draws its library item again (wires on moved pins follow). Edits the board as one undo step; returns newIds, revision and hash.path: string, id: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.rotateedsnx pcb rotateeditRotate. Rotate items by deg degrees (counter-clockwise as KiCad shows it) about about or their centre. Schematic rotations snap to 90°. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], deg: number, about?: [x, y], wires?: “rubberband” | “reroute” | “detach”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.routeedsnx pcb routeeditRoute. Route a net along a polyline on one copper layer (one track segment per pair of points, mm) and optionally drop vias at given points. Width and via sizes default to the net class, then the board defaults. One undo step; newIds are the segments then the vias.path: string, layer: string, pts: [x, y][], width?: number, net?: string | integer, vias?: array | object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.routersPage
softforge.edsnx.routers.show
edsnx pcb routers-pageuiRouters page. Open the Routers page (providers, capabilities, licences, install / buy / trial links). Agents: use pcb.autoroute.providers. UI-only: needs the open editor.path?: stringobject
pcb.routingOptions
softforge.edsnx.routingOptions
edsnx pcb routing-optionsuiRouting options. Open the interactive router options. Agents: use pcb.route. UI-only: needs the open editor.path?: stringobject
pcb.setAttrsedsnx pcb set-attrseditSet attributes. Generic attribute edit; keys follow Item.attrs from query.items (width, size, drill, layer, layers, net, text, rot, at, …). mm and degrees. Edits the board as one undo step; returns newIds, revision and hash.path: string, id: string, attrs: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setBoardSetupedsnx pcb set-board-setupeditBoard setup. Change board setup: layers, stack-up, design rules, defaults, severities (board file and .kicad_pro). Edits the board as one undo step; returns newIds, revision and hash.path: string, setup: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setDiffPairsedsnx pcb set-diff-pairseditDifferential pairs. Replace the explicit differential pair table (.kicad_pro). Edits the board as one undo step; returns newIds, revision and hash.path: string, pairs: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setGroupRigidedsnx pcb set-group-rigideditSet group rigid. Make a placed symbol / footprint rigid (its labels move only with it) or flexible (labels can be moved one by one and keep their anchored offset); null removes the flag so the softforge.edsnx.symbolGroups.defaultRigid setting decides. Stored as a hidden instance property KiCad keeps. Edits the board as one undo step; returns newIds, revision and hash.path: string, id: string, rigid: boolean | nullnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setLabelAnchoredsnx pcb set-label-anchoreditSet label anchor. One label of a symbol / footprint (field name; board free text by its id fpt:): its anchor on the group box (nw n ne w c e sw s se; null: derived from the position), its lock, an autoposition preset (moves it there), a move to at (mm; refused while the group is rigid or the label locked), or, on a board, KiCad’s Keep upright of the text (upright; false writes (unlocked yes)). Edits the board as one undo step; returns newIds, revision and hash.path: string, id: string, field: string, anchor?: “nw” | “n” | “ne” | “w” | “c” | “e” | “sw” | “s” | “se” | null, locked?: boolean, preset?: “leftAbove” | “centerAbove” | “rightAbove” | “leftCenter” | “rightCenter” | “leftBelow” | “centerBelow” | “rightBelow” | “kicad” | null, at?: [x, y], upright?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setLockededsnx pcb set-lockededitLock / unlock. Lock or unlock board items (locked items are not moved by tools). Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[], locked: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setMatchedGroupsedsnx pcb set-matched-groupseditMatched length groups. Replace the matched length groups (.kicad_pro). Edits the board as one undo step; returns newIds, revision and hash.path: string, groups: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setNetClassesedsnx pcb set-net-classeseditNet classes. Replace the net classes (.kicad_pro); sizes in mm. Edits the board as one undo step; returns newIds, revision and hash.path: string, netClasses: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setPadedsnx pcb set-padeditEdit pad. Edit one pad of a footprint (by number or pad uuid): shape, type, number, size [w, h], drill (Ø or [w, h]), layers, roundRatio, net. Edits the board as one undo step; returns newIds, revision and hash.path: string, footprintId: string, pad: string, attrs: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setPadNetedsnx pcb set-pad-neteditSet pad net. Assign a net to one pad of a footprint (by pad number). Edits the board as one undo step; returns newIds, revision and hash.path: string, footprintId: string, pad: string, net: string | integernewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setPadStackedsnx pcb set-pad-stackeditPad padstack. KiCad 9/10 padstack of one pad (number or uuid): mode normal | front_inner_back | custom, and per-layer shape patches (“F.Cu” is the pad itself; “Inner”, “B.Cu” or copper layer names). Keys: shape, size [w, h], offset, roundRatio, chamferRatio, chamfer, rectDelta, zoneConnect, thermalBridgeWidth, thermalGap, thermalAngle, clearance. Edits the board as one undo step; returns newIds, revision and hash.path: string, footprintId: string, pad: string, mode: “normal” | “front_inner_back” | “custom”, layers?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setProjectSectionedsnx pcb set-project-sectioneditProject section. Replace softforge.<section> of the .kicad_pro (rooms, blocks, …); null or [] removes it. Prefer room.* / block.*, which keep the board in step. Edits the board as one undo step; returns newIds, revision and hash.path: string, section: string, value: anynewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setPropertyedsnx pcb set-propertyeditSet property. Set a field of a footprint or symbol (Reference, Value, Footprint, Datasheet, user fields). Edits the board as one undo step; returns newIds, revision and hash.path: string, id: string, field: string, value: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setTeardropsedsnx pcb set-teardropseditTeardrops. Remove teardrop zones (all, or ids) and add teardrops with their outlines (mm). Edits the board as one undo step; returns newIds, revision and hash.path: string, remove?: string | array, add: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.setZoneedsnx pcb set-zoneeditEdit zone. Change zone settings and/or its outline. Edits the board as one undo step; returns newIds, revision and hash.path: string, id: string, zone: object, pts?: [x, y][]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.splitTrackedsnx pcb split-trackeditSplit track. Split a track segment at at (projected onto it); newIds = [the new segment]. Edits the board as one undo step; returns newIds, revision and hash.path: string, id: string, at: [x, y]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.swapedsnx pcb swapeditSwap. KiCad’s Swap: two items exchange places. Two footprints exchange position, rotation and board side; other pairs exchange their anchor positions. One undo step.path: string, ids: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.unfillZones
softforge.edsnx.unfillZones
edsnx pcb unfill-zoneseditUnfill zones. Remove the filled areas of zones (all when ids is omitted). Edits the board as one undo step; returns newIds, revision and hash.path: string, ids?: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.ungroupedsnx pcb ungroupeditUngroup. Remove groups, given by group uuid or by a member id (its innermost group). The members stay on the board; members of a nested group move up to its parent group. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.ungroupItemsedsnx pcb ungroup-itemseditUngroup. Remove groups (by group uuid, or by a member id: its group). The members stay on the board. Edits the board as one undo step; returns newIds, revision and hash.path: string, ids: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.updateLibraryFromInstanceedsnx pcb update-library-from-instanceeditUpdate library from instance. Push a symbol’s / footprint’s local override to its library item through the library editor (sym.symSetBody / the .kicad_mod): scope ’library’ writes the library only (the instance keeps its own symbol), ‘all’ also updates every instance of the item in this file. The library file is written by the editor host or the CLI. Edits the board as one undo step; returns newIds, revision and hash. Headless runs also write the library file (returned as library).path: string, id: string, scope: “library” | “all”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
pcb.view2d
softforge.edsnx.view2d
edsnx pcb view2dui2D view. Switch the board editor to the 2D view. UI-only: needs the open editor.path?: stringobject
pcb.view3d
softforge.edsnx.view3d
edsnx pcb view3dui3D view. Switch the board editor to the 3D view. Agents: use project.export3d or the render commands. UI-only: needs the open editor.path?: stringobject
Examples
  • pcb.addArcTrack Add arc track: {"path":"board.kicad_pcb","layer":"F.Cu","start":[10,10],"mid":[12.93,12.93],"end":[10,20],"width":0.25}
  • pcb.addComponentDialog Add Component dialog: {}
  • pcb.addDimension Add dimension: {"path":"board.kicad_pcb","kind":"aligned","layer":"Dwgs.User","pts":[[0,0],[50,0]],"height":5}
  • pcb.addGraphic Add graphic: {"path":"board.kicad_pcb","kind":"rect","layer":"Edge.Cuts","pts":[[0,0],[50,40]],"width":0.1}
  • pcb.addNet Add net: {"path":"board.kicad_pcb","name":"SDA"}
  • pcb.addText Add text: {"path":"board.kicad_pcb","layer":"F.SilkS","at":[10,5],"rot":0,"text":"v1.0","size":[1,1],"thickness":0.15}
  • pcb.addTextBox Add text box: {"path":"board.kicad_pcb","layer":"F.SilkS","a":[0,0],"b":[20,10],"text":"Note","size":[1,1],"thickness":0.15}
  • pcb.addTrack Add track: {"path":"board.kicad_pcb","layer":"F.Cu","pts":[[10,10],[20,10]],"width":0.25,"net":"GND"}
  • pcb.addVia Add via: {"path":"board.kicad_pcb","at":[20,10],"size":0.8,"drill":0.4,"layers":["F.Cu","B.Cu"],"net":"GND"}
  • pcb.addZone Add zone: {"path":"board.kicad_pcb","pts":[[0,0],[50,0],[50,40],[0,40]],"zone":{"layers":["B.Cu"],"net":"GND"}}
  • pcb.align Align three footprints on their top edges: {"path":"board.kicad_pcb","ids":["<uuid>","<uuid>","<uuid>"],"mode":"top"}
  • pcb.alignItems Align items: {"path":"board.kicad_pcb","ids":["<uuid>","<uuid>"],"mode":"left"}
  • pcb.applyNetlist Apply netlist: {"path":"board.kicad_pcb","netlistText":"(export (version \"E\") …)","options":{"deleteExtra":false,"replaceFootprints":false,"matchBy":"reference"}}
  • pcb.array Eight LEDs on a circle: {"path":"board.kicad_pcb","ids":["<uuid>"],"kind":"circular","count":8,"center":[100,100],"angle":360,"rotate":true}
  • pcb.arrayItems Create array: {"path":"board.kicad_pcb","ids":["<uuid>"],"kind":"grid","cols":4,"rows":2,"pitch":[2.54,2.54],"renumber":true}
  • pcb.autoposition Autoposition labels: {"path":"board.kicad_pcb","ids":["<uuid>"],"preset":"rightCenter"}
  • pcb.autoroute Route two nets with the built-in router, refuse new DRC violations: {"path":"board.kicad_pcb","provider":"builtin","nets":["GND","+5V"],"budget":120}
  • pcb.autoroute Whole board with Freerouting, 10 passes: {"path":"board.kicad_pcb","provider":"freerouting","passes":10}
  • pcb.autoroute Conformance suite of a provider: {"conformance":"builtin"}
  • pcb.autoroute.cancel Cancel every run: {}
  • pcb.autoroute.providers List the providers: {}
  • pcb.autorouteDialog Autoroute dialog: {}
  • pcb.batch Batch: {"path":"board.kicad_pcb","label":"Two moves","intents":[{"op":"move","ids":["<uuid>"],"by":[1,0]},{"op":"move","ids":["<uuid>"],"by":[0,1]}]}
  • pcb.delete Delete: {"path":"board.kicad_pcb","ids":["<uuid>"]}
  • pcb.distribute Space three footprints evenly in x: {"path":"board.kicad_pcb","ids":["<uuid>","<uuid>","<uuid>"],"axis":"x","by":"centers"}
  • pcb.distributeItems Distribute items: {"path":"board.kicad_pcb","ids":["<uuid>","<uuid>","<uuid>"],"axis":"x"}
  • pcb.dragSegment Drag a segment 1 mm down, shoving other tracks: {"path":"board.kicad_pcb","action":"drag","id":"<uuid>","by":[0,1],"mode":"shove","angle":"keep45","heal":true,"allowViolations":false}
  • pcb.dragSegment Move a via, walking its tracks around obstacles: {"path":"board.kicad_pcb","action":"via","id":"<uuid>","to":[52,48],"mode":"walkaround","angle":"keep45","heal":true,"allowViolations":false}
  • pcb.dragTrack Drag track: {"path":"board.kicad_pcb","id":"<uuid>","by":[0,1]}
  • pcb.duplicate Duplicate: {"path":"board.kicad_pcb","ids":["<uuid>"],"by":[5,0]}
  • pcb.editGroup Edit symbol / footprint in place: {"path":"board.kicad_pcb","id":"<uuid>","intents":[{"op":"symEditPin","id":"pin:NE555P_1_1:2","pin":{"name":"TRIG"}}]}
  • pcb.editInPlace Edit in Place: {}
  • pcb.fillZones Fill zones: {"path":"board.kicad_pcb"}
  • pcb.flip Flip: {"path":"board.kicad_pcb","ids":["<uuid>"]}
  • pcb.flipToBack Flip to back: {"path":"board.kicad_pcb","ids":["<uuid>"]}
  • pcb.group Group: {"path":"board.kicad_pcb","ids":["<uuid>","<uuid>"],"name":"Power stage","locked":false}
  • pcb.groupItems Group: {"path":"board.kicad_pcb","ids":["<uuid>","<uuid>"],"name":"Power stage"}
  • pcb.healZones Heal zones: {"path":"board.kicad_pcb","region":[40,40,60,60]}
  • pcb.lock Lock two footprints: {"path":"board.kicad_pcb","ids":["<uuid>","<uuid>"]}
  • pcb.move Move: {"path":"board.kicad_pcb","ids":["<uuid>"],"by":[2.54,0]}
  • pcb.moveFootprint Move U3 5 mm right, re-routing its tracks: {"path":"board.kicad_pcb","refs":["U3"],"by":[5,0],"tracks":"reroute"}
  • pcb.moveFootprint Flip C4 to the back, stretching its tracks through vias; refuse placement issues: {"path":"board.kicad_pcb","refs":["C4"],"flip":true,"checks":"strict"}
  • pcb.moveTracks Move tracks: {"path":"board.kicad_pcb","changes":[{"id":"<uuid>","pts":[[10,10],[15,15]]}]}
  • pcb.openBoardSetup Board Setup dialog: {}
  • pcb.placeFootprint Place footprint: {"path":"board.kicad_pcb","lib":"Resistor_SMD","name":"R_0603_1608Metric","at":[30,20],"rot":90,"ref":"R7","value":"10k"}
  • pcb.replaceFootprint Change footprint: {"path":"board.kicad_pcb","id":"<uuid>","lib":"Resistor_SMD","name":"R_0805_2012Metric"}
  • pcb.resizeGroup Resize group box: {"path":"board.kicad_pcb","id":"<uuid>","box":[-10.16,-7.62,10.16,7.62]}
  • pcb.revertToLibrary Revert to library: {"path":"board.kicad_pcb","id":"<uuid>"}
  • pcb.rotate Rotate: {"path":"board.kicad_pcb","ids":["<uuid>"],"deg":90}
  • pcb.route Route GND from a pad to a via: {"path":"board.kicad_pcb","layer":"F.Cu","net":"GND","pts":[[10,10],[15,10],[15,14]],"vias":[[15,14]]}
  • pcb.routersPage Routers page: {}
  • pcb.routingOptions Routing options: {}
  • pcb.setAttrs Set attributes: {"path":"board.kicad_pcb","id":"<uuid>","attrs":{"width":0.3}}
  • pcb.setBoardSetup Board setup: {"path":"board.kicad_pcb","setup":{"rules":{"minClearance":0.2}}}
  • pcb.setDiffPairs Differential pairs: {"path":"board.kicad_pcb","pairs":[{"name":"USB","p":"USB_D+","n":"USB_D-"}]}
  • pcb.setGroupRigid Set group rigid: {"path":"board.kicad_pcb","id":"<uuid>","rigid":true}
  • pcb.setLabelAnchor Set label anchor: {"path":"board.kicad_pcb","id":"<uuid>","field":"Reference","preset":"centerAbove","locked":true}
  • pcb.setLocked Lock / unlock: {"path":"board.kicad_pcb","ids":["<uuid>"],"locked":true}
  • pcb.setMatchedGroups Matched length groups: {"path":"board.kicad_pcb","groups":[{"name":"DDR","members":[{"net":"DQ0"},{"net":"DQ1"}],"target":"longest","tolerance":0.5}]}
  • pcb.setNetClasses Net classes: {"path":"board.kicad_pcb","netClasses":[{"name":"Default","clearance":0.2,"trackWidth":0.25,"viaDiameter":0.6,"viaDrill":0.3},{"name":"Power","clearance":0.2,"trackWidth":0.5,"viaDiameter":0.8,"viaDrill":0.4,"patterns":["VCC","GND"]}]}
  • pcb.setPad Edit pad: {"path":"board.kicad_pcb","footprintId":"<uuid>","pad":"1","attrs":{"size":[1,1.2]}}
  • pcb.setPadNet Set pad net: {"path":"board.kicad_pcb","footprintId":"<uuid>","pad":"1","net":"GND"}
  • pcb.setPadStack Pad padstack: {"path":"board.kicad_pcb","footprintId":"<uuid>","pad":"1","mode":"front_inner_back","layers":{"Inner":{"shape":"circle","size":[1.2,1.2]}}}
  • pcb.setProjectSection Project section: {"path":"board.kicad_pcb","section":"rooms","value":[{"name":"Timer","sheet":"/<sheet uuid>/","side":"F"}]}
  • pcb.setProperty Set property: {"path":"board.kicad_pcb","id":"<uuid>","field":"Value","value":"10k"}
  • pcb.setTeardrops Teardrops: {"path":"board.kicad_pcb","remove":"all","add":[]}
  • pcb.setZone Edit zone: {"path":"board.kicad_pcb","id":"<uuid>","zone":{"clearance":0.3}}
  • pcb.splitTrack Split track: {"path":"board.kicad_pcb","id":"<uuid>","at":[15,10]}
  • pcb.swap Swap R1 and R2: {"path":"board.kicad_pcb","ids":["<uuid R1>","<uuid R2>"]}
  • pcb.unfillZones Unfill zones: {"path":"board.kicad_pcb"}
  • pcb.ungroup Ungroup: {"path":"board.kicad_pcb","ids":["<group uuid>"]}
  • pcb.ungroupItems Ungroup: {"path":"board.kicad_pcb","ids":["<group uuid>"]}
  • pcb.updateLibraryFromInstance Update library from instance: {"path":"board.kicad_pcb","id":"<uuid>","scope":"all"}
  • pcb.view2d 2D view: {}
  • pcb.view3d 3D view: {}

Schematic edits#

CommandCLIKindDescriptionArgsResult
sch.addBusEntryedsnx sch add-bus-entryeditAdd bus entry. Add a wire-to-bus entry with one end at at (mm) and the other at at + size (default [2.54, 2.54]). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, at: [x, y], size?: [x, y]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addGraphicedsnx sch add-graphiceditAdd graphic. Add a line, rect (2 points), circle (centre, point on circle), arc (start, mid, end), poly or (schematic) bezier. Width in mm; board footprint graphics with footprintId. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, kind: “line” | “rect” | “circle” | “arc” | “poly” | “bezier”, layer: string, pts: [x, y][], width: number, fill?: boolean, footprintId?: string, style?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addImageedsnx sch add-imageeditAdd image. Place a PNG bitmap (base64 data) at at (mm) with an optional scale. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, at: [x, y], data: string, scale?: number, layer?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addJunctionedsnx sch add-junctioneditAdd junction. Add a junction dot at at (mm). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, at: [x, y]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addLabeledsnx sch add-labeleditAdd label. Add a net label (local, global, hierarchical or netclass directive) at at (mm), rotation in degrees. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, kind?: “local” | “global” | “hierarchical” | “netclass” = “local”, at: [x, y], rot?: number = 0, text: string, shape?: “input” | “output” | “bidirectional” | “tri_state” | “passive”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addNoConnectedsnx sch add-no-connecteditAdd no-connect. Add a no-connect flag on a pin end at at (mm). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, at: [x, y]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addSheetedsnx sch add-sheeteditAdd sheet. Add a hierarchical sheet box at at of size (mm) for sheet file file. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, at: [x, y], size: [x, y], name: string, file: string, sheetPath?: string, fields?: object, style?: object, borderWidth?: numbernewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addSheetPinedsnx sch add-sheet-pineditAdd sheet pin. Add a pin to a sheet box at at (mm, on the sheet border). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, sheetId: string, name: string, at: [x, y], shape: “input” | “output” | “bidirectional” | “tri_state” | “passive”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addTextedsnx sch add-texteditAdd text. Add a text at at (mm), rotation in degrees, size [w, h] mm. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, layer: string, at: [x, y], rot: number, text: string, size: [x, y], thickness: number, mirror?: boolean, footprintId?: string, knockout?: boolean, bold?: boolean, italic?: boolean, justify?: “left” | “center” | “right”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addTextBoxedsnx sch add-text-boxeditAdd text box. Add a text box between corners a and b (mm); the text word-wraps to the box. Board: knockout, border, margins [l, t, r, b], justify, valign, rot, footprintId. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, layer: string, a: [x, y], b: [x, y], text: string, size: [x, y], thickness: number, style?: object, knockout?: boolean, border?: boolean, margins?: [x0, y0, x1, y1], justify?: “left” | “center” | “right”, valign?: “top” | “center” | “bottom”, rot?: number, footprintId?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addWireedsnx sch add-wireeditAdd wire. Add a wire (or bus) polyline: one segment per consecutive pair of points (mm, on the 1.27 mm grid). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, pts: [x, y][], bus?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.addWireVertexedsnx sch add-wire-vertexeditAdd wire vertex. Add a vertex on a wire at at (mm): a two-point wire is split there, a multi-point wire gets a point. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, at: [x, y]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.alignWiresedsnx sch align-wireseditAlign wires. Drag the wires parallel to the first one onto its line; their neighbours stretch and connections are kept (as dragWireSegment). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.annotate
softforge.edsnx.annotate
edsnx sch annotateeditAnnotate. Assign reference numbers (all, or only unannotated symbols) in this file. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, scope?: “all” | “unannotated” = “unannotated”, options?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.autoWireedsnx sch auto-wireeditAuto Wire. Route a wire from pts[0] to pts[1] on the 1.27 mm grid around symbols, pins and wires (A*, Altium Auto Wire / Capture Auto Wire); it touches no other pin or wire end and never overlaps a wire. Further points join the new wires (multiple points, a junction where they land). With bus the last point is on a bus: the wire ends on a new bus entry there, labelled bus.label. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, pts: [x, y][], crossingAvoidance?: number, avoidPinEnds?: “always” | “off”, bus?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.autopositionedsnx sch autopositioneditAutoposition labels. Place the labels of symbols / footprints around their group box: Altium’s eight positions (leftAbove, centerAbove, rightAbove, leftCenter, rightCenter, leftBelow, centerBelow, rightBelow) or KiCad’s default (kicad: the side with the fewest pins); horizontal, justified away from the box, stacked. fields defaults to the visible, unlocked labels. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids: string[], preset: “leftAbove” | “centerAbove” | “rightAbove” | “leftCenter” | “rightCenter” | “leftBelow” | “centerBelow” | “rightBelow” | “kicad”, fields?: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.batchedsnx sch batcheditBatch. Apply several intents as one undo step (rolled back entirely on the first failure). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, label: string, intents: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.cleanupWiresedsnx sch cleanup-wireseditClean up wires. Clean up schematic wires without changing connectivity: remove zero-length and duplicate wires, merge collinear wires meeting end to end, remove junctions joining fewer than three connections and add missing ones, optionally snap dangling ends onto the grid. ids limits it to those wires. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids?: string[], zeroLength?: boolean = true, duplicates?: boolean = true, merge?: boolean = true, junctions?: boolean = true, grid?: boolean = falsenewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.cleanupWiresDialog
softforge.edsnx.cleanupWires
edsnx sch cleanup-wires-dialoguiClean up wires. Clean up wires of the active schematic (merge collinear, zero-length, duplicates, junctions). Agents: use sch.cleanupWires. UI-only: needs the open editor.path?: stringobject
sch.clearAnnotation
softforge.edsnx.clearAnnotation
edsnx sch clear-annotationeditClear annotation. Reset references to “R?” (all symbols, or ids). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids?: string[], sheetPath?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.convertWiresedsnx sch convert-wireseditConvert wire / bus. Turn wires into buses (to: "bus") or buses into wires (to: "wire"), keeping their points. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids: string[], to: “bus” | “wire”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.deleteedsnx sch deleteeditDelete. Delete items. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.dragWireSegmentedsnx sch drag-wire-segmenteditDrag wire segment. Drag a schematic wire segment by by (mm): it moves perpendicular to itself, neighbouring wires stretch and every connection is kept (corners, junctions, labels follow). With end (0 or 1) that end slides along the segment. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, by: [x, y], end?: 0 | 1newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.duplicateedsnx sch duplicateeditDuplicate. Copy items, offset by by (mm); newIds are the copies. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids: string[], by: [x, y], withWires?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.editGroupedsnx sch edit-groupeditEdit symbol / footprint in place. Apply library editor intents (sym.* / fp.* ops and move / rotate / flip / delete, in the library editor’s frame: symbol mm y up, footprint mm) to the instance’s own symbol :_ (the sheet’s lib_symbols) or to the board footprint: a local override, marked on the instance. Wires on moved pins follow. newIds: the library editor ids of new pins / pads / graphics. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, intents: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.editInPlace
softforge.edsnx.editInPlace
edsnx sch edit-in-placeuiEdit in Place. Enter isolation mode on the selected symbol (double-click its body): body, pins and labels edited in place, the rest dimmed; Enter / click outside applies, Esc cancels. Agents: use sch.editGroup / sch.resizeGroup / sch.setLabelAnchor / sch.updateLibraryFromInstance. UI-only: needs the open editor.path?: stringobject
sch.flipedsnx sch flipeditFlip. Mirror items horizontally (or vertically with vertical) about about or their centre. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids: string[], about?: [x, y], wires?: “rubberband” | “reroute” | “detach”, vertical?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.labeledsnx sch labeleditLabel. Name a net with a label at a wire point (mm); kind local (default), global, hierarchical or netclass; rot in degrees (default 0). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, kind?: “local” | “global” | “hierarchical” | “netclass” = “local”, at: [x, y], rot?: number = 0, text: string, shape?: “input” | “output” | “bidirectional” | “tri_state” | “passive”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.mergeWiresedsnx sch merge-wireseditMerge wires. Merge collinear wires that meet end to end with nothing else at the joint (all wires, or ids). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids?: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.moveedsnx sch moveeditMove. Move items by a vector (mm). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids: string[], by: [x, y], wires?: “rubberband” | “reroute” | “detach”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.moveSymboledsnx sch move-symboleditMove symbol with its wires. Move symbols (and any other selected items) by a vector (mm) with the wires on their pins following, as the move tool does: wires rubberband (stretched and re-cornered, the default), reroute (ripped and re-routed by Auto Wire up to the first branch) or detach (left in place). Same as sch.move with wires. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids: string[], by: [x, y], wires?: “rubberband” | “reroute” | “detach”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.moveWireEndedsnx sch move-wire-endeditMove wire end. Move end end (0 = first point) of a wire segment to to (mm). With orthogonal (default true) a diagonal result gets a corner. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, end: 0 | 1, to: [x, y], orthogonal?: boolean = truenewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.openFieldsTable
softforge.edsnx.fieldsTable
edsnx sch open-fields-tableuiSymbol Fields Table. Open the Symbol Fields Table. Agents: use sch.setProperty. UI-only: needs the open editor.path?: stringobject
sch.pageSettings
softforge.edsnx.pageSettings
edsnx sch page-settingsuiPage settings. Open the Page settings dialog of the active schematic (paper size and orientation, title block). Agents: use sch.setPaper / sch.setTitleBlock. UI-only: needs the open editor.path?: stringobject
sch.placeSymboledsnx sch place-symboleditPlace symbol. Place library symbol lib:name at at (mm), rotation (degrees), optional mirror/unit, reference, value and fields (Footprint, Datasheet, MPN…). newIds = [symbol uuid]. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, lib: string, name: string, at: [x, y], rot?: number = 0, mirror?: “x” | “y”, unit?: integer, ref?: string, value?: string, sheetPath?: string, fields?: object, footprint?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.removeWireVertexedsnx sch remove-wire-vertexeditRemove wire vertex. Remove the vertex at at (mm): the two wires meeting there (and nothing else) become one straight wire; with id, the point of that multi-point wire. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, at: [x, y], id?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.replaceSymboledsnx sch replace-symboleditChange symbol. Change a symbol’s library symbol, keeping fields, position and instances. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, lib: string, name: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.resizeGroupedsnx sch resize-groupeditResize group box. Resize the group box of a symbol (body rectangle, edges on the 1.27 mm grid) or footprint (courtyard / fabrication outline) to [minX, minY, maxX, maxY] in the group’s local frame (mm, y down, unrotated): pins and pads on an edge follow it, labels keep their offset to their anchor (auto: re-placed with their preset). A local override. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, box: [x0, y0, x1, y1], auto?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.revertToLibraryedsnx sch revert-to-libraryeditRevert to library. Drop the local override of a symbol / footprint: it draws its library item again (wires on moved pins follow). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.rotateedsnx sch rotateeditRotate. Rotate items by deg degrees (multiples of 90) about about or their centre. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids: string[], deg: number, about?: [x, y], wires?: “rubberband” | “reroute” | “detach”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.setAttrsedsnx sch set-attrseditSet attributes. Generic attribute edit; keys follow Item.attrs from query.items (width, size, drill, layer, layers, net, text, rot, at, …). mm and degrees. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, attrs: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.setGroupRigidedsnx sch set-group-rigideditSet group rigid. Make a placed symbol / footprint rigid (its labels move only with it) or flexible (labels can be moved one by one and keep their anchored offset); null removes the flag so the softforge.edsnx.symbolGroups.defaultRigid setting decides. Stored as a hidden instance property KiCad keeps. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, rigid: boolean | nullnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.setLabelAnchoredsnx sch set-label-anchoreditSet label anchor. One label of a symbol / footprint (field name; board free text by its id fpt:): its anchor on the group box (nw n ne w c e sw s se; null: derived from the position), its lock, an autoposition preset (moves it there), a move to at (mm; refused while the group is rigid or the label locked), or, on a board, KiCad’s Keep upright of the text (upright; false writes (unlocked yes)). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, field: string, anchor?: “nw” | “n” | “ne” | “w” | “c” | “e” | “sw” | “s” | “se” | null, locked?: boolean, preset?: “leftAbove” | “centerAbove” | “rightAbove” | “leftCenter” | “rightCenter” | “leftBelow” | “centerBelow” | “rightBelow” | “kicad” | null, at?: [x, y], upright?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.setPaperedsnx sch set-papereditSet paper. Set the sheet’s paper: a KiCad size (A4, A3, A2, A1, A0, A, B, C, D, E, USLetter, USLegal, USLedger) with an orientation (landscape by default), or User with width and height in mm. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, size: string, orientation?: “portrait” | “landscape”, width?: number, height?: numbernewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.setPropertyedsnx sch set-propertyeditSet property. Set a field of a footprint or symbol (Reference, Value, Footprint, Datasheet, user fields). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, field: string, value: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.setReferenceedsnx sch set-referenceeditSet reference. Set a symbol’s reference designator for one sheet instance (sheetPath, //…) or for every instance; the Reference field follows the first instance, as eeschema writes it. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, ref: string, sheetPath?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.setTitleBlockedsnx sch set-title-blockeditSet title block. Set the sheet’s title block: title, date, rev, company and comments 1–9. A field given empty is removed, a field not given is kept; no field left removes the block. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, title?: string, date?: string, rev?: string, company?: string, comments?: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.splitWireedsnx sch split-wireeditBreak wire. Split a wire segment at at (mm) into two wires meeting there. With gap (mm) a piece of that length is cut out (the net is split); relabel then adds a label with that name on the part left without one. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, at: [x, y], gap?: number, relabel?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.straightenWiresedsnx sch straighten-wireseditStraighten wires. Make diagonal wires orthogonal: an L-shaped pair touching nothing else, else an Auto Wire route between the same ends. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, ids: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.trimWireedsnx sch trim-wireeditTrim / extend wire. Extend a dangling wire end along its line to the first pin, wire end or junction (within 50 mm), or trim an end that overshoots a pin back to it. end picks the end (both are tried when absent). Edits the schematic as one undo step; returns newIds, revision and hash.path: string, id: string, end?: 0 | 1newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.unfoldBusedsnx sch unfold-buseditUnfold from bus. KiCad’s Unfold from Bus (C): a bus entry at at (mm, a point on a bus), a wire from the entry towards to and a local label member (a member net of the bus, e.g. D3 of D[0..7]) at the wire end. newIds = [entry, wire, label]. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, at: [x, y], to: [x, y], member: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.updateLibraryFromInstanceedsnx sch update-library-from-instanceeditUpdate library from instance. Push a symbol’s / footprint’s local override to its library item through the library editor (sym.symSetBody / the .kicad_mod): scope ’library’ writes the library only (the instance keeps its own symbol), ‘all’ also updates every instance of the item in this file. The library file is written by the editor host or the CLI. Edits the schematic as one undo step; returns newIds, revision and hash. Headless runs also write the library file (returned as library).path: string, id: string, scope: “library” | “all”newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.wireedsnx sch wireeditWire. Draw a wire through points (mm; keep them on the 1.27 mm grid so pins connect). Same as sch.addWire. Edits the schematic as one undo step; returns newIds, revision and hash.path: string, pts: [x, y][], bus?: boolean = falsenewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
sch.wiresPanel
softforge.edsnx.wiresPanel
edsnx sch wires-paneluiWires panel. Show the Wires panel (placement mode, crossing avoidance, symbol move mode, wire tools). Agents: use sch.autoWire / sch.cleanupWires. UI-only: needs the open editor.path?: stringobject
Examples
  • sch.addBusEntry Add bus entry: {"path":"root.kicad_sch","at":[101.6,50.8],"size":[2.54,-2.54]}
  • sch.addGraphic Add graphic: {"path":"root.kicad_sch","kind":"rect","layer":"Edge.Cuts","pts":[[0,0],[50,40]],"width":0.1}
  • sch.addImage Add image: {"path":"root.kicad_sch","at":[50,50],"data":"<base64 png>"}
  • sch.addJunction Add junction: {"path":"root.kicad_sch","at":[100.33,50.8]}
  • sch.addLabel Add label: {"path":"root.kicad_sch","kind":"local","at":[110.49,50.8],"rot":0,"text":"VCC"}
  • sch.addNoConnect Add no-connect: {"path":"root.kicad_sch","at":[100.33,50.8]}
  • sch.addSheet Add sheet: {"path":"root.kicad_sch","at":[150,50],"size":[30,20],"name":"Power","file":"power.kicad_sch"}
  • sch.addSheetPin Add sheet pin: {"path":"root.kicad_sch","sheetId":"<uuid>","name":"VCC","at":[150,55],"shape":"input"}
  • sch.addText Add text: {"path":"root.kicad_sch","layer":"F.SilkS","at":[10,5],"rot":0,"text":"v1.0","size":[1,1],"thickness":0.15}
  • sch.addTextBox Add text box: {"path":"root.kicad_sch","layer":"F.SilkS","a":[0,0],"b":[20,10],"text":"Note","size":[1,1],"thickness":0.15}
  • sch.addWire Add wire: {"path":"root.kicad_sch","pts":[[100.33,50.8],[120.65,50.8]]}
  • sch.addWireVertex Add wire vertex: {"path":"root.kicad_sch","id":"<uuid>","at":[110.49,50.8]}
  • sch.alignWires Align wires: {"path":"root.kicad_sch","ids":["<reference uuid>","<uuid>"]}
  • sch.annotate Annotate: {"path":"root.kicad_sch","scope":"unannotated"}
  • sch.autoWire Auto Wire: {"path":"root.kicad_sch","pts":[[100.33,50.8],[130.81,63.5]],"crossingAvoidance":70}
  • sch.autoposition Autoposition labels: {"path":"root.kicad_sch","ids":["<uuid>"],"preset":"rightCenter"}
  • sch.batch Batch: {"path":"root.kicad_sch","label":"Two moves","intents":[{"op":"move","ids":["<uuid>"],"by":[1,0]},{"op":"move","ids":["<uuid>"],"by":[0,1]}]}
  • sch.cleanupWires Clean up wires: {"path":"root.kicad_sch"}
  • sch.cleanupWiresDialog Clean up wires: {}
  • sch.clearAnnotation Clear annotation: {"path":"root.kicad_sch"}
  • sch.convertWires Convert wire / bus: {"path":"root.kicad_sch","ids":["<uuid>"],"to":"bus"}
  • sch.delete Delete: {"path":"root.kicad_sch","ids":["<uuid>"]}
  • sch.dragWireSegment Drag wire segment: {"path":"root.kicad_sch","id":"<uuid>","by":[0,2.54]}
  • sch.duplicate Duplicate: {"path":"root.kicad_sch","ids":["<uuid>"],"by":[5,0]}
  • sch.editGroup Edit symbol / footprint in place: {"path":"root.kicad_sch","id":"<uuid>","intents":[{"op":"symEditPin","id":"pin:NE555P_1_1:2","pin":{"name":"TRIG"}}]}
  • sch.editInPlace Edit in Place: {}
  • sch.flip Flip: {"path":"root.kicad_sch","ids":["<uuid>"]}
  • sch.label Add label: {"path":"root.kicad_sch","at":[110.49,50.8],"text":"VCC"}
  • sch.mergeWires Merge wires: {"path":"root.kicad_sch"}
  • sch.move Move: {"path":"root.kicad_sch","ids":["<uuid>"],"by":[2.54,0]}
  • sch.moveSymbol Move a symbol two grid steps right, re-routing its wires: {"path":"root.kicad_sch","ids":["<symbol uuid>"],"by":[5.08,0],"wires":"reroute"}
  • sch.moveWireEnd Move wire end: {"path":"root.kicad_sch","id":"<uuid>","end":1,"to":[120.65,55.88]}
  • sch.openFieldsTable Symbol Fields Table: {}
  • sch.pageSettings Page settings: {}
  • sch.placeSymbol Place symbol: {"path":"root.kicad_sch","lib":"Device","name":"R","at":[100.33,50.8],"rot":0,"ref":"R1","value":"10k","footprint":"Resistor_SMD:R_0603_1608Metric"}
  • sch.removeWireVertex Remove wire vertex: {"path":"root.kicad_sch","at":[110.49,50.8]}
  • sch.replaceSymbol Change symbol: {"path":"root.kicad_sch","id":"<uuid>","lib":"Device","name":"R_Small"}
  • sch.resizeGroup Resize group box: {"path":"root.kicad_sch","id":"<uuid>","box":[-10.16,-7.62,10.16,7.62]}
  • sch.revertToLibrary Revert to library: {"path":"root.kicad_sch","id":"<uuid>"}
  • sch.rotate Rotate: {"path":"root.kicad_sch","ids":["<uuid>"],"deg":90}
  • sch.setAttrs Set attributes: {"path":"root.kicad_sch","id":"<uuid>","attrs":{"width":0.3}}
  • sch.setGroupRigid Set group rigid: {"path":"root.kicad_sch","id":"<uuid>","rigid":true}
  • sch.setLabelAnchor Set label anchor: {"path":"root.kicad_sch","id":"<uuid>","field":"Reference","preset":"centerAbove","locked":true}
  • sch.setPaper Set paper: {"path":"root.kicad_sch","size":"A3"}
  • sch.setProperty Set property: {"path":"root.kicad_sch","id":"<uuid>","field":"Value","value":"10k"}
  • sch.setReference Set reference: {"path":"root.kicad_sch","id":"<uuid>","ref":"R12"}
  • sch.setTitleBlock Set title block: {"path":"root.kicad_sch","title":"nlinx nano module","rev":"A","comments":["Power"]}
  • sch.splitWire Break wire: {"path":"root.kicad_sch","id":"<uuid>","at":[110.49,50.8]}
  • sch.straightenWires Straighten wires: {"path":"root.kicad_sch","ids":["<uuid>"]}
  • sch.trimWire Trim / extend wire: {"path":"root.kicad_sch","id":"<uuid>"}
  • sch.unfoldBus Unfold from bus: {"path":"root.kicad_sch","at":[101.6,50.8],"to":[111.76,53.34],"member":"D3"}
  • sch.updateLibraryFromInstance Update library from instance: {"path":"root.kicad_sch","id":"<uuid>","scope":"all"}
  • sch.wire Add wire: {"path":"root.kicad_sch","pts":[[100.33,50.8],[120.65,50.8]]}
  • sch.wiresPanel Wires panel: {}

Project#

CommandCLIKindDescriptionArgsResult
project.annotateedsnx project annotateeditAnnotate project. Annotate the schematic hierarchy: every sheet instance (scope “all”) or this sheet, numbering unannotated symbols (mode “unannotated”) or renumbering all; references stay unique across the project. One undo step per sheet file.path: string, scope?: “all” | “sheet” = “all”, mode?: “unannotated” | “all” = “unannotated”, options?: objectnewIds, label, sheets, changed, revision, hash
project.boardSetup.getedsnx project board-setup getqueryGet board setup. The board setup: layers, copper count, thickness, stack-up, design rules (mm), default sizes, net classes, severities.path: stringlayers, copperLayers, thicknessMm, stackup, rules, defaults, netClasses, ruleSeverities, finish, maskPaste, textDefaults, diffPairTable, matchedGroups
project.boardSetup.setedsnx project board-setup seteditSet board setup. Change part of the board setup (the keys given): rules, defaults, layers, stack-up, severities. Same as pcb.setBoardSetup.path: string, setup: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
project.bomedsnx project bomexportExport BOM. Bill of materials (CSV grouped by value, KiCad defaults) or a netlist of the schematic, with kicad-cli on the saved files. Returns the output file.path: string, format?: “csv” | “python-bom” | “netlist-xml” | “netlist” = “csv”, out?: string, variant?: stringfile
project.details
softforge.edsnx.project.details
edsnx project detailsuiProject details. Open the Project details page of a KiCad project (.kicad_pro): sheets, board facts, libraries, outputs, checks, tools and agent, with the actions to open the editors and run the checks; also the read-only editor of .kicad_pro files (2.4.0 #504). UI-only: opens its own page.path?: stringobject
project.drilledsnx project drillexportDrill files. Excellon drill files (and drill map) with kicad-cli into outDir. Returns the files written.path: string, outDir?: string, options?: object, perSpan?: boolean = false, variant?: stringfiles, folder, errors
project.export
softforge.edsnx.interop.export
edsnx project exportexportExport files. Exports design files (folders: every design file below them; KiCad files and KiCad project folders are imported in memory first) through a registered exporter (as, project.formats) into out: kicad, gerber (native Gerber X2 / Excellon / job), odb and ipc2581 (kicad-cli), dsn (Specctra), idx (MCAD baseline), pdf and svg (plots), json (the reduced document), or an add-on format. Returns the files written and the report of what the format cannot hold. edsnx export is the same from the shell.files: string[], as: string, out: string, options?: object, dryRun?: booleanok, exporter, files, summary, report
project.export3dedsnx project export3dexportExport 3D. Export the board as STEP, VRML or glTF binary (.glb) with kicad-cli. Returns the output file.path: string, format?: “step” | “vrml” | “glb” = “step”, out?: string, variant?: stringfile
project.fabricateedsnx project fabricateexportFabrication outputs. Gerbers, drill and position files in one go (kicad-cli) into outDir, plus ODB++ / IPC-2581 when odb / ipc2581 are set. Returns the files written and per-step errors.path: string, format?: “gerber” | “pdf” | “svg” | “dxf” | “ps” = “gerber”, layers?: string[], outDir?: string, options?: object, perSpan?: boolean = false, odb?: boolean | object, ipc2581?: boolean | object, variant?: stringfiles, folder, errors
project.formatsedsnx project formatsqueryImport and export formats. The registered importers (id, name, extensions, origin: builtin or the add-on that registered it) and exporters (id, name, the design kinds they write, the extensions of their files, whether they need kicad-cli, what the format loses).—importers, exporters
project.import
softforge.edsnx.interop.import
edsnx project importtoolImport files. Imports foreign files into design files under to, through the registered importers (project.formats): KiCad 6–10 files, Gerber / Excellon fab sets (a folder, a zip or one file of the set → one board), Eagle 6+ XML schematics, boards and libraries, and add-on formats. Without importer each file goes to the first importer that reads it, a folder to the first importer that reads something in it. Returns the design files written and the loss report (what was dropped, approximated, kept as text, not attached). edsnx import is the same from the shell.files: string[], to: string, importer?: string, options?: object, dryRun?: booleanok, importers, designs, attachments, summary, report
project.importReport
softforge.edsnx.interop.showReport
edsnx project import-reportuiShow import report. Shows the loss report of the last import or export in the Problems view (one entry per file, object and reason) and offers to open the design files it wrote.—shown
project.ipc2581edsnx project ipc2581exportExport IPC-2581. IPC-2581 of the board with kicad-cli (KiCad 8+): revision B or C, units, precision, compression and the BOM columns from symbol fields. Writes /-ipc2581.xml by default. Returns the file.path: string, outDir?: string = “fab/”, out?: string, options?: objectfile, kind, bytes
project.migrateDesign
softforge.edsnx.design.migrateProject
edsnx project migrate-designtoolMigrate project to design files. Converts a KiCad project to a native project: every KiCad file of the project folder gets its design file next to it (meta.kicad: "export"); a compatibility cache in step keeps its history. The design files become authoritative and the KiCad files an export target, written on every save. The KiCad files are not changed. Returns the files written and the importer’s loss report.project: string, dryRun?: booleanproject, designs, summary, report
project.netClasses.getedsnx project net-classes getqueryGet net classes. Net classes of the project (sizes in mm, patterns) and the class of each net.path: stringnetClasses, assignments
project.netClasses.setedsnx project net-classes seteditSet net classes. Replace the net classes (.kicad_pro): name, clearance, track width, via sizes (mm), patterns. Same as pcb.setNetClasses.path: string, netClasses: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
project.newedsnx project newtoolNew project. Create a KiCad project from a template in a new folder (out, default ./): .kicad_pro, root .kicad_sch with a title block, .kicad_pcb with the template’s layer stack, stack-up, design rules, net classes and board outline (size WxH mm at origin), .kicad_prl and project library tables. The files are written when the command returns (no session_save needed). Returns the folder, the files and the resolved template, stack-up, size and copper layer count; –dry-run returns the plan only.name: string, template?: “2layer” | “4layer” | “6layer” = “2layer”, size?: string, stackup?: “generic-2l-1.6” | “generic-2l-0.8” | “jlc-4l-1.6” | “generic-4l-1.6” | “generic-6l-1.2”, out?: string, title?: string, company?: string, rev?: string, origin?: [x, y], force?: boolean, date?: stringdir, name, project, schematic, board, files, template, stackup, size, origin, copperLayers, dryRun
project.odbedsnx project odbexportExport ODB++. ODB++ of the board with kicad-cli (KiCad 9+): units, precision, compression zip/tgz/none. Writes /-odb.zip by default (outDir default fab/). Returns the file.path: string, outDir?: string = “fab/”, out?: string, options?: objectfile, kind, bytes
project.openBom
softforge.edsnx.bom
edsnx project open-bomuiBOM dialog. Open the BOM dialog. Agents: use project.bom. UI-only: needs the open editor.path?: stringobject
project.openFabOutputs
softforge.edsnx.fabOutputs
edsnx project open-fab-outputsuiFabrication Outputs dialog. Open the Fabrication Outputs dialog. Agents: use project.plot / drill / position / fabricate. UI-only: needs the open editor.path?: stringobject
project.plot
softforge.edsnx.plot
edsnx project plotexportPlot (Gerbers). Plot board layers with kicad-cli (Gerber by default, also pdf/svg/dxf/ps) into outDir (default fab/). Unsaved edits are plotted from a temp copy. Returns the files written.path: string, format?: “gerber” | “pdf” | “svg” | “dxf” | “ps” = “gerber”, layers?: string[], outDir?: string, options?: object, variant?: stringfiles, folder, errors
project.positionedsnx project positionexportPosition files. Component position (pick and place) files with kicad-cli into outDir. Returns the files written.path: string, outDir?: string, options?: object, variant?: stringfiles, folder, errors
project.syncPlanedsnx project sync-planqueryPlan Update PCB. What project.updatePcb would do, without changing anything: counts per action kind, action messages and warnings.path: string, schematic?: string, netlistFile?: string, options?: objectempty, stats, actions, warnings
project.updatePcb
softforge.edsnx.updateFromSchematic
edsnx project update-pcbeditUpdate PCB from Schematic. Carry the schematic over to the board (KiCad’s F8): export the netlist with kicad-cli (or read netlistFile), add/replace footprints from the libraries, set pad nets, values and references, delete extras when asked. One undo step; returns the plan’s action messages and warnings.path: string, schematic?: string, netlistFile?: string, options?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps, actions, warnings
project.updateSchematic
softforge.edsnx.updateSchematicFromPcb
edsnx project update-schematiceditUpdate Schematic from PCB. Back-annotate the board to the schematic (KiCad’s Update Schematic from PCB): re-annotated references (per sheet instance), values, footprint ids, DNP / exclude-from-BOM flags and, with the schematic netlist (kicad-cli or netlistFile), net names renamed on the board (local and global labels). Footprints are matched to symbols by their uuid path, then by reference. One undoable group across the sheets; returns the plan’s messages, warnings and the sheets changed.path: string, schematic?: string, netlistFile?: string, options?: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps, actions, warnings, sheets
Examples
  • project.annotate Number every new symbol: {"path":"root.kicad_sch"}
  • project.boardSetup.get Design rules: {"path":"board.kicad_pcb"}
  • project.boardSetup.set Tighter clearance: {"path":"board.kicad_pcb","setup":{"rules":{"minClearance":0.15}}}
  • project.bom BOM as CSV: {"path":"root.kicad_sch","out":"fab/bom.csv"}
  • project.details Project details: {}
  • project.drill Into fab/: {"path":"board.kicad_pcb","outDir":"fab/"}
  • project.export Gerbers of a board: {"files":["blinky.design.pcb"],"as":"gerber","out":"fab/"}
  • project.export The sample project as Specctra DSN: {"files":["examples/sample-project"],"as":"dsn","out":"route/"}
  • project.export3d STEP model: {"path":"board.kicad_pcb","format":"step","out":"fab/board.step"}
  • project.fabricate Into fab/: {"path":"board.kicad_pcb","outDir":"fab/"}
  • project.formats What can be imported and exported: {}
  • project.import An Eagle board and schematic: {"files":["divider.brd","divider.sch"],"to":"design/"}
  • project.import A fab set as a board: {"files":["fab/"],"to":"design/","importer":"gerber"}
  • project.importReport Show the last report: {}
  • project.ipc2581 IPC-2581 rev C with manufacturer part numbers: {"path":"board.kicad_pcb","options":{"version":"C","bomMfgPn":"MPN"}}
  • project.migrateDesign Migrate the sample project: {"project":"examples/sample-project/blinky.kicad_pro"}
  • project.netClasses.get Classes and assignments: {"path":"board.kicad_pcb"}
  • project.netClasses.set A power class: {"path":"board.kicad_pcb","netClasses":[{"name":"Default","clearance":0.2,"trackWidth":0.25,"viaDiameter":0.6,"viaDrill":0.3},{"name":"Power","clearance":0.2,"trackWidth":0.6,"viaDiameter":0.8,"viaDrill":0.4,"patterns":["+5V","GND"]}]}
  • project.new A 2-layer 50 x 35 mm board: {"name":"blinky","template":"2layer","size":"50x35"}
  • project.new A 4-layer board on the JLC stack-up: {"name":"logger","template":"4layer","size":"80x60","stackup":"jlc-4l-1.6","out":"hw/logger"}
  • project.odb ODB++ zip into fab/: {"path":"board.kicad_pcb","outDir":"fab/"}
  • project.openBom BOM dialog: {}
  • project.openFabOutputs Fabrication Outputs dialog: {}
  • project.plot Gerbers into fab/: {"path":"board.kicad_pcb","outDir":"fab/"}
  • project.position Into fab/: {"path":"board.kicad_pcb","outDir":"fab/"}
  • project.syncPlan Preview the sync: {"path":"board.kicad_pcb"}
  • project.updatePcb Sync the board with its schematic: {"path":"board.kicad_pcb"}
  • project.updatePcb Also delete footprints not in the schematic: {"path":"board.kicad_pcb","options":{"deleteExtra":true,"replaceFootprints":true,"matchBy":"reference"}}
  • project.updateSchematic Back-annotate the board (dry run first with –dry-run): {"path":"board.kicad_pcb"}
  • project.updateSchematic Only references and values, matched by reference: {"path":"board.kicad_pcb","options":{"footprints":false,"attributes":false,"netNames":false,"matchBy":"reference"}}

Queries#

CommandCLIKindDescriptionArgsResult
query.boundsedsnx query boundsqueryBounds. Bounding box [minX, minY, maxX, maxY] (mm) of the board outline (or the whole document), or of the given ids / filter; with the item count.path: string, ids?: string[], type?: string | array, net?: string | array, ref?: string | array, layer?: string | arraybounds, count, source
query.describeedsnx query describequeryDescribe document. Overview of a board or schematic: bounds (board outline, mm), layers, item counts per kind, net count, unrouted connections, revision and hash; boards add copper layers, thickness, default sizes and net classes; schematics list the sheet hierarchy. checks: true adds native DRC/ERC error and warning counts.path: string, checks?: boolean = falsepath, kind, revision, hash, bounds, layers, counts, nets, unrouted
query.freeAreaedsnx query free-areaqueryFree area. Room around a point on a copper layer: free is the distance (mm) from at to the nearest copper/hole/edge/keepout obstacle (capped at radius), insideBoard whether the point is inside the outline, then the obstacles within radius (nearest first) with id, kind, net and distance. Use it to place vias, footprints or route detours.path: string, at: [x, y], radius?: number = 5, layer?: string = “F.Cu”, limit?: integer = 50at, radius, free, layer, insideBoard, obstacles
query.groupsedsnx query groupsqueryMatched-length groups. Matched-length groups of the .kicad_pro (net_settings.matched_groups): each group with its target (mm or ps; “longest” resolved), tolerance, skew, verdict (ok) and one row per member net: routed length, routed plus the ratsnest remainder, delta to the target, status (ok / short / long / unrouted) and via count. name glob filters.path: string, name?: string | array, limit?: integer = 200total, ok, groups
query.itemsedsnx query itemsqueryList items. Items matching a filter (AND of: type, layer, net, ref globs; value glob; text substring; within [x0, y0, x1, y1]; near { at, r }; ids). Returns total, counts per type, the bounds of all matches, then up to limit (200) concise items: id, type, layer, net, ref, value, lib, at, rot, bounds, width, pads. Boards: footprint, track, arc, via, zone, graphic, text, dimension (and pad when asked by type); schematics: symbol, sheet, sheetPin, wire, bus, junction, noConnect, label, globalLabel, hierLabel, text.path: string, type?: string | array, layer?: string | array, net?: string | array, ref?: string | array, value?: string, text?: string, within?: [x0, y0, x1, y1], near?: object, ids?: string[], limit?: integer = 200total, returned, bounds, counts, items
query.netedsnx query netqueryNet details. One net: summary, its pads (“R1.2” with position), tracks, vias and zones (concise items) and its unrouted connections.path: string, name: string, limit?: integer = 200net, pads, items, unrouted
query.netsedsnx query netsqueryList nets. Nets with their class, pad count, track and via counts, routed length (mm) and unrouted connection count; net glob filters, unroutedOnly keeps nets still to route. Up to limit nets, total first.path: string, net?: string | array, unroutedOnly?: boolean = false, limit?: integer = 200total, unrouted, nets
query.pairsedsnx query pairsqueryDifferential pairs. Differential pairs of a board: the explicit table of the .kicad_pro, then KiCad’s name rule (_P/_N, +/-) and net-class suffixes. Each pair: name, positive and negative net, source (explicit / name / class), net class, resolved width, gap and via gap (mm), routed length of each side (mm), skew (|P − N| mm), unrouted connections and whether both sides are routed. name glob filters.path: string, name?: string | array, limit?: integer = 200total, pairs
query.ratsnestedsnx query ratsnestqueryRatsnest. The ratsnest: connections still to route, each with its net, the pads it joins (“R1.2” → “U1.5”), their positions and the straight length (mm). Sorted shortest first; net glob filters. Alias of query.unrouted.path: string, net?: string | array, limit?: integer = 200total, connections
query.selectedsnx query selectquerySelect ids. Ids of the items matching a filter (same filter as query.items), for chaining into edits (move, delete, setLocked…). Returns total and up to limit ids.path: string, type?: string | array, layer?: string | array, net?: string | array, ref?: string | array, value?: string, text?: string, within?: [x0, y0, x1, y1], near?: object, ids?: string[], limit?: integer = 1000total, ids
query.sheetTreeedsnx query sheet-treequerySheet hierarchy. The schematic hierarchy of the project a sheet belongs to: root file, project name, and the tree of sheets (instance path, name, file, page).path: stringroot, project, sheets, tree
query.unroutededsnx query unroutedqueryUnrouted connections. The ratsnest: connections still to route, each with its net, the pads it joins (“R1.2” → “U1.5”), their positions and the straight length (mm). Sorted shortest first; net glob filters.path: string, net?: string | array, limit?: integer = 200total, connections
query.violationsedsnx query violationsqueryViolations. Native DRC (boards) or ERC (schematics, whole hierarchy) violations of the current unsaved text: counts per rule, then violations with rule, severity, message, position (mm) and item ids. Options: rules, severity, limit, includeExcluded.path: string, rules?: string[], severity?: “all” | “error” | “warning” = “all”, limit?: integer = 200, includeExcluded?: boolean = falseerrors, warnings, total, violations
Examples
  • query.bounds Board outline: {"path":"board.kicad_pcb"}
  • query.bounds Extent of U1 and U2: {"path":"board.kicad_pcb","ref":["U1","U2"]}
  • query.describe Board overview with check counts: {"path":"board.kicad_pcb","checks":true}
  • query.freeArea Room for a via near a pad: {"path":"board.kicad_pcb","at":[100,100],"radius":2,"layer":"B.Cu"}
  • query.groups Every group and its verdict: {"path":"board.kicad_pcb"}
  • query.items Footprints whose reference starts with R: {"path":"board.kicad_pcb","type":"footprint","ref":"R*"}
  • query.items Tracks of GND on the bottom layer: {"path":"board.kicad_pcb","type":"track","net":"GND","layer":"B.Cu"}
  • query.items Anything within 5 mm of a point: {"path":"board.kicad_pcb","near":{"at":[100,100],"r":5}}
  • query.net Everything on GND: {"path":"board.kicad_pcb","name":"GND"}
  • query.nets Nets left to route: {"path":"board.kicad_pcb","unroutedOnly":true}
  • query.pairs Every pair with its skew: {"path":"board.kicad_pcb"}
  • query.pairs USB pairs only: {"path":"board.kicad_pcb","name":"USB*"}
  • query.ratsnest What is left to route: {"path":"board.kicad_pcb"}
  • query.select Every via of net GND: {"path":"board.kicad_pcb","type":"via","net":"GND"}
  • query.sheetTree Hierarchy of the project: {"path":"root.kicad_sch"}
  • query.unrouted What is left to route: {"path":"board.kicad_pcb"}
  • query.violations Clearance problems only: {"path":"board.kicad_pcb","rules":["clearance"]}

Libraries#

CommandCLIKindDescriptionArgsResult
lib.footprint.addPadedsnx lib footprint add-padeditAdd pad. Add a pad to a .kicad_mod (fp.fpAddPad): defaults SMD roundrect 1 × 1 mm, next free number.path: string, pad: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
lib.footprint.exportedsnx lib footprint exportexportExport footprint. Export a footprint: svg (kicad-cli fp export svg, one file per footprint into out), or board (a .kicad_pcb holding the footprint at the origin, for kicad-cli pcb drc / export).path: string, format: “svg” | “board”, out?: string, layers?: stringfiles
lib.footprint.getedsnx lib footprint getqueryFootprint model. A footprint as the editor sees it: pads (number, type, shape, position, size, drill, layers, margins, thermal settings, custom primitives), graphics per layer, texts, attributes, clearances, 3D models, properties, net ties. Ids feed the fp.* edit commands.path?: string, lib?: string, name?: string, project?: stringname, version, layer, description, keywords, locked, properties, attrs, clearances, netTieGroups, models, pads, graphics, texts, textBoxes, zones, courtyard, bbox
lib.footprint.listedsnx lib footprint listqueryList library footprints. The footprints of a .pretty folder (path) or of a library nickname (lib, from the fp-lib-table of project): name, description, keywords, pad count, smd.path?: string, lib?: string, project?: string, query?: string, limit?: integer = 500total, footprints
lib.footprint.newedsnx lib footprint neweditNew footprint. Write a new footprint file: blank, a copy of from (renamed), or a wizard result (wizard: soic, qfp, qfn, bga, dip, sip, chip, tht2, header, mountingHole with params). path is the .kicad_mod to write or the .pretty folder (then name or the wizard names the file).path: string, name?: string, from?: string, wizard?: “soic” | “qfp” | “qfn” | “bga” | “dip” | “sip” | “chip” | “tht2” | “header” | “mountingHole”, params?: object, overwrite?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
lib.footprint.padArrayedsnx lib footprint pad-arrayeditPad array. Grid or circular array of a pad (fp.fpPadArray): template is a pad id or a pad spec; numbering numeric, alpha or bga.path: string, template: string | object, array: object, removeTemplate?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
lib.footprint.renumberedsnx lib footprint renumbereditRenumber pads. Renumber pads: in the order of ids, or every pad by order (file, rows: by y then x, columns: by x then y, ccw: counter-clockwise from the top left as IC pins run), from start by step with a prefix.path: string, ids?: string[], order?: “file” | “rows” | “columns” | “ccw” = “file”, start?: integer = 1, step?: integer = 1, prefix?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
lib.footprint.set3dModeledsnx lib footprint set3d-modeledit3D model. Set or add a 3D model (fp.fpSet3dModel); remove: true removes model index.path: string, index?: integer, model?: object, remove?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
lib.footprint.setAttrsedsnx lib footprint set-attrseditFootprint attributes. Footprint attributes (fp.fpSetAttrs) and, in one step, description / keywords.path: string, attrs?: object, description?: string, keywords?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
lib.footprint.wizardedsnx lib footprint wizardqueryFootprint wizard. Without kind: the wizards and their parameters (mm). With kind: the generated footprint (name, pads, courtyard) and its .kicad_mod text; lib.footprint.new writes it.kind?: “soic” | “qfp” | “qfn” | “bga” | “dip” | “sip” | “chip” | “tht2” | “header” | “mountingHole”, params?: object, name?: string, text?: boolean = trueobject
lib.footprintModels
softforge.edsnx.model3d.footprintModels
edsnx lib footprint-modelsui3D models of the footprint. List the (model …) entries of the footprint open in the Footprint Editor, resolved against the KiCad environment (KICAD*_3DMODEL_DIR, KIPRJMOD), and open the chosen one in the 3D model viewer (2.5.0 #510). UI-only: needs the open editor.path?: stringobject
lib.importedsnx lib importexportImport a library. Import a foreign library into KiCad libraries: Altium .SchLib / .PcbLib / .IntLib, Eagle .lbr, EasyEDA / LCSC JSON, SnapEDA / Ultra Librarian / SamacSys zip packages. Writes/.kicad_sym, .pretty and .3dshapes (merged into existing ones) and returns the loss report (what could not be mapped).file: string, format?: “altium” | “eagle” | “easyeda” | “package”, out: string, dir?: stringfiles, symbols, footprints, models, report, text
lib.listedsnx lib listqueryList libraries. Footprint or symbol libraries from the global and project library tables: nickname, uri, description, source (global/project).kind: “footprint” | “symbol”, path?: stringtotal, libraries
lib.manage
softforge.edsnx.libraries.manage
edsnx lib manageuiManage libraries. Open the library manager. Agents: use lib.list / lib.search. UI-only: needs the open editor.path?: stringobject
lib.managed.approveedsnx lib managed approveexportSet part review states. Set the review state of managed library parts (keys “symbol:Lib:Name” / “footprint:Lib:Name”) in library.json: approved (default), draft or deprecated, with the reviewer, a note and a replacement; commit commits library.json.path: string, parts: string[], state?: “approved” | “draft” | “deprecated” = “approved”, by?: string, note?: string, replacedBy?: string, commit?: boolean = falseobject
lib.managed.statusedsnx lib managed statusqueryManaged library status. Status of a managed library repository (a git folder with library.json): name, version, HEAD, upstream, behind / ahead, update available (with fetch), the sidecar diff to the upstream and the draft / approved / deprecated counts.path: string, fetch?: boolean = falseobject
lib.managed.syncedsnx lib managed syncexportSync library.json. Sync a managed library’s library.json with its files: new parts become draft, removed parts are dropped (or deprecated with deprecateMissing), approved parts whose content changed go back to draft. Returns the changes.path: string, deprecateMissing?: boolean = falsechanges, file
lib.managed.whereUsededsnx lib managed where-usedqueryWhere used. Projects (under roots, default the current folder) whose schematics or boards use lib:name (or any part of the library without name): file, reference, lib id.lib: string, name?: string, roots?: string[]projects, uses
lib.openModel3d
softforge.edsnx.model3d.open
edsnx lib open-model3duiOpen 3D model. Open a 3D model file (.step, .stp, .wrl, .glb, .gltf) in the 3D model viewer: STEP and VRML are converted once with kicad-cli (pcb export glb), glTF loads as it is; the bounding box in mm, Fit / Iso / Top (2.5.0 #510). UI-only: opens its own page.path?: stringobject
lib.previewedsnx lib previewqueryLibrary item details. One footprint or symbol: description, keywords, datasheet; footprints add their pads (number, position relative to the anchor in mm, size, shape, layer) and bounds; symbols add units, pins (number, name, electrical type, position) and the compatible footprints from the footprint filters.kind: “footprint” | “symbol”, lib: string, name: string, unit?: integer, path?: stringkind, lib, name, description, keywords, datasheet, pads, smd, units, unitNames, pins, power, footprint, fpFilters, compatible, bounds, padList
lib.searchedsnx lib searchquerySearch libraries. Search footprints and/or symbols by words (name, description, keywords; all words must match), optionally in one library. Returns totals and up to limit hits: lib, name, description, pads/smd (footprints), units/footprint (symbols). Place hits with pcb.placeFootprint / sch.placeSymbol.query: string, kind?: “footprint” | “symbol” | “both” = “both”, lib?: string, limit?: integer = 25, path?: stringfootprints, symbols
lib.symbol.addGraphicedsnx lib symbol add-graphiceditAdd graphic to library symbol. Add a body graphic to a library symbol: rect [start, end], circle [centre, point on circle], arc [start, mid, end], line/poly/bezier points or text [at]; library mm, y up; unit 0 = all units. Fill: style.fillType none/outline/background/color.path: string, symbol: string, unit?: integer, bodyStyle?: integer, kind: “line” | “rect” | “circle” | “arc” | “poly” | “bezier” | “text”, pts: [x, y][], width?: number, style?: object, text?: string, size?: number, rot?: numberpath, changed, newIds, dryRun, diff
lib.symbol.addPinedsnx lib symbol add-pineditAdd pin to library symbol. Add a pin to a library symbol: number, name, electrical type, graphic shape, connection point (library mm, y up), orientation (direction towards the body), length, unit and body style. newIds = [pin id].path: string, symbol: string, number: string, name?: string = “~”, type?: “input” | “output” | “bidirectional” | “tri_state” | “passive” | “free” | “unspecified” | “power_in” | “power_out” | “open_collector” | “open_emitter” | “no_connect” = “passive”, shape?: “line” | “inverted” | “clock” | “inverted_clock” | “input_low” | “clock_low” | “output_low” | “edge_clock_high” | “non_logic” = “line”, at: [x, y], rot?: number = 0, length?: number = 2.54, hidden?: boolean, unit?: integer = 1, bodyStyle?: integer = 1path, changed, newIds, dryRun, diff
lib.symbol.deleteedsnx lib symbol deleteeditDelete library symbol. Delete a symbol from a .kicad_sym library (refused while other symbols extend it).path: string, name: stringpath, changed, newIds, dryRun, diff
lib.symbol.exportedsnx lib symbol exporteditExport library symbol. Copy a symbol to another .kicad_sym library (created when missing), optionally renamed. A derived symbol is flattened unless its parent is in the target library; replace overwrites a symbol of the same name.path: string, name: string, to: string, as?: string, replace?: boolean = falsepath, changed, newIds, dryRun, diff
lib.symbol.getedsnx lib symbol getqueryLibrary symbol details. One symbol of a .kicad_sym library as the symbol editor sees it: fields, flags, units, De Morgan, pin options, every pin (id, number, name, type, shape, position, orientation, length, unit, body style, alternates) and body graphic (id, kind, points). Library mm, y up.path: string, name: stringname, fields, units, pins, graphics
lib.symbol.listedsnx lib symbol listqueryList library symbols. The symbols of a .kicad_sym library: name, parent (extends), units, De Morgan, power, pin count, description and keywords.path: stringpath, total, symbols
lib.symbol.newedsnx lib symbol neweditNew library symbol. Create a symbol in a .kicad_sym library (the file is created when missing): from scratch with fields, units, De Morgan and power flag, or derived from another symbol (extends). Add pins and graphics with lib.symbol.addPin / addGraphic.path: string, name: string, extends?: string, reference?: string, value?: string, footprint?: string, datasheet?: string, description?: string, keywords?: string, fpFilters?: string[], units?: integer, deMorgan?: boolean, power?: boolean, text?: string, replace?: booleanpath, changed, newIds, dryRun, diff
lib.symbol.setPropertyedsnx lib symbol set-propertyeditSet library symbol field. Set or add a field of a library symbol (Reference, Value, Footprint, Datasheet, Description, ki_keywords, ki_fp_filters or a user field); optional position (library mm), visibility and size.path: string, symbol: string, key: string, value: string, at?: [x, y], hidden?: boolean, size?: numberpath, changed, newIds, dryRun, diff
Examples
  • lib.footprint.addPad A THT pad: {"path":"Custom.pretty/MyPart.kicad_mod","pad":{"at":[2.54,0],"type":"thru_hole","shape":"circle","size":[1.7,1.7],"drill":{"diameter":1}}}
  • lib.footprint.export SVG of a footprint: {"path":"Custom.pretty/MyPart.kicad_mod","format":"svg","out":"svg"}
  • lib.footprint.get A library file: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod"}
  • lib.footprint.get From the global libraries: {"lib":"Resistor_SMD","name":"R_0603_1608Metric"}
  • lib.footprint.list Footprints of a project library: {"path":"Custom.pretty"}
  • lib.footprint.list A global library: {"lib":"Package_SO","query":"SOIC-8"}
  • lib.footprint.new SOIC-14 from the wizard: {"path":"Custom.pretty","wizard":"soic","params":{"pins":14}}
  • lib.footprint.new Blank: {"path":"Custom.pretty","name":"MyPart"}
  • lib.footprint.padArray 2 × 10 header grid from a new pad: {"path":"Custom.pretty/MyPart.kicad_mod","template":{"at":[0,0],"type":"thru_hole","shape":"circle","size":[1.7,1.7]},"array":{"kind":"grid","nx":2,"ny":10,"dx":2.54,"dy":2.54}}
  • lib.footprint.renumber Counter-clockwise from 1: {"path":"Custom.pretty/MyPart.kicad_mod","order":"ccw"}
  • lib.footprint.set3dModel Offset the model: {"path":"Custom.pretty/MyPart.kicad_mod","index":0,"model":{"offset":[0,0,0.1]}}
  • lib.footprint.setAttrs SMD, excluded from the BOM: {"path":"Custom.pretty/MyPart.kicad_mod","attrs":{"type":"smd","excludeFromBom":true}}
  • lib.footprint.wizard List the wizards: {}
  • lib.footprint.wizard A 0805 resistor: {"kind":"chip","params":{"size":"0805","prefix":"R"},"text":false}
  • lib.footprintModels 3D models of the footprint: {}
  • lib.import An Eagle library: {"file":"parts.lbr","format":"eagle","out":"Eagle_parts"}
  • lib.import An Altium schematic library: {"file":"OpAmps.SchLib","out":"OpAmps"}
  • lib.list Footprint libraries of a project: {"kind":"footprint","path":"board.kicad_pcb"}
  • lib.manage Manage libraries: {}
  • lib.managed.approve Approve a symbol and commit: {"path":"libs/acme","parts":["symbol:Acme:R_10k"],"commit":true}
  • lib.managed.status Check for updates: {"path":"libs/acme","fetch":true}
  • lib.managed.sync After adding parts: {"path":"libs/acme"}
  • lib.managed.whereUsed Uses of a symbol: {"lib":"Acme","name":"R_10k"}
  • lib.openModel3d Open 3D model: {}
  • lib.preview Pads of a footprint: {"kind":"footprint","lib":"Resistor_SMD","name":"R_0603_1608Metric"}
  • lib.preview Pins of a symbol: {"kind":"symbol","lib":"Device","name":"R"}
  • lib.search 0603 resistor footprints: {"query":"0603 resistor","kind":"footprint"}
  • lib.search Op-amp symbols: {"query":"opamp dual","kind":"symbol","limit":10}
  • lib.symbol.addGraphic A body rectangle with the background fill: {"path":"MyLib.kicad_sym","symbol":"MyChip","unit":0,"kind":"rect","pts":[[-7.62,5.08],[7.62,-5.08]],"width":0.254,"style":{"fillType":"background"}}
  • lib.symbol.addPin A power pin on the left: {"path":"MyLib.kicad_sym","symbol":"MyChip","number":"1","name":"VCC","type":"power_in","at":[-10.16,2.54],"rot":0}
  • lib.symbol.delete Delete a symbol: {"path":"MyLib.kicad_sym","name":"MyChip"}
  • lib.symbol.export Copy a symbol to the project library: {"path":"/usr/share/kicad/symbols/Device.kicad_sym","name":"R","to":"Project.kicad_sym"}
  • lib.symbol.get Pins and fields of a symbol: {"path":"MyLib.kicad_sym","name":"MyChip"}
  • lib.symbol.list Symbols of a library: {"path":"MyLib.kicad_sym"}
  • lib.symbol.new A new IC symbol: {"path":"MyLib.kicad_sym","name":"MyChip","reference":"U","value":"MyChip","footprint":"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm"}
  • lib.symbol.new A derived symbol: {"path":"MyLib.kicad_sym","name":"MyChipB","extends":"MyChip","value":"MyChipB"}
  • lib.symbol.setProperty Set the footprint: {"path":"MyLib.kicad_sym","symbol":"MyChip","key":"Footprint","value":"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm"}

Checks#

CommandCLIKindDescriptionArgsResult
check.drc
softforge.edsnx.runDrc
edsnx check drccheckRun DRC. Design rule check of a board: counts (errors, warnings, per rule) then violations with rule id, severity, message, position (mm) and item ids. Native engine by default (unsaved text, kicad-cli rule ids); engine “kicad-cli” runs KiCad’s own DRC with schematic parity.path: string, engine?: “native” | “kicad-cli” | “auto” = “native”, rules?: string[], severity?: “all” | “error” | “warning” = “all”, limit?: integer = 200, includeExcluded?: boolean = falsekind, engine, path, errors, warnings, excluded, total, returned, byRule, violations, partial, ms
check.erc
softforge.edsnx.runErc
edsnx check erccheckRun ERC. Electrical rule check of a schematic project (the whole hierarchy of the root sheet): counts then violations with rule id, severity, message, position and item ids. Native engine by default; engine “kicad-cli” runs KiCad’s ERC on the files.path: string, engine?: “native” | “kicad-cli” | “auto” = “native”, rules?: string[], severity?: “all” | “error” | “warning” = “all”, limit?: integer = 200, includeExcluded?: boolean = falsekind, engine, path, errors, warnings, excluded, total, returned, byRule, violations, partial, ms
Examples
  • check.drc Errors only: {"path":"board.kicad_pcb","severity":"error"}
  • check.drc With KiCad itself: {"path":"board.kicad_pcb","engine":"kicad-cli"}
  • check.erc All violations: {"path":"root.kicad_sch"}
  • check.erc With KiCad itself: {"path":"root.kicad_sch","engine":"kicad-cli"}

Custom tools#

CommandCLIKindDescriptionArgsResult
tool.listedsnx tool listqueryList tools. Custom tools of the project (kicad-tools.json or .kicad/tools.json next to the .kicad_pro): id, name, command, triggers, overlay count.path: stringprojectDir, tools
tool.runedsnx tool runtoolRun tool. Run a custom tool (simulator, script) of the project: substitutes ${board}, ${outputDir}…, streams progress, loads the overlays it writes. Returns state, message, duration, output folder, overlays and the log tail. Save the board first: tools read the files.path: string, id: stringid, state, message, durationMs, outputDir, overlays, log
Examples
  • tool.list Tools of a project: {"path":"board.kicad_pcb"}
  • tool.run Thermal simulation of the sample project: {"path":"blinky.kicad_pcb","id":"thermal"}

Rendering#

CommandCLIKindDescriptionArgsResult
render.diffedsnx render diffqueryVisual diff. Visual diff of two PNG files, or of two documents (.kicad_pcb/.kicad_sch, rendered first with the same options): a PNG with unchanged pixels dimmed and changed ones highlighted (green added, red removed, violet recoloured), the changed-area percentage and the changed bounds in pixels.a: string, b: string, out?: string, threshold?: integer = 24, layers?: string[], width?: integer = 1200, height?: integer = 800, mode?: “2d” | “3d” = “2d”out, png, changedPercent, changedPixels, width, height, bounds
render.pngedsnx render pngqueryRender PNG. Render a board or schematic to PNG with the editor’s renderer in headless Chromium (2D or 3D), optionally only some layers, a region in mm, or one highlighted net. Returns the file written, or the PNG base64 when no out is given. In an attached session the editor’s unsaved text is rendered.path: string, out?: string, layers?: string[], region?: [x0, y0, x1, y1], highlightNet?: string, mode?: “2d” | “3d” = “2d”, width?: integer = 1200, height?: integer = 800, theme?: “dark” | “light” = “dark”, camera?: “iso” | “top” | “bottom” | “front” | “back” | “left” | “right”, realistic?: boolean, view3d?: objectout, png, width, height, mode
render.svgedsnx render svgexportRender SVG. Plot a board (chosen layers, board area only) or one schematic page to SVG with kicad-cli. Returns the file written, or the SVG text when no out is given.path: string, out?: string, layers?: string[], page?: integerout, svg, bytes
Examples
  • render.diff What changed between two boards: {"a":"old.kicad_pcb","b":"board.kicad_pcb","out":"diff.png"}
  • render.png Top copper of a board, 1200×800: {"path":"board.kicad_pcb","out":"board.png","layers":["F.Cu","Edge.Cuts"]}
  • render.png Realistic 3D render, ENIG on a black mask: {"path":"board.kicad_pcb","out":"board-3d.png","realistic":true,"view3d":{"realistic":{"finish":"enig","mask":"black"}}}
  • render.svg Copper and outline of a board: {"path":"board.kicad_pcb","out":"board.svg","layers":["F.Cu","B.Cu","Edge.Cuts"]}

Session#

CommandCLIKindDescriptionArgsResult
session.baseline
softforge.edsnx.design.baseline
edsnx session baselineeditCreate baseline. Names the current state of an open document in its design file: a baseline.create event (id, name, description; the state hash is recorded when the list is applied), one undo step, written on save. Returns the baseline id.path: string, name: string, description?: stringid, path
session.batchedsnx session batchsessionBatch. Run registry commands in order ({ id, args } steps, as a –batch file) as one undoable group: the first failure rolls every document back. Returns each step’s result.label?: string = “Batch”, steps: object[]steps, results
session.closeedsnx session closesessionClose document. Close a document (unsaved changes are dropped).path: stringclosed
session.consolidate
softforge.edsnx.design.consolidate
edsnx session consolidatesessionConsolidate design file. Folds the write-append list of a design file into its tree (docs/design-file-format.md §9): the tree becomes the document after the last event in effect, the list restarts with a wal.base marker and one consolidate record, and the file is written whole. For an open document the folded tree is checked against what the session shows, the document must be saved first and its undo history is cleared; a design file that is not open is consolidated on disk. Refused when an event does not apply.path: stringpath, folded
session.describeedsnx session describesessionDescribe session. Session id and mode (headless or attached), working directory, actor, open documents with their undo/redo labels when the session keeps them.—id, mode, cwd, actor, documents
session.documentsedsnx session documentssessionOpen documents. Documents open in the session with revision, hash and dirty flag.—documents
session.export
softforge.edsnx.agent.exportSession
edsnx session exportexportExport session. Export the session log (.edsnx/session.jsonl of the project: every command of the edsnx CLI and of agents attached to the editor, with revisions, created ids and errors) as JSON (one document: summary and entries) or as a Markdown report. Writes out (relative to the working directory) when given, else returns the text. Returns the format, the log file, the entry count and the file written or the text.format?: “json” | “markdown” = “markdown”, log?: string, out?: string, since?: string, limit?: integer, title?: stringformat, log, entries, failed, out, text
session.gettingStarted
softforge.edsnx.gettingStarted
edsnx session getting-starteduiGetting started. Open the Getting started page: the setup status of the extension (kicad-cli, global library tables, licence, panels layout, agent and MCP) with one action per row; linked from the Welcome page (2.4.0 #503, #506). UI-only: opens its own page.path?: stringobject
session.openedsnx session opensessionOpen document. Open a board or schematic in the session (reads the file and its .kicad_pro). Returns path, kind, revision and hash.path: stringpath, kind, revision, hash, dirty, project
session.openDesignFile
softforge.edsnx.design.openDesignFile
edsnx session open-design-fileuiOpen design file. Opens the design file of the active document in the editor: the .design.* cache of a KiCad file of a KiCad project, or the design file a migrated project’s KiCad file is exported from.—opened
session.panels.reveal
softforge.edsnx.panels.reveal
edsnx session panels revealuiShow a workbench view. Show a view of the SoftForge side bars for the open document (Layers, Properties, Checks, Nets, 3D, …): panel is a panel id, all (every view serving the document kind) or default (the default set). path opens that document first. The focus stays in the editor unless focus is true. Returns the panels shown and the ones that do not serve the document kind; with layout.panels = editor nothing is shown (layout editor). Views show what the editor shows; agents read the same data with query.* and check.*. UI-only: needs the open editor.panel: “layers” | “items” | “nets” | “sheets” | “design” | “inspect” | “properties” | “bom” | “layerStack” | “fpLib” | “symLib” | “gerber” | “objects” | “document” | “libraries” | “tools” | “fpProps” | “symProps” | “gerberTools” | “panelEditor” | “group” | “checks” | “requirements” | “wires” | “review” | “routing” | “placement” | “testPoints” | “docProperties” | “view3d” | “lengthMatching” | “overlays” | “probes” | “system” | “harness” | “dfm” | “reuse” | “simulation” | “mcad” | “si” | “agent” | “comments” | “all” | “default”, path?: string, focus?: boolean = falseshown, skipped, layout
session.preferences
softforge.edsnx.preferences
edsnx session preferencesuiPreferences. Open the editor preferences. UI-only: needs the open editor.path?: stringobject
session.redo
softforge.edsnx.redo
edsnx session redosessionRedo. Redo the last undone edit of a document. done=false when there was nothing to redo.path: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps, done
session.revertedsnx session revertsessionRevert. Discard unsaved changes and the undo history of a document; reload it from disk.path: stringpath, kind, revision, hash, dirty, project
session.saveedsnx session savesessionSave. Write a document (or every changed document) and its .kicad_pro to disk; returns the files written.path?: stringwritten
session.toolGallery
softforge.edsnx.toolGallery
edsnx session tool-galleryuiTool gallery. Open the Tool gallery (every editor tool with its demo clip, keys and description). Agents: read docs/tools.md. UI-only: needs the open editor.path?: stringobject
session.transactionedsnx session transactioneditTransaction. Apply several raw EditIntents to one document as one undo step; everything is rolled back on the first failure. Returns newIds of all steps.path: string, label?: string = “Transaction”, intents: object[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
session.undo
softforge.edsnx.undo
edsnx session undosessionUndo. Undo the last edit of a document. done=false when there was nothing to undo.path: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps, done
session.welcome
softforge.edsnx.welcome
edsnx session welcomeuiWelcome. Open the Welcome page: the wordmark, the version and the kicad-cli found, Open a KiCad project… and Create an example board, the five cards (schematic editor, board editor, libraries, fabrication, edsnx and the agent) and the links to the documentation, the setup page, the issues and the licence; opens once after install while softforge.edsnx.welcome.showOnStartup is true (2.4.0 #506). UI-only: opens its own page.path?: stringobject
Examples
  • session.baseline Mark the state sent to the fab: {"path":"blinky.design.pcb","name":"Sent to fab"}
  • session.batch Place and route: {"steps":[{"id":"pcb.placeFootprint","args":{"path":"board.kicad_pcb","lib":"Resistor_SMD","name":"R_0603_1608Metric","at":[30,20],"ref":"R9"}},{"id":"pcb.route","args":{"path":"board.kicad_pcb","layer":"F.Cu","net":"GND","pts":[[29.2,20],[25,20]]}}]}
  • session.close Close: {"path":"board.kicad_pcb"}
  • session.consolidate Fold the history of the open board: {"path":"blinky.design.pcb"}
  • session.describe Describe: {}
  • session.documents List: {}
  • session.export Markdown report next to the project: {"format":"markdown","out":"session.md"}
  • session.export The last hour as JSON: {"format":"json","since":"1h"}
  • session.gettingStarted Getting started: {}
  • session.open Open a board: {"path":"board.kicad_pcb"}
  • session.openDesignFile Open the design file: {}
  • session.panels.reveal Show the Checks view: {"panel":"checks"}
  • session.panels.reveal Show the default views of a board: {"panel":"default","path":"blinky.kicad_pcb"}
  • session.preferences Preferences: {}
  • session.redo Redo: {"path":"board.kicad_pcb"}
  • session.revert Revert: {"path":"board.kicad_pcb"}
  • session.save Save everything: {}
  • session.toolGallery Tool gallery: {}
  • session.transaction Two tracks at once: {"path":"board.kicad_pcb","label":"Two tracks","intents":[{"op":"addTrack","layer":"F.Cu","pts":[[0,0],[5,0]],"width":0.25},{"op":"addTrack","layer":"F.Cu","pts":[[5,0],[5,5]],"width":0.25}]}
  • session.undo Undo: {"path":"board.kicad_pcb"}
  • session.welcome Welcome: {}

Timeline and export#

CommandCLIKindDescriptionArgsResult
timeline.exportedsnx timeline exportuiExport playback. Render the timeline frame by frame (frame-locked) and save a WebM, an MP4 (needs ffmpeg on PATH) or a PNG sequence (.zip) to out. Options: fps, width × height, range [start, end] in base units (default in/out or the whole timeline), hud (time readout + legend), view 2d/3d. Returns the file written and the frame count. Needs the open editor (attached session).path?: string, out: string, format?: “webm” | “mp4” | “png”, fps?: number = 30, width?: integer = 1920, height?: integer = 1080, range?: [x, y], hud?: boolean = true, view?: “2d” | “3d”path, frames
timeline.getedsnx timeline getqueryTimeline state. The playback state of the board editor: t, range, playing, speed, loop, in/out, live and the time-bearing overlays with their axes. state is null when the editor has no timeline yet. Needs the attached editor.path?: stringstate
timeline.pauseedsnx timeline pauseuiPause. Pause playback. Needs the open editor (attached session).path?: stringstate
timeline.playedsnx timeline playuiPlay. Start playback of the time-bearing overlays from the playhead. Needs the open editor (attached session).path?: stringstate
timeline.seekedsnx timeline seekuiSeek. Move the playhead to t (base units: s, Hz, step or degrees), or step n frames with step. Needs the open editor (attached session).path?: string, t?: number, step?: integerstate
timeline.setedsnx timeline setsessionSet timeline. Change the playback state: seek (t), play/pause (playing), speed, real time, loop, in/out range (null clears), follow live frames. Returns the new state. Needs the attached editor.path?: string, state: objectstate
Examples
  • timeline.export Export the in/out range as WebM: {"out":"sim/playback.webm","fps":30,"width":1920,"height":1080}
  • timeline.get Where is the playhead?: {}
  • timeline.pause Pause: {}
  • timeline.play Play: {}
  • timeline.seek Go to 1.5 ns: {"t":1.5e-9}
  • timeline.seek Next frame: {"step":1}
  • timeline.set Loop the first 2 ns at half speed: {"state":{"inOut":[0,2e-9],"loop":true,"speed":0.5}}

Overlays and probes#

CommandCLIKindDescriptionArgsResult
overlay.probes.addedsnx overlay probes addsessionAdd probe. Pin a probe at a board point (mm) on a field overlay (default: the one whose legend is shown); it records the value over every frame. Returns the probe (with its trace when traces is true). Needs the attached editor.path?: string, at: [x, y], overlayId?: string, z?: number, label?: string, id?: string, component?: “magnitude” | “x” | “y” | “z” | “phase”, traces?: boolean = falseprobe
overlay.probes.exportedsnx overlay probes exportexportExport probes. The probe traces as CSV (one row per frame time, one column per probe component; empty cells are frames not sampled yet). Returns the CSV text. Needs the attached editor.path?: string, ids?: string[]csv
overlay.probes.listedsnx overlay probes listqueryList probes. Probes pinned on time-bearing overlays: id, overlay, position (mm), label, unit, frames and how many are sampled, components; with traces: every value per component and the frame times. Needs the attached editor.path?: string, ids?: string[], traces?: boolean = falseprobes
overlay.probes.removeedsnx overlay probes removesessionRemove probes. Remove probes by id (all when ids is omitted). Returns the removed ids. Needs the attached editor.path?: string, ids?: string[]removed
Examples
  • overlay.probes.add Probe |E| near U1: {"at":[42.5,31.2],"label":"U1 pin 3"}
  • overlay.probes.export CSV of all probes: {}
  • overlay.probes.list Probes with their traces: {"traces":true}
  • overlay.probes.remove Remove every probe: {}

Documentation sheets#

CommandCLIKindDescriptionArgsResult
doc.autoBalloonedsnx doc auto-ballooneditAuto-balloon a view. Place a balloon for every BOM part shown in a view (numbered with the first BOM table’s lines), laid out around the view; existing balloons of the view keep their ids. Default view: the first top/bottom view.path: string, viewId?: stringadded, balloons, viewId, dryRun
doc.export
softforge.edsnx.doc.export
edsnx doc exportexportExport documentation set. Export the documentation set with kicad-cli: PDF = one file, every sheet in the print order (root sidecar order; unlisted schematic sheets first), one bookmark per sheet; SVG / DXF = one file per sheet into a folder. sheet exports one sheet (or a few) instead of the set. Reads the files on disk (save first).path: string, format?: “pdf” | “svg” | “dxf” = “pdf”, out?: string, includeSchematics?: boolean = true, bookmarks?: boolean = true, sheet?: string, viewer?: boolean = falsefiles, pages, reordered, bookmarks, warnings
doc.insertTableedsnx doc insert-tableeditInsert a documentation table. Add a live table to a documentation sheet and generate it: layer stack (Board Setup stack-up), drill table (pads and vias), BOM (grouped like kicad-cli, bom scope / groupBy / fields), revision, board notes or custom. at is the table’s top-left corner (sheet mm).path: string, kind?: “layerStack” | “drill” | “bom” | “revision” | “notes” | “custom” = “bom”, at?: [x, y], name?: string, bom?: object, fontSize?: numberchanged, ok, message, id, dryRun
doc.insertViewedsnx doc insert-vieweditInsert a draft view. Add a draft view of the board to a sheet (it becomes a documentation sheet when it has no sidecar yet) and generate it: top / bottom (mirrored) assembly, fabrication, detail (board region, parent view), section (board line, parent) or a 3D render (camera). at is where the view’s top-left board corner lands on the sheet (mm).path: string, type?: “top” | “bottom” | “fabrication” | “detail” | “section” | “render3d” = “top”, at?: [x, y], style?: “assembly” | “fabrication” | “realistic” | “outline” | “panel”, scale?: number, layers?: string[], name?: string, board?: string, parent?: string, region?: [x0, y0, x1, y1], line?: [x, y][], camera?: “iso” | “top” | “bottom” | “front” | “back” | “left” | “right”, update?: “onSave” | “manual”changed, ok, message, id, dryRun
doc.newSheet
softforge.edsnx.doc.newSheet
edsnx doc new-sheeteditNew documentation sheet. Create a documentation sheet <name>.kicad_sch (paper, title block) with an empty sidecar, add it to the hierarchy under the root schematic and put it last in the documentation set’s print order.path: string, name: string, paper?: “A5” | “A4” | “A3” | “A2” | “A1” | “A0” | “A” | “B” | “C” | “D” | “E” = “A3”, file?: stringfile, sheetId, dryRun
doc.refresh
softforge.edsnx.doc.refreshAll
edsnx doc refresheditRefresh documentation from the board. Regenerate the views, tables, balloons, dimensions and notes of a documentation sheet from its board (all of them, or ids), rewrite their groups in the sheet and stamp the sidecar (board hash, revision, time).path: string, ids?: string[]changed, ok, message, id, dryRun
doc.statusedsnx doc statusqueryDocumentation sheet status. Whether a sheet is a documentation sheet (it has a <sheet>.kicad_doc.json sidecar), its views and tables with their stale flags (board changed since generation), balloon count and orphan groups, and the documentation set’s sheets in print order.path: stringdocumentation, sheet, status, sidecar, tree
Examples
  • doc.autoBalloon Balloon the top view: {"path":"assembly.kicad_sch"}
  • doc.export One PDF with bookmarks: {"path":"blinky.kicad_sch","format":"pdf","out":"doc/blinky-documentation.pdf"}
  • doc.export The assembly sheet alone as SVG: {"path":"blinky.kicad_sch","format":"svg","out":"doc/svg/","sheet":"assembly.kicad_sch"}
  • doc.insertTable Project BOM table: {"path":"assembly.kicad_sch","kind":"bom","at":[280,30]}
  • doc.insertView Top assembly view at 1:1: {"path":"assembly.kicad_sch","type":"top","at":[30,40]}
  • doc.insertView Detail of a region at 4:1: {"path":"assembly.kicad_sch","type":"detail","parent":"v1","region":[100,80,110,90],"scale":4,"at":[250,40]}
  • doc.newSheet An A3 assembly sheet: {"path":"blinky.kicad_sch","name":"Assembly","paper":"A3"}
  • doc.refresh Refresh every view and table: {"path":"assembly.kicad_sch"}
  • doc.status Status of the assembly sheet: {"path":"assembly.kicad_sch"}

Review#

CommandCLIKindDescriptionArgsResult
review.approveedsnx review approveeditApprove design review. Approve a design review as the git user (or user), with an optional comment. Refused (check-failed, listing the open items) while checklist items are not done; Request changes is not gated. The review is approved when someone approved and nobody requests changes.path?: string = “.”, review?: string, comment?: string, user?: stringfile, review
review.checklistedsnx review checklisteditEdit review checklist. Tick / untick a checklist item of a design review (item: id, 1-based index or text; done default toggles), add one (add) or remove one (remove). Without changes it returns the checklist.path?: string = “.”, review?: string, item?: string, done?: boolean, add?: string, remove?: string, by?: stringfile, checklist, done, total
review.ciReportedsnx review ci-reportcheckReview CI report. The last step of the CI template: reads the check outputs of the pipeline (checks folder: erc.json, drc.json, req.json from edsnx … --json), the exported viewer, and writes review-ci.json (status passed / failed, one entry per check, pipeline / viewer / report URLs) and the review report (Markdown: review state, checks, changes against the base, comments). strict fails (exit 1) when a check failed, after writing.path?: string = “.”, checks?: string, viewer?: string, out?: string = “review-ci.json”, report?: string, pipeline?: string, viewerUrl?: string, reportUrl?: string, review?: string, strict?: boolean = falsefile, report, status, checks
review.ciTemplateedsnx review ci-templatequeryReview CI template. The design review pipeline for GitLab CI (gitlab, .gitlab-ci.yml) or GitHub Actions (github, .github/workflows/design-review.yml): installs the edsnx CLI from the SoftForge Electronics Designer VSIX (EDSNX_VSIX_URL), runs edsnx check erc / drc, edsnx req eval, edsnx viewer export and edsnx review ci-report, publishes public/ (viewer, report, review-ci.json) as artifacts and pages. out writes it; project is the project folder relative to the repository root.gitlab?: boolean = false, github?: boolean = false, project?: string, out?: stringkind, text, file
review.createedsnx review createeditCreate design review. Create a design review for a branch (default: the current git branch) against a base (default: origin’s default branch, else main / master): title, checklist (the default template or checklist), reviewers (pending approvals). Stored in <project>.reviews.json; one live review per branch.path?: string = “.”, title: string, branch?: string, base?: string, checklist?: string[], reviewers?: string[], author?: stringfile, review
review.diffedsnx review diffqueryReview changes. Change list of a board or schematic against a git revision (HEAD, a branch, a tag, a commit, : for the index) or another file: items matched by uuid, each added, removed, moved (position, rotation, side/layer) or changed (reference, value, footprint/symbol, net, lock, fields, attributes, geometry, pad nets) with one detail line per difference (“moved (+2.54, 0)”, “Value 10k → 4k7”), the position (mm) and bounds. Also returns the counts per kind and the base label.path: string, base: string, against?: string, sheets?: boolean = falsepath, base, changes, counts, sheets
review.imageedsnx review imagequeryReview visual diff. Visual diff of a board or schematic against a git revision or another file: both are rendered with the editor’s renderer in headless Chromium over the same area (the union of both documents’ bounds), then compared pixel by pixel (unchanged pixels dimmed, added green, removed red, recoloured violet). Returns the PNG file written (or base64 without out), the changed-area percentage and the changed bounds in pixels. Needs Chromium or Chrome (CHROME_PATH).path: string, base: string, against?: string, out?: string, width?: integer = 1200, height?: integer = 800, threshold?: integer = 24, layers?: string[], theme?: “dark” | “light” = “dark”out, png, changedPercent, changedPixels, width, height, bounds, base
review.notesedsnx review notesexportReview release notes. Release notes of a design review as Markdown: the commits of the branch since its base (git log base..HEAD), the design changes (refresh first), the resolved comment threads, the CI checks and the review state. out writes the file.path?: string = “.”, review?: string, out?: string, intro?: stringtext, file, commits
review.requestChangesedsnx review request-changeseditRequest changes. Request changes on a design review as the git user (or user), with a comment saying what.path?: string = “.”, review?: string, comment?: string, user?: stringfile, review
review.statusedsnx review statusqueryDesign review status. A design review (default: the open review of the current branch, all lists every review): state, checklist progress, approvals, CI status from review-ci.json (project folder, ci/, public/ or ci), and with refresh the changed items against the base (0.9.0 review diff; image adds the visual diff %, needs Chromium), written back to the sidecar.path?: string = “.”, review?: string, all?: boolean = false, refresh?: boolean = false, image?: boolean = false, ci?: stringfile, review, reviews, branch, warnings
Examples
  • review.approve Approve the current branch: {"comment":"Fab files look good"}
  • review.checklist Tick item 2: {"item":"2","done":true}
  • review.checklist Add an item: {"add":"Thermal relief on the GND pads"}
  • review.ciReport After the check steps of the template: {"checks":"ci","viewer":"public/viewer","out":"public/review-ci.json","strict":true}
  • review.ciTemplate GitLab CI: {"gitlab":true,"out":".gitlab-ci.yml"}
  • review.ciTemplate GitHub Actions: {"github":true,"out":".github/workflows/design-review.yml"}
  • review.create Review the current branch: {"title":"USB-C connector and fab review"}
  • review.create With reviewers: {"title":"Rev B","base":"main","reviewers":["Maria"]}
  • review.diff What changed in the board since the last commit: {"path":"board.kicad_pcb","base":"HEAD"}
  • review.diff Schematic on a branch against main: {"path":"board.kicad_sch","base":"main","against":"feature"}
  • review.image Visual diff of the board against HEAD: {"path":"board.kicad_pcb","base":"HEAD","out":"review.png"}
  • review.notes Notes of the current branch: {"out":"review/release-notes.md"}
  • review.requestChanges Ask for a change: {"comment":"Move R8 off the crystal"}
  • review.status Status of the current branch with changes: {"refresh":true}
  • review.status Every review: {"all":true}

Simulation#

CommandCLIKindDescriptionArgsResult
sim.acedsnx sim actoolAC analysis. Small-signal AC sweep (.ac dec|oct|lin points fstart fstop). Vectors are complex: summaries give the magnitude; measurements f3db, bw, gainAt and phaseAt work on |H|.path: string, netlister?: “auto” | “kicad-cli” | “builtin” = “auto”, measurements?: object[], out?: string, currents?: boolean, sweep?: “dec” | “oct” | “lin” = “dec”, points?: integer = 20, fstart?: string = “10”, fstop?: string = “1Meg”analysis, netlister, ngspice, durationMs, plots, op, measurements, montecarlo, sweep, diagnostics, warnings, out
sim.measureedsnx sim measuretoolMeasure. Run the analysis and return only the measurements (rise time, peak, RMS, frequency at −3 dB, …), computed in JS from the result vectors so they work with any ngspice.path: string, netlister?: “auto” | “kicad-cli” | “builtin” = “auto”, analysis?: object, measurements: object[]analysis, measurements, diagnostics
sim.models.listedsnx sim models listqueryList simulation models. Simulation model of every symbol (device, type, parameters, pin map, library, enabled, tolerance; inferred when it has no Sim fields) and the model files (.lib/.sub/.mod) of the project with their model counts.path: stringsymbols, libraries, used
sim.models.setedsnx sim models seteditSet simulation model. Write the Sim.* fields of a symbol (by reference or id): device, type, params (object, merged over the current ones unless replaceParams), pins (“1=+ 2=-”), library, name, enabled (Sim.Enable), tolerance (“5%”). One undo step.path: string, ref?: string, id?: string, device?: string, type?: string, params?: object, replaceParams?: boolean = false, pins?: string, library?: string, name?: string, enabled?: boolean, tolerance?: stringobject
sim.montecarloedsnx sim montecarlotoolMonte Carlo. Run an analysis N times with R/C/L values drawn within their tolerance (Sim.Tolerance, else defaults R 1 %, C 10 %, L 10 %) and any further parameter named in params (source, model, instance or .param values, with their tolerance), seeded; progress per phase (netlist, runs, post-processing); returns per measurement mean, std, min, max, p5/p50/p95 and a histogram, plus the varied parts.path: string, netlister?: “auto” | “kicad-cli” | “builtin” = “auto”, measurements?: object[], out?: string, currents?: boolean, analysis?: object, runs?: integer = 50, seed?: integer = 1, distribution?: “gaussian” | “uniform” = “gaussian”, defaults?: object, params?: object[]analysis, netlister, ngspice, durationMs, plots, op, measurements, montecarlo, sweep, diagnostics, warnings, out
sim.netlistedsnx sim netlistquerySPICE netlist. The SPICE netlist of a schematic (kicad-cli or the built-in netlister) with its analysis directives; out writes it to a file. Returns the netlister used, element count, warnings and the netlist text (first 200 lines).path: string, netlister?: “auto” | “kicad-cli” | “builtin” = “auto”, out?: stringnetlister, elements, analyses, warnings, netlist, out
sim.opedsnx sim optoolOperating point. DC operating point (.op): every node voltage and, per device, the current through it, the voltage across it and the absorbed power (W; negative for sources delivering power).path: string, netlister?: “auto” | “kicad-cli” | “builtin” = “auto”, out?: stringanalysis, netlister, ngspice, durationMs, plots, op, measurements, montecarlo, sweep, diagnostics, warnings, out
sim.runedsnx sim runtoolRun simulation. Run ngspice on the schematic: the given analysis (default the schematic’s first .tran/.ac/.dc/.op directive), optionally a parameter sweep or Monte Carlo, with measurements. Returns per-vector summaries (min, max, final), the operating point, measurements, Monte Carlo statistics and diagnostics; out writes every vector as CSV.path: string, netlister?: “auto” | “kicad-cli” | “builtin” = “auto”, measurements?: object[], out?: string, currents?: boolean, analysis?: object, sweep?: object, montecarlo?: objectanalysis, netlister, ngspice, durationMs, plots, op, measurements, montecarlo, sweep, diagnostics, warnings, out
sim.sweepedsnx sim sweeptoolParameter sweep. Repeat an analysis for each value of an element (its value rewritten) or a .param (rewritten or added): values, or start/stop/points on a lin/log scale. Returns one plot summary and measurement row per step.path: string, netlister?: “auto” | “kicad-cli” | “builtin” = “auto”, measurements?: object[], out?: string, currents?: boolean, analysis?: object, target: string, values?: number[], start?: number, stop?: number, points?: integer, scale?: “lin” | “log”, kind?: “element” | “param”analysis, netlister, ngspice, durationMs, plots, op, measurements, montecarlo, sweep, diagnostics, warnings, out
sim.tranedsnx sim trantoolTransient analysis. Transient analysis (.tran step stop [start [maxStep]]), SPICE numbers as strings (“10u”, “5m”). Returns per-vector min/max/final and the measurements; out writes the waveforms as CSV.path: string, netlister?: “auto” | “kicad-cli” | “builtin” = “auto”, measurements?: object[], out?: string, currents?: boolean, step?: string = “10u”, stop?: string = “1m”, start?: string, maxStep?: string, uic?: booleananalysis, netlister, ngspice, durationMs, plots, op, measurements, montecarlo, sweep, diagnostics, warnings, out
Examples
  • sim.ac Bode of the RC low-pass: {"path":"examples/sim-rc/sim-rc.kicad_sch","measurements":[{"kind":"f3db","trace":"V(/out)"}]}
  • sim.measure Peak-to-peak and RMS of the output: {"path":"examples/sim-rc/sim-rc.kicad_sch","measurements":[{"kind":"pp","trace":"V(/out)"},{"kind":"rms","trace":"V(/out)"}]}
  • sim.models.list Models of the RC example: {"path":"examples/sim-rc/sim-rc.kicad_sch"}
  • sim.models.set R1 as a 2.2k resistor with 1 % tolerance: {"path":"examples/sim-rc/sim-rc.kicad_sch","ref":"R1","device":"R","params":{"r":"2.2k"},"tolerance":"1%"}
  • sim.montecarlo 50 runs of the corner frequency: {"path":"examples/sim-rc/sim-rc.kicad_sch","runs":50,"analysis":{"kind":"ac","sweep":"dec","points":20,"fstart":"10","fstop":"1Meg"},"measurements":[{"kind":"f3db","trace":"V(/out)"}]}
  • sim.netlist Netlist of the RC example: {"path":"examples/sim-rc/sim-rc.kicad_sch"}
  • sim.netlist Built-in netlister into a file: {"path":"examples/sim-rc/sim-rc.kicad_sch","netlister":"builtin","out":"sim/rc.cir"}
  • sim.op Bias point: {"path":"examples/sim-rc/sim-rc.kicad_sch"}
  • sim.run The schematic’s own analysis: {"path":"examples/sim-rc/sim-rc.kicad_sch"}
  • sim.run AC with the −3 dB point: {"path":"examples/sim-rc/sim-rc.kicad_sch","analysis":{"kind":"ac","sweep":"dec","points":20,"fstart":"10","fstop":"1Meg"},"measurements":[{"kind":"f3db","trace":"V(/out)"}]}
  • sim.sweep R1 = 1k, 2k, 4k on the AC response: {"path":"examples/sim-rc/sim-rc.kicad_sch","target":"R1","values":[1000,2000,4000],"analysis":{"kind":"ac","sweep":"dec","points":10,"fstart":"10","fstop":"1Meg"},"measurements":[{"kind":"f3db","trace":"V(/out)"}]}
  • sim.tran 5 ms with the peak-to-peak of /out: {"path":"examples/sim-rc/sim-rc.kicad_sch","step":"10u","stop":"5m","measurements":[{"kind":"pp","trace":"V(/out)"}]}

Footprint edits#

CommandCLIKindDescriptionArgsResult
fp.fpAddGraphicedsnx fp fp-add-graphiceditAdd graphic. Add a line, rect, circle, arc, polygon or Bézier on a footprint layer (F.SilkS, F.Fab, F.CrtYd, …). newIds = [id]. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, graphic: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpAddPadedsnx fp fp-add-padeditAdd pad. Add a pad to the footprint (defaults: SMD roundrect 1 × 1 mm on F.Cu/F.Paste/F.Mask, the next free number; THT pads get a drill). newIds = [pad id]. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, pad: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpDeleteedsnx fp fp-deleteeditDelete footprint. Library operation: delete footprint name from the .pretty. Acts on the .pretty folder of path.path: string, name: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpDeleteGraphicedsnx fp fp-delete-graphiceditDelete graphics. Delete graphics, user texts or text boxes. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, ids: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpDeletePadedsnx fp fp-delete-padeditDelete pads. Delete pads. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, ids: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpDuplicateedsnx fp fp-duplicateeditDuplicate footprint. Library operation: copy footprint name of the .pretty to newName (the editor host applies it; headless: lib.footprint.new with from). Acts on the .pretty folder of path.path: string, name: string, newName: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpEditGraphicedsnx fp fp-edit-graphiceditEdit graphic. Change a graphic: layer, width, points, fill, stroke type. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, id: string, patch: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpEditPadedsnx fp fp-edit-padeditEdit pads. Change pad fields (number, type, shape, position, size, drill, layers, margins, thermal settings, pin function/type, custom primitives…); null removes an optional field. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, ids: string[], patch: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpEditTextedsnx fp fp-edit-texteditEdit text. Change a footprint text (Reference, Value, a property with a layer, a user text) or text box: text, layer, position, rotation, size [w, h], thickness, hidden, knockout, mirror, justify, bold, italic; text boxes also box [w, h], align, valign, border, borderWidth, strokeType and margins. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, id: string, patch: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpNewFootprintedsnx fp fp-new-footprinteditNew footprint. Replace the footprint (replace: true) with a blank one or a wizard result (soic, qfp, qfn, bga, dip, sip, chip, tht2, header, mountingHole); without replace the editor host / lib.footprint.new writes a new file. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, name: string, wizard?: object, replace?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpPadArrayedsnx fp fp-pad-arrayeditPad array. Grid or circular array of a pad (template: a pad id or a pad spec), numbered numerically, alphabetically or BGA-style (A1…); the template is element 0 unless removeTemplate. newIds are the new pads. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, template: string | object, array: object, removeTemplate?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpRemove3dModeledsnx fp fp-remove3d-modeleditRemove 3D model. Remove 3D model index. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, index: integernewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpRenameedsnx fp fp-renameeditRename footprint. Library operation: rename footprint name of the .pretty (file and footprint name). Acts on the .pretty folder of path.path: string, name: string, newName: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpRenumberPadsedsnx fp fp-renumber-padseditRenumber pads. Renumber pads in the given order (KiCad’s Renumber Pads tool, click order): prefix + start, start + step, … Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, ids: string[], start?: integer = 1, step?: integer = 1, prefix?: stringnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpSet3dModeledsnx fp fp-set3d-modeledit3D model. Change 3D model index (or add one without index): path, offset [x, y, z] mm, scale, rotate [x, y, z] degrees, hide, opacity. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, index?: integer, model: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpSetAttrsedsnx fp fp-set-attrseditFootprint attributes. Footprint type (smd / through_hole / unspecified), board only, exclude from position files / BOM, DNP, allow missing courtyard, allow soldermask bridges, private layers. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, attrs: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpSetClearancesedsnx fp fp-set-clearanceseditFootprint clearances. Footprint-level overrides: clearance, solder mask margin, paste margin and ratio, zone connection, thermal relief width and gap (null removes one). Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, clearances: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpSetNetTieGroupsedsnx fp fp-set-net-tie-groupseditNet tie groups. Net tie pad groups, each a comma-separated list of pad numbers (“1, 2”); [] removes them. Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, groups: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
fp.fpSetPropertyedsnx fp fp-set-propertyeditFootprint property. Set (value null: remove) a footprint property: Description and Keywords (descr / tags), Reference, Value, Datasheet or a user field (new fields are hidden on F.Fab). Edits the .kicad_mod in place (minimal diff); returns newIds and the new hash.path: string, name: string, value: string | null, hidden?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
Examples
  • fp.fpAddGraphic Add graphic: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","graphic":{"kind":"rect","layer":"F.CrtYd","pts":[[-2,-1],[2,1]],"width":0.05}}
  • fp.fpAddPad Add pad: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","pad":{"at":[2,0],"type":"smd","shape":"roundrect","size":[1.2,0.6]}}
  • fp.fpDelete Delete footprint: {"path":"Custom.pretty","name":"R_0603_Mine"}
  • fp.fpDeleteGraphic Delete graphics: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","ids":["fpg:2"]}
  • fp.fpDeletePad Delete pads: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","ids":["pad:3"]}
  • fp.fpDuplicate Duplicate footprint: {"path":"Custom.pretty","name":"R_0603_1608Metric","newName":"R_0603_Custom"}
  • fp.fpEditGraphic Edit graphic: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","id":"fpg:0","patch":{"layer":"F.Fab","width":0.1}}
  • fp.fpEditPad Edit pads: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","ids":["pad:0"],"patch":{"size":[1.5,0.7],"maskMargin":0.05}}
  • fp.fpEditText Edit text: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","id":"prop:Reference","patch":{"at":[0,-2.5],"layer":"F.SilkS"}}
  • fp.fpNewFootprint New footprint: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","name":"SOIC-8_Custom","wizard":{"kind":"soic","params":{"pins":8}},"replace":true}
  • fp.fpPadArray Pad array: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","template":"pad:0","array":{"kind":"grid","nx":4,"ny":1,"dx":1.27,"dy":0,"start":1}}
  • fp.fpRemove3dModel Remove 3D model: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","index":0}
  • fp.fpRename Rename footprint: {"path":"Custom.pretty","name":"R_0603_Custom","newName":"R_0603_Mine"}
  • fp.fpRenumberPads Renumber pads: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","ids":["pad:0","pad:1"],"start":1}
  • fp.fpSet3dModel 3D model: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","model":{"path":"${KICAD9_3DMODEL_DIR}/Package_SO.3dshapes/SOIC-8_3.9x4.9mm_P1.27mm.step"}}
  • fp.fpSetAttrs Footprint attributes: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","attrs":{"type":"smd","excludeFromBom":false}}
  • fp.fpSetClearances Footprint clearances: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","clearances":{"maskMargin":0.05,"clearance":null}}
  • fp.fpSetNetTieGroups Net tie groups: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","groups":["1, 2"]}
  • fp.fpSetProperty Footprint property: {"path":"Custom.pretty/SOIC-8_Custom.kicad_mod","name":"Description","value":"SOIC-8, 1.27 mm pitch"}

Symbol edits#

CommandCLIKindDescriptionArgsResult
sym.symAddGraphicedsnx sym sym-add-graphiceditAdd body graphic. Add a body graphic to a library symbol: rect [start, end], circle [centre, point on circle], arc [start, mid, end], line/poly/bezier points or text [at] (library mm, y up). Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, symbol: string, unit?: integer, bodyStyle?: integer, kind: “line” | “rect” | “circle” | “arc” | “poly” | “bezier” | “text”, pts: [x, y][], width?: number, style?: object, text?: string, size?: number, rot?: numberpath, changed, newIds, dryRun, diff
sym.symAddPinedsnx sym sym-add-pineditAdd pin. Add a pin to a library symbol (library mm, y up; rot = direction towards the body, 0/90/180/270). newIds = [pin id]. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, symbol: string, unit?: integer, bodyStyle?: integer, pin: objectpath, changed, newIds, dryRun, diff
sym.symDeleteGraphicedsnx sym sym-delete-graphiceditDelete body graphics. Delete body graphics of a library symbol by id. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, ids: string[]path, changed, newIds, dryRun, diff
sym.symDeletePinedsnx sym sym-delete-pineditDelete pins. Delete pins of a library symbol by id. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, ids: string[]path, changed, newIds, dryRun, diff
sym.symDeleteSymboledsnx sym sym-delete-symboleditDelete symbol. Delete a symbol from the library (refused while other symbols extend it). Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, name: stringpath, changed, newIds, dryRun, diff
sym.symEditGraphicedsnx sym sym-edit-graphiceditEdit body graphic. Change the points, stroke width, style, text or size of a body graphic; on a text box also bold, italic, justification, border and margins. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, id: string, pts?: [x, y][], width?: number, style?: object, text?: string, size?: number, rot?: number, bold?: boolean, italic?: boolean, align?: “left” | “center” | “right”, valign?: “top” | “center” | “bottom”, border?: boolean, margins?: anypath, changed, newIds, dryRun, diff
sym.symEditPinedsnx sym sym-edit-pineditEdit pin. Change a pin of a library symbol: number, name, type, shape, position, orientation, length, visibility, alternates; unit / bodyStyle move it. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, id: string, pin: objectpath, changed, newIds, dryRun, diff
sym.symEditPropertyedsnx sym sym-edit-propertyeditEdit symbol field. Set or add a field of a library symbol (Reference, Value, Footprint, Datasheet, Description, ki_keywords, ki_fp_filters, user fields): value, position (library mm), rotation, visibility, size; newKey renames, remove deletes. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, symbol: string, key: string, value?: string, at?: [x, y], rot?: number, hidden?: boolean, showName?: boolean, size?: number, newKey?: string, remove?: booleanpath, changed, newIds, dryRun, diff
sym.symImportPinsCsvedsnx sym sym-import-pins-csveditImport pins (CSV). Add pins from CSV/TSV rows number,name,type,shape,x,y,orientation,length,unit (header optional; rows without a position stack on the left); replace deletes the existing pins first. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, symbol: string, csv: string, unit?: integer, bodyStyle?: integer, replace?: booleanpath, changed, newIds, dryRun, diff
sym.symNewSymboledsnx sym sym-new-symboleditNew symbol. Create a library symbol: from scratch (fields, units, De Morgan, power), derived from another (extends), or a copy of a (symbol …) text renamed to name; replace overwrites an existing symbol of that name. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, name: string, extends?: string, reference?: string, value?: string, footprint?: string, datasheet?: string, description?: string, keywords?: string, fpFilters?: string[], units?: integer, deMorgan?: boolean, power?: boolean, text?: string, replace?: booleanpath, changed, newIds, dryRun, diff
sym.symRenameSymboledsnx sym sym-rename-symboleditRename symbol. Rename a library symbol, its sub-symbols and the extends of symbols derived from it. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, from: string, to: stringpath, changed, newIds, dryRun, diff
sym.symSetBodyedsnx sym sym-set-bodyeditSet symbol body. Replace the units (sub-symbols with their pins and graphics) of a library symbol by those of body, a (symbol …) text such as a schematic instance symbol; untouched units stay byte-identical (Update library from instance). Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, symbol: string, body: stringpath, changed, newIds, dryRun, diff
sym.symSetDeMorganedsnx sym sym-set-de-morganeditDe Morgan body style. Turn the alternate (De Morgan) body style of a library symbol on (pins copied to style 2) or off (style 2 deleted). Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, symbol: string, enabled: booleanpath, changed, newIds, dryRun, diff
sym.symSetFlagsedsnx sym sym-set-flagseditSymbol flags. Power symbol (none/global/local), in BOM, on board, exclude from simulation, in position files. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, symbol: string, power?: “none” | “global” | “local”, inBom?: boolean, onBoard?: boolean, excludeFromSim?: boolean, inPosFiles?: booleanpath, changed, newIds, dryRun, diff
sym.symSetPinOptionsedsnx sym sym-set-pin-optionseditPin name options. Pin name offset (mm; 0 puts names outside, above the pin) and pin name / number visibility. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, symbol: string, nameOffset?: number, hideNames?: boolean, hideNumbers?: booleanpath, changed, newIds, dryRun, diff
sym.symSetUnitsedsnx sym sym-set-unitseditSymbol units. Set the unit count of a library symbol (units above the count are deleted with their items), whether units are interchangeable, and unit names. Edits the .kicad_sym file in place (library mm, y up); returns newIds.path: string, symbol: string, count: integer, interchangeable?: boolean, names?: objectpath, changed, newIds, dryRun, diff
Examples
  • sym.symAddGraphic Add body graphic: {"path":"MyLib.kicad_sym","symbol":"MyChip","unit":0,"kind":"rect","pts":[[-5.08,5.08],[5.08,-5.08]],"width":0.254,"style":{"fillType":"background"}}
  • sym.symAddPin Add pin: {"path":"MyLib.kicad_sym","symbol":"MyChip","unit":1,"pin":{"number":"1","name":"VCC","type":"power_in","at":[-7.62,2.54],"rot":0,"length":2.54}}
  • sym.symDeleteGraphic Delete body graphics: {"path":"MyLib.kicad_sym","ids":["gfx:MyChip_0_1:2"]}
  • sym.symDeletePin Delete pins: {"path":"MyLib.kicad_sym","ids":["pin:MyChip_1_1:3"]}
  • sym.symDeleteSymbol Delete symbol: {"path":"MyLib.kicad_sym","name":"MyChip"}
  • sym.symEditGraphic Edit body graphic: {"path":"MyLib.kicad_sym","id":"gfx:MyChip_0_1:2","width":0.254}
  • sym.symEditPin Edit pin: {"path":"MyLib.kicad_sym","id":"pin:MyChip_1_1:3","pin":{"name":"VDD","type":"power_in"}}
  • sym.symEditProperty Edit symbol field: {"path":"MyLib.kicad_sym","symbol":"MyChip","key":"Footprint","value":"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm"}
  • sym.symImportPinsCsv Import pins (CSV): {"path":"MyLib.kicad_sym","symbol":"MyChip","csv":"number,name,type\n1,VCC,power_in\n2,GND,power_in"}
  • sym.symNewSymbol New symbol: {"path":"MyLib.kicad_sym","name":"MyChip","reference":"U","value":"MyChip","footprint":"Package_SO:SOIC-8_3.9x4.9mm_P1.27mm"}
  • sym.symRenameSymbol Rename symbol: {"path":"MyLib.kicad_sym","from":"MyChip","to":"MyChip2"}
  • sym.symSetBody Set symbol body: {"path":"MyLib.kicad_sym","symbol":"NE555P","body":"(symbol \"Timer:NE555P_U1\" (symbol \"NE555P_U1_1_1\" (rectangle (start -7.62 7.62) (end 7.62 -7.62))))"}
  • sym.symSetDeMorgan De Morgan body style: {"path":"MyLib.kicad_sym","symbol":"MyChip","enabled":true}
  • sym.symSetFlags Symbol flags: {"path":"MyLib.kicad_sym","symbol":"MyChip","inBom":true,"onBoard":true}
  • sym.symSetPinOptions Pin name options: {"path":"MyLib.kicad_sym","symbol":"MyChip","nameOffset":1.016}
  • sym.symSetUnits Symbol units: {"path":"MyLib.kicad_sym","symbol":"MyChip","count":2,"interchangeable":false}

Requirements and solving#

CommandCLIKindDescriptionArgsResult
req.addedsnx req addeditAdd requirement. Add a requirement (defaults: severity error, weight 1, aggregate max, op <=, eval live). A zone2d region becomes a req:<id> rule area on its family’s user layer (one undo step on the board); the JSON is written next to the board. Returns the id.path: string, requirement: objectid, requirement, file, zoneEdits
req.evaledsnx req evalcheckEvaluate requirements. Evaluate the requirements (all, or only) on the current board: with runTools the tools they depend on run first (tool.run; the board is saved because tools read the files). Returns per requirement status (satisfied | violated | unknown | stale | disabled), value, limit, margin (negative = violated), the worst location (worst.at [x, y, z] mm, t, f, itemId) and hints for agents: itemsInRegion, contributingFootprints, contributingNets, freeSpace circles near the worst point, suggestions. Also counts, the solve score (Σ weight·max(0, −margin)) and the tool runs. record stores the results and a history entry in the JSON.path: string, only?: string[], runTools?: boolean = false, record?: boolean = falsepath, results, counts, score, tools, warnings
req.getedsnx req getqueryGet requirement. One requirement in full (region outline, quantity, window, mask, tools), its last stored result and its history series (value, margin, status per iteration).path: string, id: stringrequirement, result, history
req.historyedsnx req historyqueryRequirement history. History of the requirements file (one entry per solve iteration or recorded evaluation: iteration, time, by, edits, note, violated count), newest last; with id, the value/margin/status series of that requirement.path: string, id?: string, limit?: integer = 50entries, series, total
req.listedsnx req listqueryList requirements. Requirements of a board (<board>.kicad_requirements.json joined with the board’s req: constraint zones): id, name, severity, weight, family, region, quantity, operator and limit, and the last stored status. Drafts (zones without a requirement) and missing zones are listed.path: string, family?: stringpath, file, exists, families, requirements, drafts, missing, warnings
req.removeedsnx req removeeditRemove requirements. Remove requirements and their constraint zones (one undo step on the board).path: string, ids: string[]removed, file, zoneEdits
req.reportedsnx req reportcheckRequirements report. Requirements report: Markdown (summary, one row per requirement, details of the violated ones, history) or JSON. Evaluates first (stored results with evaluate: false); out writes the file, else the text is returned.path: string, format?: “markdown” | “json” = “markdown”, out?: string, evaluate?: boolean = true, runTools?: boolean = false, hints?: booleanformat, file, text, report
req.setedsnx req seteditEdit requirement. Change fields of a requirement (patch is merged; quantity and window merge field by field). Zones follow (one undo step).path: string, id: string, patch: objectid, requirement, file, zoneEdits
Examples
  • req.add T < 70 °C over the regulator: {"path":"blinky.kicad_pcb","requirement":{"name":"Regulator below 70 °C","layerFamily":"cst.thermal","region":{"kind":"zone2d","layer":"User.1","outline":[[115,104],[128,104],[128,117],[115,117]]},"quantity":{"source":"overlay","id":"thermal:field0","unit":"°C"},"aggregate":"max","op":"<","limit":70,"dependsOnTools":["thermal"],"eval":"onToolRun"}}
  • req.eval Run the tools, then evaluate: {"path":"blinky.kicad_pcb","runTools":true}
  • req.eval One requirement: {"path":"blinky.kicad_pcb","only":["r-thermal"]}
  • req.get The thermal requirement: {"path":"blinky.kicad_pcb","id":"r-thermal"}
  • req.history Last ten entries: {"path":"blinky.kicad_pcb","limit":10}
  • req.list Requirements of the sample board: {"path":"blinky.kicad_pcb"}
  • req.remove Remove one: {"path":"blinky.kicad_pcb","ids":["r-thermal"]}
  • req.report Markdown report: {"path":"blinky.kicad_pcb","out":"requirements.md"}
  • req.report JSON for a script: {"path":"blinky.kicad_pcb","format":"json"}
  • req.set Raise the limit: {"path":"blinky.kicad_pcb","id":"r-thermal","patch":{"limit":75}}

Solve loop#

CommandCLIKindDescriptionArgsResult
solve.canceledsnx solve cancelsessionCancel solve. Cancel a solve run (this process, or another one through its cancel file). The board keeps the state of the last kept iteration (Revert in the dialog, or session.undo).path: string, runId?: stringrunId, cancelled
solve.openDialog
softforge.edsnx.solve
edsnx solve open-dialoguiSolve Requirements…. Open the Solve dialog of the board editor (requirements, strategy, budget, gate, iteration log, accept/revert/replay). Agents: use solve.run. UI-only: needs the open editor.path?: stringobject
solve.proposeedsnx solve proposetoolPropose solve edits. Answer the prompt of an agent solve run (solve.run with agent): intents are board EditIntents ({ op: “move”, ids, by } …) and/or registry steps ({ id: “pcb.autoroute”, args }), applied as one iteration with the DRC gate. Returns the run status after that iteration (the next prompt while it continues). stop: true ends the run. A run in another process gets the proposal through its intents file.path: string, runId?: string, intents?: object[], intentsFile?: string, note?: string, stop?: boolean = false, wait?: boolean = truedelivered, runId, state
solve.replayedsnx solve replaytoolReplay solve log. Re-apply a solve log (.edsnx/solve-.jsonl) to the board, without its reverted iterations: the board must be in the state the run started from (uuid-insensitive hash; force skips the checks), every step is hash-checked, and the final hash is compared with the run’s. upTo stops after an iteration. Default log: the latest run of the board.path: string, log?: string, force?: boolean = false, upTo?: integerreplayed, matches, finalHash, expectedHash
solve.runedsnx solve runtoolSolve requirements. Run the solve loop on the board: evaluate → pick the violated requirements by weight → a strategy proposes edits (auto: the first strategy that handles the worst requirement; placementSearch, netWiden, stitchGround, heightSwap, router, add-on strategies; or agent: true: you answer prompts with solve.propose) → applied as one transaction with the DRC/ERC gate (rolled back on new errors) → tools re-run → re-evaluated; a worse score is reverted. Stops at satisfied, budget, no progress (back to the best iteration) or cancel. Every iteration is logged to .edsnx/solve-.jsonl (replayable). Returns the run status: outcome, iterations (n, strategy, applied, kept, edits, violated, score, note), best/final score, log file; with agent it returns at the first prompt (state “awaiting”, prompt with results and hints). The run lives in this process: in a shell pass wait (and answer via the intents file or stdin).path: string, requirements?: string[], strategy?: string = “auto”, agent?: boolean = false, budget?: object, iterations?: integer, seconds?: number, gate?: boolean = true, seed?: integer, options?: object, wait?: boolean, background?: boolean = false, stdin?: boolean = false, id?: stringrunId, state, outcome, iterations, logFile, prompt
solve.statusedsnx solve statusquerySolve status. Status of a solve run (this process, else from the .edsnx/solve-<id> files): state (running | awaiting | done), outcome, iterations, scores, log file, and the current prompt while it awaits a proposal. Default: the latest run of the board.path: string, runId?: string, wait?: numberrunId, state
solve.strategiesedsnx solve strategiesquerySolve strategies. The registered solve strategies (built-ins and add-ons: id, name, description, origin) and, with path, which of them handle each violated requirement of the board’s stored results.path?: stringstrategies, handles
Examples
  • solve.cancel Stop the running solve: {"path":"blinky.kicad_pcb"}
  • solve.openDialog Solve dialog: {}
  • solve.propose Move U1 3 mm right: {"path":"blinky.kicad_pcb","intents":[{"op":"move","ids":["<U1 uuid>"],"by":[3,0]}],"note":"spread the heat sources"}
  • solve.replay Replay the latest run on a fresh copy: {"path":"copy/blinky.kicad_pcb","log":".edsnx/solve-2026-10-12T10-31-05-123Z.jsonl"}
  • solve.run Placement search on the thermal requirement, seeded: {"path":"blinky.kicad_pcb","requirements":["r-thermal"],"strategy":"placementSearch","seed":1,"iterations":12}
  • solve.run Claude proposes the edits: {"path":"blinky.kicad_pcb","agent":true}
  • solve.status Latest run: {"path":"blinky.kicad_pcb"}
  • solve.strategies What can solve the sample board: {"path":"blinky.kicad_pcb"}

Multi-board systems#

CommandCLIKindDescriptionArgsResult
system.addBoardedsnx system add-boardeditAdd board to system. Add a board (a KiCad project) to the system, with an optional id (default the project name), placement (mm, degrees about X then Y then Z) and assembly variant.path?: string, project: string, id?: string, name?: string, variant?: string, at?: number[], rot?: number[]file, files, dryRun, issues
system.addCableedsnx system add-cableeditNew cable. Add a cable between two connectors (board.ref): the given wires (pins board.ref.pin, colour, gauge, length), or one wire per pin pair up to the smaller pin count (signals from a, IEC colours); a cable mate is added.path?: string, a?: string, b?: string, id?: string, name?: string, length?: number, gauge?: string, partNumber?: string, wires?: object[]file, cable, files, dryRun
system.assembly.clashedsnx system assembly clashcheckAssembly clash check. Clash check of the 3D assembly: each board’s glb (kicad-cli export, cached in .edsnx/system-glb; the outline box when there is no glb) at its placement, mated connectors left out, plus an enclosure (.glb, .stl or a faceted .step; a B-rep .step through the OCCT add-on). Board AABBs, then part AABBs, then triangle tests, then containment (a part entirely inside a closed body, by ray parity: contained on the pair); returns the clashing part pairs with a point each.path?: string, enclosure?: string, glb?: boolean = truepairs, hits, triangles, boxes, ms, warnings
system.assembly.placeedsnx system assembly placeeditPlace board in assembly. Set a board’s placement in the 3D assembly (at in mm, rot in degrees about X then Y then Z), or snap it on a direct mate (mate id): the board moves so its connector seats on the other board’s, offset mm apart.path?: string, board: string, at?: number[], rot?: number[], snap?: string, offset?: numberfile, board, placement, files, dryRun
system.describeedsnx system describequeryDescribe system. Boards (project, layers, size, placement, variant, connector candidates), connectors with their pin maps (signal, direction, voltage, mandatory), mates with pin counts and status, cables, system nets, validation issues and the ERC counts.path?: stringfile, boards, connectors, mates, cables, nets, issues, erc
system.erc
softforge.edsnx.system.erc
edsnx system erccheckSystem ERC. Check the connections between boards: pin count per mate (error when direct, warning through a cable), out↔out and power↔ground conflicts, unconnected power / ground / Sys.Mandatory pins of mated connectors, voltage domains (Sys.Voltage), duplicate signal names, and the file’s validation (unknown boards, connectors, pins). Violations carry the system sheet position. out writes the JSON report.path?: string, out?: stringsystem, violations, counts, file
system.exportedsnx system exportexportExport assembly. Export the 3D assembly: glb merges the boards’ glbs (kicad-cli) at their placements, one node per board; step writes boards and enclosure as STEP: through the OCCT add-on when it is installed (each board’s STEP from kicad-cli placed by its matrix, B-rep), else a faceted AP214 STEP from the meshes (faceted: true; closed meshes as FACETED_BREP solids); json writes the scene (placements, matrices, connector frames).path?: string, format?: “glb” | “step” | “json” = “glb”, out: string, enclosure?: string, faceted?: booleanfile, boards, missing, warnings, faceted, triangles, solids, shells
system.harness
softforge.edsnx.system.harness
edsnx system harnessexportHarness documentation. Harness documentation: the from-to table (cable, from board.J.pin, to board.J.pin, signal, colour, gauge, length) and the cable BOM; out *.csv writes the from-to table (Excel-compatible CSV; bom: true the cable BOM), *.kicad_sch the Harness documentation sheet (drawing + tables, K sidecar), *.pdf that sheet printed by kicad-cli, *.json both tables.path?: string, out?: string, bom?: boolean, paper?: “A3” | “A2” | “A1” | “A0”fromTo, bom, files, warnings
system.mateedsnx system mateeditMate connectors. Mate two connectors (board.ref): directly (board to board; pins paired by number or pinMap) or through an existing cable. snap also places board b so its connector seats on a’s (offset = distance between the connector faces, mm).path?: string, a: string, b: string, cable?: string, pinMap?: string[][], offset?: number, snap?: boolean, id?: stringfile, mate, status, files, placement, dryRun
system.new
softforge.edsnx.system.new
edsnx system neweditNew system. Create a multi-board system file (default system.kicad_sys.json in the folder) with the given boards (.kicad_pro files) side by side, and its system schematic (system.kicad_sch: boards as hierarchical sheets, connector pins as sheet pins).path?: string, name?: string, boards?: string[], force?: booleanfile, files, dryRun, issues
system.open3d
softforge.edsnx.system.open3d
edsnx system open3duiOpen 3D assembly. Open the system 3D assembly in the editor: every board’s glb at its placement, gizmo handles (move / rotate), snap on connector, clash check, glb / STEP export.path?: stringobject
system.sheetedsnx system sheeteditSystem schematic. Regenerate the system schematic and its board proxy sheets from the system file (board sheet positions are kept), or with from: "sheet" update the system file from the edited sheet (wires between sheet pins → cable wires, deleted wires removed, direct mate pin maps, cable lengths) and then regenerate.path?: string, from?: “system” | “sheet” = “system”file, files, changes, dryRun
Examples
  • system.addBoard Add the sensor board: {"path":"examples/system-sample","project":"examples/system-sample/sensor/sensor.kicad_pro","id":"sensor"}
  • system.addCable A 150 mm harness: {"path":"examples/system-sample","a":"main.J4","b":"sensor.J1","id":"W1","length":150,"gauge":"AWG26"}
  • system.assembly.clash Clash check: {"path":"examples/system-sample"}
  • system.assembly.place Lift the sensor 20 mm: {"path":"examples/system-sample","board":"sensor","at":[70,0,20],"rot":[0,0,0]}
  • system.describe The sample system: {"path":"examples/system-sample"}
  • system.erc ERC of the sample system: {"path":"examples/system-sample"}
  • system.export Assembly glb: {"path":"examples/system-sample","format":"glb","out":"out/assembly.glb"}
  • system.harness From-to table as CSV: {"path":"examples/system-sample","out":"harness.csv"}
  • system.harness Harness sheet as PDF: {"path":"examples/system-sample","out":"harness.pdf"}
  • system.mate Board-to-board mate: {"path":"hw","a":"main.J3","b":"display.J1","snap":true}
  • system.new A system of two boards: {"path":"hw","name":"Logger","boards":["hw/main/main.kicad_pro","hw/sensor/sensor.kicad_pro"]}
  • system.open3d Open the 3D assembly: {}
  • system.sheet Take the wiring drawn on the sheet: {"path":"examples/system-sample","from":"sheet"}

Assembly variants#

CommandCLIKindDescriptionArgsResult
variant.activateedsnx variant activateeditActivate variant. Make a variant the active one (the editors show it, checks leave its DNP parts unconnected); base = the KiCad files. Stored in the .kicad_pro.path: string, id: stringactive
variant.addedsnx variant addeditAdd variant. Add an assembly variant (written to the .kicad_pro). from copies the overrides of another variant. Returns the new variant id.path: string, name: string, id?: string, description?: string, from?: string, activate?: boolean = falseid, project
variant.bakeedsnx variant bakeeditWrite variant to files. Write a variant into the KiCad files so KiCad shows it: DNP and exclude-from-BOM of every symbol (all sheets) and footprint, with values also Value / Footprint / field overrides. The Base state is recorded in the .kicad_pro; restore: true writes it back. Baking another variant restores Base first. Writes the files (save open editors first).path: string, id?: string, values?: boolean = false, restore?: boolean = falsevariant, files, refs, warnings
variant.exportBomedsnx variant export-bomexportExport variant BOM. Bill of materials of a variant (default: the active one): the project’s BOM preset (or preset, a built-in or project preset name) applied to the symbols as the variant sees them (DNP, values, fields), grouped and sorted like kicad-cli sch export bom. Writes out (CSV / TSV by the format preset, html: true for HTML) or returns the rows.path: string, id?: string, preset?: string, out?: string, html?: boolean = false, excludeDnp?: booleanvariant, file, headers, rows, components
variant.listedsnx variant listqueryList variants. Assembly variants of the project (softforge.variants in the .kicad_pro): Base (the KiCad files) and every variant with its override count and DNP references, the active variant and what the last bake wrote. overrides: true lists every override.path: string, overrides?: boolean = falseproject, active, variants, baked
variant.openDialog
softforge.edsnx.variants
edsnx variant open-dialoguiVariants…. Open the Variants dialog of the editor (matrix of components × variants with fitted / DNP / override cells, filters, bulk edit, CSV import/export, BOM per variant). Agents: use variant.list / variant.set. UI-only: needs the open editor.path?: stringobject
variant.removeedsnx variant removeeditRemove variant. Remove an assembly variant (Base becomes active when it was). The KiCad files are not touched (bake –restore first if it was written to them).path: string, id: stringremoved, active
variant.setedsnx variant seteditSet variant overrides. Set overrides of references in a variant: fitted / dnp (not populated), value, footprint, fields, excludeFromBom; null clears a key, clear: true removes the references’ overrides. name / description rename the variant. Returns the resulting overrides of those references.path: string, id: string, refs?: string[], ref?: string, fitted?: boolean | null, dnp?: boolean | null, value?: string | null, footprint?: string | null, fields?: object, excludeFromBom?: boolean | null, clear?: boolean, name?: string, description?: stringid, overrides
Examples
  • variant.activate Show the Lite variant: {"path":"blinky.kicad_pro","id":"lite"}
  • variant.add A Lite variant: {"path":"blinky.kicad_pro","name":"Lite","description":"No programming header"}
  • variant.bake Write Lite into the KiCad files: {"path":"blinky.kicad_pro","id":"lite"}
  • variant.bake Back to Base: {"path":"blinky.kicad_pro","restore":true}
  • variant.exportBom BOM of Lite as CSV: {"path":"blinky.kicad_pro","id":"lite","out":"fab/blinky-lite-bom.csv"}
  • variant.list Variants of the sample project: {"path":"blinky.kicad_pro","overrides":true}
  • variant.openDialog Variants dialog: {}
  • variant.remove Remove Lite: {"path":"blinky.kicad_pro","id":"lite"}
  • variant.set J2 not fitted and R3 = 1k in Lite: {"path":"blinky.kicad_pro","id":"lite","ref":"J2","fitted":false}
  • variant.set A value override: {"path":"blinky.kicad_pro","id":"lite","refs":["R3"],"value":"1k"}

Rooms#

CommandCLIKindDescriptionArgsResult
room.addedsnx room addeditAdd room. Add a room: a room:<name> rule area (nothing kept out) on the “Rooms” user layer with outline (mm), or wrapped around its members with margin when no outline is given, and its definition in .kicad_pro softforge.rooms (members by sheet and/or references, side, height limit, clearance). One undo step.path: string, name: string, outline?: [x, y][], margin?: number = 1, sheet?: string, refs?: string[], nested?: boolean, side?: “F” | “B”, heightMax?: number, clearance?: number, fixed?: booleannewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
room.arrangeedsnx room arrangeeditArrange in room. Pack a room’s members inside its outline (largest first, row by row, spacing mm apart, around other parts inside it). Members that do not fit stay and are listed. One undo step.path: string, name: string, spacing?: number = 1newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps, moved, unplaced
room.checkedsnx room checkcheckCheck rooms. Room rules (also part of the native DRC as warnings): room_part_outside (a member’s body is not inside its room), room_wrong_side, room_height (Height field / package table over heightMax), room_component_clearance. Returns the violations with references and positions.path: stringviolations, count
room.fitedsnx room fiteditFit room to parts. Fit rooms to their parts (a part is at home in the room that lists its reference, else in its sheet’s room): a rectangle room becomes the box of its parts’ bodies plus margin (it may shrink; growOnly keeps what is larger), any other outline grows around the parts outside it and keeps its shape. Rooms grow on their own when a member is moved out of them or Update PCB adds parts to a full room, unless the room is locked or fixed. Without names, every room. One undo step.path: string, names?: string[], margin?: number, growOnly?: boolean = falsenewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps, fitted
room.fromSheetsedsnx room from-sheetseditRooms from sheets. One room per schematic sheet instance (the footprints’ path prefix), named after the sheet (“Root” for the root sheet): wrap draws each room around its parts (nothing moves), grid tiles the rooms over the board and packs each sheet’s parts inside its room, auto wraps when every part is inside the board outline. Existing rooms of a sheet keep their name and rules. Later Update PCB places new parts in their sheet’s room. One undo step.path: string, mode?: “auto” | “wrap” | “grid” = “auto”, margin?: number = 1, spacing?: number = 1newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps, rooms, mode, moved, unplaced
room.listedsnx room listqueryList rooms. Rooms of a board: the room:<name> rule areas joined with .kicad_pro softforge.rooms. Per room: members (references), parts outside it, rules (side, heightMax, clearance) and warnings; the user layer they live on.path: stringlayer, rooms
room.moveedsnx room moveeditMove room. Move a room with its parts: by by [dx, dy] or so its outline’s top-left corner goes to. withRouting also moves the tracks and vias that lie entirely inside the room. One undo step.path: string, name: string, by?: [x, y], to?: [x, y], withRouting?: boolean = falsenewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
room.removeedsnx room removeeditRemove rooms. Remove rooms: their rule areas and definitions (the parts stay). One undo step.path: string, names: string[]newIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
room.setedsnx room seteditEdit room. Change a room: rules (sheet, refs, nested, side, heightMax, clearance, fixed, margin; null clears), its outline, or rename it (newName). One undo step.path: string, name: string, newName?: string, outline?: [x, y][], sheet?: string | null, refs?: array | null, nested?: boolean | null, side?: “F” | “B” | null, heightMax?: number | null, clearance?: number | null, fixed?: boolean | null, margin?: number | nullnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
Examples
  • room.add A room for the Timer sheet, front side, parts up to 6 mm: {"path":"blinky.kicad_pcb","name":"Timer","sheet":"Timer","side":"F","heightMax":6}
  • room.arrange Pack the Timer parts: {"path":"blinky.kicad_pcb","name":"Timer"}
  • room.check Parts outside their rooms: {"path":"blinky.kicad_pcb"}
  • room.fit Fit the Timer room around its parts: {"path":"blinky.kicad_pcb","names":["Timer"]}
  • room.fromSheets A room around each sheet’s parts: {"path":"blinky.kicad_pcb","mode":"wrap"}
  • room.list Rooms of the sample board: {"path":"blinky.kicad_pcb"}
  • room.move Move the Timer room 5 mm right: {"path":"blinky.kicad_pcb","name":"Timer","by":[5,0]}
  • room.remove Remove the Timer room: {"path":"blinky.kicad_pcb","names":["Timer"]}
  • room.set Back side only: {"path":"blinky.kicad_pcb","name":"Timer","side":"B"}

Reuse blocks#

CommandCLIKindDescriptionArgsResult
block.listedsnx block listqueryList blocks. The snippets library: blocks (*.kicad_block.json) in paths, $EDSNX_BLOCK_PATHS and blocks/ next to the board (one level of sub-folders), filtered by query (name, description, references, ports); with a board, also the blocks placed on it with each instance’s sync state (in-sync, outdated: the block changed, modified: parts moved by hand, missing: block file not found).path?: string, paths?: string[], query?: stringlibrary, placed, folders
block.makeedsnx block makeeditMake block. Make a reuse block from a sheet instance on the board (Make block from selection): the instance’s sheet file, its footprints and the tracks, arcs, vias and zones of its nets inside its box (plus include, minus exclude) are written to dir as <slug>.kicad_sch (symbol instances stripped), <slug>.kicad_pcb (a KiCad board fragment, items verbatim) and <slug>.kicad_block.json (anchor, footprints by sheet-relative key, nets, hash). A sheet holding hierarchical sheets (other blocks) makes a nested block: its sub-sheet files go along and the parts of every level are in the layout. Text variables in the fields (${R_VALUE}) become the block’s parameters. The board does not change.path: string, sheet: string, name: string, description?: string, dir?: string, include?: string[], exclude?: string[], anchor?: [x, y], margin?: number = 1, parameters?: objectblock, files, footprints, copper
block.placeedsnx block placeeditPlace block. Place a block count times: the block’s sheet file is copied into the project (once), each instance becomes a hierarchical sheet on the root schematic (sheet pins for its ports, labels per connect port → net) with references in its own range (R1 → R101, R201, … or from base), the schematics are saved and Update PCB runs (kicad-cli), then the block’s layout is placed on each instance at at + k·pitch turned by rot: footprints matched by sheet-relative key, tracks/vias/zones copied with the instance’s nets and grouped block:<name>/<sheet>. Instances are recorded in .kicad_pro softforge.blocks. updatePcb: false stops after the schematic (block.update lays out instances later). A nested block brings its sub-sheet files and numbers the references of every level in the instance’s range; power symbols get theirs as KiCad annotates them (#PWR0101). parameters set the block’s parameters per instance (fields of the sheet symbol that KiCad resolves in ${NAME}).path: string, block: string, count?: integer = 1, at?: [x, y], pitch?: [x, y], rot?: number = 0, names?: string[], connect?: object, base?: integer, step?: integer = 100, schematic?: string, sheetAt?: [x, y], updatePcb?: boolean = true, paths?: string[], parameters?: object | arrayinstances, warnings, sheetFile
block.replicateedsnx block replicateeditReplicate layout. Replicate the layout of one sheet instance onto other instances of the same sheet (Altium room formation / Allegro reuse): footprints matched by sheet-relative key take the source’s relative placement and the source’s tracks, arcs, vias and zones are copied with each target’s nets. Each target keeps its reference part (the largest common footprint) where it is unless at is given. One undo group.path: string, from: string, to?: string[], at?: [x, y], rot?: number, include?: string[], exclude?: string[]targets, warnings
block.showPanel
softforge.edsnx.reuse.show
edsnx block show-paneluiReuse Panel. Show the Reuse panel of the board editor: rooms with part counts and outside warnings, reuse blocks with their sync state (Place, Replicate layout, Update instances), the snippets library, pin and gate swap groups.path?: stringobject
block.updateedsnx block updateeditUpdate block instances. Bring the instances of placed blocks (.kicad_pro softforge.blocks) up to date with their block files: an outdated instance (block hash changed), one never laid out, or every one with force, gets the block’s copper again (its previous block: group is replaced) and its footprints re-placed, except footprints the user moved since (kept and reported). Returns per instance what changed.path: string, block?: string, force?: boolean = falseinstances, warnings
Examples
  • block.list Blocks of the project: {"path":"blinky.kicad_pcb"}
  • block.make The Timer sheet as a block: {"path":"blinky.kicad_pcb","sheet":"Timer","name":"NE555 astable"}
  • block.place Two LED drivers fed from OUT: {"path":"blinky.kicad_pcb","block":"blocks/led-driver/led-driver.kicad_block.json","count":2,"at":[104,126],"pitch":[14,0],"connect":{"IN":"OUT"}}
  • block.replicate LED1’s layout onto the other LED driver instances: {"path":"blinky.kicad_pcb","from":"LED1"}
  • block.showPanel Open the Reuse panel: {}
  • block.update Re-place the instances of changed blocks: {"path":"blinky.kicad_pcb"}

Pin and gate swap#

CommandCLIKindDescriptionArgsResult
swap.gatesedsnx swap gateseditSwap gates. Swap two units (gates) of a multi-unit part: the schematic placements exchange their unit numbers (their wiring stays where it is) and the board pads of the two units trade nets pin name by pin name. The units must be interchangeable (identical pin names, or Swap.Gates yes) unless force. Attached copper: as swap.pins (re-attached by default). One undo group.path: string, ref: string, units: integer[], copper?: “reattach” | “ripUp” | “refuse”, ripUp?: boolean = false, force?: boolean = false, allInstances?: boolean = falsechanges, ripped, reattached, unrouted, schematic, instances, warnings
swap.listedsnx swap listquerySwap groups. Swappable pin groups of the board’s footprints (their Swap.Groups property, copied from the symbol by Update PCB: “1,2;A1,A2,A3”), gate swap flags (Swap.Gates) and alternative footprints (Swap.Footprints).path: string, ref?: stringgroups, gates, alternatives
swap.partedsnx swap parteditSwap part. Swap a part for an alternative footprint (Swap.Footprints of the part, unless force): without variant the board footprint is replaced (pads keep their nets) and the symbol’s Footprint field follows; with variant nothing is edited here and the footprint override for that variant is returned (variantOverride) — and applied through variant.set (the variant table’s footprint override).path: string, ref: string, footprint: string, variant?: string, force?: boolean = falsevariantOverride, applied, board, schematic, warnings
swap.pinsedsnx swap pinseditSwap pins. Swap two pins of a part: the two pads trade nets on the board and the pins’ connections are swapped in the schematic (wire ends, labels, junctions, no-connect flags move between the two pins), so Update PCB stays empty. The pads must share a swap group (Swap.Groups) unless force. Copper attached to the pads keeps its net: each track is cut back from its pad and joined to the pad that now carries its net (straight, around the pads, or through vias on another layer when the two connections cross), clear of other nets (reattached); a connection with no clean path is ripped up (unrouted, a warning). copper: "ripUp" (or ripUp) deletes the attached copper instead, "refuse" fails with the conflicts. A part in a sheet used several times needs allInstances (the schematic change applies to every instance). One undo group.path: string, ref: string, pads: string[], copper?: “reattach” | “ripUp” | “refuse”, ripUp?: boolean = false, force?: boolean = false, schematic?: boolean = true, allInstances?: boolean = falsechanges, ripped, reattached, unrouted, schematic, instances, warnings
Examples
  • swap.gates Swap units A and B of U2: {"path":"board.kicad_pcb","ref":"U2","units":[1,2]}
  • swap.list Swap groups of the board: {"path":"blinky.kicad_pcb"}
  • swap.part R3 as 0603: {"path":"blinky.kicad_pcb","ref":"R3","footprint":"Resistor_SMD:R_0603_1608Metric","force":true}
  • swap.pins Swap the two ends of R3 (its tracks follow): {"path":"blinky.kicad_pcb","ref":"R3","pads":["1","2"],"force":true}

Manufacturer parts#

CommandCLIKindDescriptionArgsResult
parts.offersedsnx parts offersqueryPart offers. Distributor offers of a part (MPN or provider id) from the enabled providers: distributor, sku, stock, MOQ, multiple, currency and price breaks.mpn: string, providers?: string[], offline?: boolean = falseoffers, errors
parts.searchedsnx parts searchquerySearch manufacturer parts. Search the part data providers (Octopart/Nexar, Mouser, Digi-Key, LCSC, add-ons; cached, rate limited) by keywords or MPN. Returns hits: provider, mpn, manufacturer, description, package, lifecycle (active / nrnd / eol / obsolete), stock, price@100 and the providers that know the part; errors lists provider failures.query: string, providers?: string[], limit?: integer = 20, inStock?: boolean = false, activeOnly?: boolean = false, manufacturers?: string[], offline?: boolean = falsehits, errors, cached
Examples
  • parts.offers Offers of NE555P (recorded fixtures): {"mpn":"NE555P","providers":["fixture"]}
  • parts.search A 10k 0805 resistor in stock: {"query":"10k 0805 resistor","inStock":true}
  • parts.search Recorded fixtures (no keys): {"query":"NE555P","providers":["fixture"]}

BOM cost#

CommandCLIKindDescriptionArgsResult
bom.costedsnx bom costqueryBOM cost. BOM costing: the project’s BOM lines (grouped by MPN, else Value + Footprint; DNP and variant-unfitted parts not bought) resolved against the part data providers, the cheapest offer for qty × boards (MOQ / multiple, price breaks, stock first, approved manufacturers and preferred distributors from .kicad_parts.json), cost per board and total, lifecycle / stock / approval warnings and the cost of every variant. cart writes a distributor cart CSV, report a cost report (.md or .csv).path: string, qty?: integer = 1, variant?: string, providers?: string[], offline?: boolean = false, currency?: string, attrition?: number, cart?: “mouser” | “digikey” | “lcsc”, cartOut?: string, report?: stringboards, currency, perBoard, total, lines, warnings, perVariant
Examples
  • bom.cost Cost of 100 boards of the Lite variant: {"path":"blinky.kicad_pro","qty":100,"variant":"Lite"}
  • bom.cost Recorded fixtures, LCSC cart: {"path":".","qty":10,"providers":["fixture"],"cart":"lcsc"}

Rigid-flex and HDI#

CommandCLIKindDescriptionArgsResult
flex.bend.addedsnx flex bend addeditAdd bend line. Add a bend line a→b (mm) across a flex region: a Dwgs.User line in a group flex:bend:<id> (KiCad shows it) and its inner radius (mm, default 1), signed angle (deg, + folds the far side up, default 90) and folding order (default next) in the JSON. The far side is the side away from the largest rigid region. Returns the id.path: string, id?: string, name?: string, a: [x, y], b: [x, y], radius?: number = 1, angle?: number = 90, order?: integer, regionId?: stringid, bend, file, boardEdits
flex.bend.removeedsnx flex bend removeeditRemove bend lines. Remove bend lines (their grouped lines go too).path: string, ids: string[]removed, file, boardEdits
flex.bend.setedsnx flex bend seteditEdit bend line. Change a bend line: end points (moves its line), radius, angle, order, name, region.path: string, id: string, name?: string, a?: [x, y], b?: [x, y], radius?: number, angle?: number, order?: integer, regionId?: stringid, bend, file, boardEdits
flex.checkedsnx flex checkcheckFlex and HDI checks. Native DRC limited to the rigid-flex and HDI rules (via_span_invalid, via_aspect_ratio, via_annular_span, micro_via_stacking, flex_bend_radius, flex_copper_on_bend, flex_stiffener_overlap, flex_coverlay_opening, flex_layer_absent, flex_component_on_bend) on the session’s board text and .kicad_flex.json: counts then violations (rule id, severity, message, position, item ids). kicad-cli has no span or bend concept; flex.span.rules writes the KiCad-checkable part as .kicad_dru rules.path: string, severity?: “all” | “error” | “warning” = “all”, limit?: integer = 100kind, engine, path, errors, warnings, excluded, total, returned, byRule, violations, partial, ms
flex.describeedsnx flex describequeryDescribe rigid-flex. Stack-up regions of a board (flex: rule areas joined with <board>.kicad_flex.json; the board wins on outlines): id, name, kind (rigid | flex | rigid-flex-transition), copper layer set, absent layers, materials, derived thickness, coverlay, stiffener; bend lines (end points, radius, angle, order, bend zone width); via spans; drafts (zones without a JSON region), missing zones and warnings. With at [x, y]: the region and stack at that point (the whole-board default region where no region is).path: string, at?: [x, y]file, regions, bends, viaSpans, at, drafts, missing, warnings
flex.exportedsnx flex exportqueryExport rigid-flex 3D. Export the 3D board flat or folded (state, or fold 0…1) as glb (board, regions with their stacks, models; metres, y up like kicad-cli) or png (3D screenshot), through the headless renderer (Chromium).path: string, state?: “flat” | “folded” = “folded”, fold?: number, format?: “glb” | “png” = “glb”, out: string, width?: integer, height?: integerfile, format, fold, bytes
flex.foldedsnx flex foldcheckFold rigid-flex. The board in a fold state (state flat | folded, or fold 0…1; mode together | sequence by order): the angle applied per bend, the folded extent (mm) and the folded clearance check — rigid regions and component bodies (courtyard × Height) that collide once folded but not flat (rule flex_folded_clearance, contacts in board mm with z). Parts crossing bend lines are listed. out writes the folded board and models as glb and png a 3D screenshot through the headless renderer (Chromium).path: string, state?: “flat” | “folded” = “folded”, fold?: number, mode?: “together” | “sequence” = “together”, clearance?: number = 0, out?: string, png?: string, width?: integer, height?: integerfold, applied, extent, collisions, onBends, files, render
flex.region.addedsnx flex region addeditAdd stack-up region. Add a stack-up region: a flex:<id> rule area (nothing kept out) on the “Flex regions” user layer with outline (mm) and the region in <board>.kicad_flex.json (kind, stack top to bottom, absent copper layers, coverlay, stiffener). Defaults: rigid → the Board Setup stack-up; flex → coverlay / copper / polyimide / copper / coverlay with the inner layers absent. One undo step. Returns the id.path: string, id?: string, name?: string, kind?: “rigid” | “flex” | “rigid-flex-transition”, outline: [x, y][], stack?: object[], absentLayers?: string[], coverlay?: object, stiffener?: objectid, region, file, boardEdits
flex.region.removeedsnx flex region removeeditRemove stack-up regions. Remove regions and their rule areas (the board falls back to the Board Setup stack-up there). One undo step.path: string, ids: string[]removed, file, boardEdits
flex.region.setedsnx flex region seteditEdit stack-up region. Change a region: name, kind, outline (moves its rule area), stack, absent layers, coverlay, stiffener (null clears coverlay / stiffener). One undo step.path: string, id: string, name?: string, kind?: “rigid” | “flex” | “rigid-flex-transition”, outline?: [x, y][], stack?: object[], absentLayers?: string[], coverlay?: object | null, stiffener?: object | nullid, region, file, boardEdits
flex.span.addedsnx flex span addeditAdd via span. Add a via span between two copper layers (kind from the layers unless given: through / blind / buried; micro for laser microvias), size and drill default to the net class via (micro: µvia). The first span added also writes the default through span. Returns the span and the list.path: string, id?: string, from: string, to: string, kind?: “through” | “blind” | “buried” | “micro”, size?: number, drill?: number, laser?: boolean | null, stacked?: boolean | null, staggeredMin?: number | null, aspectRatioMax?: number | null, annularMin?: number | null, drillGroup?: string | nullspan, file, spans
flex.span.assignedsnx flex span assigneditPut vias on a span. Put vias on a via span: KiCad type (through / blind / micro), layers, size and drill of the span. span omitted: the shortest span that connects each via’s layers. Undoable.path: string, ids: string[], span?: stringnewIds
flex.span.drilledsnx flex span drillexportDrill files per span. Native Excellon drill files per via span / layer pair into outDir (default fab/): -PTH.drl, -NPTH.drl, -front-in1.drl … (laser microvias apart when a pair also has drilled blind vias), the drill map -drill-spans.rpt, and drill entries in a .gbrjob found there. project.drill / project.fabricate with perSpan do the same after kicad-cli.path: string, outDir?: string = “fab/”files, folder, groups
flex.span.listedsnx flex span listqueryList via spans. HDI via spans of a board (viaSpans of .kicad_flex.json; one through span from the net class via when none is defined): id, kind, from/to layers, size, drill, laser, stacked/staggered, the drilled depth (stack-up), aspect ratio and its maximum, annular ring, KiCad via type, how many vias use each span, vias that fit no span, and validation issues.path: stringpath, spans, defined, issues
flex.span.removeedsnx flex span removeeditRemove via span. Remove a via span (vias that used it are reported by flex.check as via_span_invalid).path: string, id: stringremoved, file, spans
flex.span.replaceedsnx flex span replaceeditReplace via spans. Replace the whole via span list (Board Setup ▸ Via Spans Apply). An empty list removes the definitions (the default through span applies again).path: string, spans: object[]file, spans
flex.span.rulesedsnx flex span ruleseditWrite via span rules. Write the spans as .kicad_dru rules named SPAN: <id> (hole_size min = max(depth / max aspect ratio), annular_width min, µvia diameter) plus SPAN: layer pairs (disallow via for any other layer pair), so kicad-cli reports span violations as drill_out_of_range / annular_width / items_not_allowed. Other rules are kept byte for byte; remove: true deletes the SPAN rules. Returns the rules written.path: string, remove?: boolean = false, pairs?: boolean = truefile, rules, text
flex.span.setedsnx flex span seteditSet via span. Change a via span: layers, kind, size, drill, laser, stacked, staggeredMin, aspectRatioMax, annularMin, drillGroup (null clears an option); newId renames it. Vias already placed are not changed (flex.span.assign does that).path: string, id: string, newId?: string, from?: string, to?: string, kind?: “through” | “blind” | “buried” | “micro”, size?: number, drill?: number, laser?: boolean | null, stacked?: boolean | null, staggeredMin?: number | null, aspectRatioMax?: number | null, annularMin?: number | null, drillGroup?: string | nullspan, file
Examples
  • flex.bend.add A 90° bend across the flex tail: {"path":"rigid-flex.kicad_pcb","a":[140,94],"b":[140,106],"radius":1,"angle":90}
  • flex.bend.remove Remove a bend: {"path":"rigid-flex.kicad_pcb","ids":["b2"]}
  • flex.bend.set Fold the tail flat on itself: {"path":"rigid-flex.kicad_pcb","id":"b1","angle":180}
  • flex.check HDI and flex checks: {"path":"hdi6.kicad_pcb"}
  • flex.describe Regions and bends of the rigid-flex sample: {"path":"rigid-flex.kicad_pcb"}
  • flex.describe Stack at a point of the flex tail: {"path":"rigid-flex.kicad_pcb","at":[140,100]}
  • flex.export Flat glb: {"path":"rigid-flex.kicad_pcb","state":"flat","out":"flat.glb"}
  • flex.fold Folded clearance of the sample: {"path":"rigid-flex.kicad_pcb","state":"folded"}
  • flex.fold Folded glb: {"path":"rigid-flex.kicad_pcb","state":"folded","out":"folded.glb"}
  • flex.region.add A flex tail between two rigid parts: {"path":"rigid-flex.kicad_pcb","name":"Flex","kind":"flex","outline":[[130,95],[170,95],[170,105],[130,105]]}
  • flex.region.remove Remove a region: {"path":"rigid-flex.kicad_pcb","ids":["r3"]}
  • flex.region.set Inner layers absent in the flex: {"path":"rigid-flex.kicad_pcb","id":"r3","absentLayers":["In1.Cu","In2.Cu"]}
  • flex.span.add Blind F.Cu–In1.Cu: {"path":"hdi6.kicad_pcb","from":"F.Cu","to":"In1.Cu","size":0.45,"drill":0.2}
  • flex.span.add Laser microvia In1–In2, staggered only: {"path":"hdi6.kicad_pcb","from":"In1.Cu","to":"In2.Cu","kind":"micro","size":0.35,"drill":0.15,"stacked":false,"staggeredMin":0.4}
  • flex.span.assign A via onto the blind span: {"path":"hdi6.kicad_pcb","ids":["<via uuid>"],"span":"blind-F-In1"}
  • flex.span.drill Drill files per span into fab/: {"path":"hdi6.kicad_pcb","outDir":"fab/"}
  • flex.span.list Spans of the HDI fixture: {"path":"hdi6.kicad_pcb"}
  • flex.span.remove Remove a span: {"path":"hdi6.kicad_pcb","id":"micro-In1-In2"}
  • flex.span.replace Two spans: {"path":"hdi6.kicad_pcb","spans":[{"id":"blind-F-In1","kind":"blind","from":"F.Cu","to":"In1.Cu","size":0.45,"drill":0.2},{"id":"micro-In1-In2","kind":"micro","from":"In1.Cu","to":"In2.Cu","size":0.35,"drill":0.15}]}
  • flex.span.rules Span rules for kicad-cli: {"path":"hdi6.kicad_pcb"}
  • flex.span.set Stricter annular ring: {"path":"hdi6.kicad_pcb","id":"micro-In1-In2","annularMin":0.1}

DFM / DFA / DFF profiles#

CommandCLIKindDescriptionArgsResult
dfm.profiles.activateedsnx dfm profiles activateeditActivate DFM profile. Set the project’s active DFM profile (softforge.dfm.active in the .kicad_pro): live DFM, the Checks panel DFM group and the release gate use it. none clears it (default by copper layer count).path?: string = “.”, id: stringactive
dfm.profiles.exportedsnx dfm profiles exportexportExport DFM profile. Write a DFM profile (bundled, file or project) to a JSON file, to edit it or share it with another project.path?: string = “.”, id: string, out?: stringfile
dfm.profiles.getedsnx dfm profiles getqueryGet DFM profile. One DFM profile as JSON (limits in mm, ratio or count; DFA spacing table; DFF test access).path?: string = “.”, id: stringobject
dfm.profiles.importedsnx dfm profiles importeditImport DFM profile. Import a DFM profile (a JSON file of one profile, an array, or { profiles: […] }; or profile as an object) into the .kicad_pro softforge.dfm.profiles (replacing one with the same id). Validates every limit; activate makes it the active profile.path?: string = “.”, file?: string, profile?: object, activate?: boolean = falseimported, active
dfm.profiles.listedsnx dfm profiles listqueryList DFM profiles. DFM profiles available to the project: bundled (JLCPCB 2/4/6-layer, PCBWay, OSH Park, Eurocircuits, Aisler: typical values, verify), *.dfm.json files in the project folder or dfm/, and those imported into the .kicad_pro; with the active one and any profile file errors.path?: string = “.”active, profiles, errors
dfm.profiles.removeedsnx dfm profiles removeeditRemove DFM profile. Remove an imported profile from the .kicad_pro (bundled and file profiles cannot be removed this way).path?: string = “.”, id: stringremoved
dfm.run
softforge.edsnx.dfm.run
edsnx dfm runcheckRun DFM. Evaluate a fabricator profile (DFM fab limits, DFA assembly spacing, DFF test access) against the board: track width, clearance (geometry and net classes), drill, annular ring, via diameter, mask slivers and expansion, silk width and silk-to-pad, copper to edge, hole to hole / copper, aspect ratio, via in pad, slots, board thickness and size; DFA spacing by package class pair, edge keep-out, tall next to short, same side; DFF access % and probe pitch. Returns counts, per-rule counts and the violations (rule ids dfm_* / dfa_* / dff_*, mm). out writes the full JSON report.path?: string = “.”, profile?: string, rules?: “dfm_track_width” | “dfm_clearance” | “dfm_drill” | “dfm_annular_ring” | “dfm_mask_sliver” | “dfm_silk_width” | “dfm_silk_to_pad” | “dfm_copper_to_edge” | “dfm_hole_to_hole” | “dfm_aspect_ratio” | “dfm_via_in_pad” | “dfa_spacing” | “dfa_edge_keepout” | “dfa_tall_near_short” | “dff_test_access” | “dff_test_pitch” | “dfm_hole_to_copper” | “dfm_via_diameter” | “dfm_mask_expansion” | “dfm_board_thickness” | “dfm_slot_width” | “dfm_board_size” | “dfa_same_side”[], severity?: “all” | “error” | “warning” = “all”, limit?: integer = 200, out?: stringprofile, counts, byRule, violations, testAccess, skipped, file, truncated
dfm.savePackedsnx dfm save-packeditSave DFM profile as rule pack. Write the profile’s hard limits (annular ring, drill range, hole to hole, NPTH to copper, track width, copper to edge, mask dam, silk clearance and thickness) as the Constraint Manager’s “DFM: …” custom rules into the board’s .kicad_dru, so kicad-cli’s DRC enforces them too. Other rules of the file are kept.path?: string = “.”, profile?: stringfile, rules, profile
dfm.viaInPad.setedsnx dfm via-in-pad seteditSet via-in-pad policy. Choose how a DFM profile treats vias inside SMD pads for this project: allowed (no finding), warn (a dfm_via_in_pad warning: filled and capped vias cost extra) or forbidden (an error); default goes back to the profile’s own policy. Stored per profile in the .kicad_pro (softforge.dfm.viaInPad); the DFM tab’s Via in pad selector calls this.path?: string = “.”, mode: “allowed” | “warn” | “forbidden” | “default”, profile?: stringprofile, mode, source
Examples
  • dfm.profiles.activate Use the JLCPCB 4-layer limits: {"id":"jlcpcb-4"}
  • dfm.profiles.export Copy a bundled profile to edit: {"id":"jlcpcb-4","out":"myfab.dfm.json"}
  • dfm.profiles.get The bundled JLCPCB 4-layer profile: {"id":"jlcpcb-4"}
  • dfm.profiles.import Import and activate a fab profile: {"path":"blinky.kicad_pro","file":"myfab.dfm.json","activate":true}
  • dfm.profiles.list Profiles of the project: {"path":"blinky.kicad_pro"}
  • dfm.profiles.remove Remove an imported profile: {"id":"myfab"}
  • dfm.run JLCPCB 4-layer limits on the sample: {"path":"blinky.kicad_pcb","profile":"jlcpcb-4"}
  • dfm.run The active profile, errors only: {"severity":"error"}
  • dfm.savePack Enforce the JLCPCB 2-layer limits in kicad-cli too: {"profile":"jlcpcb-2"}
  • dfm.viaInPad.set Warn instead of failing on via-in-pad with JLCPCB 2-layer: {"mode":"warn","profile":"jlcpcb-2"}

Output jobs#

CommandCLIKindDescriptionArgsResult
jobs.jobset.listedsnx jobs jobset listqueryList job sets. KiCad job sets (.kicad_jobset) of the project folder: each output (folder or archive) as an output job with its steps, and the KiCad jobs it cannot run here (unsupported).path?: string = “.”, file?: stringjobsets
jobs.jobset.runedsnx jobs jobset runexportRun job set. Run a KiCad job set through the output jobs: every output (or output, by id or description) becomes an output job whose steps are its KiCad jobs (Gerbers, drill, position, BOM, PDFs, SVG, DXF, STEP / glTF, ODB++, IPC-2581, IPC-D-356, netlist, execute command); the same export commands, manifest.json and zip as edsnx jobs run. KiCad jobs without an output kind here (DRC, ERC, render, GenCAD …) are reported as skipped steps.path?: string = “.”, file?: string, output?: string, out?: string, version?: string, variant?: stringfile, ok, outputs, skipped
jobs.jobset.saveedsnx jobs jobset saveexportSave output jobs as job set. Write output jobs into a KiCad job set that kicad-cli jobset run (KiCad 9+) can run: one KiCad job per step KiCad has, one output per job (archive when the job zips). An existing job set is updated in place (outputs with the same id replaced, everything else kept). Steps KiCad has no job for (documentation set, panel, web viewer, requirements report, Gerber checks) are listed as skipped.path?: string = “.”, file?: string, jobs?: string[]file, outputs, skipped
jobs.listedsnx jobs listqueryList output jobs. Output jobs of the project (.kicad_pro softforge.outputJobs, else the defaults fab, assembly, docs, panel, webviewer, all): id, name, folder, zip and steps (kinds: gerber, drill, position, bom, pdfSch, pdfPcb, svg, dxf, step, glb, odb, ipc2581, ipcd356, netlist, docset, panel, webviewer, reqReport, custom, gerberCheck).path?: string = “.”jobs, custom, errors
jobs.runedsnx jobs runexportRun output job. Run an output job: each step through the export commands (project.plot / drill / position / bom / export3d / odb / ipc2581, doc.export, panel.export, req.report, kicad-cli for schematic PDF and IPC-D-356, custom shell commands) into /, then manifest.json and the zip. Failed steps are reported, the others still run. Returns the manifest.path?: string = “.”, id: string, out?: string, version?: string, variant?: stringjob, ok, folder, out, steps, files, zip, manifest
jobs.setedsnx jobs seteditSet output jobs. Replace the project’s output jobs (softforge.outputJobs in the .kicad_pro). Each job: { id, name, folder, zip?, steps: [{ kind, options?, folder?, name? (template: ${project} ${version} ${kind} ${job} ${date} ${variant}), variant?, enabled? }] }. [] restores the defaults.path?: string = “.”, jobs: object[]jobs
Examples
  • jobs.jobset.list Job sets of the project: {}
  • jobs.jobset.run Run every output of the project’s job set: {}
  • jobs.jobset.run Only the Fabrication output, into out/: {"output":"Fabrication","out":"out"}
  • jobs.jobset.save Fabrication and assembly jobs as .kicad_jobset: {"jobs":["fab","assembly"]}
  • jobs.list Jobs of the sample project: {"path":"blinky.kicad_pro"}
  • jobs.run Fabrication package into out/: {"id":"fab","out":"out"}
  • jobs.run Assembly outputs of a variant: {"id":"assembly","variant":"lite"}
  • jobs.set A Gerber + drill job zipped: {"jobs":[{"id":"fab","name":"Fabrication","folder":"fab","zip":true,"steps":[{"kind":"gerber"},{"kind":"drill"}]}]}

Releases#

CommandCLIKindDescriptionArgsResult
release.listedsnx release listqueryList releases. Releases of the project (releases//release.json), newest first: version, date, ok, tag, folder, notes, zip.path?: string = “.”current, releases
release.openDialog
softforge.edsnx.release
edsnx release open-dialoguiRelease…. Open the Release dialog of the editor: version, the gate list (ERC, DRC, requirements, DFM, test access, panel DRC, clean git) with Fix gate, output jobs, notes, Release (tag). Agents: use release.plan / release.run. UI-only: needs the open editor.path?: stringobject
release.planedsnx release plancheckPlan release. The release gate without producing anything: each entry { name, ok, detail } for ERC, DRC (errors and unrouted), requirements (req.eval), DFM (a profile), test access %, panel DRC and a clean git working tree; firstFailing is what Fix gate opens.path?: string = “.”, gate?: string[], version?: stringok, gate, firstFailing, tokens, version, tag, problems
release.runedsnx release runexportRelease. Release the project: the gate (refused when it fails unless force), then stamp the version (REVISION text variable, title block revisions, softforge.release), run the jobs into releases//, write release-notes.md (git log since the last v* tag, the board changes against it, the checks), release.json and -.zip, optionally commit the stamped files (commit) and git tag -a v<version> (tag). Returns the ReleaseResult with every gate entry, outputs and errors.path?: string = “.”, version: string, jobs?: string[], gate?: string[], tag?: boolean = false, commit?: boolean = false, notes?: string, folder?: string, variant?: string, stamp?: boolean = true, force?: boolean = falseversion, ok, gate, outputs, tag, folder, notesFile, zip, stamps, errors
Examples
  • release.list Release history: {"path":"blinky.kicad_pro"}
  • release.openDialog Release dialog: {}
  • release.plan Would a release pass?: {"gate":["drc","erc","dfm:jlcpcb-4"]}
  • release.run Release 1.4.0 with fab and assembly outputs, gated on DRC, ERC and JLCPCB 4-layer DFM, tagged: {"version":"1.4.0","jobs":["fab","assembly"],"gate":["drc","erc","dfm:jlcpcb-4"],"tag":true}

Panelization#

CommandCLIKindDescriptionArgsResult
panel.describeedsnx panel describequeryDescribe panel. The panel file and what the generator makes of it: panel size, instances (board, position, rotation), tabs, mouse-bite holes, V-score lines (positions), fiducials, tooling holes, warnings; and whether the output board exists and is up to date.path?: stringfile, panel, summary, instances, vscores, output, upToDate
panel.drcedsnx panel drccheckPanel DRC. Board DRC on the generated panel board plus the panel rules (panel_board_to_rail, panel_mousebite_copper, panel_fiducial_clearance, panel_vscore_copper): native engine (default), kicad-cli, or both (kicad-cli’s report, the panel rules from the native engine). Limits come from the panel file’s options (boardToRail 0.5, mousebiteCopper 0.25, fiducialClearance 1.5, vscoreCopper 0.4 mm by default).path?: string, engine?: “native” | “kicad-cli” | “both” = “native”errors, warnings, violations, engines
panel.exportedsnx panel exportexportExport panel. Write the panel board (and its .kicad_pro) to out (default the panel file’s output), and with gerbers plot the Gerbers (copper, paste, silk, mask, Edge.Cuts) and the Excellon drill files of the panel through kicad-cli into that folder (relative to the panel board).path?: string, out?: string, gerbers?: stringboard, files, errors
panel.generateedsnx panel generateeditGenerate panel board. Generate the panel board from the panel file: every instance’s items transformed (references kept, Panel.Instance property, nets prefixed P/), the outline (panel minus milled slots, tab bridges), V-score lines (Cmts.User), mouse-bite NPTH holes, fiducials, tooling holes and rail text. Writes panel/.kicad_pcb with a .kicad_pro (the first board’s rules, net classes per instance) and the resolved panel file.path?: stringfile, files, dryRun, summary, panel
panel.new
softforge.edsnx.panel.new
edsnx panel neweditNew panel. Create a panel file (*.kicad_panel, default .kicad_panel in the folder) for a board: a grid (cols × rows, gaps, alternate 180° rotation), top and bottom rails (mm) with three fiducials and four 3 mm tooling holes, V-score rows and mouse-bite columns by default; then generate the panel board (panel/.kicad_pcb + .kicad_pro) unless generate is false.path?: string, name?: string, boards: string[], cols?: integer = 3, rows?: integer = 2, gapX?: number, gapY?: number, rails?: number = 8, alternateRotation?: boolean = true, rowsSeparation?: “vscore” | “mousebites” | “tabs” | “none”, colsSeparation?: “vscore” | “mousebites” | “tabs” | “none”, generate?: boolean = true, force?: booleanfile, files, dryRun, summary, panel
panel.setedsnx panel seteditSet panel fields. Change the panel file: name, boards (paths relative to the panel file, or {id, board, variant}), layout ({kind: “grid”, cols, rows, gapX, gapY, alternateRotation} or {kind: “manual”}), instances (manual layout: {boardId, at, rot}), rails ({top, bottom, left, right, fiducials, toolingHoles: {d, inset}}), separation ({rows, cols}: a kind or a Separation), text, options (DRC limits, refill, output). The panel board is regenerated when generate (default true).path?: string, name?: string, boards?: any[], layout?: object, instances?: any[], rails?: object, separation?: object, text?: any[], options?: object, size?: object, generate?: boolean = truefile, files, dryRun, summary, panel
Examples
  • panel.describe The sample panel: {"path":"examples/sample-project/blinky.kicad_panel"}
  • panel.drc Panel DRC of the sample panel: {"path":"examples/sample-project/blinky.kicad_panel"}
  • panel.export Panel Gerbers: {"path":"examples/sample-project/blinky.kicad_panel","gerbers":"fab/"}
  • panel.generate Regenerate the sample panel: {"path":"examples/sample-project/blinky.kicad_panel"}
  • panel.new A 3 × 2 panel of the sample board: {"path":"examples/sample-project/blinky.kicad_panel","boards":["examples/sample-project/blinky.kicad_pcb"]}
  • panel.set Four columns, mouse bites with 6 holes: {"path":"examples/sample-project/blinky.kicad_panel","layout":{"cols":4},"separation":{"cols":{"kind":"mousebites","count":6}},"generate":false}

Test points#

CommandCLIKindDescriptionArgsResult
test.assignedsnx test assigneditAssign test points. Assign one test point per net needing access (existing pads, then vias, by the rules; the most constrained nets first; pitch kept), propose a test pad (TestPoint:TestPoint_Pad_Dmm) at a free spot of a net left without access (on its copper, else next to it with a stub track up to 8 mm; zone fills of other nets give way last and are refilled), and with place add those pads (ref TP, value the net, property TestPoint) and their stubs as one undo step; a net still without access says why (refusals counted per reason). Returns the report and the proposals.path: string, rules?: object, place?: boolean = falsereport, proposals, placed, summary
test.ipcd356edsnx test ipcd356exportIPC-D-356 netlist. Write the IPC-D-356A netlist of the board (bare-board test). engine “auto” uses kicad-cli when installed (pcb export ipcd356), else the native writer (src/test/ipcd356.ts, the same records); “native” always the writer. testPointsOnly (native) keeps the records of the assigned test points.path: string, out?: string, engine?: “auto” | “kicad-cli” | “native” = “auto”, testPointsOnly?: boolean = false, rules?: objectfile, engine, records
test.probeReportedsnx test probe-reportexportProbe report. The test points as a probe report: “csv” (TP, Net, X, Y, Side, Size, Source, Ref), “flying” (generic flying-probe / ICT CSV: Name, Net, X, Y, Side T/B, Pad, Type) or “takaya” (fixed-column text). Coordinates in mm from the board outline’s lower-left corner, y up (origin “kicad”: KiCad coordinates). Proposed pads are included unless existing.path: string, out?: string, format?: “csv” | “flying” | “takaya” = “csv”, origin?: “lower-left” | “kicad” = “lower-left”, existing?: boolean = false, rules?: objectfile, points, accessPercent, text
test.reportedsnx test reportqueryTest access report. Test access per net under the rules: the assigned points (id, net, position, side, source pad / via / added), nets without access with the reason, access %. existing counts only copper already on the board (no proposed pads): what DFF checks (dff_test_access).path: string, rules?: object, existing?: boolean = falsereport, summary
test.rules.getedsnx test rules getqueryTest point rules. The test point rules of the board’s project (.kicad_pro softforge.testPoints) with the defaults filled: nets (“all”), padMin 0.8 mm, pitchMin 1.27 mm, side “either”, prefer pads.path: stringnets, padMin, pitchMin, side, preferVias, preferPads, excludeNets
test.rules.setedsnx test rules seteditSet test point rules. Merge rules into the project’s test point rules (.kicad_pro softforge.testPoints), one undo step with the board.path: string, rules: objectnewIds, touched, revision, hash, label, message, dryRun, diff, changed, steps
Examples
  • test.assign Assign on the sample: {"path":"examples/sample-project/blinky.kicad_pcb"}
  • test.ipcd356 IPC-D-356 of the sample: {"path":"examples/sample-project/blinky.kicad_pcb","engine":"native"}
  • test.probeReport Flying-probe CSV of the sample: {"path":"examples/sample-project/blinky.kicad_pcb","format":"flying"}
  • test.report Access on the sample: {"path":"examples/sample-project/blinky.kicad_pcb"}
  • test.rules.get Sample rules: {"path":"examples/sample-project/blinky.kicad_pcb"}
  • test.rules.set Bottom-side probing, 2.54 mm pitch: {"path":"examples/sample-project/blinky.kicad_pcb","rules":{"side":"bottom","pitchMin":2.54}}

Comments#

CommandCLIKindDescriptionArgsResult
comment.addedsnx comment addeditAdd comment. Start a comment thread: on an item (item: uuid or reference, the thread follows the item when it moves), a point (at mm, optional layer), a region (region outline mm) or the whole document / project (none). Mentions are @handles (@agent posts the thread to the attached agent from the editor). The author defaults to git config user.name. Writes <project>.comments.json.path: string, body: string, item?: string, at?: [x, y], region?: [x, y][], layer?: string, author?: string, labels?: string[]file, thread
comment.exportedsnx comment exportexportExport comments. The comment threads as Markdown for the review report (one section per thread: anchor, state, author, body, replies; detached item anchors marked). out writes the file, else the text is returned.path?: string = “.”, state?: “open” | “resolved” | “all” = “all”, out?: stringtext, file, threads
comment.listedsnx comment listqueryList comments. Comment threads of the project (<project>.comments.json): number, state (open / resolved), author, body, replies, the anchor (item uuid, point, region or file) resolved on its document (“R8”, detached when the item is gone) and the counts. Filter by state or by document.path?: string = “.”, state?: “open” | “resolved” | “all” = “all”, file?: stringfile, threads, counts
comment.replyedsnx comment replyeditReply to comment. Reply to a comment thread (by number or id). The author defaults to git config user.name; @mentions are recorded.path?: string = “.”, thread: string, body: string, author?: stringfile, thread, reply
comment.resolveedsnx comment resolveeditResolve comment. Resolve a comment thread (by number or id), or reopen it with reopen. Records who resolved it and when.path?: string = “.”, thread: string, reopen?: boolean = false, by?: stringfile, thread
comment.showPanel
softforge.edsnx.comments.show
edsnx comment show-paneluiComments and Design Review Panel. Show the Comments tab of the board or schematic editor: the comment threads of the document (filter, New comment, Region, Export to report), the Live Share session, the design review of the current branch and the web viewer card.path?: string = “.”object
Examples
  • comment.add On R8: {"path":"blinky.kicad_pcb","item":"R8","body":"This trace runs under the crystal; can we move it to B.Cu? @agent"}
  • comment.add At a point: {"path":"blinky.kicad_pcb","at":[120.5,98],"layer":"F.Cu","body":"Zone clearance near U1"}
  • comment.export Open threads into the report: {"state":"open","out":"review/comments.md"}
  • comment.list Open threads: {"path":"blinky.kicad_pro","state":"open"}
  • comment.list Threads on the board: {"file":"blinky.kicad_pcb"}
  • comment.reply Reply to #1: {"thread":"1","body":"Yes, re-routing on B.Cu with a via pair."}
  • comment.resolve Resolve #2: {"thread":"2"}
  • comment.resolve Reopen #2: {"thread":"2","reopen":true}
  • comment.showPanel Open the Comments tab: {}

Web viewer#

CommandCLIKindDescriptionArgsResult
viewer.exportedsnx viewer exportexportExport web viewer. Export a static web viewer folder (index.html, viewer.js, data/): the boards and schematics of the project (or documents) with layers, net highlight, measure, zoom / pan; 3d adds the components’ 3D models for the 3D tab (read natively from the footprints’ VRML / glb models, no kicad-cli; models3d kicad-cli or auto to use it), comments the comment pins, checks ERC / DRC markers. The documents show an assembly variant (variant, default the project’s active one; base the files): DNP parts crossed / hatched as in the editors and left out of the 3D models, value overrides on the canvas. Opens from file:// and any static host (relative paths only). Returns the folder, files, size, manifest and the link (baseUrl, else the setting softforge.edsnx.collab.baseUrl in .vscode/settings.json, else the CI-written URL, else file://).path?: string = “.”, documents?: string[], out?: string = “viewer”, 3d?: boolean = false, models3d?: “native” | “kicad-cli” | “auto” = “native”, comments?: boolean = false, checks?: boolean = false, variant?: string, title?: string, baseUrl?: stringout, files, bytes, manifest, url, urlSource, warnings
Examples
  • viewer.export Project with comments and checks: {"path":"blinky.kicad_pro","out":"public/viewer","comments":true,"checks":true}
  • viewer.export Board with 3D: {"path":"blinky.kicad_pcb","out":"viewer","3d":true}
  • viewer.export An assembly variant, published under a base URL: {"path":"blinky.kicad_pro","out":"public/viewer","variant":"lite","baseUrl":"https://team.pages.example/blinky/viewer"}

MCAD co-design#

CommandCLIKindDescriptionArgsResult
mcad.booleanedsnx mcad booleaneditReference solid boolean. Combine two reference solids: op union, subtract (a − b) or intersect. With the OCCT add-on and both solids from STEP files the boolean runs on the exact B-rep (tolerance ~1e-7 mm) and is tessellated once; otherwise mesh CSG (BSP) on their triangles in the main extension, whose curved faces carry the input tessellation’s chord error (src/mcad/booleans.ts). The result is a glb in .softforge/mcad/ that replaces solid a (or becomes solid id); hideB hides solid b. Returns the engine, the precision note, the volume and the triangle count.path: string, a: string, b: string, op: “union” | “subtract” | “intersect”, id?: string, name?: string, hideB?: boolean = false, meshQuality?: number = 0.5solid, engine, precision, volumeMm3, triangles, file
mcad.clearance
softforge.edsnx.mcad.clearance
edsnx mcad clearancecheckMCAD clearance check. 3D clearance of the board against its reference solids (src/mcad/clearance.ts; the DRC rules mcad_*): component bodies (courtyard × height: Height field, package table, type default; or their 3D model meshes with models) colliding with a solid (penetration depth along the smallest push, location in the MCAD frame and on the board), bodies closer than clearanceMinMm (enclosure clearance), bodies completely inside a closed solid, solids intruding into the board, parts above a height envelope, enclosure bosses without a mounting hole. Returns the hits, the minimum clearance (negative = penetration), an interference volume estimate and the time.path: string, clearanceMinMm?: number, componentPairs?: boolean = false, models?: stringhits, envelopes, mounting, minClearanceMm, interferenceMm3, counts, ms, warnings
mcad.describeedsnx mcad describequeryDescribe MCAD. The board’s MCAD file (<board>.kicad_mcad.json): reference solids (file, kind, placement in the MCAD frame — mm, z up, y = −KiCad y, z = 0 on the board bottom — opacity, visibility, mesh state and bounds), height envelopes, enclosure bosses, the clearance minimum, whether the OCCT add-on is available, and the IDX exchange history.path: stringfile, exists, occt, solids, envelopes, bosses, clearanceMinMm, history, warnings
mcad.envelope.addedsnx mcad envelope addeditAdd height envelope. Add a height envelope: parts on side whose footprint box overlaps outline may be at most maxHeight mm high (rule mcad_height_envelope). Returns the id.path: string, id?: string, name?: string, outline: [x, y][], side?: “top” | “bottom” = “top”, maxHeight: numberid, envelope, file
mcad.envelope.removeedsnx mcad envelope removeeditRemove height envelopes. Remove height envelopes.path: string, ids: string[]removed, file
mcad.envelope.setedsnx mcad envelope seteditEdit height envelope. Change a height envelope: name, outline, side, maxHeight.path: string, id: string, name?: string, outline?: [x, y][], side?: “top” | “bottom”, maxHeight?: numberenvelope, file
mcad.exportStepedsnx mcad export-stepexportExport board STEP. The board as a STEP assembly through the OCCT add-on: the outline with its cut-outs and drilled holes (⌀ ≥ minHole) extruded by the board thickness from z = 0, plus each footprint’s STEP model (paths with ${VARS} expanded from the environment and the project; .wrl falls back to the .step beside it) placed at its position, rotation and side with the model’s offset / rotation / scale. Parts without a STEP model are listed in missing. MCAD frame: mm, z up, y = −KiCad y.path: string, out: string, components?: boolean = true, minHole?: number = 0.6file, bytes, components, holes, missing
mcad.idx.applyedsnx mcad idx applyeditApply accepted IDX changes. Apply the accepted changes of the pending IDX exchange: outline (Edge.Cuts replaced), component and mounting-hole moves / rotations / side, Height fields, keep-out rule areas (add / reshape / delete) in one undo step on the board; height limits and mounting bosses in the MCAD file. Changes that cannot apply (new electrical parts, pad holes) are listed in skipped.path: string, file?: stringapplied, skipped, edits
mcad.idx.decideedsnx mcad idx decideeditAccept / reject IDX changes. Accept or reject changes of the pending IDX exchange (or of file): accept / reject list item ids (* = every undecided one), comments maps item id → comment for the response.path: string, file?: string, accept?: string[], reject?: string[], comments?: objectchanges
mcad.idx.exportedsnx mcad idx exportexportExport IDX. Write the board as an IDX 3.0 baseline (ProSTEP iViP EDMDDataSet, SendInformation): board outline and thickness, cut-outs, non-plated and mounting holes, keep-out rule areas, component placements with heights (Height field / package table) and sides, height envelopes as component keep-outs with an upper bound. Coordinates in the MCAD frame (y up). Records the exchange in <board>.kicad_idx.json.path: string, out: string, creator?: stringfile, items, bytes, baseline
mcad.idx.historyedsnx mcad idx historyqueryIDX history. The IDX exchanges of the board (<board>.kicad_idx.json), newest last: file, direction (ecad = sent, mcad = received), date, item count, changes with their decisions, when applied.path: string, changes?: boolean = falseexchanges
mcad.idx.import
softforge.edsnx.mcad.idxImport
edsnx mcad idx importqueryImport IDX. Read an IDX from MCAD (a baseline or SendChanges proposals) and compute its changes against the board’s current items: board outline, holes, mounting holes, keep-outs, component moves / rotations / heights, height limits, notes — each with a summary (op add / modify / remove). Records the exchange (decisions undecided); the editor opens the review dialog. Nothing changes on the board until mcad.idx.apply.path: string, file: stringkind, items, changes, header
mcad.idx.respondedsnx mcad idx respondexportWrite IDX response. Write the response IDX for the pending exchange: SendChanges with each change’s IsAccepted (true / false; undecided count as rejected) and comment, for the MCAD tool to merge. Recorded in the history.path: string, out: string, file?: stringfile, accepted, rejected, undecided
mcad.importStep
softforge.edsnx.mcad.importStep
edsnx mcad import-stepeditImport reference solid. Add (or replace, with id) a reference solid such as an enclosure: a STEP is tessellated by the OCCT add-on (meshQuality 0…1) into .softforge/mcad/<name>-<key>.glb, a .glb (metres, y up like kicad-cli) is referenced as is. Placement at / rot in the MCAD frame (mm, degrees about x, then y, then z). With detectBosses the add-on’s vertical cylinders of the STEP become mounting bosses. Writes the MCAD file; returns the solid and its bounds.path: string, file: string, id?: string, name?: string, kind?: “enclosure” | “battery” | “mechanical” | “other”, at?: number[], rot?: number[], opacity?: number, meshQuality?: number = 0.5, detectBosses?: boolean = falsesolid, bounds, converted, bosses, file
mcad.link
softforge.edsnx.mcad.link
edsnx mcad linkeditMCAD link folder. Set the live MCAD link: an exchange folder shared with the MCAD system. The board’s IDX baseline is written there (<stem>-ecad-baseline.idx, unless publish is false); IDX proposals (.idx / .xml) and solids (.step / .stp / .glb) that MCAD drops there become proposals (mcad.link.scan; the editor watches the folder and opens the review). off clears the link. Without folder or off: the current link and the files waiting.path: string, folder?: string, off?: boolean = false, publish?: boolean = truefolder, baseline, waiting
mcad.link.respondedsnx mcad link respondeditAnswer MCAD link proposal. Answer the pending IDX exchange through the link folder: apply applies the accepted changes first (as mcad.idx.apply), reject rejects every undecided change (with comment); the response IDX (<stem>-ecad-response-<time>.idx) is written into the folder for MCAD to merge.path: string, apply?: boolean = false, reject?: boolean = false, comment?: stringfile, accepted, rejected, undecided, applied
mcad.link.scanedsnx mcad link scanqueryScan MCAD link folder. Take the new or changed files of the MCAD link folder as proposals: an IDX is imported against the board (an exchange with its changes, as mcad.idx.import; review with mcad.idx.decide), a STEP / glb becomes “update reference solid ” (same file name) or “add a reference solid” (apply with mcad.importStep { file, id }). Each file is proposed once per modification.path: string, settleMs?: integer = 300proposals
mcad.outlineedsnx mcad outlineeditBoard outline from STEP / DXF. Set the board outline from MCAD: a DXF (LINE / ARC / CIRCLE / LWPOLYLINE / POLYLINE, built in) or a STEP (the OCCT add-on: the largest planar face at the top or bottom, else a section). The largest loop is the outline, loops inside it are cut-outs; y is flipped (MCAD y up → KiCad y down) and offset [dx, dy] (board mm) is added. With replace (default) the board-level Edge.Cuts shapes are deleted first. One undo step. preview returns the outline without editing.path: string, file: string, plane?: “top” | “bottom” = “top”, layer?: string, offset?: [x, y], replace?: boolean = true, preview?: boolean = false, tolerance?: numberouter, holes, size, source, deleted, edits, warnings
mcad.requirementedsnx mcad requirementeditEnclosure clearance requirement. Add a requirement (layer family Mechanical) that the clearance between component bodies and the enclosure stays ≥ limit (default the MCAD file’s minimum clearance): quantity mechanical enclosureClearance, aggregate min, over the board. The editor supplies the value from each clearance run (requirementsEval setExternalQuantity). Returns the requirement id and the current minimum.path: string, limit?: number, name?: stringid, limit, current
mcad.solid.removeedsnx mcad solid removeeditRemove reference solids. Remove reference solids (and the bosses detected on them). Cached glbs stay in .softforge/mcad/.path: string, ids: string[]removed, file
mcad.solid.setedsnx mcad solid seteditEdit reference solid. Change a reference solid: name, kind, at / rot (MCAD frame), opacity, visible.path: string, id: string, name?: string, kind?: “enclosure” | “battery” | “mechanical” | “other”, at?: number[], rot?: number[], opacity?: number, visible?: booleansolid, file
Examples
  • mcad.boolean Cut the connector opening out of the enclosure: {"path":"blinky.kicad_pcb","a":"s1","b":"s2","op":"subtract","hideB":true}
  • mcad.clearance The sample under its enclosure: {"path":"blinky.kicad_pcb"}
  • mcad.describe The sample’s enclosure and envelope: {"path":"blinky.kicad_pcb"}
  • mcad.envelope.add 4 mm under a display window: {"path":"blinky.kicad_pcb","name":"Display","outline":[[119,108],[131,108],[131,120],[119,120]],"maxHeight":4}
  • mcad.envelope.remove Remove an envelope: {"path":"blinky.kicad_pcb","ids":["e1"]}
  • mcad.envelope.set Allow 5.5 mm: {"path":"blinky.kicad_pcb","id":"e1","maxHeight":5.5}
  • mcad.exportStep The sample board as STEP: {"path":"blinky.kicad_pcb","out":"blinky.step"}
  • mcad.idx.apply Apply what was accepted: {"path":"blinky.kicad_pcb"}
  • mcad.idx.decide Accept the hole move, reject the keepout: {"path":"blinky.kicad_pcb","accept":["mounting:H1"],"reject":["keepout:K1"],"comments":{"keepout:K1":"Antenna area needs copper"}}
  • mcad.idx.export Baseline for the MCAD team: {"path":"blinky.kicad_pcb","out":"blinky.idx"}
  • mcad.idx.history Exchanges so far: {"path":"blinky.kicad_pcb"}
  • mcad.idx.import Proposals from the enclosure designer: {"path":"blinky.kicad_pcb","file":"from-mcad.idx"}
  • mcad.idx.respond Answer the MCAD proposals: {"path":"blinky.kicad_pcb","out":"blinky-response.idx"}
  • mcad.importStep The sample enclosure (glb) over the board: {"path":"blinky.kicad_pcb","file":"enclosure.glb","at":[125,-117.5,0]}
  • mcad.importStep A STEP enclosure with its bosses: {"path":"blinky.kicad_pcb","file":"enclosure.step","at":[125,-117.5,0],"detectBosses":true}
  • mcad.link Link to the enclosure team’s share: {"path":"blinky.kicad_pcb","folder":"mcad-exchange"}
  • mcad.link Stop the link: {"path":"blinky.kicad_pcb","off":true}
  • mcad.link.respond Apply what was accepted and answer: {"path":"blinky.kicad_pcb","apply":true}
  • mcad.link.respond Reject the proposal: {"path":"blinky.kicad_pcb","reject":true,"comment":"Keep the connector where it is"}
  • mcad.link.scan What did MCAD send?: {"path":"blinky.kicad_pcb"}
  • mcad.outline Outline from a DXF, moved into the sheet: {"path":"blinky.kicad_pcb","file":"outline.dxf","offset":[100,135]}
  • mcad.outline Preview the outline of a STEP: {"path":"blinky.kicad_pcb","file":"enclosure-pcb.step","preview":true}
  • mcad.requirement Keep 1 mm to the enclosure: {"path":"blinky.kicad_pcb","limit":1}
  • mcad.solid.remove Remove the enclosure: {"path":"blinky.kicad_pcb","ids":["s1"]}
  • mcad.solid.set Lift the enclosure 0.5 mm: {"path":"blinky.kicad_pcb","id":"s1","at":[125,-117.5,0.5]}

Signal and power integrity#

CommandCLIKindDescriptionArgsResult
si.acedsnx si accheckPDN impedance (AC). AC impedance |Z(f)| of each supply net seen from an IC’s supply pins (2.1.0): plane pairs (the net’s fills facing ground fills on the adjacent layer, C = ε0·εr·A/h, the plane-to-plane capacitance), decoupling capacitors (value from the footprint, ESL / ESR from its ESL / ESR fields when present, else by package; mounting and spreading inductance), the VRM (R + L) and the IC’s via loop; the target impedance V·ripple / (I·transient fraction) and the bands above it. Run on demand, separate from the DC solve. Records the results in the SI file.path: string, nets?: string[], at?: string, fMinHz?: number, fMaxHz?: number, points?: integer, targetOhm?: number, record?: boolean = trueac, file, ms
si.asRequirementedsnx si as-requirementeditPDN result as requirement. Add an L requirement on the PDN overlay of a net: quantity: "drop" → max of the si.pdn.<net>.drop overlay (mV) ≤ limit (default the net’s irDropMaxMv), "current" → max of si.pdn.<net>.j (A/mm²) ≤ limit (default jMaxAPerMm2). Evaluated live in the editor when the SI/PI panel has solved the net. Returns the requirement id (req.add).path: string, net: string, quantity?: “drop” | “current” = “drop”, limit?: numberid, requirement
si.checksedsnx si checkscheckReturn path and EMC checks. The signal / power integrity DRC rules alone (native engine, with the board’s SI file): si_return_path_split, si_reference_change_no_via, si_stitching_pitch, si_edge_rate_series_r, si_stub_length, si_crosstalk_coupling, si_impedance_out_of_range, pdn_ir_drop, pdn_current_density, pdn_decoupling_distance. Each violation has the rule, severity, message, position and items. The pdn_* rules use the results recorded by si.pdn. decoupling also lists the decoupling estimate per IC and supply net.path: string, rules?: “si_return_path_split” | “si_reference_change_no_via” | “si_stitching_pitch” | “si_edge_rate_series_r” | “si_stub_length” | “si_crosstalk_coupling” | “si_impedance_out_of_range” | “pdn_ir_drop” | “pdn_current_density” | “pdn_decoupling_distance”[]violations, errors, warnings, decoupling
si.describeedsnx si describequeryDescribe signal / power integrity setup. The SI file of a board (<board>.kicad_si.json): rule settings (fMaxHz, stitching λ fraction, stub, crosstalk, impedance tolerance and targets, IR-drop limits per net, J max, decoupling distance), IBIS-lite models (built-in and the file’s), per-net driver / receiver models and pins, load and source points, and a summary of the last results (worst Z0 / crosstalk per net, drop and J per PDN net).path: stringfile, exists, rules, models, netModels, sources, loads, results, warnings
si.emissionedsnx si emissioncheckRadiated-emission estimate. An ESTIMATE of the radiated emission against the CISPR 32 class B limit (2.1.0; not a measurement): differential-mode radiation of every analysed signal net’s loop (Ott, E = 2.63e-14·f²·A·I/r) and common-mode radiation driven by the return-path discontinuities of the si_return_path_split / si_reference_change_no_via checks into an attached cable (E = 1.257e-6·f·L·I_cm/r), the clock spectra as trapezoid envelopes, 10 m below 1 GHz and 3 m above. Per frequency: dBµV/m of each part, total, limit and margin; the worst margin; the sources ranked; the assumptions. clocks sets toggle frequencies per net, cableM the cable (0: the board). Records the result in the SI file.path: string, nets?: string[], clocks?: object, defaultClockHz?: number, cableM?: number, points?: integer, record?: boolean = trueestimate, worst, sources, points, assumptions, file
si.handoffedsnx si handoffexportField-solver hand-off. Write a field-solver model of the selected nets: tool: "openems" writes <name>.py (CSXCAD + openEMS python: dielectrics, copper as extruded polygons, lumped ports, mesh, run, Touchstone output) and geometry.xml (CSX); tool: "elmer" writes model.geo (gmsh), case.sif (VectorHelmholtz) and run.sh. The region defaults to the nets’ copper + 3 mm; reference planes (fills of other nets) in the region are included. Mesh presets: coarse / normal / fine = 10 / 20 / 40 cells per wavelength at fMax in the dielectric. Ports default to the two farthest pads of each net (50 Ω).path: string, tool: “openems” | “elmer”, nets: string[], region?: [x0, y0, x1, y1], mesh?: “coarse” | “normal” | “fine” = “normal”, fMaxHz?: number, ports?: object[], out: string, name?: stringfiles, ports, region, resolution, warnings
si.lossyedsnx si lossyqueryLossy line model. The lossy, dispersive line model of a track (2.1.0): per frequency R (skin effect, Wheeler’s incremental-inductance rule), L, G (Djordjevic–Sarkar dielectric fitted to the layer’s εr and tan δ), C, Zc, the conductor / dielectric / total attenuation (dB/m) and the phase delay, for a layer and width; or, with net, the insertion loss of the net’s routed copper and (out) its 2-port Touchstone (the sections cascaded, 50 Ω ports) for the S-parameter card.path: string, layer?: string, width?: number, net?: string, freqHz?: number[], out?: stringline, points, net, file
si.pdnedsnx si pdncheckPDN IR drop. DC solve of each PDN net’s copper (zone fills on a grid, tracks, vias, pads as a resistive mesh) under its load and source points: worst drop (mV) and where, worst current density (A/mm²), where and on which layer, drop per load, the limit (irDropMaxMv) and the decoupling check (nearest capacitor per IC and supply net, loop inductance nH). gridMm sets the grid pitch (default automatic). out writes the drop and current-density fields as overlay JSON files (<net>-drop.json, <net>-j.json). Records the results in the SI file (the pdn_* DRC rules read them).path: string, nets?: string[], gridMm?: number, out?: string, record?: boolean = truepdn, fields, warnings, file, ms
si.point.addedsnx si point addeditAdd load / source point. Add a PDN load (kind: "load", currentA drawn from the net there; on a return net whose sources are all 0 V the current flows back in) or source (kind: "source", voltageV, default from the net name: +3V3 → 3.3, GND → 0) on a pad (ref + pad) or at at on layer of net. Returns the point.path: string, kind?: “load” | “source” = “load”, id?: string, net?: string, ref?: string, pad?: string | integer, at?: [x, y], layer?: string, currentA?: number, voltageV?: numberpoint, file
si.point.removeedsnx si point removeeditRemove load / source points. Remove load and source points by id.path: string, ids: string[]removed, file
si.setedsnx si seteditSet SI rules and models. Change the SI file: rules is merged into the rule settings (irDropMaxMv merged per net), netModels per net (null removes a net’s entry), models adds or replaces IBIS-lite models by id ({ id, name, kind: driver | receiver | io, rOut Ω, cIn pF, vHigh, vLow, edgePsPerV, thresholds { vih, vil } }). Writes <board>.kicad_si.json.path: string, rules?: object, netModels?: object, models?: object[]file, rules, netModels, models
si.showPanel
softforge.edsnx.si.show
edsnx si show-paneluiSI/PI Panel. Show the SI/PI panel of the board editor: per-net table (Z0, delay, crosstalk, reflection), PDN table (load, drop, J max with limits), return path and EMC checks, Add load point / Solve DC / Decoupling check / As requirement, S-parameters and field-solver hand-off.path?: stringobject
si.solveedsnx si solveexportRun a field solver. Run openEMS or Elmer on the hand-off model of the selected nets (2.1.0): the model is written to out (si.handoff), then openEMS runs geometry.xml (its port probes become <name>.s<N>p) or the python script, Elmer runs run.sh (gmsh → ElmerGrid → ElmerSolver → <name>.vtu). Fails with “service-unavailable” and the owner note when the solver is not installed (si.solvers).path: string, tool: “openems” | “elmer”, nets: string[], mesh?: “coarse” | “normal” | “fine” = “coarse”, fMaxHz?: number, out: string, name?: stringfiles, touchstone, field, warnings
si.solversedsnx si solversqueryField solvers installed. Detect openEMS (the openEMS executable, or its python bindings) and Elmer (ElmerSolver, ElmerGrid and gmsh): installed or not, how it runs, the programs probed with their first output line, the reason when not installed and the owner note (what to install). The openEMS / Elmer custom tools and si.solve use the same detection.—solvers
si.sparamsedsnx si sparamsqueryRead S-parameters. Read a Touchstone file (.sNp, v1 or v2): ports, frequency range and points, reference impedance, and per requested pair (default S11 and S21) |S| in dB at up to points frequencies plus the −3 dB and −10 dB crossing frequencies.file: string, pairs?: integer[][], points?: integer = 21ports, z0, fMinHz, fMaxHz, count, params
si.tlineedsnx si tlinecheckTransmission lines and crosstalk. Per signal net: Z0 average / min / max (Ω) of its segments from the stack-up (microstrip / stripline; Zdiff of coupled differential pair segments), delay (ps) from the driver pin to the receiver (or the farthest pad), routed length, via stubs (mm, quarter-wave resonance Hz), crosstalk against parallel neighbours (aggressor, coupled length, spacing, NEXT / FEXT dB, worst point) and, with a driver model, the reflection estimate (overshoot %, settle ps, monotonic, notes). segments adds every segment. Records the results in the SI file.path: string, nets?: string[], segments?: boolean = false, record?: boolean = truenets, file, ms
Examples
  • si.ac AC impedance of every supply net: {"path":"blinky.kicad_pcb"}
  • si.ac +5V against 0.1 Ω up to 500 MHz: {"path":"blinky.kicad_pcb","nets":["+5V"],"targetOhm":0.1,"fMaxHz":500000000}
  • si.asRequirement +5V drop below 50 mV: {"path":"blinky.kicad_pcb","net":"+5V","quantity":"drop","limit":50}
  • si.checks Return path and EMC of the sample: {"path":"blinky.kicad_pcb"}
  • si.describe SI setup of the sample: {"path":"blinky.kicad_pcb"}
  • si.emission Emission estimate of the sample: {"path":"blinky.kicad_pcb"}
  • si.emission A 25 MHz clock on /OUT, no cable: {"path":"blinky.kicad_pcb","clocks":{"/OUT":25000000},"cableM":0}
  • si.handoff openEMS model of /OUT: {"path":"blinky.kicad_pcb","tool":"openems","nets":["/OUT"],"out":"si/openems"}
  • si.lossy F.Cu 0.3 mm line: {"path":"blinky.kicad_pcb","layer":"F.Cu","width":0.3}
  • si.lossy Loss of a net with its Touchstone: {"path":"blinky.kicad_pcb","net":"/OUT","out":"si/out-lossy.s2p"}
  • si.pdn Solve every PDN net: {"path":"blinky.kicad_pcb"}
  • si.pdn +5V with field files: {"path":"blinky.kicad_pcb","nets":["+5V"],"out":"si-fields"}
  • si.point.add 0.3 A load on U1 pin 8: {"path":"blinky.kicad_pcb","kind":"load","ref":"U1","pad":"8","currentA":0.3}
  • si.point.add 5 V source on J1 pin 1: {"path":"blinky.kicad_pcb","kind":"source","ref":"J1","pad":"1"}
  • si.point.remove Remove a load: {"path":"blinky.kicad_pcb","ids":["L1"]}
  • si.set IR-drop limit and a driver model: {"path":"blinky.kicad_pcb","rules":{"irDropMaxMv":{"+5V":50}},"netModels":{"/OUT":{"driver":"cmos5","receiver":"input-5pf","driverPin":"U1.3","receiverPin":"J2.1"}}}
  • si.showPanel Open the SI/PI panel: {}
  • si.solve openEMS on /OUT: {"path":"blinky.kicad_pcb","tool":"openems","nets":["/OUT"],"out":"si/openems-run"}
  • si.solvers Which field solvers are installed: {}
  • si.sparams S11 / S21 of the sample’s line: {"file":"si/out-line.s2p"}
  • si.tline Every signal net: {"path":"blinky.kicad_pcb"}
  • si.tline One net with segments: {"path":"blinky.kicad_pcb","nets":["/OUT"],"segments":true}

Gerber engine and viewer#

CommandCLIKindDescriptionArgsResult
gerber.checkedsnx gerber checkcheckCheck Gerbers. Gerber-level DFM on a fab set from any tool (rules gbr_min_feature, gbr_min_clearance, gbr_min_annular, gbr_sliver, gbr_mask_opening, gbr_paste_opening, gbr_outline_open, gbr_drill_to_copper, gbr_missing_layer, gbr_attribute_mismatch): min copper feature (erosion), min copper clearance, min annular ring (plated holes vs copper), solder mask slivers, pads without mask opening, paste off copper, Profile outline closure, hole to copper, missing layers and job-file attribute mismatches. Limits from profile (a DFM profile id: jlcpcb-4 …), else the project’s active profile when the set sits in a project, else defaults; single limits override. failOn error / warning puts the findings in errors (output jobs fail the step). out writes the JSON report.path: string, profile?: string, board?: string, rules?: “gbr_min_feature” | “gbr_min_clearance” | “gbr_min_annular” | “gbr_sliver” | “gbr_mask_opening” | “gbr_paste_opening” | “gbr_outline_open” | “gbr_drill_to_copper” | “gbr_missing_layer” | “gbr_attribute_mismatch”[], minFeature?: number, minClearance?: number, minAnnular?: number, sliver?: number, drillToCopper?: number, failOn?: “none” | “error” | “warning” = “none”, out?: string, limit?: integer = 200, text?: boolean = false, load?: boolean = falsecounts, summary, findings, settings, profile, errors, file, table, truncated, load
gerber.compareedsnx gerber comparecheckCompare Gerbers. Compare two fab sets layer by layer (paired by X2 file function, file-name heuristics otherwise): dark area of each, XOR area and its share of the layer, XOR regions with bboxes (only in a / only in b), aperture function counts, drill hits per size and file attribute differences. Either side may be a .kicad_pcb, plotted natively (Gerber vs board). ok when every pair is within tolerance % with no other difference and no layer is unmatched.path: string, b: string, tolerance?: number = 0.01, shapes?: boolean = false, ignore?: string[], maxRegions?: integer = 20, text?: boolean = false, png?: stringok, tolerancePct, pairs, unmatchedA, unmatchedB, a, b, table, diff
gerber.compareReview
softforge.edsnx.gerber.compareReview
edsnx gerber compare-reviewuiReview Gerber vs Gerber. Open the Gerber vs Gerber review in the Gerber viewer: one row per layer with the XOR thumbnail, areas, XOR %, regions (click to centre), aperture and attribute differences, Export Markdown, and a stale banner with Re-run when a file of either set changes on disk. Without arguments it reviews the active viewer’s last compare, else asks for two fab sets. UI-only: agents use gerber.compare.a?: string, b?: stringobject
gerber.exportedsnx gerber exportexportExport Gerbers. Plot a board into a fabrication set: one RS-274X file per layer (X2 file functions, aperture functions, X2 netlist .N/.P/.C attributes), Excellon drill files (PTH / NPTH), drill maps and the .gbrjob job file. engine native (default: the SoftForge engine, no KiCad needed) or kicad-cli. Flags mirror the Plot dialog (layers, precision, protel, x2, netlist, disableMacros, subtractMask, auxOrigin, mergeNpth, drillMap, drillUnits; options takes a whole PlotOptions). Unsaved edits of an open board are plotted. Returns the files written.path: string, out?: string = “fab/”, engine?: “native” | “kicad-cli” = “native”, layers?: string[], precision?: 5 | 6, protel?: boolean, x2?: boolean, netlist?: boolean, disableMacros?: boolean, subtractMask?: boolean, auxOrigin?: boolean, mergeNpth?: boolean, drillMap?: boolean, drillUnits?: “mm” | “in”, options?: object, variant?: string, glyphs?: “kicad” | “softforge” = “kicad”files, folder, engine, warnings, errors
gerber.jobedsnx gerber jobqueryGerber job file. The job file (.gbrjob) of a fab set: project, size, copper layer count, thickness, files with their FileFunction and polarity, the material stack-up, plus missing / mismatch (job entries without a file, files whose X2 function or polarity differ, gbr_missing_layer / gbr_attribute_mismatch). With a .kicad_pcb: the native engine’s job file (out writes it).path: string, out?: stringjob, files, missing, mismatch, file
gerber.openSet
softforge.edsnx.gerber.openSet
edsnx gerber open-setuiOpen fab set…. Open a folder or a .zip of Gerber / drill / job files in the Gerber viewer (custom editor softforge.edsnx.gerber; opening one .gbr / .drl / .gbrjob loads its siblings as the set). UI-only: needs the open editor. Agents: use gerber.set and gerber.view.path?: stringobject
gerber.parseedsnx gerber parsequeryParse a Gerber, drill or job file. Read one fab file with the SoftForge Gerber reader. Gerber: units, coordinate format, X2 file attributes (function, polarity, generator, project), apertures (D-code, shape, size in mm, aperture function, use count), macro names, object counts (flashes, draws, arcs, regions, clear objects, X3 components), the bounding box (mm, board frame: y down) and the dark area after clear passes when geometry. Excellon: units, format, tools (diameter mm, plated), hits / slots / routes. Job: the parsed .gbrjob. Every unknown or legacy construct is a warning, never an error.path: string, geometry?: boolean = truefile, kind, warnings
gerber.setedsnx gerber setqueryRead a fab set. Load a fab set (a folder, a .zip, or one file of it → its folder) as the Gerber viewer does: each layer with its id, file, name (F.Cu, B.Mask, Edge.Cuts … from the X2 .FileFunction, the job file or the file name: KiCad -F_Cu.gbr, Protel .gtl/.gbl/.gts/.gbs/.gto/.gbo/.gtp/.gbp/.gm1/.gko, .drl/.xln/.txt), function, colour, side, default order (0 = top of the Layers list) and kind; the job file (stack-up, board thickness); the status line (Gerber · 11 files · mm · 4.6 · X2); parse times and warnings per file.path: stringroot, layers, status, warnings
gerber.viewedsnx gerber viewexportRender Gerbers. Render a fab set (folder, zip, one Gerber/drill file’s folder, or a board plotted natively) with the Gerber viewer’s colours and stacking to a PNG (png), an SVG (svg) and / or a PDF (pdf, vector, 1:1). Headless and browser-free (a software rasteriser). layers limits the layers (F.Cu, B.Mask, Edge.Cuts, PTH … or file names), flipped views from the bottom. Returns the files and the layers drawn.path: string, png?: string, svg?: string, pdf?: string, layers?: string[], size?: integer = 1600, flipped?: boolean = false, background?: string = “#0b1b2b”files, layers, width, height, warnings
Examples
  • gerber.check A fab zip against the JLCPCB 4-layer limits: {"path":"fab.zip","profile":"jlcpcb-4"}
  • gerber.check Only the outline and drill checks: {"path":"fab/","rules":["gbr_outline_open","gbr_drill_to_copper"]}
  • gerber.compare Did the plot match the board?: {"path":"blinky.kicad_pcb","b":"fab/"}
  • gerber.compare Two revisions of a fab set: {"path":"fab-rev-a.zip","b":"fab-rev-b.zip","tolerance":0}
  • gerber.compareReview Review two revisions: {"a":"fab-rev-b.zip","b":"fab-rev-a.zip"}
  • gerber.export Native Gerbers, drill and job file into fab/: {"path":"blinky.kicad_pcb","out":"fab/"}
  • gerber.export kicad-cli, 4.5 format: {"path":"blinky.kicad_pcb","out":"fab-cli/","engine":"kicad-cli","precision":5}
  • gerber.job The job file of a fab folder: {"path":"fab/"}
  • gerber.job Write the native job file of a board: {"path":"blinky.kicad_pcb","out":"fab/blinky-job.gbrjob"}
  • gerber.openSet Open the sample fab set: {"path":"examples/sample-project/fab"}
  • gerber.parse The sample front copper: {"path":"examples/sample-project/fab/blinky-F_Cu.gbr"}
  • gerber.set The sample fab set: {"path":"examples/sample-project/fab"}
  • gerber.view PNG of a fab folder: {"path":"fab/","png":"fab.png"}
  • gerber.view Bottom copper and mask as SVG: {"path":"fab.zip","svg":"bottom.svg","layers":["B.Cu","B.Mask"],"flipped":true}

Documentation for Electronics Designer 2.3.60.