chipwright 0.2.0__py3-none-any.whl

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 (49) hide show
  1. chipwright/__init__.py +11 -0
  2. chipwright/adapt.py +57 -0
  3. chipwright/build.py +329 -0
  4. chipwright/cache.py +65 -0
  5. chipwright/cli.py +242 -0
  6. chipwright/config.py +106 -0
  7. chipwright/data/behavior_prompts.yaml +108 -0
  8. chipwright/data/index.yaml +327 -0
  9. chipwright/device.py +143 -0
  10. chipwright/device_adb.py +121 -0
  11. chipwright/env.py +229 -0
  12. chipwright/errors.py +41 -0
  13. chipwright/llm_reference.py +114 -0
  14. chipwright/modalities/__init__.py +3 -0
  15. chipwright/modalities/asr_encoder.py +90 -0
  16. chipwright/modalities/cv.py +34 -0
  17. chipwright/modalities/llm.py +300 -0
  18. chipwright/recipe.py +205 -0
  19. chipwright/registry.py +65 -0
  20. chipwright/resolver.py +197 -0
  21. chipwright/run.py +173 -0
  22. chipwright/sdk.py +140 -0
  23. chipwright/tags.py +56 -0
  24. chipwright/task_eval.py +190 -0
  25. chipwright/tests/conftest.py +12 -0
  26. chipwright/tests/test_adapt.py +61 -0
  27. chipwright/tests/test_build.py +279 -0
  28. chipwright/tests/test_cache.py +147 -0
  29. chipwright/tests/test_device_adb.py +140 -0
  30. chipwright/tests/test_env.py +73 -0
  31. chipwright/tests/test_env_adb.py +120 -0
  32. chipwright/tests/test_llm_modality.py +259 -0
  33. chipwright/tests/test_packaging.py +147 -0
  34. chipwright/tests/test_precision_support.py +128 -0
  35. chipwright/tests/test_registry.py +107 -0
  36. chipwright/tests/test_resolver.py +93 -0
  37. chipwright/tests/test_run_llm.py +47 -0
  38. chipwright/tests/test_tags.py +95 -0
  39. chipwright/tests/test_task_eval.py +164 -0
  40. chipwright/tests/test_verify.py +92 -0
  41. chipwright/tests/test_verify_llm.py +244 -0
  42. chipwright/verify.py +24 -0
  43. chipwright/verify_llm.py +203 -0
  44. chipwright-0.2.0.dist-info/METADATA +268 -0
  45. chipwright-0.2.0.dist-info/RECORD +49 -0
  46. chipwright-0.2.0.dist-info/WHEEL +5 -0
  47. chipwright-0.2.0.dist-info/entry_points.txt +2 -0
  48. chipwright-0.2.0.dist-info/licenses/LICENSE +21 -0
  49. chipwright-0.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,268 @@
