napkin2factory 0.1.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 (203) hide show
  1. napkin2factory-0.1.0/.gitignore +15 -0
  2. napkin2factory-0.1.0/LICENSE +21 -0
  3. napkin2factory-0.1.0/PKG-INFO +162 -0
  4. napkin2factory-0.1.0/README.md +128 -0
  5. napkin2factory-0.1.0/packaging/n2f/README.md +4 -0
  6. napkin2factory-0.1.0/packaging/n2f/pyproject.toml +21 -0
  7. napkin2factory-0.1.0/pyproject.toml +107 -0
  8. napkin2factory-0.1.0/src/napkin2factory/__init__.py +3 -0
  9. napkin2factory-0.1.0/src/napkin2factory/bom/__init__.py +1 -0
  10. napkin2factory-0.1.0/src/napkin2factory/bom/files.py +313 -0
  11. napkin2factory-0.1.0/src/napkin2factory/bom/rollups.py +297 -0
  12. napkin2factory-0.1.0/src/napkin2factory/bom/validation.py +136 -0
  13. napkin2factory-0.1.0/src/napkin2factory/catalog/__init__.py +5 -0
  14. napkin2factory-0.1.0/src/napkin2factory/catalog/common.yaml +76 -0
  15. napkin2factory-0.1.0/src/napkin2factory/cli/__init__.py +1 -0
  16. napkin2factory-0.1.0/src/napkin2factory/cli/__main__.py +5 -0
  17. napkin2factory-0.1.0/src/napkin2factory/cli/app.py +62 -0
  18. napkin2factory-0.1.0/src/napkin2factory/cli/build.py +115 -0
  19. napkin2factory-0.1.0/src/napkin2factory/cli/check.py +260 -0
  20. napkin2factory-0.1.0/src/napkin2factory/cli/common.py +76 -0
  21. napkin2factory-0.1.0/src/napkin2factory/cli/doctor.py +124 -0
  22. napkin2factory-0.1.0/src/napkin2factory/cli/ecr.py +195 -0
  23. napkin2factory-0.1.0/src/napkin2factory/cli/graph.py +62 -0
  24. napkin2factory-0.1.0/src/napkin2factory/cli/init.py +114 -0
  25. napkin2factory-0.1.0/src/napkin2factory/cli/release.py +97 -0
  26. napkin2factory-0.1.0/src/napkin2factory/cli/serve.py +36 -0
  27. napkin2factory-0.1.0/src/napkin2factory/cli/snapshot.py +63 -0
  28. napkin2factory-0.1.0/src/napkin2factory/cli/validate.py +88 -0
  29. napkin2factory-0.1.0/src/napkin2factory/core/__init__.py +1 -0
  30. napkin2factory-0.1.0/src/napkin2factory/core/checks/__init__.py +1 -0
  31. napkin2factory-0.1.0/src/napkin2factory/core/checks/calcs.py +139 -0
  32. napkin2factory-0.1.0/src/napkin2factory/core/checks/engine.py +358 -0
  33. napkin2factory-0.1.0/src/napkin2factory/core/checks/evaluators.py +268 -0
  34. napkin2factory-0.1.0/src/napkin2factory/core/checks/evidence.py +103 -0
  35. napkin2factory-0.1.0/src/napkin2factory/core/checks/interface.py +160 -0
  36. napkin2factory-0.1.0/src/napkin2factory/core/checks/interference.py +153 -0
  37. napkin2factory-0.1.0/src/napkin2factory/core/checks/results.py +100 -0
  38. napkin2factory-0.1.0/src/napkin2factory/core/checks/stage.py +212 -0
  39. napkin2factory-0.1.0/src/napkin2factory/core/errors.py +118 -0
  40. napkin2factory-0.1.0/src/napkin2factory/core/expr.py +183 -0
  41. napkin2factory-0.1.0/src/napkin2factory/core/graph/__init__.py +1 -0
  42. napkin2factory-0.1.0/src/napkin2factory/core/graph/export.py +98 -0
  43. napkin2factory-0.1.0/src/napkin2factory/core/graph/hashing.py +53 -0
  44. napkin2factory-0.1.0/src/napkin2factory/core/graph/impact.py +546 -0
  45. napkin2factory-0.1.0/src/napkin2factory/core/graph/manifest.py +84 -0
  46. napkin2factory-0.1.0/src/napkin2factory/core/graph/rules.py +263 -0
  47. napkin2factory-0.1.0/src/napkin2factory/core/graph/runner.py +317 -0
  48. napkin2factory-0.1.0/src/napkin2factory/core/graph/runs.py +249 -0
  49. napkin2factory-0.1.0/src/napkin2factory/core/graph/values.py +152 -0
  50. napkin2factory-0.1.0/src/napkin2factory/core/lint.py +255 -0
  51. napkin2factory-0.1.0/src/napkin2factory/core/loader.py +836 -0
  52. napkin2factory-0.1.0/src/napkin2factory/core/model/__init__.py +65 -0
  53. napkin2factory-0.1.0/src/napkin2factory/core/model/assemblies.py +66 -0
  54. napkin2factory-0.1.0/src/napkin2factory/core/model/base.py +149 -0
  55. napkin2factory-0.1.0/src/napkin2factory/core/model/decisions.py +32 -0
  56. napkin2factory-0.1.0/src/napkin2factory/core/model/docs.py +23 -0
  57. napkin2factory-0.1.0/src/napkin2factory/core/model/ecr.py +92 -0
  58. napkin2factory-0.1.0/src/napkin2factory/core/model/interfaces.py +129 -0
  59. napkin2factory-0.1.0/src/napkin2factory/core/model/manifest.py +57 -0
  60. napkin2factory-0.1.0/src/napkin2factory/core/model/parameters.py +37 -0
  61. napkin2factory-0.1.0/src/napkin2factory/core/model/parts.py +131 -0
  62. napkin2factory-0.1.0/src/napkin2factory/core/model/requirements.py +101 -0
  63. napkin2factory-0.1.0/src/napkin2factory/core/model/signoff.py +23 -0
  64. napkin2factory-0.1.0/src/napkin2factory/core/units.py +158 -0
  65. napkin2factory-0.1.0/src/napkin2factory/core/uris.py +142 -0
  66. napkin2factory-0.1.0/src/napkin2factory/core/vcs.py +283 -0
  67. napkin2factory-0.1.0/src/napkin2factory/core/yamlio.py +60 -0
  68. napkin2factory-0.1.0/src/napkin2factory/docs/__init__.py +1 -0
  69. napkin2factory-0.1.0/src/napkin2factory/docs/engine.py +199 -0
  70. napkin2factory-0.1.0/src/napkin2factory/docs/html.py +138 -0
  71. napkin2factory-0.1.0/src/napkin2factory/docs/outputs.py +213 -0
  72. napkin2factory-0.1.0/src/napkin2factory/docs/typst.py +418 -0
  73. napkin2factory-0.1.0/src/napkin2factory/drawings/__init__.py +1 -0
  74. napkin2factory-0.1.0/src/napkin2factory/drawings/dxf.py +99 -0
  75. napkin2factory-0.1.0/src/napkin2factory/drawings/engine.py +173 -0
  76. napkin2factory-0.1.0/src/napkin2factory/drawings/sheet.py +747 -0
  77. napkin2factory-0.1.0/src/napkin2factory/drawings/svg.py +456 -0
  78. napkin2factory-0.1.0/src/napkin2factory/drawings/views.py +174 -0
  79. napkin2factory-0.1.0/src/napkin2factory/ecr/__init__.py +1 -0
  80. napkin2factory-0.1.0/src/napkin2factory/ecr/diff.py +372 -0
  81. napkin2factory-0.1.0/src/napkin2factory/ecr/lifecycle.py +436 -0
  82. napkin2factory-0.1.0/src/napkin2factory/ecr/release.py +338 -0
  83. napkin2factory-0.1.0/src/napkin2factory/geometry/__init__.py +1 -0
  84. napkin2factory-0.1.0/src/napkin2factory/geometry/accessors.py +146 -0
  85. napkin2factory-0.1.0/src/napkin2factory/geometry/assembly.py +282 -0
  86. napkin2factory-0.1.0/src/napkin2factory/geometry/build.py +613 -0
  87. napkin2factory-0.1.0/src/napkin2factory/geometry/exporters.py +162 -0
  88. napkin2factory-0.1.0/src/napkin2factory/geometry/features.py +215 -0
  89. napkin2factory-0.1.0/src/napkin2factory/geometry/glb.py +230 -0
  90. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/__init__.py +102 -0
  91. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/_common.py +63 -0
  92. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/_sheet.py +254 -0
  93. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/block.py +83 -0
  94. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/bracket_l.py +242 -0
  95. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/enclosure.py +369 -0
  96. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/frame.py +259 -0
  97. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/hole_pattern.py +396 -0
  98. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/panel.py +284 -0
  99. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/plate.py +126 -0
  100. napkin2factory-0.1.0/src/napkin2factory/geometry/kit/tube.py +135 -0
  101. napkin2factory-0.1.0/src/napkin2factory/geometry/materials.py +51 -0
  102. napkin2factory-0.1.0/src/napkin2factory/geometry/render.py +214 -0
  103. napkin2factory-0.1.0/src/napkin2factory/report/__init__.py +1 -0
  104. napkin2factory-0.1.0/src/napkin2factory/report/builder.py +524 -0
  105. napkin2factory-0.1.0/src/napkin2factory/report/inline.py +89 -0
  106. napkin2factory-0.1.0/src/napkin2factory/report/site.py +22 -0
  107. napkin2factory-0.1.0/src/napkin2factory/report/templates/diff.html.j2 +78 -0
  108. napkin2factory-0.1.0/src/napkin2factory/report/templates/report.html.j2 +241 -0
  109. napkin2factory-0.1.0/src/napkin2factory/report/vendor/three/BufferGeometryUtils.js +1373 -0
  110. napkin2factory-0.1.0/src/napkin2factory/report/vendor/three/GLTFLoader.js +4727 -0
  111. napkin2factory-0.1.0/src/napkin2factory/report/vendor/three/OrbitControls.js +1523 -0
  112. napkin2factory-0.1.0/src/napkin2factory/report/vendor/three/three.module.js +54571 -0
  113. napkin2factory-0.1.0/src/napkin2factory/report/viewer.js +236 -0
  114. napkin2factory-0.1.0/src/napkin2factory/rulepacks/__init__.py +5 -0
  115. napkin2factory-0.1.0/src/napkin2factory/rulepacks/checks.py +201 -0
  116. napkin2factory-0.1.0/src/napkin2factory/rulepacks/general-v0.yaml +29 -0
  117. napkin2factory-0.1.0/src/napkin2factory/rulepacks/runner.py +136 -0
  118. napkin2factory-0.1.0/src/napkin2factory/rulepacks/sheet-metal-v0.yaml +44 -0
  119. napkin2factory-0.1.0/src/napkin2factory/templates/__init__.py +11 -0
  120. napkin2factory-0.1.0/src/napkin2factory/templates/_common/.claude/agents/n2f-impact-analyst.md +17 -0
  121. napkin2factory-0.1.0/src/napkin2factory/templates/_common/.claude/agents/n2f-verifier.md +27 -0
  122. napkin2factory-0.1.0/src/napkin2factory/templates/_common/.claude/skills/n2f-design/SKILL.md +59 -0
  123. napkin2factory-0.1.0/src/napkin2factory/templates/_common/.claude/skills/n2f-pm/SKILL.md +77 -0
  124. napkin2factory-0.1.0/src/napkin2factory/templates/_common/.github/workflows/build.yml +18 -0
  125. napkin2factory-0.1.0/src/napkin2factory/templates/_common/.github/workflows/release.yml +26 -0
  126. napkin2factory-0.1.0/src/napkin2factory/templates/_common/.gitignore +4 -0
  127. napkin2factory-0.1.0/src/napkin2factory/templates/_common/AGENTS.md +55 -0
  128. napkin2factory-0.1.0/src/napkin2factory/templates/_common/CLAUDE.md +55 -0
  129. napkin2factory-0.1.0/src/napkin2factory/templates/blank/CHANGELOG.md +3 -0
  130. napkin2factory-0.1.0/src/napkin2factory/templates/blank/changes/.gitkeep +0 -0
  131. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/assemblies/.gitkeep +0 -0
  132. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/calcs/.gitkeep +0 -0
  133. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/decisions.yaml +2 -0
  134. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/docs/safety.md +23 -0
  135. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/geometry/.gitkeep +0 -0
  136. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/intake.md +5 -0
  137. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/interfaces/.gitkeep +0 -0
  138. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/manufacturers/.gitkeep +0 -0
  139. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/parameters.yaml +2 -0
  140. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/parts/.gitkeep +0 -0
  141. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/requirements.yaml +3 -0
  142. napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/signoffs/.gitkeep +0 -0
  143. napkin2factory-0.1.0/src/napkin2factory/templates/blank/n2f.yaml +7 -0
  144. napkin2factory-0.1.0/src/napkin2factory/templates/blank/operator.yaml +5 -0
  145. napkin2factory-0.1.0/src/napkin2factory/templates/blank/reports/.gitkeep +0 -0
  146. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.claude/agents/n2f-impact-analyst.md +17 -0
  147. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.claude/agents/n2f-verifier.md +27 -0
  148. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.claude/skills/n2f-design/SKILL.md +59 -0
  149. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.claude/skills/n2f-pm/SKILL.md +77 -0
  150. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.github/workflows/build.yml +18 -0
  151. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.github/workflows/release.yml +26 -0
  152. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.gitignore +4 -0
  153. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/AGENTS.md +55 -0
  154. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/CHANGELOG.md +3 -0
  155. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/CLAUDE.md +55 -0
  156. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/changes/.gitkeep +0 -0
  157. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/assemblies/bracket.yaml +7 -0
  158. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/calcs/.gitkeep +0 -0
  159. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/decisions.yaml +13 -0
  160. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/docs/installation.md +22 -0
  161. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/docs/safety.md +20 -0
  162. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/geometry/bracket.py +14 -0
  163. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/intake.md +7 -0
  164. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/interfaces/.gitkeep +0 -0
  165. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/manufacturers/.gitkeep +0 -0
  166. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/parameters.yaml +12 -0
  167. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/parts/l-bracket.yaml +26 -0
  168. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/requirements.yaml +27 -0
  169. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/signoffs/.gitkeep +0 -0
  170. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/n2f.yaml +8 -0
  171. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/operator.yaml +5 -0
  172. napkin2factory-0.1.0/src/napkin2factory/templates/bracket/reports/.gitkeep +0 -0
  173. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.claude/agents/n2f-impact-analyst.md +17 -0
  174. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.claude/agents/n2f-verifier.md +27 -0
  175. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.claude/skills/n2f-design/SKILL.md +59 -0
  176. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.claude/skills/n2f-pm/SKILL.md +77 -0
  177. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.github/workflows/build.yml +18 -0
  178. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.github/workflows/release.yml +26 -0
  179. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.gitignore +4 -0
  180. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/AGENTS.md +55 -0
  181. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/CHANGELOG.md +3 -0
  182. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/CLAUDE.md +55 -0
  183. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/changes/.gitkeep +0 -0
  184. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/assemblies/enclosure.yaml +11 -0
  185. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/calcs/.gitkeep +0 -0
  186. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/decisions.yaml +19 -0
  187. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/docs/assembly.md +17 -0
  188. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/docs/safety.md +20 -0
  189. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/geometry/enclosure.py +32 -0
  190. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/intake.md +6 -0
  191. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/interfaces/lid-base-mount.yaml +10 -0
  192. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/manufacturers/.gitkeep +0 -0
  193. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/parameters.yaml +22 -0
  194. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/parts/base.yaml +24 -0
  195. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/parts/bracket.yaml +21 -0
  196. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/parts/lid.yaml +19 -0
  197. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/parts/m4x10-screw.yaml +11 -0
  198. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/requirements.yaml +59 -0
  199. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/signoffs/.gitkeep +0 -0
  200. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/n2f.yaml +8 -0
  201. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/operator.yaml +5 -0
  202. napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/reports/.gitkeep +0 -0
  203. napkin2factory-0.1.0/src/napkin2factory/templates/sync.py +80 -0
