akcli-kicad 0.15.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- akcli_kicad-0.15.0/LICENSE +21 -0
- akcli_kicad-0.15.0/PKG-INFO +219 -0
- akcli_kicad-0.15.0/README.md +188 -0
- akcli_kicad-0.15.0/pyproject.toml +104 -0
- akcli_kicad-0.15.0/setup.cfg +4 -0
- akcli_kicad-0.15.0/src/akcli/__init__.py +46 -0
- akcli_kicad-0.15.0/src/akcli/__main__.py +7 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/__init__.py +0 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/LICENSE +9 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/PROVENANCE.md +23 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/__init__.py +7 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/_http.py +49 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/_kmt.py +339 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/footprint/__init__.py +0 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/footprint/footprint.py +181 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/footprint/footprint_handlers.py +617 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/footprint/model3d.py +255 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/helper.py +29 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/symbol/__init__.py +0 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/symbol/symbol.py +234 -0
- akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/symbol/symbol_handlers.py +469 -0
- akcli_kicad-0.15.0/src/akcli/adapters/__init__.py +1 -0
- akcli_kicad-0.15.0/src/akcli/adapters/dts.py +241 -0
- akcli_kicad-0.15.0/src/akcli/adapters/pinout_md.py +162 -0
- akcli_kicad-0.15.0/src/akcli/arrange.py +372 -0
- akcli_kicad-0.15.0/src/akcli/bom_policy.py +129 -0
- akcli_kicad-0.15.0/src/akcli/calc/__init__.py +28 -0
- akcli_kicad-0.15.0/src/akcli/calc/analog.py +148 -0
- akcli_kicad-0.15.0/src/akcli/calc/codes.py +132 -0
- akcli_kicad-0.15.0/src/akcli/calc/convert.py +86 -0
- akcli_kicad-0.15.0/src/akcli/calc/electrical.py +177 -0
- akcli_kicad-0.15.0/src/akcli/calc/eseries.py +236 -0
- akcli_kicad-0.15.0/src/akcli/calc/ic.py +169 -0
- akcli_kicad-0.15.0/src/akcli/calc/interface.py +68 -0
- akcli_kicad-0.15.0/src/akcli/calc/opsmap.py +141 -0
- akcli_kicad-0.15.0/src/akcli/calc/pcb.py +254 -0
- akcli_kicad-0.15.0/src/akcli/calc/power.py +209 -0
- akcli_kicad-0.15.0/src/akcli/calc/protection.py +107 -0
- akcli_kicad-0.15.0/src/akcli/calc/registry.py +113 -0
- akcli_kicad-0.15.0/src/akcli/calc/regulator.py +110 -0
- akcli_kicad-0.15.0/src/akcli/calc/rf.py +296 -0
- akcli_kicad-0.15.0/src/akcli/calc/sensor.py +151 -0
- akcli_kicad-0.15.0/src/akcli/calc/si.py +74 -0
- akcli_kicad-0.15.0/src/akcli/checks/__init__.py +1 -0
- akcli_kicad-0.15.0/src/akcli/checks/_rails.py +57 -0
- akcli_kicad-0.15.0/src/akcli/checks/bom.py +421 -0
- akcli_kicad-0.15.0/src/akcli/checks/contract.py +275 -0
- akcli_kicad-0.15.0/src/akcli/checks/diff.py +517 -0
- akcli_kicad-0.15.0/src/akcli/checks/erc.py +541 -0
- akcli_kicad-0.15.0/src/akcli/checks/geom.py +157 -0
- akcli_kicad-0.15.0/src/akcli/checks/intent.py +452 -0
- akcli_kicad-0.15.0/src/akcli/checks/layout.py +508 -0
- akcli_kicad-0.15.0/src/akcli/checks/libsync.py +193 -0
- akcli_kicad-0.15.0/src/akcli/checks/nets.py +101 -0
- akcli_kicad-0.15.0/src/akcli/checks/pairs.py +158 -0
- akcli_kicad-0.15.0/src/akcli/checks/pinmap.py +288 -0
- akcli_kicad-0.15.0/src/akcli/checks/power.py +322 -0
- akcli_kicad-0.15.0/src/akcli/checks/schpcb.py +153 -0
- akcli_kicad-0.15.0/src/akcli/cli.py +235 -0
- akcli_kicad-0.15.0/src/akcli/commands/__init__.py +7 -0
- akcli_kicad-0.15.0/src/akcli/commands/_shared.py +440 -0
- akcli_kicad-0.15.0/src/akcli/commands/calc.py +207 -0
- akcli_kicad-0.15.0/src/akcli/commands/capabilities.py +270 -0
- akcli_kicad-0.15.0/src/akcli/commands/checks.py +546 -0
- akcli_kicad-0.15.0/src/akcli/commands/doc.py +219 -0
- akcli_kicad-0.15.0/src/akcli/commands/doctor.py +225 -0
- akcli_kicad-0.15.0/src/akcli/commands/drawing.py +1388 -0
- akcli_kicad-0.15.0/src/akcli/commands/fab.py +116 -0
- akcli_kicad-0.15.0/src/akcli/commands/jlc.py +838 -0
- akcli_kicad-0.15.0/src/akcli/commands/library.py +322 -0
- akcli_kicad-0.15.0/src/akcli/commands/log.py +75 -0
- akcli_kicad-0.15.0/src/akcli/commands/query.py +729 -0
- akcli_kicad-0.15.0/src/akcli/commands/release.py +302 -0
- akcli_kicad-0.15.0/src/akcli/commands/render.py +79 -0
- akcli_kicad-0.15.0/src/akcli/commands/review.py +687 -0
- akcli_kicad-0.15.0/src/akcli/commands/sim.py +758 -0
- akcli_kicad-0.15.0/src/akcli/commands/view.py +96 -0
- akcli_kicad-0.15.0/src/akcli/config.py +281 -0
- akcli_kicad-0.15.0/src/akcli/drivers/__init__.py +1 -0
- akcli_kicad-0.15.0/src/akcli/drivers/altium_live/__init__.py +1 -0
- akcli_kicad-0.15.0/src/akcli/drivers/altium_live/bridge.py +289 -0
- akcli_kicad-0.15.0/src/akcli/drivers/jlc2kicad.py +170 -0
- akcli_kicad-0.15.0/src/akcli/drivers/kicad_cli.py +185 -0
- akcli_kicad-0.15.0/src/akcli/drivers/pdftotext.py +63 -0
- akcli_kicad-0.15.0/src/akcli/errors.py +313 -0
- akcli_kicad-0.15.0/src/akcli/exporters.py +142 -0
- akcli_kicad-0.15.0/src/akcli/fab.py +379 -0
- akcli_kicad-0.15.0/src/akcli/groupframe.py +140 -0
- akcli_kicad-0.15.0/src/akcli/journal.py +157 -0
- akcli_kicad-0.15.0/src/akcli/kicad_escape.py +99 -0
- akcli_kicad-0.15.0/src/akcli/libtable.py +578 -0
- akcli_kicad-0.15.0/src/akcli/model.py +325 -0
- akcli_kicad-0.15.0/src/akcli/netbuild.py +584 -0
- akcli_kicad-0.15.0/src/akcli/netdiff.py +265 -0
- akcli_kicad-0.15.0/src/akcli/ops.py +1301 -0
- akcli_kicad-0.15.0/src/akcli/parts/__init__.py +18 -0
- akcli_kicad-0.15.0/src/akcli/parts/bom_jlc.py +932 -0
- akcli_kicad-0.15.0/src/akcli/parts/datasheet.py +241 -0
- akcli_kicad-0.15.0/src/akcli/parts/easyeda.py +433 -0
- akcli_kicad-0.15.0/src/akcli/parts/search.py +548 -0
- akcli_kicad-0.15.0/src/akcli/parts/value_parse.py +196 -0
- akcli_kicad-0.15.0/src/akcli/readers/__init__.py +1 -0
- akcli_kicad-0.15.0/src/akcli/readers/_cfbf.py +314 -0
- akcli_kicad-0.15.0/src/akcli/readers/altium_pcb.py +150 -0
- akcli_kicad-0.15.0/src/akcli/readers/altium_pcb_bin.py +230 -0
- akcli_kicad-0.15.0/src/akcli/readers/altium_prj.py +93 -0
- akcli_kicad-0.15.0/src/akcli/readers/altium_records.py +192 -0
- akcli_kicad-0.15.0/src/akcli/readers/altium_sch.py +503 -0
- akcli_kicad-0.15.0/src/akcli/readers/altium_schlib.py +134 -0
- akcli_kicad-0.15.0/src/akcli/readers/footprint_lib.py +311 -0
- akcli_kicad-0.15.0/src/akcli/readers/gerber.py +254 -0
- akcli_kicad-0.15.0/src/akcli/readers/kicad.py +810 -0
- akcli_kicad-0.15.0/src/akcli/readers/kicad_lib.py +400 -0
- akcli_kicad-0.15.0/src/akcli/readers/sexpr.py +339 -0
- akcli_kicad-0.15.0/src/akcli/relink.py +310 -0
- akcli_kicad-0.15.0/src/akcli/render_art.py +312 -0
- akcli_kicad-0.15.0/src/akcli/render_svg.py +337 -0
- akcli_kicad-0.15.0/src/akcli/report.py +488 -0
- akcli_kicad-0.15.0/src/akcli/review/__init__.py +83 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/__init__.py +8 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/domain/__init__.py +8 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/domain/usb.py +104 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/emc/__init__.py +10 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/emc/diffpair.py +95 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/emc/edge.py +112 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/emc/planes.py +122 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/emc/protection.py +97 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/emc/stitching.py +88 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/gerber.py +198 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/pcb/__init__.py +3 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/pcb/decap.py +98 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/pcb/routing.py +67 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/pcb/thermal.py +170 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/pcb/trace_width.py +78 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/signal/__init__.py +6 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/signal/crystal.py +166 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/signal/divider.py +250 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/signal/opamp.py +198 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/signal/power_protect.py +279 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/signal/protection.py +79 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/signal/rc_filter.py +72 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/validation/__init__.py +3 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/validation/enable_pin.py +71 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/validation/i2c_pullup.py +169 -0
- akcli_kicad-0.15.0/src/akcli/review/detectors/validation/vdomain.py +131 -0
- akcli_kicad-0.15.0/src/akcli/review/diff.py +73 -0
- akcli_kicad-0.15.0/src/akcli/review/engine.py +111 -0
- akcli_kicad-0.15.0/src/akcli/review/facts.py +340 -0
- akcli_kicad-0.15.0/src/akcli/review/geometry.py +258 -0
- akcli_kicad-0.15.0/src/akcli/review/propose.py +237 -0
- akcli_kicad-0.15.0/src/akcli/review/tables.py +146 -0
- akcli_kicad-0.15.0/src/akcli/review/testbench.py +246 -0
- akcli_kicad-0.15.0/src/akcli/review/topo.py +314 -0
- akcli_kicad-0.15.0/src/akcli/review/tree.py +75 -0
- akcli_kicad-0.15.0/src/akcli/review/validate.py +169 -0
- akcli_kicad-0.15.0/src/akcli/safety.py +127 -0
- akcli_kicad-0.15.0/src/akcli/schemas/__init__.py +8 -0
- akcli_kicad-0.15.0/src/akcli/schemas/datasheet-facts.schema.json +54 -0
- akcli_kicad-0.15.0/src/akcli/schemas/diff.schema.json +98 -0
- akcli_kicad-0.15.0/src/akcli/schemas/doc.schema.json +79 -0
- akcli_kicad-0.15.0/src/akcli/schemas/draw-result.schema.json +62 -0
- akcli_kicad-0.15.0/src/akcli/schemas/findings.schema.json +100 -0
- akcli_kicad-0.15.0/src/akcli/schemas/netlist.schema.json +50 -0
- akcli_kicad-0.15.0/src/akcli/schemas/ops.capabilities.json +122 -0
- akcli_kicad-0.15.0/src/akcli/schemas/ops.schema.json +484 -0
- akcli_kicad-0.15.0/src/akcli/schemas/pinmap.schema.json +40 -0
- akcli_kicad-0.15.0/src/akcli/schemas/proposals.schema.json +62 -0
- akcli_kicad-0.15.0/src/akcli/schemas/schematic.schema.json +82 -0
- akcli_kicad-0.15.0/src/akcli/schemas/sim.schema.json +119 -0
- akcli_kicad-0.15.0/src/akcli/sim/__init__.py +24 -0
- akcli_kicad-0.15.0/src/akcli/sim/assertions.py +448 -0
- akcli_kicad-0.15.0/src/akcli/sim/builtin.lib +119 -0
- akcli_kicad-0.15.0/src/akcli/sim/deck.py +574 -0
- akcli_kicad-0.15.0/src/akcli/sim/engine.py +359 -0
- akcli_kicad-0.15.0/src/akcli/sim/models.py +614 -0
- akcli_kicad-0.15.0/src/akcli/sim/wave.py +92 -0
- akcli_kicad-0.15.0/src/akcli/units.py +68 -0
- akcli_kicad-0.15.0/src/akcli/webui/__init__.py +17 -0
- akcli_kicad-0.15.0/src/akcli/webui/calc.html +1593 -0
- akcli_kicad-0.15.0/src/akcli/webui/hub.html +226 -0
- akcli_kicad-0.15.0/src/akcli/webui/live.html +961 -0
- akcli_kicad-0.15.0/src/akcli/webui/server.py +807 -0
- akcli_kicad-0.15.0/src/akcli/writers/__init__.py +1 -0
- akcli_kicad-0.15.0/src/akcli/writers/connectivity.py +581 -0
- akcli_kicad-0.15.0/src/akcli/writers/footprint_mod.py +86 -0
- akcli_kicad-0.15.0/src/akcli/writers/geometry.py +221 -0
- akcli_kicad-0.15.0/src/akcli/writers/instances.py +289 -0
- akcli_kicad-0.15.0/src/akcli/writers/kicad.py +2089 -0
- akcli_kicad-0.15.0/src/akcli/writers/lib_cache.py +536 -0
- akcli_kicad-0.15.0/src/akcli/writers/sexpr_writer.py +200 -0
- akcli_kicad-0.15.0/src/akcli_kicad.egg-info/PKG-INFO +219 -0
- akcli_kicad-0.15.0/src/akcli_kicad.egg-info/SOURCES.txt +347 -0
- akcli_kicad-0.15.0/src/akcli_kicad.egg-info/dependency_links.txt +1 -0
- akcli_kicad-0.15.0/src/akcli_kicad.egg-info/entry_points.txt +2 -0
- akcli_kicad-0.15.0/src/akcli_kicad.egg-info/requires.txt +8 -0
- akcli_kicad-0.15.0/src/akcli_kicad.egg-info/top_level.txt +1 -0
- akcli_kicad-0.15.0/tests/test_agent_eval.py +40 -0
- akcli_kicad-0.15.0/tests/test_altium_hierarchy.py +177 -0
- akcli_kicad-0.15.0/tests/test_altium_pcb.py +126 -0
- akcli_kicad-0.15.0/tests/test_altium_pcb_bin.py +122 -0
- akcli_kicad-0.15.0/tests/test_altium_records.py +186 -0
- akcli_kicad-0.15.0/tests/test_altium_sch.py +127 -0
- akcli_kicad-0.15.0/tests/test_altium_schlib.py +107 -0
- akcli_kicad-0.15.0/tests/test_altium_sweep.py +122 -0
- akcli_kicad-0.15.0/tests/test_arrange.py +96 -0
- akcli_kicad-0.15.0/tests/test_arrange_groups.py +302 -0
- akcli_kicad-0.15.0/tests/test_arrange_groups_properties.py +173 -0
- akcli_kicad-0.15.0/tests/test_bbox_query.py +67 -0
- akcli_kicad-0.15.0/tests/test_bom.py +343 -0
- akcli_kicad-0.15.0/tests/test_bom_classes.py +210 -0
- akcli_kicad-0.15.0/tests/test_bom_lock_offline.py +182 -0
- akcli_kicad-0.15.0/tests/test_bom_p2.py +142 -0
- akcli_kicad-0.15.0/tests/test_bom_p3.py +134 -0
- akcli_kicad-0.15.0/tests/test_bom_safety.py +182 -0
- akcli_kicad-0.15.0/tests/test_bridge.py +332 -0
- akcli_kicad-0.15.0/tests/test_bus_alias.py +286 -0
- akcli_kicad-0.15.0/tests/test_bus_gate.py +207 -0
- akcli_kicad-0.15.0/tests/test_bus_netlist.py +268 -0
- akcli_kicad-0.15.0/tests/test_calc.py +408 -0
- akcli_kicad-0.15.0/tests/test_calc_cli.py +70 -0
- akcli_kicad-0.15.0/tests/test_calc_extended.py +299 -0
- akcli_kicad-0.15.0/tests/test_calc_new.py +192 -0
- akcli_kicad-0.15.0/tests/test_capabilities.py +88 -0
- akcli_kicad-0.15.0/tests/test_cfbf.py +235 -0
- akcli_kicad-0.15.0/tests/test_check_lock.py +47 -0
- akcli_kicad-0.15.0/tests/test_checks_geom.py +212 -0
- akcli_kicad-0.15.0/tests/test_checks_intent.py +563 -0
- akcli_kicad-0.15.0/tests/test_checks_libsync.py +174 -0
- akcli_kicad-0.15.0/tests/test_cli.py +271 -0
- akcli_kicad-0.15.0/tests/test_cli_json_errors.py +133 -0
- akcli_kicad-0.15.0/tests/test_cli_round3.py +480 -0
- akcli_kicad-0.15.0/tests/test_config.py +126 -0
- akcli_kicad-0.15.0/tests/test_contract.py +249 -0
- akcli_kicad-0.15.0/tests/test_corpus_groups.py +84 -0
- akcli_kicad-0.15.0/tests/test_corpus_power_entry.py +50 -0
- akcli_kicad-0.15.0/tests/test_corpus_replay.py +58 -0
- akcli_kicad-0.15.0/tests/test_diff.py +295 -0
- akcli_kicad-0.15.0/tests/test_doc.py +88 -0
- akcli_kicad-0.15.0/tests/test_docs_conformance.py +276 -0
- akcli_kicad-0.15.0/tests/test_doctor.py +62 -0
- akcli_kicad-0.15.0/tests/test_draw_cli.py +196 -0
- akcli_kicad-0.15.0/tests/test_dts.py +163 -0
- akcli_kicad-0.15.0/tests/test_e2e_draw.py +473 -0
- akcli_kicad-0.15.0/tests/test_erc.py +608 -0
- akcli_kicad-0.15.0/tests/test_errors.py +110 -0
- akcli_kicad-0.15.0/tests/test_expected_cli.py +75 -0
- akcli_kicad-0.15.0/tests/test_exporters.py +84 -0
- akcli_kicad-0.15.0/tests/test_fab.py +252 -0
- akcli_kicad-0.15.0/tests/test_findings_schema.py +100 -0
- akcli_kicad-0.15.0/tests/test_footprint_lib.py +239 -0
- akcli_kicad-0.15.0/tests/test_fuzz_cfbf.py +80 -0
- akcli_kicad-0.15.0/tests/test_fuzz_oplist.py +329 -0
- akcli_kicad-0.15.0/tests/test_fuzz_sexpr.py +76 -0
- akcli_kicad-0.15.0/tests/test_geometry.py +250 -0
- akcli_kicad-0.15.0/tests/test_golden_corpus.py +141 -0
- akcli_kicad-0.15.0/tests/test_groups.py +224 -0
- akcli_kicad-0.15.0/tests/test_groups_frame.py +151 -0
- akcli_kicad-0.15.0/tests/test_gui_lock.py +96 -0
- akcli_kicad-0.15.0/tests/test_hook_draw_guard.py +117 -0
- akcli_kicad-0.15.0/tests/test_instances.py +236 -0
- akcli_kicad-0.15.0/tests/test_jlc2kicad.py +205 -0
- akcli_kicad-0.15.0/tests/test_jlc_add_cli.py +105 -0
- akcli_kicad-0.15.0/tests/test_jlc_bom.py +330 -0
- akcli_kicad-0.15.0/tests/test_jlc_csv.py +133 -0
- akcli_kicad-0.15.0/tests/test_jlc_datasheet.py +482 -0
- akcli_kicad-0.15.0/tests/test_journal.py +138 -0
- akcli_kicad-0.15.0/tests/test_json_version_stamps.py +213 -0
- akcli_kicad-0.15.0/tests/test_kicad_cli.py +101 -0
- akcli_kicad-0.15.0/tests/test_kicad_escape.py +54 -0
- akcli_kicad-0.15.0/tests/test_kicad_fixtures.py +336 -0
- akcli_kicad-0.15.0/tests/test_kicad_hierarchy.py +150 -0
- akcli_kicad-0.15.0/tests/test_kicad_lib.py +205 -0
- akcli_kicad-0.15.0/tests/test_kicad_parity.py +1142 -0
- akcli_kicad-0.15.0/tests/test_kicad_pcb_deep.py +104 -0
- akcli_kicad-0.15.0/tests/test_kicad_reader.py +298 -0
- akcli_kicad-0.15.0/tests/test_kicad_writer.py +349 -0
- akcli_kicad-0.15.0/tests/test_label_orient_and_layout.py +447 -0
- akcli_kicad-0.15.0/tests/test_lib_cache.py +319 -0
- akcli_kicad-0.15.0/tests/test_library_audit_fixes.py +170 -0
- akcli_kicad-0.15.0/tests/test_library_workspace.py +259 -0
- akcli_kicad-0.15.0/tests/test_macros2.py +469 -0
- akcli_kicad-0.15.0/tests/test_model.py +91 -0
- akcli_kicad-0.15.0/tests/test_move_carry.py +159 -0
- akcli_kicad-0.15.0/tests/test_netbuild.py +388 -0
- akcli_kicad-0.15.0/tests/test_netdiff.py +309 -0
- akcli_kicad-0.15.0/tests/test_new_undo.py +274 -0
- akcli_kicad-0.15.0/tests/test_ops.py +240 -0
- akcli_kicad-0.15.0/tests/test_ops_kit.py +96 -0
- akcli_kicad-0.15.0/tests/test_output_policy.py +153 -0
- akcli_kicad-0.15.0/tests/test_output_schemas.py +129 -0
- akcli_kicad-0.15.0/tests/test_packaging.py +119 -0
- akcli_kicad-0.15.0/tests/test_pairs.py +103 -0
- akcli_kicad-0.15.0/tests/test_parts_easyeda.py +223 -0
- akcli_kicad-0.15.0/tests/test_parts_search.py +440 -0
- akcli_kicad-0.15.0/tests/test_perf_netbuild.py +133 -0
- akcli_kicad-0.15.0/tests/test_pinmap.py +283 -0
- akcli_kicad-0.15.0/tests/test_pinout_md.py +113 -0
- akcli_kicad-0.15.0/tests/test_pins_and_pwrflag.py +141 -0
- akcli_kicad-0.15.0/tests/test_place_array.py +92 -0
- akcli_kicad-0.15.0/tests/test_preview.py +133 -0
- akcli_kicad-0.15.0/tests/test_query_throttle.py +77 -0
- akcli_kicad-0.15.0/tests/test_read_lib_pcb.py +182 -0
- akcli_kicad-0.15.0/tests/test_rectangle.py +139 -0
- akcli_kicad-0.15.0/tests/test_relative_placement.py +200 -0
- akcli_kicad-0.15.0/tests/test_release_preflight.py +161 -0
- akcli_kicad-0.15.0/tests/test_relink.py +296 -0
- akcli_kicad-0.15.0/tests/test_render_svg.py +177 -0
- akcli_kicad-0.15.0/tests/test_report.py +56 -0
- akcli_kicad-0.15.0/tests/test_report_formats.py +95 -0
- akcli_kicad-0.15.0/tests/test_report_positions.py +238 -0
- akcli_kicad-0.15.0/tests/test_review.py +173 -0
- akcli_kicad-0.15.0/tests/test_review_detectors.py +546 -0
- akcli_kicad-0.15.0/tests/test_review_emc.py +248 -0
- akcli_kicad-0.15.0/tests/test_review_facts.py +299 -0
- akcli_kicad-0.15.0/tests/test_review_fixes.py +120 -0
- akcli_kicad-0.15.0/tests/test_review_gerber.py +232 -0
- akcli_kicad-0.15.0/tests/test_review_pcb.py +224 -0
- akcli_kicad-0.15.0/tests/test_review_propose.py +272 -0
- akcli_kicad-0.15.0/tests/test_review_testbench.py +160 -0
- akcli_kicad-0.15.0/tests/test_review_validate.py +253 -0
- akcli_kicad-0.15.0/tests/test_roundtrip_byte_identity.py +142 -0
- akcli_kicad-0.15.0/tests/test_roundtrip_netlist.py +203 -0
- akcli_kicad-0.15.0/tests/test_route_net.py +174 -0
- akcli_kicad-0.15.0/tests/test_safety.py +82 -0
- akcli_kicad-0.15.0/tests/test_schema_exports.py +122 -0
- akcli_kicad-0.15.0/tests/test_schpcb.py +162 -0
- akcli_kicad-0.15.0/tests/test_sexpr.py +193 -0
- akcli_kicad-0.15.0/tests/test_sheet_ops.py +350 -0
- akcli_kicad-0.15.0/tests/test_sim_assertions.py +604 -0
- akcli_kicad-0.15.0/tests/test_sim_cli.py +528 -0
- akcli_kicad-0.15.0/tests/test_sim_deck.py +552 -0
- akcli_kicad-0.15.0/tests/test_sim_deepening.py +181 -0
- akcli_kicad-0.15.0/tests/test_sim_engine.py +235 -0
- akcli_kicad-0.15.0/tests/test_sim_fullloop.py +267 -0
- akcli_kicad-0.15.0/tests/test_sim_models.py +460 -0
- akcli_kicad-0.15.0/tests/test_sim_sweep.py +232 -0
- akcli_kicad-0.15.0/tests/test_sim_wave.py +187 -0
- akcli_kicad-0.15.0/tests/test_sync_version.py +125 -0
- akcli_kicad-0.15.0/tests/test_text_box.py +97 -0
- akcli_kicad-0.15.0/tests/test_text_io_portability.py +90 -0
- akcli_kicad-0.15.0/tests/test_title_block.py +107 -0
- akcli_kicad-0.15.0/tests/test_units.py +50 -0
- akcli_kicad-0.15.0/tests/test_value_parse.py +116 -0
- akcli_kicad-0.15.0/tests/test_verify_undo_macros.py +232 -0
- akcli_kicad-0.15.0/tests/test_view_cli.py +104 -0
- akcli_kicad-0.15.0/tests/test_waivers.py +145 -0
- akcli_kicad-0.15.0/tests/test_webui.py +736 -0
- akcli_kicad-0.15.0/tests/test_webui_browser.py +124 -0
- akcli_kicad-0.15.0/tests/test_writer_connectivity.py +301 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Li, ching yu
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: akcli-kicad
|
|
3
|
+
Version: 0.15.0
|
|
4
|
+
Summary: AI-native schematic design agent, purpose-built for KiCad: draw and edit .kicad_sch from JSON op-lists with net-diff safety rails, run ERC/design/intent checks, simulate on bundled ngspice, source parts, and import Altium .SchDoc/.PcbDoc read-only into the KiCad flow.
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Project-URL: Homepage, https://github.com/tipoLi5890/akcli
|
|
7
|
+
Project-URL: Repository, https://github.com/tipoLi5890/akcli.git
|
|
8
|
+
Project-URL: Changelog, https://github.com/tipoLi5890/akcli/blob/main/CHANGELOG.md
|
|
9
|
+
Classifier: Development Status :: 3 - Alpha
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Intended Audience :: Manufacturing
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Operating System :: OS Independent
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Provides-Extra: dev
|
|
24
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
25
|
+
Requires-Dist: jsonschema>=4; extra == "dev"
|
|
26
|
+
Requires-Dist: build; extra == "dev"
|
|
27
|
+
Requires-Dist: twine; extra == "dev"
|
|
28
|
+
Requires-Dist: ruff>=0.15; extra == "dev"
|
|
29
|
+
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
30
|
+
Dynamic: license-file
|
|
31
|
+
|
|
32
|
+
<div align="center">
|
|
33
|
+
|
|
34
|
+
<img src="docs/assets/hero.png" alt="akcli — KiCad-native design CLI for humans and AI agents" width="820">
|
|
35
|
+
|
|
36
|
+
<p><strong>AI-native schematic design, purpose-built for KiCad — a zero-dependency (pure-stdlib Python) CLI.</strong></p>
|
|
37
|
+
|
|
38
|
+
<p>
|
|
39
|
+
<a href="https://github.com/tipoLi5890/akcli/actions/workflows/ci.yml"><img src="https://github.com/tipoLi5890/akcli/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
40
|
+
<img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11+">
|
|
41
|
+
<img src="https://img.shields.io/badge/dependencies-0-brightgreen" alt="Zero runtime dependencies">
|
|
42
|
+
<img src="https://img.shields.io/badge/license-MIT-green" alt="License: MIT">
|
|
43
|
+
</p>
|
|
44
|
+
|
|
45
|
+
<p><strong>English</strong> · <a href=".github/README.zh-Hant.md">繁體中文</a> · <a href=".github/README.zh-Hans.md">简体中文</a></p>
|
|
46
|
+
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
**akcli** is a zero-dependency Python CLI for **AI-native schematic design on KiCad** — a scriptable
|
|
52
|
+
design loop that you or **any AI agent** can drive end to end (bundled plugins/skills ship for Claude
|
|
53
|
+
Code, Codex, and OpenCode, but a shell is all it takes). Author a `.kicad_sch` from a JSON op-list,
|
|
54
|
+
run ERC / design-review / BOM / schematic ↔ PCB checks, simulate on ngspice, and source real
|
|
55
|
+
JLCPCB/LCSC parts. Existing Altium `.SchDoc` / `.SchLib` / `.PcbDoc` / `.PcbLib` designs import
|
|
56
|
+
read-only — an on-ramp into the KiCad flow, which is where all development happens.
|
|
57
|
+
|
|
58
|
+
## Install
|
|
59
|
+
|
|
60
|
+
Zero runtime dependencies; needs **Python ≥ 3.11** (for stdlib `tomllib`). The distribution is
|
|
61
|
+
`akcli-kicad`; the command is `akcli`:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pipx install akcli-kicad # or: pip install akcli-kicad
|
|
65
|
+
akcli --version
|
|
66
|
+
|
|
67
|
+
# or run straight from a clone, no install
|
|
68
|
+
git clone https://github.com/tipoLi5890/akcli
|
|
69
|
+
./akcli/bin/akcli --help # wrapper auto-selects a Python ≥ 3.11
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Claude Code plugin (marketplace name `akcli`):
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
/plugin marketplace add tipoLi5890/akcli
|
|
76
|
+
/plugin install akcli@akcli
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Codex plugin (same name `akcli`):
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
codex plugin marketplace add tipoLi5890/akcli # or `add ./` from a clone
|
|
83
|
+
codex plugin install akcli@akcli
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Full details, per-agent setup, and troubleshooting in [INSTALL.md](INSTALL.md).
|
|
87
|
+
|
|
88
|
+
## Quickstart
|
|
89
|
+
|
|
90
|
+
Read a design, check it, and draw into it — straight from the shell:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
akcli read board.kicad_sch --summary # normalized JSON, context-budgeted
|
|
94
|
+
akcli check board.kicad_sch # ERC-lite + power + BOM + connectivity
|
|
95
|
+
akcli draw board.kicad_sch --ops ops.json # dry-run: shows changes + net diff
|
|
96
|
+
akcli draw board.kicad_sch --ops ops.json --apply --strict-nets # atomic write + verify + backup
|
|
97
|
+
akcli undo board.kicad_sch # revert the last write
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Every write is a dry run by default; `--apply` goes through an atomic snapshot → temp → verify →
|
|
101
|
+
replace pipeline with a pure-Python connectivity gate, and `akcli undo` reverts from a rotated backup
|
|
102
|
+
stack. Altium files are read-only offline.
|
|
103
|
+
|
|
104
|
+
## What it does
|
|
105
|
+
|
|
106
|
+
One normalized model behind every command, so each check, diff, and report works on a KiCad
|
|
107
|
+
`.kicad_sch` — and just the same on an imported Altium `.SchDoc`:
|
|
108
|
+
|
|
109
|
+
| Command | What it does |
|
|
110
|
+
|---|---|
|
|
111
|
+
| `read` · `net` · `component` · `pins` | Parse KiCad or Altium into one normalized JSON model; query nets, components, and pin coordinates. |
|
|
112
|
+
| `new` · `plan` · `draw` · `ops` · `arrange` | Author a `.kicad_sch` from a versioned **22-op + 10-macro** JSON op-list, behind a net-diff safety gate and one-command `undo`. |
|
|
113
|
+
| `check` · `verify` · `diff` · `pinmap` | ERC-lite + power + BOM + intent / contract checks, schematic ↔ PCB equivalence, net-membership diff, MCU pin → net map. |
|
|
114
|
+
| `review` | Advisory, confidence-graded design review across six detector families (signal / validation / pcb / emc / domain / gerber). |
|
|
115
|
+
| `sim` | Render to a SPICE deck and assert on KiCad's bundled ngspice; sweep corners; fit diode models from datasheet points. |
|
|
116
|
+
| `jlc` | Search JLCPCB/LCSC (stock, price, Basic/Extended), convert a part into a KiCad library in-process, fetch datasheets. |
|
|
117
|
+
| `calc` | **60** standards-cited offline calculators (E-series, IPC-2221, impedance, I²C pull-ups, buck/boost…), each citing its reference. |
|
|
118
|
+
| `library` · `fab` · `release` | Library-workspace audit/repair, versioned fab-profile checks, and a release preflight that writes a traceable manifest. |
|
|
119
|
+
| `render` · `doc` · `view` | Pure-stdlib SVG render, a Markdown pinout book, and a localhost `/calc` + `/live` dashboard. |
|
|
120
|
+
|
|
121
|
+
Two headline examples — a design review and a part search:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
akcli review analyze board.kicad_sch --profile deep --pcb board.kicad_pcb # advisory findings + evidence
|
|
125
|
+
akcli jlc search "0.1uF 0402 X7R" # JLCPCB/LCSC catalog (needs network)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Use with AI agents
|
|
129
|
+
|
|
130
|
+
`akcli` is a plain CLI, so any shell-capable agent can drive it. Commands emit structured JSON with
|
|
131
|
+
`--json` (carrying a `schema_version`), each op-list carries a `protocol_version`, and `akcli
|
|
132
|
+
capabilities` self-describes the entire CLI surface in one JSON document — and every error code ships a
|
|
133
|
+
machine-readable `remediation` hint.
|
|
134
|
+
|
|
135
|
+
- **Claude Code** — install the bundled plugin for five `/akcli:circuit-*` commands (review, pinmap,
|
|
136
|
+
draw, diff, parts) plus twelve skills spanning design, review, authoring, Altium interop, parts
|
|
137
|
+
sourcing, calculators, and release gating.
|
|
138
|
+
- **Codex** — install the bundled plugin, or drop the loose skill folders into `.agents/skills/` for
|
|
139
|
+
auto-discovery. See [docs/codex-plugin.md](docs/codex-plugin.md).
|
|
140
|
+
- **OpenCode** — auto-discovers the bundled skills; see
|
|
141
|
+
[INSTALL.md](INSTALL.md#use-with-ai-coding-agents) for the exact commands.
|
|
142
|
+
|
|
143
|
+
## Why akcli
|
|
144
|
+
|
|
145
|
+
- **Zero runtime dependencies.** Standard library only (including `tomllib`) — easy to vendor, sandbox,
|
|
146
|
+
or run in CI.
|
|
147
|
+
- **Purpose-built for KiCad.** An iterative KiCad S-expression parser and byte-stable writer at the
|
|
148
|
+
core; Altium designs come in read-only through pure-stdlib OLE2/CFBF record decoding, straight into
|
|
149
|
+
the same KiCad flow. No compiled extensions.
|
|
150
|
+
- **Byte-identical re-apply.** Deterministic UUIDv5 + replace-in-place makes every edit idempotent —
|
|
151
|
+
re-running an op-list produces the same bytes.
|
|
152
|
+
- **Connectivity is the only hard write gate.** Every `plan`/`draw` prints a before/after net diff
|
|
153
|
+
(splits, merges, renames — matched by pin membership, never by name); `--strict-nets` refuses a
|
|
154
|
+
write that splits or merges a named net.
|
|
155
|
+
- **Net inference you can trust.** A rebuilt net layer handles global same-name merges, junctions,
|
|
156
|
+
T-junctions, and No-ERC markers — fixing the classic "same-named nets split into single-pin nets" bug.
|
|
157
|
+
|
|
158
|
+
## Optional external tools
|
|
159
|
+
|
|
160
|
+
"Zero-dependency" means zero Python **package** dependencies: `pip install` pulls in nothing, and the
|
|
161
|
+
entire core loop (read / plan / draw / check / diff / calc / render) runs on the standard library
|
|
162
|
+
alone. A few features can use something outside Python — always detected at runtime, never required
|
|
163
|
+
by the core loop:
|
|
164
|
+
|
|
165
|
+
| Feature | Uses | If missing |
|
|
166
|
+
|---|---|---|
|
|
167
|
+
| Advisory ERC second opinion, `view live` SVG | `kicad-cli` (local executable) | Skipped silently — non-fatal, results stay advisory. |
|
|
168
|
+
| `sim` execution (`--deck-only` needs nothing) | libngspice (bundled with KiCad) | `sim` exits with `NGSPICE_MISSING`; everything else unaffected. |
|
|
169
|
+
| `jlc` part search / datasheet fetch | Network | The **only** networked command family; all others are fully offline. |
|
|
170
|
+
|
|
171
|
+
`akcli doctor` probes each of these and prints per-OS remediation.
|
|
172
|
+
|
|
173
|
+
## Documentation
|
|
174
|
+
|
|
175
|
+
| Doc | Covers |
|
|
176
|
+
|---|---|
|
|
177
|
+
| [SPEC.md](docs/SPEC.md) | Data model, config tables, JSON schemas |
|
|
178
|
+
| [cli-reference.md](docs/cli-reference.md) | Every command and flag |
|
|
179
|
+
| [op-list-authoring.md](docs/op-list-authoring.md) | Op-list authoring bible (ops, macros, groups) |
|
|
180
|
+
| [design-integrity.md](docs/design-integrity.md) | Contracts, fab profiles, release preflight |
|
|
181
|
+
| [review-rules.md](docs/review-rules.md) | Design-review rule catalogue |
|
|
182
|
+
| [sim.md](docs/sim.md) | Simulation reference |
|
|
183
|
+
| [ROADMAP.md](ROADMAP.md) | Roadmap to v1.0 with exit criteria |
|
|
184
|
+
|
|
185
|
+
## Roadmap
|
|
186
|
+
|
|
187
|
+
**Shipped (v0.15.0):** KiCad write/draw from a 22-op + 10-macro vocabulary (hierarchical `add_sheet`,
|
|
188
|
+
net-diff safety rails, `new` / multi-level `undo`), net-preserving `arrange --groups` re-layout, the
|
|
189
|
+
advisory `akcli review` engine (six detector families, now including power-entry protection, plus a
|
|
190
|
+
datasheet facts store, `propose` / `tree` / `validate`), ERC / power / BOM / diff / pinmap / intent /
|
|
191
|
+
contract checks with waivers and SARIF, schematic ↔ PCB `verify`, a project `library` workspace,
|
|
192
|
+
versioned `fab` profiles, a `release preflight` gate, `akcli sim` on KiCad's bundled ngspice,
|
|
193
|
+
JLCPCB/LCSC sourcing with datasheet fetch, 60 standards-cited calculators, pure-stdlib SVG rendering,
|
|
194
|
+
and version-tolerant Altium/KiCad readers.
|
|
195
|
+
|
|
196
|
+
**Ahead (→ v1.0):** the contract-freeze audit. The first PyPI release (`pip install akcli-kicad`) shipped in 0.15.0.
|
|
197
|
+
*Deferred by decision:* a GitHub Action gating schematic PRs, the `view` waveform panel, and a native
|
|
198
|
+
MCP server (the plain CLI serves agents today). Full plan with exit criteria in
|
|
199
|
+
[ROADMAP.md](ROADMAP.md).
|
|
200
|
+
|
|
201
|
+
## Acknowledgments
|
|
202
|
+
|
|
203
|
+
`akcli jlc` builds on (full attribution in [ACKNOWLEDGMENTS.md](ACKNOWLEDGMENTS.md) and
|
|
204
|
+
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)):
|
|
205
|
+
|
|
206
|
+
- **JLC2KiCadLib** by **TousstNicolas** (MIT) — LCSC → KiCad conversion core, vendored.
|
|
207
|
+
- **jlcsearch** (tscircuit, MIT) and **jlcparts** (MIT) — part-search backend.
|
|
208
|
+
- **EasyEDA / LCSC / JLCPCB** — component data source.
|
|
209
|
+
|
|
210
|
+
## Contact
|
|
211
|
+
|
|
212
|
+
Questions, bugs, or feature requests: please
|
|
213
|
+
[open a GitHub issue](https://github.com/tipoLi5890/akcli/issues).
|
|
214
|
+
|
|
215
|
+
## License
|
|
216
|
+
|
|
217
|
+
MIT © 2026 Li, ching yu. See [LICENSE](LICENSE); third-party attribution in
|
|
218
|
+
[ACKNOWLEDGMENTS.md](ACKNOWLEDGMENTS.md) and [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md), and the
|
|
219
|
+
security model in [SECURITY.md](SECURITY.md).
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src="docs/assets/hero.png" alt="akcli — KiCad-native design CLI for humans and AI agents" width="820">
|
|
4
|
+
|
|
5
|
+
<p><strong>AI-native schematic design, purpose-built for KiCad — a zero-dependency (pure-stdlib Python) CLI.</strong></p>
|
|
6
|
+
|
|
7
|
+
<p>
|
|
8
|
+
<a href="https://github.com/tipoLi5890/akcli/actions/workflows/ci.yml"><img src="https://github.com/tipoLi5890/akcli/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
9
|
+
<img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11+">
|
|
10
|
+
<img src="https://img.shields.io/badge/dependencies-0-brightgreen" alt="Zero runtime dependencies">
|
|
11
|
+
<img src="https://img.shields.io/badge/license-MIT-green" alt="License: MIT">
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<p><strong>English</strong> · <a href=".github/README.zh-Hant.md">繁體中文</a> · <a href=".github/README.zh-Hans.md">简体中文</a></p>
|
|
15
|
+
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
**akcli** is a zero-dependency Python CLI for **AI-native schematic design on KiCad** — a scriptable
|
|
21
|
+
design loop that you or **any AI agent** can drive end to end (bundled plugins/skills ship for Claude
|
|
22
|
+
Code, Codex, and OpenCode, but a shell is all it takes). Author a `.kicad_sch` from a JSON op-list,
|
|
23
|
+
run ERC / design-review / BOM / schematic ↔ PCB checks, simulate on ngspice, and source real
|
|
24
|
+
JLCPCB/LCSC parts. Existing Altium `.SchDoc` / `.SchLib` / `.PcbDoc` / `.PcbLib` designs import
|
|
25
|
+
read-only — an on-ramp into the KiCad flow, which is where all development happens.
|
|
26
|
+
|
|
27
|
+
## Install
|
|
28
|
+
|
|
29
|
+
Zero runtime dependencies; needs **Python ≥ 3.11** (for stdlib `tomllib`). The distribution is
|
|
30
|
+
`akcli-kicad`; the command is `akcli`:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pipx install akcli-kicad # or: pip install akcli-kicad
|
|
34
|
+
akcli --version
|
|
35
|
+
|
|
36
|
+
# or run straight from a clone, no install
|
|
37
|
+
git clone https://github.com/tipoLi5890/akcli
|
|
38
|
+
./akcli/bin/akcli --help # wrapper auto-selects a Python ≥ 3.11
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Claude Code plugin (marketplace name `akcli`):
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
/plugin marketplace add tipoLi5890/akcli
|
|
45
|
+
/plugin install akcli@akcli
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Codex plugin (same name `akcli`):
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
codex plugin marketplace add tipoLi5890/akcli # or `add ./` from a clone
|
|
52
|
+
codex plugin install akcli@akcli
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Full details, per-agent setup, and troubleshooting in [INSTALL.md](INSTALL.md).
|
|
56
|
+
|
|
57
|
+
## Quickstart
|
|
58
|
+
|
|
59
|
+
Read a design, check it, and draw into it — straight from the shell:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
akcli read board.kicad_sch --summary # normalized JSON, context-budgeted
|
|
63
|
+
akcli check board.kicad_sch # ERC-lite + power + BOM + connectivity
|
|
64
|
+
akcli draw board.kicad_sch --ops ops.json # dry-run: shows changes + net diff
|
|
65
|
+
akcli draw board.kicad_sch --ops ops.json --apply --strict-nets # atomic write + verify + backup
|
|
66
|
+
akcli undo board.kicad_sch # revert the last write
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Every write is a dry run by default; `--apply` goes through an atomic snapshot → temp → verify →
|
|
70
|
+
replace pipeline with a pure-Python connectivity gate, and `akcli undo` reverts from a rotated backup
|
|
71
|
+
stack. Altium files are read-only offline.
|
|
72
|
+
|
|
73
|
+
## What it does
|
|
74
|
+
|
|
75
|
+
One normalized model behind every command, so each check, diff, and report works on a KiCad
|
|
76
|
+
`.kicad_sch` — and just the same on an imported Altium `.SchDoc`:
|
|
77
|
+
|
|
78
|
+
| Command | What it does |
|
|
79
|
+
|---|---|
|
|
80
|
+
| `read` · `net` · `component` · `pins` | Parse KiCad or Altium into one normalized JSON model; query nets, components, and pin coordinates. |
|
|
81
|
+
| `new` · `plan` · `draw` · `ops` · `arrange` | Author a `.kicad_sch` from a versioned **22-op + 10-macro** JSON op-list, behind a net-diff safety gate and one-command `undo`. |
|
|
82
|
+
| `check` · `verify` · `diff` · `pinmap` | ERC-lite + power + BOM + intent / contract checks, schematic ↔ PCB equivalence, net-membership diff, MCU pin → net map. |
|
|
83
|
+
| `review` | Advisory, confidence-graded design review across six detector families (signal / validation / pcb / emc / domain / gerber). |
|
|
84
|
+
| `sim` | Render to a SPICE deck and assert on KiCad's bundled ngspice; sweep corners; fit diode models from datasheet points. |
|
|
85
|
+
| `jlc` | Search JLCPCB/LCSC (stock, price, Basic/Extended), convert a part into a KiCad library in-process, fetch datasheets. |
|
|
86
|
+
| `calc` | **60** standards-cited offline calculators (E-series, IPC-2221, impedance, I²C pull-ups, buck/boost…), each citing its reference. |
|
|
87
|
+
| `library` · `fab` · `release` | Library-workspace audit/repair, versioned fab-profile checks, and a release preflight that writes a traceable manifest. |
|
|
88
|
+
| `render` · `doc` · `view` | Pure-stdlib SVG render, a Markdown pinout book, and a localhost `/calc` + `/live` dashboard. |
|
|
89
|
+
|
|
90
|
+
Two headline examples — a design review and a part search:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
akcli review analyze board.kicad_sch --profile deep --pcb board.kicad_pcb # advisory findings + evidence
|
|
94
|
+
akcli jlc search "0.1uF 0402 X7R" # JLCPCB/LCSC catalog (needs network)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Use with AI agents
|
|
98
|
+
|
|
99
|
+
`akcli` is a plain CLI, so any shell-capable agent can drive it. Commands emit structured JSON with
|
|
100
|
+
`--json` (carrying a `schema_version`), each op-list carries a `protocol_version`, and `akcli
|
|
101
|
+
capabilities` self-describes the entire CLI surface in one JSON document — and every error code ships a
|
|
102
|
+
machine-readable `remediation` hint.
|
|
103
|
+
|
|
104
|
+
- **Claude Code** — install the bundled plugin for five `/akcli:circuit-*` commands (review, pinmap,
|
|
105
|
+
draw, diff, parts) plus twelve skills spanning design, review, authoring, Altium interop, parts
|
|
106
|
+
sourcing, calculators, and release gating.
|
|
107
|
+
- **Codex** — install the bundled plugin, or drop the loose skill folders into `.agents/skills/` for
|
|
108
|
+
auto-discovery. See [docs/codex-plugin.md](docs/codex-plugin.md).
|
|
109
|
+
- **OpenCode** — auto-discovers the bundled skills; see
|
|
110
|
+
[INSTALL.md](INSTALL.md#use-with-ai-coding-agents) for the exact commands.
|
|
111
|
+
|
|
112
|
+
## Why akcli
|
|
113
|
+
|
|
114
|
+
- **Zero runtime dependencies.** Standard library only (including `tomllib`) — easy to vendor, sandbox,
|
|
115
|
+
or run in CI.
|
|
116
|
+
- **Purpose-built for KiCad.** An iterative KiCad S-expression parser and byte-stable writer at the
|
|
117
|
+
core; Altium designs come in read-only through pure-stdlib OLE2/CFBF record decoding, straight into
|
|
118
|
+
the same KiCad flow. No compiled extensions.
|
|
119
|
+
- **Byte-identical re-apply.** Deterministic UUIDv5 + replace-in-place makes every edit idempotent —
|
|
120
|
+
re-running an op-list produces the same bytes.
|
|
121
|
+
- **Connectivity is the only hard write gate.** Every `plan`/`draw` prints a before/after net diff
|
|
122
|
+
(splits, merges, renames — matched by pin membership, never by name); `--strict-nets` refuses a
|
|
123
|
+
write that splits or merges a named net.
|
|
124
|
+
- **Net inference you can trust.** A rebuilt net layer handles global same-name merges, junctions,
|
|
125
|
+
T-junctions, and No-ERC markers — fixing the classic "same-named nets split into single-pin nets" bug.
|
|
126
|
+
|
|
127
|
+
## Optional external tools
|
|
128
|
+
|
|
129
|
+
"Zero-dependency" means zero Python **package** dependencies: `pip install` pulls in nothing, and the
|
|
130
|
+
entire core loop (read / plan / draw / check / diff / calc / render) runs on the standard library
|
|
131
|
+
alone. A few features can use something outside Python — always detected at runtime, never required
|
|
132
|
+
by the core loop:
|
|
133
|
+
|
|
134
|
+
| Feature | Uses | If missing |
|
|
135
|
+
|---|---|---|
|
|
136
|
+
| Advisory ERC second opinion, `view live` SVG | `kicad-cli` (local executable) | Skipped silently — non-fatal, results stay advisory. |
|
|
137
|
+
| `sim` execution (`--deck-only` needs nothing) | libngspice (bundled with KiCad) | `sim` exits with `NGSPICE_MISSING`; everything else unaffected. |
|
|
138
|
+
| `jlc` part search / datasheet fetch | Network | The **only** networked command family; all others are fully offline. |
|
|
139
|
+
|
|
140
|
+
`akcli doctor` probes each of these and prints per-OS remediation.
|
|
141
|
+
|
|
142
|
+
## Documentation
|
|
143
|
+
|
|
144
|
+
| Doc | Covers |
|
|
145
|
+
|---|---|
|
|
146
|
+
| [SPEC.md](docs/SPEC.md) | Data model, config tables, JSON schemas |
|
|
147
|
+
| [cli-reference.md](docs/cli-reference.md) | Every command and flag |
|
|
148
|
+
| [op-list-authoring.md](docs/op-list-authoring.md) | Op-list authoring bible (ops, macros, groups) |
|
|
149
|
+
| [design-integrity.md](docs/design-integrity.md) | Contracts, fab profiles, release preflight |
|
|
150
|
+
| [review-rules.md](docs/review-rules.md) | Design-review rule catalogue |
|
|
151
|
+
| [sim.md](docs/sim.md) | Simulation reference |
|
|
152
|
+
| [ROADMAP.md](ROADMAP.md) | Roadmap to v1.0 with exit criteria |
|
|
153
|
+
|
|
154
|
+
## Roadmap
|
|
155
|
+
|
|
156
|
+
**Shipped (v0.15.0):** KiCad write/draw from a 22-op + 10-macro vocabulary (hierarchical `add_sheet`,
|
|
157
|
+
net-diff safety rails, `new` / multi-level `undo`), net-preserving `arrange --groups` re-layout, the
|
|
158
|
+
advisory `akcli review` engine (six detector families, now including power-entry protection, plus a
|
|
159
|
+
datasheet facts store, `propose` / `tree` / `validate`), ERC / power / BOM / diff / pinmap / intent /
|
|
160
|
+
contract checks with waivers and SARIF, schematic ↔ PCB `verify`, a project `library` workspace,
|
|
161
|
+
versioned `fab` profiles, a `release preflight` gate, `akcli sim` on KiCad's bundled ngspice,
|
|
162
|
+
JLCPCB/LCSC sourcing with datasheet fetch, 60 standards-cited calculators, pure-stdlib SVG rendering,
|
|
163
|
+
and version-tolerant Altium/KiCad readers.
|
|
164
|
+
|
|
165
|
+
**Ahead (→ v1.0):** the contract-freeze audit. The first PyPI release (`pip install akcli-kicad`) shipped in 0.15.0.
|
|
166
|
+
*Deferred by decision:* a GitHub Action gating schematic PRs, the `view` waveform panel, and a native
|
|
167
|
+
MCP server (the plain CLI serves agents today). Full plan with exit criteria in
|
|
168
|
+
[ROADMAP.md](ROADMAP.md).
|
|
169
|
+
|
|
170
|
+
## Acknowledgments
|
|
171
|
+
|
|
172
|
+
`akcli jlc` builds on (full attribution in [ACKNOWLEDGMENTS.md](ACKNOWLEDGMENTS.md) and
|
|
173
|
+
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)):
|
|
174
|
+
|
|
175
|
+
- **JLC2KiCadLib** by **TousstNicolas** (MIT) — LCSC → KiCad conversion core, vendored.
|
|
176
|
+
- **jlcsearch** (tscircuit, MIT) and **jlcparts** (MIT) — part-search backend.
|
|
177
|
+
- **EasyEDA / LCSC / JLCPCB** — component data source.
|
|
178
|
+
|
|
179
|
+
## Contact
|
|
180
|
+
|
|
181
|
+
Questions, bugs, or feature requests: please
|
|
182
|
+
[open a GitHub issue](https://github.com/tipoLi5890/akcli/issues).
|
|
183
|
+
|
|
184
|
+
## License
|
|
185
|
+
|
|
186
|
+
MIT © 2026 Li, ching yu. See [LICENSE](LICENSE); third-party attribution in
|
|
187
|
+
[ACKNOWLEDGMENTS.md](ACKNOWLEDGMENTS.md) and [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md), and the
|
|
188
|
+
security model in [SECURITY.md](SECURITY.md).
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
# PEP 639 bare license string (`license = "MIT"`) requires setuptools >= 77.
|
|
3
|
+
requires = ["setuptools>=77"]
|
|
4
|
+
build-backend = "setuptools.build_meta"
|
|
5
|
+
|
|
6
|
+
[project]
|
|
7
|
+
# PyPI dist name: the distribution ships as `akcli-kicad` while the import
|
|
8
|
+
# package and CLI stay `akcli` (see src/akcli/__init__.py name cascade);
|
|
9
|
+
# keep the three in lockstep.
|
|
10
|
+
name = "akcli-kicad"
|
|
11
|
+
version = "0.15.0"
|
|
12
|
+
description = "AI-native schematic design agent, purpose-built for KiCad: draw and edit .kicad_sch from JSON op-lists with net-diff safety rails, run ERC/design/intent checks, simulate on bundled ngspice, source parts, and import Altium .SchDoc/.PcbDoc read-only into the KiCad flow."
|
|
13
|
+
requires-python = ">=3.11"
|
|
14
|
+
readme = "README.md"
|
|
15
|
+
license = "MIT"
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 3 - Alpha",
|
|
18
|
+
"Environment :: Console",
|
|
19
|
+
"Intended Audience :: Developers",
|
|
20
|
+
"Intended Audience :: Manufacturing",
|
|
21
|
+
"Intended Audience :: Science/Research",
|
|
22
|
+
"Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
|
|
23
|
+
"Programming Language :: Python :: 3.11",
|
|
24
|
+
"Programming Language :: Python :: 3.12",
|
|
25
|
+
"Programming Language :: Python :: 3.13",
|
|
26
|
+
"Programming Language :: Python :: 3.14",
|
|
27
|
+
"Operating System :: OS Independent",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
[project.urls]
|
|
31
|
+
Homepage = "https://github.com/tipoLi5890/akcli"
|
|
32
|
+
Repository = "https://github.com/tipoLi5890/akcli.git"
|
|
33
|
+
Changelog = "https://github.com/tipoLi5890/akcli/blob/main/CHANGELOG.md"
|
|
34
|
+
|
|
35
|
+
[project.scripts]
|
|
36
|
+
akcli = "akcli.cli:main"
|
|
37
|
+
|
|
38
|
+
[project.optional-dependencies]
|
|
39
|
+
dev = ["pytest>=8", "jsonschema>=4", "build", "twine", "ruff>=0.15", "mypy>=1.10"]
|
|
40
|
+
|
|
41
|
+
[tool.setuptools.packages.find]
|
|
42
|
+
where = ["src"]
|
|
43
|
+
|
|
44
|
+
[tool.setuptools.package-data]
|
|
45
|
+
"akcli.webui" = ["*.html"]
|
|
46
|
+
"akcli.schemas" = ["*.json"]
|
|
47
|
+
# sim/builtin.lib is loaded at runtime via Path(__file__); it MUST ship in the
|
|
48
|
+
# wheel or `akcli sim` with a builtin model breaks on a non-editable install.
|
|
49
|
+
"akcli.sim" = ["*.lib"]
|
|
50
|
+
# vendored MIT library — ship its license/provenance for compliance.
|
|
51
|
+
"akcli._vendor.jlc2kicadlib" = ["LICENSE", "PROVENANCE.md"]
|
|
52
|
+
|
|
53
|
+
[tool.ruff]
|
|
54
|
+
# Vendored jlc2kicadlib is kept byte-close to upstream; never lint it.
|
|
55
|
+
extend-exclude = ["src/akcli/_vendor"]
|
|
56
|
+
|
|
57
|
+
[tool.ruff.lint]
|
|
58
|
+
select = ["E4", "E7", "E9", "F", "W"]
|
|
59
|
+
|
|
60
|
+
[tool.ruff.lint.per-file-ignores]
|
|
61
|
+
# `l` is inductance throughout the calc domain, not an ambiguous name.
|
|
62
|
+
"src/akcli/calc/electrical.py" = ["E741"]
|
|
63
|
+
"src/akcli/calc/power.py" = ["E741"]
|
|
64
|
+
# Grandfathered spare imports/f-strings; clean up at next functional touch
|
|
65
|
+
# rather than churning otherwise-untouched modules for the lint gate.
|
|
66
|
+
"src/akcli/calc/registry.py" = ["F401"]
|
|
67
|
+
"src/akcli/calc/regulator.py" = ["F401"]
|
|
68
|
+
"src/akcli/ops.py" = ["F401"]
|
|
69
|
+
"src/akcli/parts/bom_jlc.py" = ["F401", "F541"]
|
|
70
|
+
# Deliberate compact paired coordinate statements in the S-expression writer.
|
|
71
|
+
"src/akcli/writers/kicad.py" = ["E702"]
|
|
72
|
+
# Tests favor readability: spare imports/locals and compact fuzz mutators are fine.
|
|
73
|
+
"tests/**" = ["E702", "E741", "F401", "F841"]
|
|
74
|
+
|
|
75
|
+
[tool.mypy]
|
|
76
|
+
# Beachhead: gate packages module-by-module as each is brought up to the bar
|
|
77
|
+
# rather than the whole tree at once. Covered so far: the networked layer
|
|
78
|
+
# (parts), the calculators, and the typed core (model/errors/units/safety/
|
|
79
|
+
# netdiff/journal/render_svg/kicad_escape/config/arrange).
|
|
80
|
+
files = [
|
|
81
|
+
"src/akcli/parts", "src/akcli/calc",
|
|
82
|
+
"src/akcli/model.py", "src/akcli/errors.py", "src/akcli/units.py",
|
|
83
|
+
"src/akcli/safety.py", "src/akcli/netdiff.py", "src/akcli/journal.py",
|
|
84
|
+
"src/akcli/render_svg.py", "src/akcli/kicad_escape.py",
|
|
85
|
+
"src/akcli/config.py", "src/akcli/arrange.py",
|
|
86
|
+
]
|
|
87
|
+
python_version = "3.11"
|
|
88
|
+
disallow_untyped_defs = true
|
|
89
|
+
disallow_incomplete_defs = true
|
|
90
|
+
warn_unused_ignores = true
|
|
91
|
+
warn_redundant_casts = true
|
|
92
|
+
warn_unreachable = true
|
|
93
|
+
no_implicit_optional = true
|
|
94
|
+
# parts/ imports ..model, ..checks.bom (untyped elsewhere in the tree); check
|
|
95
|
+
# call sites here but don't cascade errors into or require annotations on
|
|
96
|
+
# modules outside this beachhead.
|
|
97
|
+
follow_imports = "silent"
|
|
98
|
+
|
|
99
|
+
[[tool.mypy.overrides]]
|
|
100
|
+
# jlcsearch/EasyEDA JSON payloads are untyped `object`/`dict` by design (see
|
|
101
|
+
# module docstrings) — the defensive `getattr`/duck-typed opener plumbing
|
|
102
|
+
# isn't worth fighting the checker over for a first pass.
|
|
103
|
+
module = "akcli.parts.*"
|
|
104
|
+
disallow_untyped_calls = false
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""akcli — read Altium .SchDoc and KiCad .kicad_sch, run checks, draw KiCad.
|
|
2
|
+
|
|
3
|
+
Zero-runtime-dependency Python package (stdlib only). This top-level module exposes
|
|
4
|
+
the package version and the analysis/protocol version constants used across the CLI.
|
|
5
|
+
|
|
6
|
+
Name cascade (LOCKED): PyPI dist = ``akcli-kicad`` (the ``akcli`` name is
|
|
7
|
+
taken on PyPI by an unrelated project); import package = ``akcli``; CLI =
|
|
8
|
+
``akcli``.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from importlib.metadata import PackageNotFoundError, version as _pkg_version
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _resolve_version() -> str:
|
|
17
|
+
"""Report the version of the code actually running, dev checkout or install.
|
|
18
|
+
|
|
19
|
+
A co-located ``pyproject.toml`` (``project.name == "akcli-kicad"``) means we are
|
|
20
|
+
executing FROM the source tree; that file is the freshest truth and WINS —
|
|
21
|
+
an editable or older install otherwise pins stale metadata, so bumping the
|
|
22
|
+
working tree would not move ``akcli --version`` and a real update reads as
|
|
23
|
+
"unchanged" (the exact confusion the 0.7.0/design-integrity overlap caused).
|
|
24
|
+
An installed wheel has no such sibling pyproject, so it falls through to the
|
|
25
|
+
dist metadata. Last-resort ``"0.0.0"`` only if neither source is readable.
|
|
26
|
+
"""
|
|
27
|
+
try:
|
|
28
|
+
import tomllib
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
|
|
31
|
+
pyproject = Path(__file__).resolve().parents[2] / "pyproject.toml"
|
|
32
|
+
with pyproject.open("rb") as fh:
|
|
33
|
+
project = tomllib.load(fh).get("project", {})
|
|
34
|
+
if project.get("name") == "akcli-kicad" and project.get("version"):
|
|
35
|
+
return project["version"]
|
|
36
|
+
except Exception:
|
|
37
|
+
pass
|
|
38
|
+
try:
|
|
39
|
+
return _pkg_version("akcli-kicad")
|
|
40
|
+
except PackageNotFoundError:
|
|
41
|
+
return "0.0.0"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
__version__ = _resolve_version()
|
|
45
|
+
|
|
46
|
+
__all__ = ["__version__"]
|
|
File without changes
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright © 2021 TousstNicolas
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Provenance — vendored JLC2KiCadLib
|
|
2
|
+
|
|
3
|
+
- Upstream: https://github.com/TousstNicolas/JLC2KiCad_lib
|
|
4
|
+
- License: MIT (see `LICENSE` in this directory, preserved verbatim)
|
|
5
|
+
- Vendored commit: `48d36032108d64b0f59755234681f1ce8bc98d46`
|
|
6
|
+
- Files taken: `helper.py`, `footprint/{footprint,footprint_handlers,model3d}.py`,
|
|
7
|
+
`symbol/{symbol,symbol_handlers}.py`. The upstream CLI entry
|
|
8
|
+
(`JLC2KiCadLib.py`) is NOT vendored — akcli drives `create_footprint` /
|
|
9
|
+
`create_symbol` directly from `drivers/jlc2kicad.py`.
|
|
10
|
+
|
|
11
|
+
## Local modifications (kept minimal, all import-level)
|
|
12
|
+
|
|
13
|
+
1. `import requests` → `from .. import _http as requests` (stdlib urllib shim;
|
|
14
|
+
keeps akcli zero-dependency).
|
|
15
|
+
2. `from KicadModTree import ...` → `from .._kmt import ...`. **KicadModTree is
|
|
16
|
+
GPLv3+ and is deliberately not vendored or imported**; `_kmt.py` is an
|
|
17
|
+
original, clean-room implementation of just the API surface these files use,
|
|
18
|
+
written against the KiCad footprint *file format* (it emits the modern
|
|
19
|
+
`(footprint ...)` s-expression dialect rather than the legacy `(module ...)`
|
|
20
|
+
output of KicadModTree 1.x).
|
|
21
|
+
|
|
22
|
+
`_http.py` and `_kmt.py` are original akcli code (project MIT license), not
|
|
23
|
+
upstream files.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""Vendored JLC2KiCadLib (MIT, (c) 2021 TousstNicolas) — see LICENSE + PROVENANCE.md.
|
|
2
|
+
|
|
3
|
+
Only the conversion core is vendored (footprint/ + symbol/ + helper.py). Its two
|
|
4
|
+
upstream dependencies are NOT vendored: ``requests`` is replaced by the stdlib
|
|
5
|
+
shim ``_http`` and the GPLv3 ``KicadModTree`` by the clean-room ``_kmt`` writer
|
|
6
|
+
(implemented from the KiCad footprint file format, not from KicadModTree code).
|
|
7
|
+
"""
|