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.
Files changed (349) hide show
  1. akcli_kicad-0.15.0/LICENSE +21 -0
  2. akcli_kicad-0.15.0/PKG-INFO +219 -0
  3. akcli_kicad-0.15.0/README.md +188 -0
  4. akcli_kicad-0.15.0/pyproject.toml +104 -0
  5. akcli_kicad-0.15.0/setup.cfg +4 -0
  6. akcli_kicad-0.15.0/src/akcli/__init__.py +46 -0
  7. akcli_kicad-0.15.0/src/akcli/__main__.py +7 -0
  8. akcli_kicad-0.15.0/src/akcli/_vendor/__init__.py +0 -0
  9. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/LICENSE +9 -0
  10. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/PROVENANCE.md +23 -0
  11. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/__init__.py +7 -0
  12. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/_http.py +49 -0
  13. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/_kmt.py +339 -0
  14. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/footprint/__init__.py +0 -0
  15. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/footprint/footprint.py +181 -0
  16. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/footprint/footprint_handlers.py +617 -0
  17. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/footprint/model3d.py +255 -0
  18. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/helper.py +29 -0
  19. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/symbol/__init__.py +0 -0
  20. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/symbol/symbol.py +234 -0
  21. akcli_kicad-0.15.0/src/akcli/_vendor/jlc2kicadlib/symbol/symbol_handlers.py +469 -0
  22. akcli_kicad-0.15.0/src/akcli/adapters/__init__.py +1 -0
  23. akcli_kicad-0.15.0/src/akcli/adapters/dts.py +241 -0
  24. akcli_kicad-0.15.0/src/akcli/adapters/pinout_md.py +162 -0
  25. akcli_kicad-0.15.0/src/akcli/arrange.py +372 -0
  26. akcli_kicad-0.15.0/src/akcli/bom_policy.py +129 -0
  27. akcli_kicad-0.15.0/src/akcli/calc/__init__.py +28 -0
  28. akcli_kicad-0.15.0/src/akcli/calc/analog.py +148 -0
  29. akcli_kicad-0.15.0/src/akcli/calc/codes.py +132 -0
  30. akcli_kicad-0.15.0/src/akcli/calc/convert.py +86 -0
  31. akcli_kicad-0.15.0/src/akcli/calc/electrical.py +177 -0
  32. akcli_kicad-0.15.0/src/akcli/calc/eseries.py +236 -0
  33. akcli_kicad-0.15.0/src/akcli/calc/ic.py +169 -0
  34. akcli_kicad-0.15.0/src/akcli/calc/interface.py +68 -0
  35. akcli_kicad-0.15.0/src/akcli/calc/opsmap.py +141 -0
  36. akcli_kicad-0.15.0/src/akcli/calc/pcb.py +254 -0
  37. akcli_kicad-0.15.0/src/akcli/calc/power.py +209 -0
  38. akcli_kicad-0.15.0/src/akcli/calc/protection.py +107 -0
  39. akcli_kicad-0.15.0/src/akcli/calc/registry.py +113 -0
  40. akcli_kicad-0.15.0/src/akcli/calc/regulator.py +110 -0
  41. akcli_kicad-0.15.0/src/akcli/calc/rf.py +296 -0
  42. akcli_kicad-0.15.0/src/akcli/calc/sensor.py +151 -0
  43. akcli_kicad-0.15.0/src/akcli/calc/si.py +74 -0
  44. akcli_kicad-0.15.0/src/akcli/checks/__init__.py +1 -0
  45. akcli_kicad-0.15.0/src/akcli/checks/_rails.py +57 -0
  46. akcli_kicad-0.15.0/src/akcli/checks/bom.py +421 -0
  47. akcli_kicad-0.15.0/src/akcli/checks/contract.py +275 -0
  48. akcli_kicad-0.15.0/src/akcli/checks/diff.py +517 -0
  49. akcli_kicad-0.15.0/src/akcli/checks/erc.py +541 -0
  50. akcli_kicad-0.15.0/src/akcli/checks/geom.py +157 -0
  51. akcli_kicad-0.15.0/src/akcli/checks/intent.py +452 -0
  52. akcli_kicad-0.15.0/src/akcli/checks/layout.py +508 -0
  53. akcli_kicad-0.15.0/src/akcli/checks/libsync.py +193 -0
  54. akcli_kicad-0.15.0/src/akcli/checks/nets.py +101 -0
  55. akcli_kicad-0.15.0/src/akcli/checks/pairs.py +158 -0
  56. akcli_kicad-0.15.0/src/akcli/checks/pinmap.py +288 -0
  57. akcli_kicad-0.15.0/src/akcli/checks/power.py +322 -0
  58. akcli_kicad-0.15.0/src/akcli/checks/schpcb.py +153 -0
  59. akcli_kicad-0.15.0/src/akcli/cli.py +235 -0
  60. akcli_kicad-0.15.0/src/akcli/commands/__init__.py +7 -0
  61. akcli_kicad-0.15.0/src/akcli/commands/_shared.py +440 -0
  62. akcli_kicad-0.15.0/src/akcli/commands/calc.py +207 -0
  63. akcli_kicad-0.15.0/src/akcli/commands/capabilities.py +270 -0
  64. akcli_kicad-0.15.0/src/akcli/commands/checks.py +546 -0
  65. akcli_kicad-0.15.0/src/akcli/commands/doc.py +219 -0
  66. akcli_kicad-0.15.0/src/akcli/commands/doctor.py +225 -0
  67. akcli_kicad-0.15.0/src/akcli/commands/drawing.py +1388 -0
  68. akcli_kicad-0.15.0/src/akcli/commands/fab.py +116 -0
  69. akcli_kicad-0.15.0/src/akcli/commands/jlc.py +838 -0
  70. akcli_kicad-0.15.0/src/akcli/commands/library.py +322 -0
  71. akcli_kicad-0.15.0/src/akcli/commands/log.py +75 -0
  72. akcli_kicad-0.15.0/src/akcli/commands/query.py +729 -0
  73. akcli_kicad-0.15.0/src/akcli/commands/release.py +302 -0
  74. akcli_kicad-0.15.0/src/akcli/commands/render.py +79 -0
  75. akcli_kicad-0.15.0/src/akcli/commands/review.py +687 -0
  76. akcli_kicad-0.15.0/src/akcli/commands/sim.py +758 -0
  77. akcli_kicad-0.15.0/src/akcli/commands/view.py +96 -0
  78. akcli_kicad-0.15.0/src/akcli/config.py +281 -0
  79. akcli_kicad-0.15.0/src/akcli/drivers/__init__.py +1 -0
  80. akcli_kicad-0.15.0/src/akcli/drivers/altium_live/__init__.py +1 -0
  81. akcli_kicad-0.15.0/src/akcli/drivers/altium_live/bridge.py +289 -0
  82. akcli_kicad-0.15.0/src/akcli/drivers/jlc2kicad.py +170 -0
  83. akcli_kicad-0.15.0/src/akcli/drivers/kicad_cli.py +185 -0
  84. akcli_kicad-0.15.0/src/akcli/drivers/pdftotext.py +63 -0
  85. akcli_kicad-0.15.0/src/akcli/errors.py +313 -0
  86. akcli_kicad-0.15.0/src/akcli/exporters.py +142 -0
  87. akcli_kicad-0.15.0/src/akcli/fab.py +379 -0
  88. akcli_kicad-0.15.0/src/akcli/groupframe.py +140 -0
  89. akcli_kicad-0.15.0/src/akcli/journal.py +157 -0
  90. akcli_kicad-0.15.0/src/akcli/kicad_escape.py +99 -0
  91. akcli_kicad-0.15.0/src/akcli/libtable.py +578 -0
  92. akcli_kicad-0.15.0/src/akcli/model.py +325 -0
  93. akcli_kicad-0.15.0/src/akcli/netbuild.py +584 -0
  94. akcli_kicad-0.15.0/src/akcli/netdiff.py +265 -0
  95. akcli_kicad-0.15.0/src/akcli/ops.py +1301 -0
  96. akcli_kicad-0.15.0/src/akcli/parts/__init__.py +18 -0
  97. akcli_kicad-0.15.0/src/akcli/parts/bom_jlc.py +932 -0
  98. akcli_kicad-0.15.0/src/akcli/parts/datasheet.py +241 -0
  99. akcli_kicad-0.15.0/src/akcli/parts/easyeda.py +433 -0
  100. akcli_kicad-0.15.0/src/akcli/parts/search.py +548 -0
  101. akcli_kicad-0.15.0/src/akcli/parts/value_parse.py +196 -0
  102. akcli_kicad-0.15.0/src/akcli/readers/__init__.py +1 -0
  103. akcli_kicad-0.15.0/src/akcli/readers/_cfbf.py +314 -0
  104. akcli_kicad-0.15.0/src/akcli/readers/altium_pcb.py +150 -0
  105. akcli_kicad-0.15.0/src/akcli/readers/altium_pcb_bin.py +230 -0
  106. akcli_kicad-0.15.0/src/akcli/readers/altium_prj.py +93 -0
  107. akcli_kicad-0.15.0/src/akcli/readers/altium_records.py +192 -0
  108. akcli_kicad-0.15.0/src/akcli/readers/altium_sch.py +503 -0
  109. akcli_kicad-0.15.0/src/akcli/readers/altium_schlib.py +134 -0
  110. akcli_kicad-0.15.0/src/akcli/readers/footprint_lib.py +311 -0
  111. akcli_kicad-0.15.0/src/akcli/readers/gerber.py +254 -0
  112. akcli_kicad-0.15.0/src/akcli/readers/kicad.py +810 -0
  113. akcli_kicad-0.15.0/src/akcli/readers/kicad_lib.py +400 -0
  114. akcli_kicad-0.15.0/src/akcli/readers/sexpr.py +339 -0
  115. akcli_kicad-0.15.0/src/akcli/relink.py +310 -0
  116. akcli_kicad-0.15.0/src/akcli/render_art.py +312 -0
  117. akcli_kicad-0.15.0/src/akcli/render_svg.py +337 -0
  118. akcli_kicad-0.15.0/src/akcli/report.py +488 -0
  119. akcli_kicad-0.15.0/src/akcli/review/__init__.py +83 -0
  120. akcli_kicad-0.15.0/src/akcli/review/detectors/__init__.py +8 -0
  121. akcli_kicad-0.15.0/src/akcli/review/detectors/domain/__init__.py +8 -0
  122. akcli_kicad-0.15.0/src/akcli/review/detectors/domain/usb.py +104 -0
  123. akcli_kicad-0.15.0/src/akcli/review/detectors/emc/__init__.py +10 -0
  124. akcli_kicad-0.15.0/src/akcli/review/detectors/emc/diffpair.py +95 -0
  125. akcli_kicad-0.15.0/src/akcli/review/detectors/emc/edge.py +112 -0
  126. akcli_kicad-0.15.0/src/akcli/review/detectors/emc/planes.py +122 -0
  127. akcli_kicad-0.15.0/src/akcli/review/detectors/emc/protection.py +97 -0
  128. akcli_kicad-0.15.0/src/akcli/review/detectors/emc/stitching.py +88 -0
  129. akcli_kicad-0.15.0/src/akcli/review/detectors/gerber.py +198 -0
  130. akcli_kicad-0.15.0/src/akcli/review/detectors/pcb/__init__.py +3 -0
  131. akcli_kicad-0.15.0/src/akcli/review/detectors/pcb/decap.py +98 -0
  132. akcli_kicad-0.15.0/src/akcli/review/detectors/pcb/routing.py +67 -0
  133. akcli_kicad-0.15.0/src/akcli/review/detectors/pcb/thermal.py +170 -0
  134. akcli_kicad-0.15.0/src/akcli/review/detectors/pcb/trace_width.py +78 -0
  135. akcli_kicad-0.15.0/src/akcli/review/detectors/signal/__init__.py +6 -0
  136. akcli_kicad-0.15.0/src/akcli/review/detectors/signal/crystal.py +166 -0
  137. akcli_kicad-0.15.0/src/akcli/review/detectors/signal/divider.py +250 -0
  138. akcli_kicad-0.15.0/src/akcli/review/detectors/signal/opamp.py +198 -0
  139. akcli_kicad-0.15.0/src/akcli/review/detectors/signal/power_protect.py +279 -0
  140. akcli_kicad-0.15.0/src/akcli/review/detectors/signal/protection.py +79 -0
  141. akcli_kicad-0.15.0/src/akcli/review/detectors/signal/rc_filter.py +72 -0
  142. akcli_kicad-0.15.0/src/akcli/review/detectors/validation/__init__.py +3 -0
  143. akcli_kicad-0.15.0/src/akcli/review/detectors/validation/enable_pin.py +71 -0
  144. akcli_kicad-0.15.0/src/akcli/review/detectors/validation/i2c_pullup.py +169 -0
  145. akcli_kicad-0.15.0/src/akcli/review/detectors/validation/vdomain.py +131 -0
  146. akcli_kicad-0.15.0/src/akcli/review/diff.py +73 -0
  147. akcli_kicad-0.15.0/src/akcli/review/engine.py +111 -0
  148. akcli_kicad-0.15.0/src/akcli/review/facts.py +340 -0
  149. akcli_kicad-0.15.0/src/akcli/review/geometry.py +258 -0
  150. akcli_kicad-0.15.0/src/akcli/review/propose.py +237 -0
  151. akcli_kicad-0.15.0/src/akcli/review/tables.py +146 -0
  152. akcli_kicad-0.15.0/src/akcli/review/testbench.py +246 -0
  153. akcli_kicad-0.15.0/src/akcli/review/topo.py +314 -0
  154. akcli_kicad-0.15.0/src/akcli/review/tree.py +75 -0
  155. akcli_kicad-0.15.0/src/akcli/review/validate.py +169 -0
  156. akcli_kicad-0.15.0/src/akcli/safety.py +127 -0
  157. akcli_kicad-0.15.0/src/akcli/schemas/__init__.py +8 -0
  158. akcli_kicad-0.15.0/src/akcli/schemas/datasheet-facts.schema.json +54 -0
  159. akcli_kicad-0.15.0/src/akcli/schemas/diff.schema.json +98 -0
  160. akcli_kicad-0.15.0/src/akcli/schemas/doc.schema.json +79 -0
  161. akcli_kicad-0.15.0/src/akcli/schemas/draw-result.schema.json +62 -0
  162. akcli_kicad-0.15.0/src/akcli/schemas/findings.schema.json +100 -0
  163. akcli_kicad-0.15.0/src/akcli/schemas/netlist.schema.json +50 -0
  164. akcli_kicad-0.15.0/src/akcli/schemas/ops.capabilities.json +122 -0
  165. akcli_kicad-0.15.0/src/akcli/schemas/ops.schema.json +484 -0
  166. akcli_kicad-0.15.0/src/akcli/schemas/pinmap.schema.json +40 -0
  167. akcli_kicad-0.15.0/src/akcli/schemas/proposals.schema.json +62 -0
  168. akcli_kicad-0.15.0/src/akcli/schemas/schematic.schema.json +82 -0
  169. akcli_kicad-0.15.0/src/akcli/schemas/sim.schema.json +119 -0
  170. akcli_kicad-0.15.0/src/akcli/sim/__init__.py +24 -0
  171. akcli_kicad-0.15.0/src/akcli/sim/assertions.py +448 -0
  172. akcli_kicad-0.15.0/src/akcli/sim/builtin.lib +119 -0
  173. akcli_kicad-0.15.0/src/akcli/sim/deck.py +574 -0
  174. akcli_kicad-0.15.0/src/akcli/sim/engine.py +359 -0
  175. akcli_kicad-0.15.0/src/akcli/sim/models.py +614 -0
  176. akcli_kicad-0.15.0/src/akcli/sim/wave.py +92 -0
  177. akcli_kicad-0.15.0/src/akcli/units.py +68 -0
  178. akcli_kicad-0.15.0/src/akcli/webui/__init__.py +17 -0
  179. akcli_kicad-0.15.0/src/akcli/webui/calc.html +1593 -0
  180. akcli_kicad-0.15.0/src/akcli/webui/hub.html +226 -0
  181. akcli_kicad-0.15.0/src/akcli/webui/live.html +961 -0
  182. akcli_kicad-0.15.0/src/akcli/webui/server.py +807 -0
  183. akcli_kicad-0.15.0/src/akcli/writers/__init__.py +1 -0
  184. akcli_kicad-0.15.0/src/akcli/writers/connectivity.py +581 -0
  185. akcli_kicad-0.15.0/src/akcli/writers/footprint_mod.py +86 -0
  186. akcli_kicad-0.15.0/src/akcli/writers/geometry.py +221 -0
  187. akcli_kicad-0.15.0/src/akcli/writers/instances.py +289 -0
  188. akcli_kicad-0.15.0/src/akcli/writers/kicad.py +2089 -0
  189. akcli_kicad-0.15.0/src/akcli/writers/lib_cache.py +536 -0
  190. akcli_kicad-0.15.0/src/akcli/writers/sexpr_writer.py +200 -0
  191. akcli_kicad-0.15.0/src/akcli_kicad.egg-info/PKG-INFO +219 -0
  192. akcli_kicad-0.15.0/src/akcli_kicad.egg-info/SOURCES.txt +347 -0
  193. akcli_kicad-0.15.0/src/akcli_kicad.egg-info/dependency_links.txt +1 -0
  194. akcli_kicad-0.15.0/src/akcli_kicad.egg-info/entry_points.txt +2 -0
  195. akcli_kicad-0.15.0/src/akcli_kicad.egg-info/requires.txt +8 -0
  196. akcli_kicad-0.15.0/src/akcli_kicad.egg-info/top_level.txt +1 -0
  197. akcli_kicad-0.15.0/tests/test_agent_eval.py +40 -0
  198. akcli_kicad-0.15.0/tests/test_altium_hierarchy.py +177 -0
  199. akcli_kicad-0.15.0/tests/test_altium_pcb.py +126 -0
  200. akcli_kicad-0.15.0/tests/test_altium_pcb_bin.py +122 -0
  201. akcli_kicad-0.15.0/tests/test_altium_records.py +186 -0
  202. akcli_kicad-0.15.0/tests/test_altium_sch.py +127 -0
  203. akcli_kicad-0.15.0/tests/test_altium_schlib.py +107 -0
  204. akcli_kicad-0.15.0/tests/test_altium_sweep.py +122 -0
  205. akcli_kicad-0.15.0/tests/test_arrange.py +96 -0
  206. akcli_kicad-0.15.0/tests/test_arrange_groups.py +302 -0
  207. akcli_kicad-0.15.0/tests/test_arrange_groups_properties.py +173 -0
  208. akcli_kicad-0.15.0/tests/test_bbox_query.py +67 -0
  209. akcli_kicad-0.15.0/tests/test_bom.py +343 -0
  210. akcli_kicad-0.15.0/tests/test_bom_classes.py +210 -0
  211. akcli_kicad-0.15.0/tests/test_bom_lock_offline.py +182 -0
  212. akcli_kicad-0.15.0/tests/test_bom_p2.py +142 -0
  213. akcli_kicad-0.15.0/tests/test_bom_p3.py +134 -0
  214. akcli_kicad-0.15.0/tests/test_bom_safety.py +182 -0
  215. akcli_kicad-0.15.0/tests/test_bridge.py +332 -0
  216. akcli_kicad-0.15.0/tests/test_bus_alias.py +286 -0
  217. akcli_kicad-0.15.0/tests/test_bus_gate.py +207 -0
  218. akcli_kicad-0.15.0/tests/test_bus_netlist.py +268 -0
  219. akcli_kicad-0.15.0/tests/test_calc.py +408 -0
  220. akcli_kicad-0.15.0/tests/test_calc_cli.py +70 -0
  221. akcli_kicad-0.15.0/tests/test_calc_extended.py +299 -0
  222. akcli_kicad-0.15.0/tests/test_calc_new.py +192 -0
  223. akcli_kicad-0.15.0/tests/test_capabilities.py +88 -0
  224. akcli_kicad-0.15.0/tests/test_cfbf.py +235 -0
  225. akcli_kicad-0.15.0/tests/test_check_lock.py +47 -0
  226. akcli_kicad-0.15.0/tests/test_checks_geom.py +212 -0
  227. akcli_kicad-0.15.0/tests/test_checks_intent.py +563 -0
  228. akcli_kicad-0.15.0/tests/test_checks_libsync.py +174 -0
  229. akcli_kicad-0.15.0/tests/test_cli.py +271 -0
  230. akcli_kicad-0.15.0/tests/test_cli_json_errors.py +133 -0
  231. akcli_kicad-0.15.0/tests/test_cli_round3.py +480 -0
  232. akcli_kicad-0.15.0/tests/test_config.py +126 -0
  233. akcli_kicad-0.15.0/tests/test_contract.py +249 -0
  234. akcli_kicad-0.15.0/tests/test_corpus_groups.py +84 -0
  235. akcli_kicad-0.15.0/tests/test_corpus_power_entry.py +50 -0
  236. akcli_kicad-0.15.0/tests/test_corpus_replay.py +58 -0
  237. akcli_kicad-0.15.0/tests/test_diff.py +295 -0
  238. akcli_kicad-0.15.0/tests/test_doc.py +88 -0
  239. akcli_kicad-0.15.0/tests/test_docs_conformance.py +276 -0
  240. akcli_kicad-0.15.0/tests/test_doctor.py +62 -0
  241. akcli_kicad-0.15.0/tests/test_draw_cli.py +196 -0
  242. akcli_kicad-0.15.0/tests/test_dts.py +163 -0
  243. akcli_kicad-0.15.0/tests/test_e2e_draw.py +473 -0
  244. akcli_kicad-0.15.0/tests/test_erc.py +608 -0
  245. akcli_kicad-0.15.0/tests/test_errors.py +110 -0
  246. akcli_kicad-0.15.0/tests/test_expected_cli.py +75 -0
  247. akcli_kicad-0.15.0/tests/test_exporters.py +84 -0
  248. akcli_kicad-0.15.0/tests/test_fab.py +252 -0
  249. akcli_kicad-0.15.0/tests/test_findings_schema.py +100 -0
  250. akcli_kicad-0.15.0/tests/test_footprint_lib.py +239 -0
  251. akcli_kicad-0.15.0/tests/test_fuzz_cfbf.py +80 -0
  252. akcli_kicad-0.15.0/tests/test_fuzz_oplist.py +329 -0
  253. akcli_kicad-0.15.0/tests/test_fuzz_sexpr.py +76 -0
  254. akcli_kicad-0.15.0/tests/test_geometry.py +250 -0
  255. akcli_kicad-0.15.0/tests/test_golden_corpus.py +141 -0
  256. akcli_kicad-0.15.0/tests/test_groups.py +224 -0
  257. akcli_kicad-0.15.0/tests/test_groups_frame.py +151 -0
  258. akcli_kicad-0.15.0/tests/test_gui_lock.py +96 -0
  259. akcli_kicad-0.15.0/tests/test_hook_draw_guard.py +117 -0
  260. akcli_kicad-0.15.0/tests/test_instances.py +236 -0
  261. akcli_kicad-0.15.0/tests/test_jlc2kicad.py +205 -0
  262. akcli_kicad-0.15.0/tests/test_jlc_add_cli.py +105 -0
  263. akcli_kicad-0.15.0/tests/test_jlc_bom.py +330 -0
  264. akcli_kicad-0.15.0/tests/test_jlc_csv.py +133 -0
  265. akcli_kicad-0.15.0/tests/test_jlc_datasheet.py +482 -0
  266. akcli_kicad-0.15.0/tests/test_journal.py +138 -0
  267. akcli_kicad-0.15.0/tests/test_json_version_stamps.py +213 -0
  268. akcli_kicad-0.15.0/tests/test_kicad_cli.py +101 -0
  269. akcli_kicad-0.15.0/tests/test_kicad_escape.py +54 -0
  270. akcli_kicad-0.15.0/tests/test_kicad_fixtures.py +336 -0
  271. akcli_kicad-0.15.0/tests/test_kicad_hierarchy.py +150 -0
  272. akcli_kicad-0.15.0/tests/test_kicad_lib.py +205 -0
  273. akcli_kicad-0.15.0/tests/test_kicad_parity.py +1142 -0
  274. akcli_kicad-0.15.0/tests/test_kicad_pcb_deep.py +104 -0
  275. akcli_kicad-0.15.0/tests/test_kicad_reader.py +298 -0
  276. akcli_kicad-0.15.0/tests/test_kicad_writer.py +349 -0
  277. akcli_kicad-0.15.0/tests/test_label_orient_and_layout.py +447 -0
  278. akcli_kicad-0.15.0/tests/test_lib_cache.py +319 -0
  279. akcli_kicad-0.15.0/tests/test_library_audit_fixes.py +170 -0
  280. akcli_kicad-0.15.0/tests/test_library_workspace.py +259 -0
  281. akcli_kicad-0.15.0/tests/test_macros2.py +469 -0
  282. akcli_kicad-0.15.0/tests/test_model.py +91 -0
  283. akcli_kicad-0.15.0/tests/test_move_carry.py +159 -0
  284. akcli_kicad-0.15.0/tests/test_netbuild.py +388 -0
  285. akcli_kicad-0.15.0/tests/test_netdiff.py +309 -0
  286. akcli_kicad-0.15.0/tests/test_new_undo.py +274 -0
  287. akcli_kicad-0.15.0/tests/test_ops.py +240 -0
  288. akcli_kicad-0.15.0/tests/test_ops_kit.py +96 -0
  289. akcli_kicad-0.15.0/tests/test_output_policy.py +153 -0
  290. akcli_kicad-0.15.0/tests/test_output_schemas.py +129 -0
  291. akcli_kicad-0.15.0/tests/test_packaging.py +119 -0
  292. akcli_kicad-0.15.0/tests/test_pairs.py +103 -0
  293. akcli_kicad-0.15.0/tests/test_parts_easyeda.py +223 -0
  294. akcli_kicad-0.15.0/tests/test_parts_search.py +440 -0
  295. akcli_kicad-0.15.0/tests/test_perf_netbuild.py +133 -0
  296. akcli_kicad-0.15.0/tests/test_pinmap.py +283 -0
  297. akcli_kicad-0.15.0/tests/test_pinout_md.py +113 -0
  298. akcli_kicad-0.15.0/tests/test_pins_and_pwrflag.py +141 -0
  299. akcli_kicad-0.15.0/tests/test_place_array.py +92 -0
  300. akcli_kicad-0.15.0/tests/test_preview.py +133 -0
  301. akcli_kicad-0.15.0/tests/test_query_throttle.py +77 -0
  302. akcli_kicad-0.15.0/tests/test_read_lib_pcb.py +182 -0
  303. akcli_kicad-0.15.0/tests/test_rectangle.py +139 -0
  304. akcli_kicad-0.15.0/tests/test_relative_placement.py +200 -0
  305. akcli_kicad-0.15.0/tests/test_release_preflight.py +161 -0
  306. akcli_kicad-0.15.0/tests/test_relink.py +296 -0
  307. akcli_kicad-0.15.0/tests/test_render_svg.py +177 -0
  308. akcli_kicad-0.15.0/tests/test_report.py +56 -0
  309. akcli_kicad-0.15.0/tests/test_report_formats.py +95 -0
  310. akcli_kicad-0.15.0/tests/test_report_positions.py +238 -0
  311. akcli_kicad-0.15.0/tests/test_review.py +173 -0
  312. akcli_kicad-0.15.0/tests/test_review_detectors.py +546 -0
  313. akcli_kicad-0.15.0/tests/test_review_emc.py +248 -0
  314. akcli_kicad-0.15.0/tests/test_review_facts.py +299 -0
  315. akcli_kicad-0.15.0/tests/test_review_fixes.py +120 -0
  316. akcli_kicad-0.15.0/tests/test_review_gerber.py +232 -0
  317. akcli_kicad-0.15.0/tests/test_review_pcb.py +224 -0
  318. akcli_kicad-0.15.0/tests/test_review_propose.py +272 -0
  319. akcli_kicad-0.15.0/tests/test_review_testbench.py +160 -0
  320. akcli_kicad-0.15.0/tests/test_review_validate.py +253 -0
  321. akcli_kicad-0.15.0/tests/test_roundtrip_byte_identity.py +142 -0
  322. akcli_kicad-0.15.0/tests/test_roundtrip_netlist.py +203 -0
  323. akcli_kicad-0.15.0/tests/test_route_net.py +174 -0
  324. akcli_kicad-0.15.0/tests/test_safety.py +82 -0
  325. akcli_kicad-0.15.0/tests/test_schema_exports.py +122 -0
  326. akcli_kicad-0.15.0/tests/test_schpcb.py +162 -0
  327. akcli_kicad-0.15.0/tests/test_sexpr.py +193 -0
  328. akcli_kicad-0.15.0/tests/test_sheet_ops.py +350 -0
  329. akcli_kicad-0.15.0/tests/test_sim_assertions.py +604 -0
  330. akcli_kicad-0.15.0/tests/test_sim_cli.py +528 -0
  331. akcli_kicad-0.15.0/tests/test_sim_deck.py +552 -0
  332. akcli_kicad-0.15.0/tests/test_sim_deepening.py +181 -0
  333. akcli_kicad-0.15.0/tests/test_sim_engine.py +235 -0
  334. akcli_kicad-0.15.0/tests/test_sim_fullloop.py +267 -0
  335. akcli_kicad-0.15.0/tests/test_sim_models.py +460 -0
  336. akcli_kicad-0.15.0/tests/test_sim_sweep.py +232 -0
  337. akcli_kicad-0.15.0/tests/test_sim_wave.py +187 -0
  338. akcli_kicad-0.15.0/tests/test_sync_version.py +125 -0
  339. akcli_kicad-0.15.0/tests/test_text_box.py +97 -0
  340. akcli_kicad-0.15.0/tests/test_text_io_portability.py +90 -0
  341. akcli_kicad-0.15.0/tests/test_title_block.py +107 -0
  342. akcli_kicad-0.15.0/tests/test_units.py +50 -0
  343. akcli_kicad-0.15.0/tests/test_value_parse.py +116 -0
  344. akcli_kicad-0.15.0/tests/test_verify_undo_macros.py +232 -0
  345. akcli_kicad-0.15.0/tests/test_view_cli.py +104 -0
  346. akcli_kicad-0.15.0/tests/test_waivers.py +145 -0
  347. akcli_kicad-0.15.0/tests/test_webui.py +736 -0
  348. akcli_kicad-0.15.0/tests/test_webui_browser.py +124 -0
  349. 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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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__"]
@@ -0,0 +1,7 @@
1
+ """``python -m akcli`` entry point (thin shim over :func:`cli.main`)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from .cli import main
6
+
7
+ raise SystemExit(main())
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
+ """