@@ -0,0 +1,15 @@
1
+ .env
2
+ .venv/
3
+ __pycache__/
4
+ *.pyc
5
+ build/
6
+ dist/
7
+ *.egg-info/
8
+ .pytest_cache/
9
+ .mypy_cache/
10
+ .ruff_cache/
11
+ .coverage
12
+ coverage.xml
13
+ htmlcov/
14
+ examples/*/build/
15
+ .DS_Store
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 osama
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,162 @@
1
+ Metadata-Version: 2.5
2
+ Name: napkin2factory
3
+ Version: 0.1.0
4
+ Summary: From napkin to factory: a text-only product model compiled into a manufacturable technical data package, with an engineering-change loop that rebuilds exactly what changed.
5
+ Project-URL: Homepage, https://github.com/osaxma/napkin2factory
6
+ Author: osama
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Keywords: bom,build123d,cad,eco,engineering-change,manufacturing
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Manufacturing
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Topic :: Scientific/Engineering
16
+ Requires-Python: <3.15,>=3.13
17
+ Requires-Dist: build123d<0.13,>=0.12
18
+ Requires-Dist: ezdxf>=1.3
19
+ Requires-Dist: httpx>=0.27
20
+ Requires-Dist: jinja2>=3.1
21
+ Requires-Dist: markdown-it-py>=3.0
22
+ Requires-Dist: numpy>=2.0
23
+ Requires-Dist: openpyxl>=3.1
24
+ Requires-Dist: packaging>=24.0
25
+ Requires-Dist: pint>=0.24
26
+ Requires-Dist: pydantic>=2.9
27
+ Requires-Dist: pygltflib>=1.16
28
+ Requires-Dist: pyyaml>=6.0
29
+ Requires-Dist: rich>=13.0
30
+ Requires-Dist: ruamel-yaml>=0.18
31
+ Requires-Dist: typer>=0.15
32
+ Requires-Dist: typst>=0.13
33
+ Description-Content-Type: text/markdown
34
+
35
+ # napkin2factory
36
+
37
+ **From napkin to factory.** Describe a physical product as text; get a manufacturable
38
+ technical data package — 3D models, drawings, flat patterns, bill of materials, manuals and
39
+ a self-contained report — and change it safely: every engineering change rebuilds exactly
40
+ what it invalidates, shows its impact before anything moves, and ships as a diff page.
41
+
42
+ > **Disclaimer.** napkin2factory designs are produced with an AI system and have not been
43
+ > reviewed by a licensed engineer. Every report, manual, drawing and package it generates
44
+ > says so. Have a qualified person review a design before you build, power or use it.
45
+ > Safety requirements can never pass by computation alone; they need a human sign-off.
46
+
47
+ Version 0.1 covers mechanical parts and the bill of materials. Electrical design, FEA and
48
+ hosted services are not included (see `BACKLOG.md`).
49
+
50
+ ## Install (from source)
51
+
52
+ Requires [uv](https://docs.astral.sh/uv/) (`curl -LsSf https://astral.sh/uv/install.sh | sh`);
53
+ `uv sync` fetches Python 3.13 itself if the machine has none. The repository is private
54
+ until launch, so the clone line is for people with access; everyone else unpacks the source
55
+ archive they were given and starts at `cd`.
56
+
57
+ ```bash
58
+ git clone https://github.com/osaxma/napkin2factory.git # or unpack the source archive
59
+ cd napkin2factory
60
+ uv sync # add --no-dev if you only want to run it, not develop it
61
+ uv run n2f version # napkin2factory 0.1.0
62
+ uv run n2f doctor # is this machine ready?
63
+ ```
64
+
65
+ `uv run n2f …` only works from inside this checkout. To have `n2f` on your PATH and usable
66
+ from any folder:
67
+
68
+ ```bash
69
+ uv tool install .
70
+ ```
71
+
72
+ or `pip install -e .` into a virtual environment. Once the package is published,
73
+ `uvx napkin2factory` will work without a checkout.
74
+
75
+ ## Ten-minute first run
76
+
77
+ ```bash
78
+ uv run n2f init demo --template bracket
79
+ cd demo
80
+ uv run n2f build # the first build loads the CAD kernel: about two minutes, then seconds
81
+ uv run n2f check
82
+ open build/report/index.html # macOS; Linux: xdg-open …; or: uv run n2f serve
83
+ ```
84
+
85
+ The first `n2f build` on a machine prints "loading the CAD kernel…" and then sits silent for
86
+ a minute or two while the kernel loads; later builds take seconds. Builds also check that
87
+ each bought part's vendor link still resolves; set `N2F_OFFLINE=1` (or pass `--offline`) to
88
+ skip that.
89
+
90
+ The report opens straight from disk: a 3D view you can orbit, drawings, the bill of
91
+ materials with a "what to tell the manufacturer" column, and the check matrix. Try a change:
92
+
93
+ ```bash
94
+ uv run n2f ecr new --title "Longer bracket" --set param://bracket-length=140mm
95
+ uv run n2f ecr impact ECR-001 # what it touches, before anything changes
96
+ uv run n2f ecr approve ECR-001 --by "me"
97
+ uv run n2f ecr apply ECR-001
98
+ uv run n2f build && uv run n2f check
99
+ uv run n2f ecr close ECR-001
100
+ uv run n2f release v1.0.0
101
+ ```
102
+
103
+ Make a second change the same way, release it as `v1.1.0`, and the headline diff page is
104
+ one command away:
105
+
106
+ ```bash
107
+ uv run n2f diff v1.0.0 v1.1.0 # → build/site/diff/v1.0.0..v1.1.0/index.html
108
+ ```
109
+
110
+ `n2f status` always tells you where the product stands and what to do next.
111
+
112
+ **Sign-offs.** Some requirements cannot be checked by computation (the enclosure template
113
+ has one: inspect every edge by hand). `n2f check` lists them as `needs your sign-off` and
114
+ still exits 0, but `n2f release` refuses until a person has recorded the review:
115
+
116
+ ```bash
117
+ uv run n2f signoff REQ-004 --by "your name" --statement "what you inspected"
118
+ ```
119
+
120
+ `n2f status` prints the exact command to run. A sign-off stays valid until the evidence it
121
+ was bound to changes.
122
+
123
+ ## The three doors
124
+
125
+ 1. **Chat app only** — planned: a connector or skill that lets a chat assistant run the
126
+ intake and build in its own sandbox.
127
+ 2. **GitHub template** — planned: "Use this template", GitHub Actions as the build machine,
128
+ Pages as the product site. Every product folder already carries the workflow files.
129
+ 3. **Local CLI** — this: `uv run n2f …` (or `n2f …` after `uv tool install .`), works
130
+ offline (`N2F_OFFLINE=1`), no accounts. Open the product folder in Claude Code, Codex or
131
+ any coding agent: the folder's `CLAUDE.md` and skills turn it into the project team.
132
+
133
+ ## The showcase: a 1200 °C test kiln
134
+
135
+ `examples/kiln` is a complete product: 21 parts, interfaces, thermal and element calcs,
136
+ six manuals, example sign-offs, and two change requests. `examples/kiln/demo.sh` runs the
137
+ parametric engineering-change loop unattended (release → change → impact → approve → apply →
138
+ rebuild → check → re-sign → release → diff page); `demo-design.sh` adds a design change
139
+ applied from a pre-authored patch.
140
+
141
+ ## Learn more
142
+
143
+ - `docs/concepts.md` — the ideas (one canonical model, recorded dependencies, checks as the gate)
144
+ - `docs/cli.md` — every command · `docs/vocabulary.md` — the glossary (draft, snapshot,
145
+ change request, Revision … and what each means underneath)
146
+ - `docs/product-model.md` — the files in a product folder · `docs/kit.md` — the part generators
147
+ - `docs/checks.md` — how verification works · `docs/ecr-loop.md` — the change loop
148
+ - `docs/agent-layer.md` — the roles a product folder installs for AI clients
149
+
150
+ ## Developing
151
+
152
+ ```bash
153
+ make check # lint, types, tests, both small examples (6–10 min; sets N2F_OFFLINE=1)
154
+ make check-full # + the kiln, both demos, timing assertions (N2F_TIMING=1)
155
+ ```
156
+
157
+ See `CLAUDE.md` for the rules, `GRAND_PLAN.md` for the plan this version was built to, and
158
+ `DECISIONS.md` / `STATUS.md` / `BACKLOG.md` for the build journal.
159
+
160
+ ## License
161
+
162
+ MIT — see `LICENSE`.
@@ -0,0 +1,128 @@
1
+ # napkin2factory
2
+
3
+ **From napkin to factory.** Describe a physical product as text; get a manufacturable
4
+ technical data package — 3D models, drawings, flat patterns, bill of materials, manuals and
5
+ a self-contained report — and change it safely: every engineering change rebuilds exactly
6
+ what it invalidates, shows its impact before anything moves, and ships as a diff page.
7
+
8
+ > **Disclaimer.** napkin2factory designs are produced with an AI system and have not been
9
+ > reviewed by a licensed engineer. Every report, manual, drawing and package it generates
10
+ > says so. Have a qualified person review a design before you build, power or use it.
11
+ > Safety requirements can never pass by computation alone; they need a human sign-off.
12
+
13
+ Version 0.1 covers mechanical parts and the bill of materials. Electrical design, FEA and
14
+ hosted services are not included (see `BACKLOG.md`).
15
+
16
+ ## Install (from source)
17
+
18
+ Requires [uv](https://docs.astral.sh/uv/) (`curl -LsSf https://astral.sh/uv/install.sh | sh`);
19
+ `uv sync` fetches Python 3.13 itself if the machine has none. The repository is private
20
+ until launch, so the clone line is for people with access; everyone else unpacks the source
21
+ archive they were given and starts at `cd`.
22
+
23
+ ```bash
24
+ git clone https://github.com/osaxma/napkin2factory.git # or unpack the source archive
25
+ cd napkin2factory
26
+ uv sync # add --no-dev if you only want to run it, not develop it
27
+ uv run n2f version # napkin2factory 0.1.0
28
+ uv run n2f doctor # is this machine ready?
29
+ ```
30
+
31
+ `uv run n2f …` only works from inside this checkout. To have `n2f` on your PATH and usable
32
+ from any folder:
33
+
34
+ ```bash
35
+ uv tool install .
36
+ ```
37
+
38
+ or `pip install -e .` into a virtual environment. Once the package is published,
39
+ `uvx napkin2factory` will work without a checkout.
40
+
41
+ ## Ten-minute first run
42
+
43
+ ```bash
44
+ uv run n2f init demo --template bracket
45
+ cd demo
46
+ uv run n2f build # the first build loads the CAD kernel: about two minutes, then seconds
47
+ uv run n2f check
48
+ open build/report/index.html # macOS; Linux: xdg-open …; or: uv run n2f serve
49
+ ```
50
+
51
+ The first `n2f build` on a machine prints "loading the CAD kernel…" and then sits silent for
52
+ a minute or two while the kernel loads; later builds take seconds. Builds also check that
53
+ each bought part's vendor link still resolves; set `N2F_OFFLINE=1` (or pass `--offline`) to
54
+ skip that.
55
+
56
+ The report opens straight from disk: a 3D view you can orbit, drawings, the bill of
57
+ materials with a "what to tell the manufacturer" column, and the check matrix. Try a change:
58
+
59
+ ```bash
60
+ uv run n2f ecr new --title "Longer bracket" --set param://bracket-length=140mm
61
+ uv run n2f ecr impact ECR-001 # what it touches, before anything changes
62
+ uv run n2f ecr approve ECR-001 --by "me"
63
+ uv run n2f ecr apply ECR-001
64
+ uv run n2f build && uv run n2f check
65
+ uv run n2f ecr close ECR-001
66
+ uv run n2f release v1.0.0
67
+ ```
68
+
69
+ Make a second change the same way, release it as `v1.1.0`, and the headline diff page is
70
+ one command away:
71
+
72
+ ```bash
73
+ uv run n2f diff v1.0.0 v1.1.0 # → build/site/diff/v1.0.0..v1.1.0/index.html
74
+ ```
75
+
76
+ `n2f status` always tells you where the product stands and what to do next.
77
+
78
+ **Sign-offs.** Some requirements cannot be checked by computation (the enclosure template
79
+ has one: inspect every edge by hand). `n2f check` lists them as `needs your sign-off` and
80
+ still exits 0, but `n2f release` refuses until a person has recorded the review:
81
+
82
+ ```bash
83
+ uv run n2f signoff REQ-004 --by "your name" --statement "what you inspected"
84
+ ```
85
+
86
+ `n2f status` prints the exact command to run. A sign-off stays valid until the evidence it
87
+ was bound to changes.
88
+
89
+ ## The three doors
90
+
91
+ 1. **Chat app only** — planned: a connector or skill that lets a chat assistant run the
92
+ intake and build in its own sandbox.
93
+ 2. **GitHub template** — planned: "Use this template", GitHub Actions as the build machine,
94
+ Pages as the product site. Every product folder already carries the workflow files.
95
+ 3. **Local CLI** — this: `uv run n2f …` (or `n2f …` after `uv tool install .`), works
96
+ offline (`N2F_OFFLINE=1`), no accounts. Open the product folder in Claude Code, Codex or
97
+ any coding agent: the folder's `CLAUDE.md` and skills turn it into the project team.
98
+
99
+ ## The showcase: a 1200 °C test kiln
100
+
101
+ `examples/kiln` is a complete product: 21 parts, interfaces, thermal and element calcs,
102
+ six manuals, example sign-offs, and two change requests. `examples/kiln/demo.sh` runs the
103
+ parametric engineering-change loop unattended (release → change → impact → approve → apply →
104
+ rebuild → check → re-sign → release → diff page); `demo-design.sh` adds a design change
105
+ applied from a pre-authored patch.
106
+
107
+ ## Learn more
108
+
109
+ - `docs/concepts.md` — the ideas (one canonical model, recorded dependencies, checks as the gate)
110
+ - `docs/cli.md` — every command · `docs/vocabulary.md` — the glossary (draft, snapshot,
111
+ change request, Revision … and what each means underneath)
112
+ - `docs/product-model.md` — the files in a product folder · `docs/kit.md` — the part generators
113
+ - `docs/checks.md` — how verification works · `docs/ecr-loop.md` — the change loop
114
+ - `docs/agent-layer.md` — the roles a product folder installs for AI clients
115
+
116
+ ## Developing
117
+
118
+ ```bash
119
+ make check # lint, types, tests, both small examples (6–10 min; sets N2F_OFFLINE=1)
120
+ make check-full # + the kiln, both demos, timing assertions (N2F_TIMING=1)
121
+ ```
122
+
123
+ See `CLAUDE.md` for the rules, `GRAND_PLAN.md` for the plan this version was built to, and
124
+ `DECISIONS.md` / `STATUS.md` / `BACKLOG.md` for the build journal.
125
+
126
+ ## License
127
+
128
+ MIT — see `LICENSE`.
@@ -0,0 +1,4 @@
1
+ # n2f
2
+
3
+ This package only installs [napkin2factory](https://pypi.org/project/napkin2factory/),
4
+ which provides the `n2f` command. Install either name; you get the same tool.
@@ -0,0 +1,21 @@
1
+ # Placeholder that reserves the `n2f` name on PyPI and installs napkin2factory.
2
+ # Its version must match the main package; .github/workflows/publish.yml checks this.
3
+ [project]
4
+ name = "n2f"
5
+ version = "0.1.0"
6
+ description = "Alias for napkin2factory: `pip install n2f` installs napkin2factory and its `n2f` command."
7
+ readme = "README.md"
8
+ license = "MIT"
9
+ requires-python = ">=3.13,<3.15"
10
+ authors = [{ name = "osama" }]
11
+ dependencies = ["napkin2factory==0.1.0"]
12
+
13
+ [project.urls]
14
+ Homepage = "https://pypi.org/project/napkin2factory/"
15
+
16
+ [build-system]
17
+ requires = ["hatchling"]
18
+ build-backend = "hatchling.build"
19
+
20
+ [tool.hatch.build.targets.wheel]
21
+ bypass-selection = true
@@ -0,0 +1,107 @@
1
+ [project]
2
+ name = "napkin2factory"
3
+ version = "0.1.0"
4
+ description = "From napkin to factory: a text-only product model compiled into a manufacturable technical data package, with an engineering-change loop that rebuilds exactly what changed."
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ requires-python = ">=3.13,<3.15"
8
+ authors = [{ name = "osama" }]
9
+ keywords = ["cad", "build123d", "manufacturing", "bom", "engineering-change", "eco"]
10
+ classifiers = [
11
+ "Development Status :: 3 - Alpha",
12
+ "Intended Audience :: Manufacturing",
13
+ "License :: OSI Approved :: MIT License",
14
+ "Programming Language :: Python :: 3",
15
+ "Programming Language :: Python :: 3.13",
16
+ "Topic :: Scientific/Engineering",
17
+ ]
18
+ dependencies = [
19
+ "build123d>=0.12,<0.13",
20
+ "pint>=0.24",
21
+ "pydantic>=2.9",
22
+ "pyyaml>=6.0",
23
+ "ruamel.yaml>=0.18",
24
+ "typer>=0.15",
25
+ "jinja2>=3.1",
26
+ "ezdxf>=1.3",
27
+ "openpyxl>=3.1",
28
+ "typst>=0.13",
29
+ "numpy>=2.0",
30
+ "httpx>=0.27",
31
+ "pygltflib>=1.16",
32
+ "markdown-it-py>=3.0",
33
+ "rich>=13.0",
34
+ "packaging>=24.0",
35
+ ]
36
+
37
+ [project.scripts]
38
+ n2f = "napkin2factory.cli.app:main"
39
+
40
+ [project.urls]
41
+ Homepage = "https://github.com/osaxma/napkin2factory"
42
+
43
+ [dependency-groups]
44
+ dev = [
45
+ "pytest>=8.3",
46
+ "pytest-cov>=6.0",
47
+ "ruff>=0.8",
48
+ "mypy>=1.13",
49
+ "hypothesis>=6.115",
50
+ "lxml>=5.3",
51
+ "selectolax>=0.3",
52
+ "actionlint-py>=1.7",
53
+ "twine>=6.0",
54
+ "types-PyYAML",
55
+ "types-openpyxl",
56
+ "playwright>=1.48",
57
+ "pillow>=11.0",
58
+ ]
59
+
60
+ [build-system]
61
+ requires = ["hatchling"]
62
+ build-backend = "hatchling.build"
63
+
64
+ [tool.hatch.build.targets.wheel]
65
+ packages = ["src/napkin2factory"]
66
+
67
+ [tool.hatch.build.targets.sdist]
68
+ include = ["src/napkin2factory", "README.md", "LICENSE", "pyproject.toml"]
69
+
70
+ [tool.ruff]
71
+ line-length = 100
72
+ target-version = "py313"
73
+ src = ["src", "tests"]
74
+ extend-exclude = ["src/napkin2factory/report/vendor", "src/napkin2factory/templates", "examples", "docs/history"]
75
+
76
+ [tool.ruff.lint]
77
+ select = ["E", "F", "I", "D", "E722"]
78
+ ignore = ["D203", "D213", "D105", "D107"]
79
+
80
+ [tool.ruff.lint.per-file-ignores]
81
+ "tests/**" = ["D", "E741"]
82
+ "src/napkin2factory/geometry/**" = ["E741"] # `I` is the interface accessor by contract (D5)
83
+
84
+ [tool.ruff.lint.pydocstyle]
85
+ convention = "google"
86
+
87
+ [tool.mypy]
88
+ python_version = "3.13"
89
+ strict = true
90
+ warn_unreachable = true
91
+
92
+ [[tool.mypy.overrides]]
93
+ module = ["OCP", "OCP.*", "build123d", "build123d.*", "ezdxf", "ezdxf.*", "pygltflib", "pygltflib.*", "typst", "pint", "pint.*", "markdown_it", "markdown_it.*", "ruamel", "ruamel.*", "selectolax", "selectolax.*", "lxml", "lxml.*", "hypothesis", "hypothesis.*"]
94
+ ignore_missing_imports = true
95
+
96
+ [tool.pytest.ini_options]
97
+ testpaths = ["tests"]
98
+ addopts = "-q -p no:cacheprovider"
99
+ markers = [
100
+ "timing: timing assertions (only under N2F_TIMING=1)",
101
+ "full: kiln and demo end-to-end tests, run by make check-full (D27)",
102
+ ]
103
+ filterwarnings = ["ignore::DeprecationWarning"]
104
+
105
+ [tool.coverage.run]
106
+ source = ["napkin2factory.core"]
107
+ branch = false
@@ -0,0 +1,3 @@
1
+ """napkin2factory: compile a text-only product model into a manufacturable package."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1 @@
1
+ """Bill of materials: rollups, validation tiers, CSV/XLSX, curated catalog."""