1
+ Metadata-Version: 2.4
2
+ Name: chipwright
3
+ Version: 0.2.0
4
+ Summary: A verified package manager for Qualcomm NPUs — resolve the artifact that loads on your exact chip, run it, and prove it against a CPU reference.
5
+ License-Expression: MIT
6
+ Project-URL: Homepage, https://github.com/nameissakthi25/chipwright
7
+ Project-URL: Specification, https://github.com/nameissakthi25/chipwright-speckit
8
+ Keywords: npu,qualcomm,hexagon,qnn,edge-ai,quantization,inference,package-manager
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
13
+ Classifier: Topic :: Software Development :: Build Tools
14
+ Requires-Python: >=3.9
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Requires-Dist: pyyaml>=6
18
+ Requires-Dist: numpy>=1.24
19
+ Provides-Extra: asr
20
+ Requires-Dist: onnxruntime>=1.16; extra == "asr"
21
+ Provides-Extra: cv
22
+ Requires-Dist: onnxruntime>=1.16; extra == "cv"
23
+ Requires-Dist: pillow>=10; extra == "cv"
24
+ Provides-Extra: tts
25
+ Requires-Dist: onnxruntime>=1.16; extra == "tts"
26
+ Provides-Extra: llm
27
+ Requires-Dist: onnxruntime>=1.16; extra == "llm"
28
+ Requires-Dist: tokenizers>=0.19; extra == "llm"
29
+ Provides-Extra: eval
30
+ Requires-Dist: qai-hub-models>=4.5; extra == "eval"
31
+ Provides-Extra: build
32
+ Requires-Dist: onnx>=1.14; extra == "build"
33
+ Provides-Extra: dev
34
+ Requires-Dist: pytest>=7; extra == "dev"
35
+ Dynamic: license-file
36
+
37
+ # Chipwright
38
+
39
+ [![python](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/)
40
+ [![license](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
41
+ [![verified on QCS6490](https://img.shields.io/badge/verified%20on-QCS6490-brightgreen.svg)](#tested-is-a-record-not-a-badge)
42
+
43
+ **A verified package manager and model hub for NPUs.** Chipwright reads your board, hands you an artifact that will actually load on your exact chip, and proves it against a CPU reference before you trust the output.
44
+
45
+ `resolve · run · build` — Qualcomm first, cross-vendor by design.
46
+
47
+ ```mermaid
48
+ flowchart LR
49
+ M([model]):::io
50
+ B([your board<br/>arch · SDK · SoC]):::io
51
+ M --> R{{resolve}}:::core
52
+ B --> R
53
+ R -->|exact · in-range| RUN[run on the NPU]:::step
54
+ R -->|no artifact,<br/>recipe exists| BLD[build<br/>convert · quantize<br/>on-board context]:::step
55
+ R -->|nothing fits| FAIL([refuse —<br/>name the axis]):::bad
56
+ BLD --> RUN
57
+ RUN --> V{{verify<br/>NPU vs CPU cosine}}:::core
58
+ V -->|≥ threshold| OK([trusted artifact]):::good
59
+ V -->|below| NO([caught, not shipped]):::bad
60
+
61
+ classDef io fill:#1f2430,stroke:#8a919e,color:#e8eaee;
62
+ classDef core fill:#7c3f1d,stroke:#b4632f,color:#fde8d7;
63
+ classDef step fill:#222a36,stroke:#4b5563,color:#e2e8f0;
64
+ classDef good fill:#14321f,stroke:#2d7d54,color:#86efac;
65
+ classDef bad fill:#3b1a16,stroke:#b23a2c,color:#f5a3a3;
66
+ ```
67
+
68
+ ---
69
+
70
+ ## The problem
71
+
72
+ On an NPU, a model isn't a file. It's a context binary pinned to a precise tuple: **architecture × SDK × quantization × shape × backend**. Load it on the wrong chip, or the wrong SDK, and it fails at load — or worse, it loads and quietly returns a fast wrong answer.
73
+
74
+ A model hub tells you *which model*. It can't tell you *which chip*. The gap between "here is a checkpoint" and "here is something that runs correctly on the board in your hand" is where edge ML projects stall.
75
+
76
+ Chipwright closes that gap. Think of it as **PyPI wheel tags for NPUs**: the chip is the platform tag. You don't hand-pick a binary and hope — you ask the resolver, and it either gives you one that matches or tells you, by name, the axis that doesn't.
77
+
78
+ ---
79
+
80
+ ## Quickstart
81
+
82
+ ```bash
83
+ pip install -e .
84
+ ```
85
+
86
+ Point Chipwright at a board (over SSH) and probe it:
87
+
88
+ ```bash
89
+ export CW_BOARD_HOST=192.168.1.50
90
+ export CW_BOARD_PASS=…
91
+
92
+ chipwright doctor
93
+ ```
94
+
95
+ ```text
96
+ ● board reachable root@192.168.1.50:22
97
+ SoC : QCS6490 (soc_id 498)
98
+ Hexagon arch: v68
99
+ QNN libs : libQnnHtp.so (QAIRT 2.38.0)
100
+ target key : htpv68,qnn2.38
101
+ ```
102
+
103
+ Resolve a model against that exact board — no guessing:
104
+
105
+ ```bash
106
+ chipwright resolve whisper-small-en
107
+ ```
108
+
109
+ ```text
110
+ model : whisper-small-en
111
+ target : htpv68,qnn2.38
112
+ ▲ USE (warn) whisper-small-en-1.2.0 htpv68/w8a16/win30s
113
+ warning: artifact tested at qnn2.37.1; board runs 2.38.0 — inside compatible range >=2.34,<2.40
114
+ ```
115
+
116
+ Then run it on the board and verify the NPU output against a CPU reference:
117
+
118
+ ```bash
119
+ chipwright run zipformer-enin --input utterance.npy
120
+ ```
121
+
122
+ ```text
123
+ model : zipformer-enin
124
+ target : htpv68,qnn2.38
125
+ ✔ USE zipformer-enin-7.0.0 htpv68/w8a16/win39 qnn2.37.1 (exact match)
126
+
127
+ ✔ VERIFIED NPU vs CPU-reference cosine_min = 0.98800 (threshold 0.95)
128
+ encoder: 0.98800
129
+ ```
130
+
131
+ That `0.98800` is not a claim in a README. It is the number Chipwright measured on a live QCS6490 against an ONNX-Runtime reference, on the input you gave it, this run.
132
+
133
+ ---
134
+
135
+ ## The three verbs
136
+
137
+ | Verb | What it does |
138
+ | --- | --- |
139
+ | **resolve** | Match a registry variant to your board's target key. If nothing matches, name the axis that failed — never silently downgrade to a near-miss. |
140
+ | **run** | `resolve` → fetch (or locate) the artifact → push and execute on the board → compare the NPU output to a CPU reference and report the cosine. |
141
+ | **build** | Produce the artifact from a recipe when no hosted variant matches your chip — op pre-check, host preflight, convert → quantize → on-board context, then gate on the verification before publishing. |
142
+
143
+ ---
144
+
145
+ ## The four resolve outcomes
146
+
147
+ The resolver is deliberately honest. Every resolution lands in exactly one of four outcomes:
148
+
149
+ - **USE** — an exact match on arch, quant, and shape, with the board's SDK inside the compatible range. Run it.
150
+ - **USE-with-warning** — a match, but the board's SDK sits outside the *tested* point while staying inside the compatible range. You get the artifact and the caveat, both.
151
+ - **BUILD** — no hosted artifact for your chip, but a recipe exists that can produce one.
152
+ - **FAIL** — nothing fits, and the message names the axis:
153
+
154
+ ```text
155
+ ✗ FAIL axis=htp_arch: no variant for v68; registry has [v73]
156
+ ```
157
+
158
+ The arch axis is hard — a mismatch fails at load, so the resolver refuses. The SDK axis is a range, not a point — so outside the tested point the resolver warns rather than refuses. That distinction is the whole discipline: **never downgrade to a near-miss artifact silently.**
159
+
160
+ ---
161
+
162
+ ## Artifact tags
163
+
164
+ An artifact's identity is its name. Chipwright names the five axes a resolver matches on in the filename and expands the rest in the manifest — exactly how a PyPI wheel names `cp312-manylinux_x86_64` and leaves the rest to metadata:
165
+
166
+ ```text
167
+ whisper-small-en-1.2.0+qnn2.37-htpv68-w8a16-win30s.qnnctx
168
+ └──────┬───────┘ └─┬─┘ └──┬──┘ └──┬──┘ └─┬─┘ └─┬─┘ └─┬──┘
169
+ name version sdk arch quant shape ext
170
+ ```
171
+
172
+ Parsing is strict: a tag that doesn't parse is a bug, not a near-miss to paper over.
173
+
174
+ ---
175
+
176
+ ## Tested is a record, not a badge
177
+
178
+ Chipwright does not stamp a green checkmark and ask you to believe it. Every registry variant carries a **verification record** — which board it ran on, what it was compared to, and the numbers — so a reader who distrusts the claim can check the inputs.
179
+
180
+ The record for `zipformer-enin`, from a live run:
181
+
182
+ ```yaml
183
+ verified:
184
+ on: "QCS6490 (soc_id 498)"
185
+ date: 2026-10-08
186
+ loads: true
187
+ vs_reference:
188
+ backend: onnxruntime-cpu
189
+ metric: encoder_cosine
190
+ value: 0.988 # threshold 0.95 — VERIFIED
191
+ ```
192
+
193
+ A high cosine is necessary, not sufficient — a cosine of 0.99 can still cost task accuracy — so the record keeps the numerical check separate from the task metric. The point is not the badge. The point is that the evidence travels with the artifact.
194
+
195
+ ---
196
+
197
+ ## Architecture
198
+
199
+ One front door today, one core, three targets.
200
+
201
+ - **The front door** — the `chipwright` CLI (`doctor · resolve · run · build`), a thin surface over the core. The core is deliberately UI-agnostic so other surfaces (a desktop app, editor integrations) can call the same logic later without reimplementing it; today the CLI is what ships.
202
+ - **One core** — [`chipwright-core`](chipwright/) holds all the logic: tags, board probe, resolver, registry client, cache, device transport, verification, and the run loop.
203
+ - **Three targets** — the core reaches the **registry** (the index of verified variants), the **board** (probe and execute), and the **build-host** (produce an artifact from a recipe).
204
+
205
+ See [`docs/architecture.md`](docs/architecture.md) for the diagram and the module map.
206
+
207
+ ---
208
+
209
+ ## Repo layout
210
+
211
+ ```text
212
+ chipwright/
213
+ cli.py the `chipwright` CLI — doctor · resolve · run · build
214
+ tags.py wheel-tag grammar for NPU artifacts (parse / format)
215
+ env.py board probe → TargetKey (arch × SDK × SoC)
216
+ resolver.py match variants to a target; the four outcomes
217
+ registry.py read the index (a git-repo file), list a model's variants
218
+ cache.py content-addressed artifact cache (~/.cache/chipwright)
219
+ device.py remote QNN runner — push + execute over SSH
220
+ verify.py NPU-vs-CPU cosine; the check that catches a fast wrong answer
221
+ run.py the run verb — ties resolve · device · modality · verify
222
+ modalities/ per-task glue (frontend, decoders, CPU reference)
223
+ registry/
224
+ index.yaml the registry index — one reviewable file, variants by hash
225
+ ```
226
+
227
+ ---
228
+
229
+ ## Status
230
+
231
+ - ✅ **resolve** — done, with the four honest outcomes, offline targets, and axis-named failures.
232
+ - ✅ **run** — done and **verified on hardware**, six real models pulled from Hugging Face, on a live QCS6490 / RB3 Gen2:
233
+
234
+ | model | task | quant | cosine |
235
+ |---|---|---|---|
236
+ | `zipformer-enin` | ASR (streaming RNN-T) | w8a16 | **0.988** |
237
+ | `mobilenet-v2` | image classification | w8a16 | **0.956** |
238
+ | `quicksrnet-small` | super-resolution | w8a8 | **0.9999** |
239
+ | `fcn-resnet50` | semantic segmentation | w8a8 | **0.998** |
240
+ | `depth-anything-v2` | depth estimation (DINOv2 **ViT**) | w8a16 | **0.99996** |
241
+ | `movenet` | pose estimation (17 keypoints) | w8a16 | **0.916** |
242
+
243
+ Two input modalities, five CV tasks, two quant profiles — the quant axis is real, and every run ends in a measured number. The gate earns its keep: a random-noise input to MobileNet correctly **FAILs** at 0.776, and a MediaPipe face detector surfaced a genuine w8a8 fidelity loss on its secondary score head (0.80 vs 0.98 elsewhere) — caught, not shipped. The cosine spread is itself the signal: a ViT depth head converts near-perfectly (0.99996), while a pose keypoint+confidence head shows real quant softness (0.916) yet still clears the bar — the number tells you which is which. Getting that Depth-Anything ViT to convert at all needed a recipe adaptation (an unsupported `Reshape allowzero` attribute, patched across 29 nodes) — the honest boundary, handled rather than papered over.
244
+ - ✅ **build** — **verified end-to-end**: `chipwright build mobilenet-cv` on a real x86_64-linux QAIRT host produced a w8a16 DLC (`…+qnn2.34-htpv68-w8a16-img224.dlc`) via `qairt-converter`, and `chipwright run` then verified that *built* artifact on the board — **cosine 0.956**. The full `resolve → build → run → verify` loop. Op pre-check, host preflight, declared graph adaptations, and a fidelity gate before publish are all in; on a machine without QAIRT the CLI says so plainly instead of pretending.
245
+
246
+ **SDK-range in practice:** that same board runs QAIRT **2.38.0** while the artifact was tested at **2.37.1**, both inside the compatible range `>=2.34,<2.40`. It ran correctly — and `resolve` says so plainly (USE-with-warning), rather than pretending the tested point and the board agree.
247
+
248
+ ### Modality roadmap
249
+
250
+ ```text
251
+ ASR → TTS → VLM → LLM → VLA
252
+ ▲
253
+ verified on hardware today
254
+ ```
255
+
256
+ ---
257
+
258
+ ## Vendor-neutrality
259
+
260
+ Chipwright is Qualcomm first because that is where the hardware and the proof are today. It is cross-vendor by design: the tag grammar, the resolver's axis model, the verification record, and the device transport are not tied to one silicon vendor. Adding a backend means adding a target adapter and its arch axis — not reworking the framework.
261
+
262
+ The specification lives in a separate repo, the **spec kit** (`chipwright-speckit`, in GitHub Spec Kit format). Changes are spec-first: the spec kit moves before the code.
263
+
264
+ ---
265
+
266
+ ## License
267
+
268
+ MIT — see [LICENSE](LICENSE). Contributions welcome; start with [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -0,0 +1,49 @@
1
+ chipwright/__init__.py,sha256=4wfGz68eXNIIBdFbX1gS9_e_XsX0fZdfvRUYmmxWfnM,500
2
+ chipwright/adapt.py,sha256=1MDkDv8S9y9zE9DYD9Tjmq0x79MIQ0ajORu-XaTgjDM,2158
3
+ chipwright/build.py,sha256=Oi1luyiMbYPmPSDX1ui9sJ1br_PBRGqclGaiMlM4M5g,16293
4
+ chipwright/cache.py,sha256=mABbmd1i2_GGyh7PbUWYJaDJ4lynZlmDDcfvYeeUYiA,2457
5
+ chipwright/cli.py,sha256=0HbW4BUFlNmQh61Ue6kUisN9h_X2FrL3QsTSYpooO3A,10319
6
+ chipwright/config.py,sha256=VlXfF6HcuhiuahZ15MrIm6Xw9-5nvZOt7Gm7nk6INTs,4672
7
+ chipwright/device.py,sha256=c_urAp9d3yRLILTI3pJwYNSe91tgu56mh3AVcykodJw,7891
8
+ chipwright/device_adb.py,sha256=_Y_m8azEXz6bPIV7k6ziBrK_RTjSbJso18_9Iu3a-ZA,6264
9
+ chipwright/env.py,sha256=r4REkZXEiVmY00_2pGFMkr1i9LRr9mEO8lkIfN70MiM,11650
10
+ chipwright/errors.py,sha256=F2b7-aUX7ZfCdzGT2cQ6MjXow6Q6K3wMTIhPTo9u-RM,1610
11
+ chipwright/llm_reference.py,sha256=Bd2MhceZdbL-GFSywxbBCuiC3HjlMf6lS6T_Kih_GKQ,5987
12
+ chipwright/recipe.py,sha256=aEaCqk9CZCa0H39Atq0HJ7WGRZB9yXgJUhSx68l5lmc,8723
13
+ chipwright/registry.py,sha256=NzIlv1bcy5pvSHx4Bfh5EuUW7OJQPONPW8JV-xOtNow,2515
14
+ chipwright/resolver.py,sha256=zL6t5KtkuWrg3x4Vb9GXMUbtyznk_bVyW11G2jx5hZw,9175
15
+ chipwright/run.py,sha256=d2QC690RaN-g6IpfO_Jc8YU4YRRPd8ahdbAUduopBd4,8738
16
+ chipwright/sdk.py,sha256=BChTgzRL7yj6QWi3Yg7DH4p0rzECk5nR17gK1AnZQuI,7426
17
+ chipwright/tags.py,sha256=It1CUK_1NwF7jZgDC-JkGBk94QXr6xPrfhTlKsnhOCQ,2271
18
+ chipwright/task_eval.py,sha256=CZl-BI-_BOEKJW_rrCSZG8f8Hbb7engrzCE8vhubEnA,10965
19
+ chipwright/verify.py,sha256=x7KiXYwGUTu3Ux_XCkL0uQkYgdbumO_07ta48CxOltk,1031
20
+ chipwright/verify_llm.py,sha256=wQs85ucmQkDvwuwhXZiAI-6wUAK9mxZPtk1AYl_ThmY,10483
21
+ chipwright/data/behavior_prompts.yaml,sha256=jLFa9sYggY98rxERCBSScjNXp5fHarbBlDrTURMBtIY,7872
22
+ chipwright/data/index.yaml,sha256=CFS6zpdprIcRBCvadQwgNn9Px9_FK8W2__d4Yn6-HhM,8669
23
+ chipwright/modalities/__init__.py,sha256=PjK1e4j4CNz1_hFJ6zR1fctA_dOkPqjBzBZoxj2EyLs,185
24
+ chipwright/modalities/asr_encoder.py,sha256=_yr4qVBn7Qrmtq_pqNvLmcjOLAj-3h4xroZ08XSaAIc,4016
25
+ chipwright/modalities/cv.py,sha256=Wxl_-gmU0E6cqKAPtxnG8mXchlrslzsbcQbUGuHdEzs,1669
26
+ chipwright/modalities/llm.py,sha256=D911Eew_tThZpVRc1hUYSS_2YVZgWijPaR33uSIO0SY,16096
27
+ chipwright/tests/conftest.py,sha256=N1gwwU2odf6HWHdK4gEAOhott36ljMTLmgU4-Yktid8,518
28
+ chipwright/tests/test_adapt.py,sha256=pYK2IESCVxIdpsxIjvVddbETIPJxg9yREAOH6ytD8XY,2236
29
+ chipwright/tests/test_build.py,sha256=BMZvM6rJf-xXFScPEmn3EyMAnU7MI5lKHoVqkkQTX3Y,10757
30
+ chipwright/tests/test_cache.py,sha256=PUirZlCdkvkUL42sTCBHbZF1dxKdk5CdsgQcMgLiqAg,5293
31
+ chipwright/tests/test_device_adb.py,sha256=yJMp7ZGrUWg83WITWO3GPI3r57tb9XTqJQzlXVYJcMk,4800
32
+ chipwright/tests/test_env.py,sha256=Z8Afb3pMNBPWEc2srI8KCy8N2USgZFYTQSazvC7QEuA,2336
33
+ chipwright/tests/test_env_adb.py,sha256=hBZzp8VbP4c3Dl2MAJ9g10u9yO6sV5g4a6LVZHKuT4M,4039
34
+ chipwright/tests/test_llm_modality.py,sha256=orWEpXAPqX8MbX7CLoVTfWdm6PoCEz34SveJUL0nO4Y,10981
35
+ chipwright/tests/test_packaging.py,sha256=v1JDsHnbbzqLeFhKV-rLM0nIux4tvd00f-MV8iuVudE,7260
36
+ chipwright/tests/test_precision_support.py,sha256=QdeX8HiYmsYTSRTRkCExzqrT8xgOPWirbQx2ZbUhigc,5186
37
+ chipwright/tests/test_registry.py,sha256=MlYTo9DmFzf2MDdXMmhqUNGGNK2-0cDDCWKb2Yhq-rs,3475
38
+ chipwright/tests/test_resolver.py,sha256=P335bla-1VXDMq7YeaxaHyQlJw7An-SFT-G92nW1H04,3415
39
+ chipwright/tests/test_run_llm.py,sha256=wkAEFfEibblXh0wkO9mRVyMNIbkBL9cVbvWEAJ_5Iqw,1959
40
+ chipwright/tests/test_tags.py,sha256=Yb7TkewLaDNiAeWqdxaALLDLQKHAOu8lDDnd_9OMIvU,3059
41
+ chipwright/tests/test_task_eval.py,sha256=h3lL67WCrepqhlenhOQy23WP1BXQ1jPPjJ-JvhX6Tuc,6677
42
+ chipwright/tests/test_verify.py,sha256=Foat-s75Atjmn2g9wnU1EmsA_8o34V6YZASIMJDYYiU,3113
43
+ chipwright/tests/test_verify_llm.py,sha256=ifBKBiFqxKNBn9maleRNTFlRwnXqkCtki9A9n4BBhUo,8623
44
+ chipwright-0.2.0.dist-info/licenses/LICENSE,sha256=exndoctXKjFD4v_r8NjB7UKo_5Mr3TNf14TQw5M1e4I,1080
45
+ chipwright-0.2.0.dist-info/METADATA,sha256=ow691sxMlZFgAYX6UJ22n0gTSw6BdfgjNQ4HYiHDN8M,12685
46
+ chipwright-0.2.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
47
+ chipwright-0.2.0.dist-info/entry_points.txt,sha256=fQ-tHA5T5uWaC8FgxEO-fa7M1p4_azVAQ8YVrqPiuys,51
48
+ chipwright-0.2.0.dist-info/top_level.txt,sha256=ZBNCkKg5jz-2IdPMVWFdBXncwCGFay2yyePdCRk0BWM,11
49
+ chipwright-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.2.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ chipwright = chipwright.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Chipwright contributors
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 @@
1
+ chipwright