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.
- napkin2factory-0.1.0/.gitignore +15 -0
- napkin2factory-0.1.0/LICENSE +21 -0
- napkin2factory-0.1.0/PKG-INFO +162 -0
- napkin2factory-0.1.0/README.md +128 -0
- napkin2factory-0.1.0/packaging/n2f/README.md +4 -0
- napkin2factory-0.1.0/packaging/n2f/pyproject.toml +21 -0
- napkin2factory-0.1.0/pyproject.toml +107 -0
- napkin2factory-0.1.0/src/napkin2factory/__init__.py +3 -0
- napkin2factory-0.1.0/src/napkin2factory/bom/__init__.py +1 -0
- napkin2factory-0.1.0/src/napkin2factory/bom/files.py +313 -0
- napkin2factory-0.1.0/src/napkin2factory/bom/rollups.py +297 -0
- napkin2factory-0.1.0/src/napkin2factory/bom/validation.py +136 -0
- napkin2factory-0.1.0/src/napkin2factory/catalog/__init__.py +5 -0
- napkin2factory-0.1.0/src/napkin2factory/catalog/common.yaml +76 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/__init__.py +1 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/__main__.py +5 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/app.py +62 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/build.py +115 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/check.py +260 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/common.py +76 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/doctor.py +124 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/ecr.py +195 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/graph.py +62 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/init.py +114 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/release.py +97 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/serve.py +36 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/snapshot.py +63 -0
- napkin2factory-0.1.0/src/napkin2factory/cli/validate.py +88 -0
- napkin2factory-0.1.0/src/napkin2factory/core/__init__.py +1 -0
- napkin2factory-0.1.0/src/napkin2factory/core/checks/__init__.py +1 -0
- napkin2factory-0.1.0/src/napkin2factory/core/checks/calcs.py +139 -0
- napkin2factory-0.1.0/src/napkin2factory/core/checks/engine.py +358 -0
- napkin2factory-0.1.0/src/napkin2factory/core/checks/evaluators.py +268 -0
- napkin2factory-0.1.0/src/napkin2factory/core/checks/evidence.py +103 -0
- napkin2factory-0.1.0/src/napkin2factory/core/checks/interface.py +160 -0
- napkin2factory-0.1.0/src/napkin2factory/core/checks/interference.py +153 -0
- napkin2factory-0.1.0/src/napkin2factory/core/checks/results.py +100 -0
- napkin2factory-0.1.0/src/napkin2factory/core/checks/stage.py +212 -0
- napkin2factory-0.1.0/src/napkin2factory/core/errors.py +118 -0
- napkin2factory-0.1.0/src/napkin2factory/core/expr.py +183 -0
- napkin2factory-0.1.0/src/napkin2factory/core/graph/__init__.py +1 -0
- napkin2factory-0.1.0/src/napkin2factory/core/graph/export.py +98 -0
- napkin2factory-0.1.0/src/napkin2factory/core/graph/hashing.py +53 -0
- napkin2factory-0.1.0/src/napkin2factory/core/graph/impact.py +546 -0
- napkin2factory-0.1.0/src/napkin2factory/core/graph/manifest.py +84 -0
- napkin2factory-0.1.0/src/napkin2factory/core/graph/rules.py +263 -0
- napkin2factory-0.1.0/src/napkin2factory/core/graph/runner.py +317 -0
- napkin2factory-0.1.0/src/napkin2factory/core/graph/runs.py +249 -0
- napkin2factory-0.1.0/src/napkin2factory/core/graph/values.py +152 -0
- napkin2factory-0.1.0/src/napkin2factory/core/lint.py +255 -0
- napkin2factory-0.1.0/src/napkin2factory/core/loader.py +836 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/__init__.py +65 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/assemblies.py +66 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/base.py +149 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/decisions.py +32 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/docs.py +23 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/ecr.py +92 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/interfaces.py +129 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/manifest.py +57 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/parameters.py +37 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/parts.py +131 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/requirements.py +101 -0
- napkin2factory-0.1.0/src/napkin2factory/core/model/signoff.py +23 -0
- napkin2factory-0.1.0/src/napkin2factory/core/units.py +158 -0
- napkin2factory-0.1.0/src/napkin2factory/core/uris.py +142 -0
- napkin2factory-0.1.0/src/napkin2factory/core/vcs.py +283 -0
- napkin2factory-0.1.0/src/napkin2factory/core/yamlio.py +60 -0
- napkin2factory-0.1.0/src/napkin2factory/docs/__init__.py +1 -0
- napkin2factory-0.1.0/src/napkin2factory/docs/engine.py +199 -0
- napkin2factory-0.1.0/src/napkin2factory/docs/html.py +138 -0
- napkin2factory-0.1.0/src/napkin2factory/docs/outputs.py +213 -0
- napkin2factory-0.1.0/src/napkin2factory/docs/typst.py +418 -0
- napkin2factory-0.1.0/src/napkin2factory/drawings/__init__.py +1 -0
- napkin2factory-0.1.0/src/napkin2factory/drawings/dxf.py +99 -0
- napkin2factory-0.1.0/src/napkin2factory/drawings/engine.py +173 -0
- napkin2factory-0.1.0/src/napkin2factory/drawings/sheet.py +747 -0
- napkin2factory-0.1.0/src/napkin2factory/drawings/svg.py +456 -0
- napkin2factory-0.1.0/src/napkin2factory/drawings/views.py +174 -0
- napkin2factory-0.1.0/src/napkin2factory/ecr/__init__.py +1 -0
- napkin2factory-0.1.0/src/napkin2factory/ecr/diff.py +372 -0
- napkin2factory-0.1.0/src/napkin2factory/ecr/lifecycle.py +436 -0
- napkin2factory-0.1.0/src/napkin2factory/ecr/release.py +338 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/__init__.py +1 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/accessors.py +146 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/assembly.py +282 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/build.py +613 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/exporters.py +162 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/features.py +215 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/glb.py +230 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/__init__.py +102 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/_common.py +63 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/_sheet.py +254 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/block.py +83 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/bracket_l.py +242 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/enclosure.py +369 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/frame.py +259 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/hole_pattern.py +396 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/panel.py +284 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/plate.py +126 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/kit/tube.py +135 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/materials.py +51 -0
- napkin2factory-0.1.0/src/napkin2factory/geometry/render.py +214 -0
- napkin2factory-0.1.0/src/napkin2factory/report/__init__.py +1 -0
- napkin2factory-0.1.0/src/napkin2factory/report/builder.py +524 -0
- napkin2factory-0.1.0/src/napkin2factory/report/inline.py +89 -0
- napkin2factory-0.1.0/src/napkin2factory/report/site.py +22 -0
- napkin2factory-0.1.0/src/napkin2factory/report/templates/diff.html.j2 +78 -0
- napkin2factory-0.1.0/src/napkin2factory/report/templates/report.html.j2 +241 -0
- napkin2factory-0.1.0/src/napkin2factory/report/vendor/three/BufferGeometryUtils.js +1373 -0
- napkin2factory-0.1.0/src/napkin2factory/report/vendor/three/GLTFLoader.js +4727 -0
- napkin2factory-0.1.0/src/napkin2factory/report/vendor/three/OrbitControls.js +1523 -0
- napkin2factory-0.1.0/src/napkin2factory/report/vendor/three/three.module.js +54571 -0
- napkin2factory-0.1.0/src/napkin2factory/report/viewer.js +236 -0
- napkin2factory-0.1.0/src/napkin2factory/rulepacks/__init__.py +5 -0
- napkin2factory-0.1.0/src/napkin2factory/rulepacks/checks.py +201 -0
- napkin2factory-0.1.0/src/napkin2factory/rulepacks/general-v0.yaml +29 -0
- napkin2factory-0.1.0/src/napkin2factory/rulepacks/runner.py +136 -0
- napkin2factory-0.1.0/src/napkin2factory/rulepacks/sheet-metal-v0.yaml +44 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/__init__.py +11 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/_common/.claude/agents/n2f-impact-analyst.md +17 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/_common/.claude/agents/n2f-verifier.md +27 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/_common/.claude/skills/n2f-design/SKILL.md +59 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/_common/.claude/skills/n2f-pm/SKILL.md +77 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/_common/.github/workflows/build.yml +18 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/_common/.github/workflows/release.yml +26 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/_common/.gitignore +4 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/_common/AGENTS.md +55 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/_common/CLAUDE.md +55 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/CHANGELOG.md +3 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/changes/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/assemblies/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/calcs/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/decisions.yaml +2 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/docs/safety.md +23 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/geometry/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/intake.md +5 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/interfaces/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/manufacturers/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/parameters.yaml +2 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/parts/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/requirements.yaml +3 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/model/signoffs/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/n2f.yaml +7 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/operator.yaml +5 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/blank/reports/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.claude/agents/n2f-impact-analyst.md +17 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.claude/agents/n2f-verifier.md +27 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.claude/skills/n2f-design/SKILL.md +59 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.claude/skills/n2f-pm/SKILL.md +77 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.github/workflows/build.yml +18 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.github/workflows/release.yml +26 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/.gitignore +4 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/AGENTS.md +55 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/CHANGELOG.md +3 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/CLAUDE.md +55 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/changes/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/assemblies/bracket.yaml +7 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/calcs/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/decisions.yaml +13 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/docs/installation.md +22 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/docs/safety.md +20 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/geometry/bracket.py +14 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/intake.md +7 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/interfaces/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/manufacturers/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/parameters.yaml +12 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/parts/l-bracket.yaml +26 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/requirements.yaml +27 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/model/signoffs/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/n2f.yaml +8 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/operator.yaml +5 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/bracket/reports/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.claude/agents/n2f-impact-analyst.md +17 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.claude/agents/n2f-verifier.md +27 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.claude/skills/n2f-design/SKILL.md +59 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.claude/skills/n2f-pm/SKILL.md +77 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.github/workflows/build.yml +18 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.github/workflows/release.yml +26 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/.gitignore +4 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/AGENTS.md +55 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/CHANGELOG.md +3 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/CLAUDE.md +55 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/changes/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/assemblies/enclosure.yaml +11 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/calcs/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/decisions.yaml +19 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/docs/assembly.md +17 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/docs/safety.md +20 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/geometry/enclosure.py +32 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/intake.md +6 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/interfaces/lid-base-mount.yaml +10 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/manufacturers/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/parameters.yaml +22 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/parts/base.yaml +24 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/parts/bracket.yaml +21 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/parts/lid.yaml +19 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/parts/m4x10-screw.yaml +11 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/requirements.yaml +59 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/model/signoffs/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/n2f.yaml +8 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/operator.yaml +5 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/enclosure/reports/.gitkeep +0 -0
- napkin2factory-0.1.0/src/napkin2factory/templates/sync.py +80 -0
|
@@ -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,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 @@
|
|
|
1
|
+
"""Bill of materials: rollups, validation tiers, CSV/XLSX, curated catalog."""
|