Build and test
Use when building, validating, or debugging atopile projects. Triggers on build errors, "ato build", solver failures, "no parts found", package management, creating parts from JLCPCB, or debugging connectivity issues.From its SKILL.md
npx -y skills add mawildoer/atopile-agent-skill --skill build-and-testAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 9 stars9 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.5 KB, as published. Nobody here has run it
Build & Test Workflow
Typical Order
ato validate <file.ato>-- quick syntax check. Catches parse errors before a full build. No solver, no parts, no PCB. Use after editing .ato files to confirm they parse cleanly.ato build-- the main command. Runs from the project directory (whereverato.yamllives). Stages in order: resolve dependencies, build context, instantiate, verify design, pick parts from JLCPCB, update PCB, generate reports. A successful build means the design is electrically valid and all parts are available.ato build --open-- same as above, then launches KiCad layout editor so you can inspect/route the PCB.ato build -b <name>-- build a specific target fromato.yaml(e.g.ato build -b test). Useful when a project has multiple build targets.ato build --verbose-- runs sequentially without the live display. Better for reading error messages.ato inspect-- debug connectivity. Shows what is connected to a module at a given boundary. Use--inspect <module> --context <parent>to see connections from a specific viewpoint.ato create part -s "<search>"-- search JLCPCB and generate a component package (.ato + KiCad footprint/symbol) inparts/. Interactive: presents matches and lets you pick.
Run any command with --help for full flag details.
Build Outputs
After a successful build, outputs land in build/builds/<target>/:
| File | Contents |
|---|---|
<target>.bom.csv | Bill of materials -- designators, footprints, manufacturer, LCSC part numbers |
<target>.bom.json | Same BOM in JSON format |
<target>.variables.ato.json | All solved parameter values -- spec vs actual, whether constraints are met |
<target>.power_tree.ato.json | Power tree structure (JSON) |
power_tree.md | Power tree as Mermaid diagram |
<target>.data_interface_tree.ato.json | Data interface topology |
pinout/ | Per-component pinout JSON files |
backups/ | PCB backup snapshots |
The build/cache/ directory stores downloaded datasheets (PDFs) for picked parts.
Debugging Build Errors
"No parts found matching constraints"
The most common error. The JLCPCB part solver cannot find a real part matching your parameter assertions. Fix in this order:
- Add tolerances --
resistance = 10kohmmatches nothing (0% tolerance). Useresistance = 10kohm +/- 5%orassert resistance within 10kohm +/- 10%. - Widen package constraint --
package = "0201"severely limits options. Try"0402"or remove the package constraint entirely. - Check for conflicting assertions -- two assertions on the same parameter can create an impossible range. Use
get_hoverfrom the LSP on the parameter to see the effective constraint. - Check max_voltage / max_current -- if you assert
max_voltage within 100V +/- 10%on a 0402 cap, nothing exists. Relax or remove secondary constraints. - Inspect the variables report -- after a partial build, check
build/builds/<target>/<target>.variables.ato.jsonto see what the solver computed for each parameter.
"Assertion failed"
A design rule check (assert statement) evaluated to false after part picking. The error message names the specific assertion and the values it compared.
- Read the assertion in the .ato source -- it tells you what relationship was expected.
- Use
get_hoveron the parameters involved to see their solved values. - Either loosen the assertion (widen the tolerance) or tighten the input (pick a more precise part, constrain upstream parameters).
Connection / wiring errors
Symptoms: "cannot connect X to Y", type mismatch on ~, or missing pins.
- You can only connect interfaces of the same type.
ElectricPower ~ Electricalwill fail -- you need to connect to the correct sub-interface (e.g.power.hv ~ some_electrical). - Use
ato inspect --inspect <module> --context <parent>to see what is actually connected where. - Check
~vs~>usage.~>is the bridge-connect operator and requires#pragma experiment("BRIDGE_CONNECT")and the module must have thecan_bridgetrait. - Make sure pin names match. Use
get_hoverorget_definitionon the component to verify pin names.
Import / dependency errors
Symptoms: "module not found", "cannot resolve import", file path errors.
- Check
ato.yaml-- is the dependency listed? Is the path correct fortype: filedeps? - Run
ato dependencies syncto install/update dependencies. - For registry packages:
ato dependencies add <package-name>to add and install. - For local packages: use
type: filewith a relative path from the project root. - Verify the import path matches the actual file path and module name.
Build hangs or is very slow
The part picker queries JLCPCB and can be slow. If it hangs:
- Check your internet connection -- part picking requires network access.
- Use
--verboseto see which stage is stalling. - If stuck on "Picking parts", you may have too many unconstrained components. Add package constraints to narrow the search space.
- Use
--keep-picked-partsto reuse previously picked parts and skip re-solving.
PCB-related errors
--frozenmode (CI) fails if the PCB needs changes. Remove--frozenlocally to let it update, then commit the result.- "Backing up unsaved pcb changes" is informational, not an error -- it saves your KiCad session before overwriting.
- If KiCad is open and locked, close it or remove the
.lckfile before building.
Package Management
# ato.yaml dependency types:
dependencies:
- type: registry # From packages.atopile.io
identifier: atopile/netties
release: 0.2.0
- type: file # Local/vendored package
identifier: <namespace>/<package-name>
path: ../packages/<package-name>
| Command | What it does |
|---|---|
ato dependencies add <pkg> | Add a registry package (e.g. atopile/netties) |
ato dependencies add file://<path> | Add a local package |
ato dependencies remove <pkg> | Remove a dependency |
ato dependencies sync | Install/update all deps to match ato.yaml |
ato dependencies sync -U | Upgrade deps, ignoring pinned versions |
ato dependencies list | Show current dependencies |
LSP Integration for Debugging
Use the atopile LSP MCP tools (see the lsp skill) alongside builds:
get_diagnostics-- faster than a full build for catching syntax errors after edits.get_hover-- inspect solved parameter constraints, interface types, and member lists. Essential for debugging "no parts found" and "assertion failed".get_definition-- jump to where an interface or module is defined when you need to understand its structure.get_references-- find everywhere a symbol is used when tracing connectivity issues.
Build Flags Quick Reference
| Flag | Use case |
|---|---|
--verbose / -v | See full sequential output instead of live display |
--open | Launch KiCad after build |
--frozen | CI mode -- fail if PCB would change |
--keep-picked-parts | Reuse previously picked parts |
--keep-net-names | Preserve net names from PCB |
--keep-designators | Preserve designators from PCB |
--all | Build all projects found recursively |
-j N | Set max concurrent builds (default: 14) |