From kicad
Use when reading, understanding, or reviewing KiCad designs — any .kicad_pro / .kicad_sch / .kicad_pcb file, or tasks involving schematic review, PCB layout review, ERC/DRC, netlists, footprints, power/thermal/trace-width/decoupling/DFM analysis, or "review my board / schematic". Read-and-review focused (v0 makes no edits).
How this skill is triggered — by the user, by Claude, or both
Slash command
/kicad:kicad-designThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A workflow for reading and **reviewing** KiCad 9/10 schematics and PCBs. It wraps
A workflow for reading and reviewing KiCad 9/10 schematics and PCBs. It wraps
kicad-cli (ERC/DRC/netlist/render) and a deterministic engineering-check engine,
then hands you rendered images and datasheet pointers so you can finish the review
with judgment only you can provide.
This is review-focused. v0 does not edit design files. Suggest changes; the human applies them in KiCad. (Guarded human-approved edits are a planned v1.)
.kicad_pro, .kicad_sch, or .kicad_pcb file is mentioned or present.Always drive the engine through Python:
py C:\Users\jonny\.claude\plugins\local\kicad-review\lib\kicad_review_cli.py <subcommand> <project>
<project> is a directory or any .kicad_pro / .kicad_sch / .kicad_pcb. The engine
auto-detects the newest installed kicad-cli; override with the KICAD_CLI_PATH env var.
| Subcommand | Purpose |
|---|---|
inspect <project> | Fast structured summary — files, net classes, layers, track widths, counts. Run this FIRST. |
review <project> [--scope all|schematic|layout] [--no-render] [--current NET=AMPS] | Full review: runs all checks, renders images, prints findings + the list of images to Read + datasheet pointers + a rubric. |
erc <project> | Run ERC, summarize violations + disabled checks. |
drc <project> | Run DRC (+ schematic↔board parity), summarize. |
render <project> [--what all|sch|board|3d] | Render images only; prints their paths. |
netlist <project> | Export a netlist; print its path. |
version | Show kicad-cli + engine versions. |
When asked to review a KiCad design:
inspect <project> — learn the files, net classes, layer count,
copper weight, and track-width distribution. Never guess what's on the board.review <project>. This prints a deterministic findings
report (ERC/DRC triage, schematic↔board parity, net-class audit, IPC-2221 trace-current
capacity, decoupling coverage + placement distance, BOM hygiene) and ends with a list of
rendered images and datasheet pointers.Read each PDF/PNG the review lists:
It mirrors LTspice review: the tool gives numbers, you interpret what they mean.
check_trace_currents reports each power net's capacity. To get a hard pass/fail, pass the
expected current per net (use the EXACT net name from inspect/review):
review <project> --current "12V=4.0" --current "Motor 1 Out 1=3.5"
Without --current, the engine flags suspiciously thin power nets (≤0.30 mm) for you to
sanity-check against the real current.
Always Read the rendered images before reporting on layout. A board PDF or 3D PNG shows
placement, routing congestion, pour coverage, thin necks, and return-path problems instantly;
the netlist and width numbers hide all of that. Render + Read is the primary path to any
layout finding — coordinates alone are not enough.
inspect/render and Read
the real images..lck /
_autosave-* file is present), kicad-cli reads the on-disk file, which may lag the editor.
Note this if something looks inconsistent; ask the user to save.lib_symbol_issues / lib_footprint_mismatch are usually library drift (cosmetic) but
can mask real pin/footprint changes — skim a few before dismissing.--current. "12V" ≠ "+12V". Copy the exact name from the report.Don't tell the user to go hunt for a symbol. Source it natively, cheapest tier first:
py …\lib\kicad_review_cli.py find-symbol <name> # search the INSTALLED KiCad libraries (offline)
py …\lib\kicad_review_cli.py pull-part <MPN> # pull from online by part number (easyeda2kicad)
find-symbol <name> first. Most common parts (R, C, op-amps, common ICs, regulators,
connectors, MOSFETs, diodes) already ship with KiCad — this is an offline lib lookup, highest
trust, no network. It returns Lib:Symbol ids you can use directly.pull-part <MPN> if it's not local. Resolves the manufacturer part number → LCSC → and
converts via easyeda2kicad (pip install easyeda2kicad) into a .kicad_sym + .kicad_mod +
STEP/WRL 3D model. Keyless, no login.(MCP equivalents: kicad_find_symbol / kicad_pull_part.) Placing a sourced symbol into the
schematic (with wiring) is not yet built — hand placement/wiring to the KiCad GUI for now.
Before recommending or pulling a part, check it's actually sourceable. Checks both JLCPCB/LCSC and DigiKey and normalizes the result (stock qty, price breaks, status, LCSC#/DigiKey#, package).
py …\lib\kicad_review_cli.py check-stock <MPN|LCSC> # one part, both distributors
py …\lib\kicad_review_cli.py search-parts "<query>" [--limit N] # find candidates, stock-ranked (JLCPCB)
py …\lib\kicad_review_cli.py check-bom <project> # sweep EVERY MPN in the schematic
check-stock already enforces the exact match;
search-parts deliberately returns the fuzzy candidate list for discovery.DIGIKEY_CLIENT_ID +
DIGIKEY_CLIENT_SECRET env vars or a local JSON file at ~/.claude/kicad-review-credentials.json
with those two keys (outside the repo, never committed). The file works for every process
immediately; env vars set via setx only reach newly-started process trees, so prefer the file.
Until configured, check-stock shows DigiKey as "not configured" and the JLCPCB half still answers.
.get(...) defaults), not real
availability — grab one live response body and re-align normalize_digikey.search-parts to discover → note the lcsc code → pull-part/pull_lcsc to bring
in the symbol+footprint → check-stock to confirm it's in stock before committing. check-bom
flags out-of-stock, invalid, and unsourced (no-MPN) components across the whole design at once.(MCP equivalents: kicad_check_stock / kicad_search_parts / kicad_check_bom.)
You can now change a component's Value or Footprint association in the schematic. These are surgical, in-place edits (only the one property string changes; the rest of the file is byte-identical — no full-file resave, so KiCad-10 constructs are never dropped).
Always dry-run first, show the diff, get the human's OK, then apply. Never write the live schematic blindly.
py …\lib\kicad_review_cli.py set-value <project> <refdes> <value> # dry run
py …\lib\kicad_review_cli.py set-footprint <project> <refdes> <Lib:Fp> # dry run
py …\lib\kicad_review_cli.py set-property <project> <refdes> <name> <value> # dry run (any field: MPN, LCSC, …)
py …\lib\kicad_review_cli.py place-like <project> <src-ref> <new-ref> <x> <y> # dry run
# …add --apply to write it to the live file (only applied if ERC does not regress)
set-property generalizes set-value/set-footprint to any existing field (MPN, LCSC, Description, …)
under the same copy→ERC→diff→approve guard — handy for fixing BOM/sourcing fields. (MCP: kicad_set_property.)
Workflow:
--apply). The guard copies the project, makes the edit on the copy,
re-runs kicad-cli sch erc, and returns a unified diff + an ERC error delta.--apply only after approval. The write is atomic and only happens if ERC did
not regress.(MCP equivalents: kicad_set_value / kicad_set_footprint, both dry-run unless apply=True.)
place-likeplace-like adds a new FLOATING symbol by cloning a part type already on the board: it copies
an existing placed instance (its library symbol is already cached, so the result is parse-valid),
mints a fresh UUID + fresh per-pin UUIDs, a new non-colliding refdes, and a grid-snapped position.
Use it to add another instance of something already present — e.g. another decoupling cap or pull-up.
py …\lib\kicad_review_cli.py place-like <project> C1 C99 50.8 60.96 # clone C1 -> C99 at (x,y) mm
# …add --apply to write it (only if the schematic still LOADS in kicad-cli)
The placed part is unwired: its pins float, so ERC gains the expected pin_not_connected
warnings — that increase is normal, so the safety gate here is "the schematic still loads" rather
than "ERC did not regress". Wiring is geometric and stays a GUI step. Report the new
unconnected-pin count to the user and tell them to wire + fine-position it in the KiCad editor.
(MCP equivalent: kicad_place_like, dry-run unless apply=True.)
Still out of scope (v1): auto-wiring (connectivity is geometric — the GUI or a
connectivity-aware step is needed), placing a newly-sourced part type not yet on the board
(needs lib_symbols injection — a later increment; for now clone a part type already present),
editing .kicad_sym/.kicad_mod library geometry, and any PCB layout.
Produce the deliverables a board shop / assembler needs, and grade whether the board is actually ready to send out. This is review-agent work — it packages and assesses the handoff, it does not author layout.
py …\lib\kicad_review_cli.py fab-export <project> # gerbers + drill + pick-and-place + STEP
py …\lib\kicad_review_cli.py fab-check <project> # READY? (DRC + board outline) + the package
fab-check is the one to lead with: it runs DRC, checks for an Edge.Cuts board outline, and returns a
ready / not-ready verdict plus the produced package. ready is False on any blocker (DRC errors,
missing outline) — a board with DRC errors is commonly rejected or fabbed with defects, so don't call a
board "done" until fab-check is clean. (MCP: kicad_fab_export / kicad_fab_check.)
If the board is made/assembled at JLCPCB, the DRC must match their real capabilities, not
KiCad's defaults. Capability values are transcribed + cited from JLCPCB's published pages
(jlcpcb.py SOURCES/VERIFIED) — never invented. Re-verify when JLCPCB updates.
py …\lib\kicad_review_cli.py jlcpcb-check <project> # flag features/rules JLCPCB can't make
py …\lib\kicad_review_cli.py jlcpcb-apply-rules <project> # dry run; --apply tightens .kicad_pro rules
jlcpcb-check compares the board (keyed to its layer count + copper weight) to JLCPCB minimums.
Track width / via drill / annular ring are measured from geometry (a blocker if JLCPCB
physically can't make them). Clearance & copper-to-edge are config checks — a rule looser than
JLCPCB is a major: KiCad's DRC will pass a sub-JLCPCB feature you add later. So "geometry within
limits" plus majors means makeable as drawn, but your DRC won't protect you — don't read it as
all-clear.jlcpcb-apply-rules raises only the looser-than-JLCPCB rules in .kicad_pro to JLCPCB minimums
(max(current, floor), never loosens), surgically + scoped to design_settings.rules (other blocks
carry the same key names — a blind replace would hit the wrong one), under a dry-run→diff→approve→apply
guard. Then KiCad's own DRC enforces JLCPCB limits.jlcpcb-check compares the board's stackup to JLCPCB's
published standard (sourced from gsuberland's JLCPCB-impedance-API extraction, cited in
jlcpcb.STACKUP_SOURCE) and prints the reference stack. jlcpcb-apply-stackup (dry-run→diff→
approve→apply) surgically updates an EXISTING stackup's dielectric thicknesses + εr (and inner
copper) to JLCPCB's reference (JLC04161H-7628 for 4L/1.6mm), guarded by "the edited board still
loads in kicad-cli" + round-trip. It refuses if there's no stackup block, the layer sequence
doesn't match, or no reference is vendored — it never regenerates a stackup or invents dielectrics.
Note it sets inner copper to JLCPCB's 0.5 oz — review the diff. Framed as JLCPCB's published
standard (JLCPCB sets the final build stack at order); only common configs are vendored.(MCP: kicad_jlcpcb_check / kicad_jlcpcb_apply_rules.)
LLMs are unreliable at spatial PCB tasks, so the tool draws a hard line and the assistant must hold it.
REFUSE + ADVISE only (never perform): trace routing, component placement/movement, length-tuning, differential pairs, autorouting, drawing the board outline. For these, don't attempt an edit — explain the approach and constraints (impedance, return paths, clearance, thermals) and tell the user what to do in the KiCad GUI. This is the deliberate cutoff: spatial/judgment work stays human-driven with AI advice, not AI edits.
Deterministic, fully-specified board edits are in-bounds (explicit net + layer + polygon, guarded
S-expression) — e.g. defining a copper-zone/pour outline. BUT a hard headless limit, verified
empirically: kicad-cli does not fill zones (it plots only cached fills), so an added zone is an
unfilled outline — the user must fill it in KiCad (Edit ▸ Fill All Zones / B). True headless
filling would need the KiCad GUI or the IPC API, which this tool avoids by design. So a "pour" here =
define the outline; KiCad does the fill. Say that plainly; don't imply a finished pour.
The one in-bounds layout edit:
py …\lib\kicad_review_cli.py add-zone <project> <net> <layer> <x1> <y1> <x2> <y2> # dry run; --apply to write
add-zone inserts a copper-zone outline for an explicit net + copper layer over a rectangle, guarded
(the edited board must still load in kicad-cli). The net is resolved by name against either a
numbered net table or a name-only board (tool-generated boards reference nets by name; the zone
then matches that (net "name") form — so name-only nets are NOT a blocker). "" = no-net zone;
clear error if the name is unknown. The result is unfilled — tell the user to fill it in KiCad.
(MCP: kicad_add_zone.)
Net: review everything; do schematic value/footprint/property edits + clone-place; produce fab + JLCPCB checks; for PCB layout, advise — and at most define a zone outline for the user to fill.
v0: read + review. v1 (now): surgical Value/Footprint edits + clone-place-like behind a
copy→ERC/load→diff→approve→apply guard (above); local-libs→easyeda2kicad-pull part sourcing.
Next: placing a newly-sourced part (lib_symbols injection), then connectivity-aware wiring;
manufacturing-export hard-block.
Searches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.
npx claudepluginhub jonathanliu1401/kicad-review