forgecad 0.9.14 → 0.9.16

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 (239) hide show
  1. package/LICENSE +6 -4
  2. package/README.md +8 -4
  3. package/dist/assets/{AdminPage-eWGs2K6H.js → AdminPage-CXvls4-J.js} +2 -2
  4. package/dist/assets/{BenchmarkPage-CTrLKfpo.js → BenchmarkPage-B27zk8xL.js} +4 -15
  5. package/dist/assets/{BlogPage-5nPesyds.js → BlogPage-CMAVvgQL.js} +2 -2
  6. package/dist/assets/{DocsPage-C4Y3nbYc.js → DocsPage-knf4I4h7.js} +9 -3
  7. package/dist/assets/EditorApp-BHMQlJ-D.js +14686 -0
  8. package/dist/assets/{EditorApp-BAnckbsk.css → EditorApp-BpjZgzk0.css} +846 -0
  9. package/dist/assets/{EmbedViewer-C8fB4n5U.js → EmbedViewer-D7ZGlFjx.js} +3 -3
  10. package/dist/assets/{LandingPageProofDriven-jSz0LaMM.js → LandingPageProofDriven-CnevhTE8.js} +36 -38
  11. package/dist/assets/LegalPage-BPTUmqeg.js +39 -0
  12. package/dist/assets/LegalPage-BRlScr9A.css +91 -0
  13. package/dist/assets/{PricingPage-B83B90zh.js → PricingPage-B0D4goG_.js} +19 -19
  14. package/dist/assets/{PricingPage-BMedqFef.css → PricingPage-BPF6HKyO.css} +25 -0
  15. package/dist/assets/{SettingsPage-DY889pcu.js → SettingsPage-CFF-UgjI.js} +2 -2
  16. package/dist/assets/app-CE3sYcV7.css +3890 -0
  17. package/dist/assets/{app-bEww1ic4.js → app-T0pDcSX4.js} +3382 -1069
  18. package/dist/assets/cli/{render-Cho2uKG_.js → render-C5pcIISc.js} +477 -29
  19. package/dist/assets/{constructionHistoryWorker-HYwzJY4m.js → constructionHistoryWorker-Ba2Hm58b.js} +928 -243
  20. package/dist/assets/{evalWorker-CjQwJSE-.js → evalWorker-vkx310U2.js} +8883 -6040
  21. package/dist/assets/{forgecad_geometry-CH2nvuLA.js → forgecad_geometry-Dgceylq9.js} +43 -1
  22. package/dist/assets/forgecad_geometry_bg-dD4RNQF1.wasm +0 -0
  23. package/dist/assets/{inspectWorker-DeRnMVv1.js → inspectWorker-BuTJDVX6.js} +1179 -273
  24. package/dist/assets/{javascript-70-4uGcz.js → javascript-1kQXfVaz.js} +1 -1
  25. package/dist/assets/{targets-D6PWsv6X.js → jointPose-B_Cgedn9.js} +71 -3
  26. package/dist/assets/landing-proof-driven-DiGqdtWa.js +18 -0
  27. package/dist/assets/{landing-proof-driven-oFYW6mjz.css → landing-proof-driven-ORyigZ6p.css} +13 -7
  28. package/dist/assets/legalContent-ZfFGMmi4.js +251 -0
  29. package/dist/assets/{manifold-rmfAcdwF.js → manifold-BWgsjmAM.js} +1 -1
  30. package/dist/assets/{manifold-uRzgk5O8.js → manifold-D6IFSkhH.js} +2 -2
  31. package/dist/assets/{manifold-CG9Fokx-.js → manifold-rZexZI0G.js} +1 -1
  32. package/dist/assets/{reportWorker-4cW_ZpoS.js → reportWorker-0AGij1Ru.js} +8659 -12771
  33. package/dist/assets/{scalar-sampling-budget-CfDiFvh7.js → scalar-sampling-budget-J5cuzxT1.js} +8050 -6203
  34. package/dist/assets/{scanProxyWorker-Bs2TDgLw.js → scanProxyWorker-Vl4Wxa1y.js} +50 -6
  35. package/dist/assets/{solver-DuJAO8S6.js → solver-BZ9LPTHs.js} +1 -1
  36. package/dist/assets/solver_bg-DAHZJ_rw.wasm +0 -0
  37. package/dist/assets/{vendor-react-Da3A2QmU.js → vendor-react-6j1Kke-Y.js} +6 -5
  38. package/dist/cli/render.html +1 -1
  39. package/dist/docs/index.html +2 -2
  40. package/dist/docs-raw/AI/ai-native-cad.md +50 -0
  41. package/dist/docs-raw/AI/usage.md +5 -12
  42. package/dist/docs-raw/CLI.md +34 -10
  43. package/dist/docs-raw/component-model.md +27 -11
  44. package/dist/docs-raw/generated/assembly.md +374 -187
  45. package/dist/docs-raw/generated/concepts.md +245 -237
  46. package/dist/docs-raw/generated/core.md +283 -6
  47. package/dist/docs-raw/generated/curves.md +274 -361
  48. package/dist/docs-raw/generated/lib.md +9 -19
  49. package/dist/docs-raw/generated/output.md +29 -4
  50. package/dist/docs-raw/generated/runtime-names.md +49 -0
  51. package/dist/docs-raw/generated/sdf.md +31 -0
  52. package/dist/docs-raw/generated/sheet-metal.md +9 -0
  53. package/dist/docs-raw/generated/sketch.md +44 -1
  54. package/dist/docs-raw/generated/viewport.md +11 -3
  55. package/dist/docs-raw/guides/coordinate-system.md +20 -16
  56. package/dist/docs-raw/guides/geometry-conventions.md +2 -2
  57. package/dist/docs-raw/guides/inspection-bundles.md +2 -1
  58. package/dist/docs-raw/guides/joint-design.md +24 -0
  59. package/dist/docs-raw/guides/positioning.md +13 -3
  60. package/dist/docs-raw/legal/privacy.md +63 -0
  61. package/dist/docs-raw/legal/software-license.md +55 -0
  62. package/dist/docs-raw/legal/terms.md +87 -0
  63. package/dist/docs-raw/skills/forgecad-3d-reconstruction.md +1 -1
  64. package/dist/docs-raw/skills/forgecad-blockout-model.md +1 -1
  65. package/dist/docs-raw/skills/forgecad-component-model.md +11 -2
  66. package/dist/docs-raw/skills/forgecad-high-level-spec.md +1 -1
  67. package/dist/docs-raw/skills/forgecad-image-replicator.md +8 -8
  68. package/dist/docs-raw/skills/forgecad-lld.md +1 -1
  69. package/dist/docs-raw/skills/forgecad-make-a-model.md +40 -39
  70. package/dist/docs-raw/skills/forgecad-model-grader.md +2 -2
  71. package/dist/docs-raw/skills/forgecad-prepare-prompt.md +2 -2
  72. package/dist/docs-raw/skills/forgecad-project.md +3 -1
  73. package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +1 -1
  74. package/dist/docs-raw/skills/forgecad-render-inspect.md +4 -2
  75. package/dist/docs-raw/skills/forgecad-visual-spec.md +1 -1
  76. package/dist/docs-raw/skills/forgecad.md +4 -3
  77. package/dist/docs-raw/welcome.md +2 -0
  78. package/dist/index.html +40 -12
  79. package/dist/llms.txt +8 -0
  80. package/dist/site.webmanifest +1 -1
  81. package/dist/sitemap.xml +49 -13
  82. package/dist-cli/{check-compiler-U5SOPN7X.js → check-compiler-SYQ2PWOB.js} +1 -2
  83. package/dist-cli/{check-query-propagation-XOKNSSYU.js → check-query-propagation-HIAGV62W.js} +1 -2
  84. package/dist-cli/{chunk-EXWGNL6K.js → chunk-SPZE3DUY.js} +20659 -17930
  85. package/dist-cli/forgecad.js +3568 -1250
  86. package/dist-cli/{forgecad_geometry-GYVNKPIE.js → forgecad_geometry-QOQIIP53.js} +42 -1
  87. package/dist-cli/forgecad_geometry_bg.wasm +0 -0
  88. package/dist-cli/{solver-46FFSK2U.js → solver-OK4HECRH.js} +0 -1
  89. package/dist-cli/solver_bg.wasm +0 -0
  90. package/dist-skill/CONTEXT.md +1192 -725
  91. package/dist-skill/SKILL.md +3 -2
  92. package/dist-skill/docs/API/core/concepts.md +64 -1
  93. package/dist-skill/docs/CLI.md +34 -10
  94. package/dist-skill/docs/generated/assembly.md +339 -213
  95. package/dist-skill/docs/generated/core.md +283 -6
  96. package/dist-skill/docs/generated/curves.md +272 -362
  97. package/dist-skill/docs/generated/lib.md +9 -19
  98. package/dist-skill/docs/generated/output.md +29 -4
  99. package/dist-skill/docs/generated/runtime-names.md +40 -0
  100. package/dist-skill/docs/generated/sdf.md +31 -0
  101. package/dist-skill/docs/generated/sheet-metal.md +9 -0
  102. package/dist-skill/docs/generated/sketch.md +44 -2
  103. package/dist-skill/docs/generated/viewport.md +2 -87
  104. package/dist-skill/docs/guides/coordinate-system.md +20 -16
  105. package/dist-skill/docs/guides/geometry-conventions.md +2 -2
  106. package/dist-skill/docs/guides/inspection-bundles.md +2 -1
  107. package/dist-skill/docs/guides/joint-design.md +24 -0
  108. package/dist-skill/docs/guides/positioning.md +13 -3
  109. package/dist-skill/library/forgecad-component-model/SKILL.md +10 -1
  110. package/dist-skill/library/forgecad-image-replicator/SKILL.md +6 -6
  111. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.py +166 -0
  112. package/dist-skill/library/forgecad-make-a-model/SKILL.md +39 -38
  113. package/dist-skill/library/forgecad-model-grader/SKILL.md +1 -1
  114. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +1 -1
  115. package/dist-skill/library/forgecad-project/SKILL.md +2 -0
  116. package/dist-skill/library/forgecad-render-inspect/SKILL.md +3 -1
  117. package/examples/api/assembly-kinematics-foundation.forge.js +65 -0
  118. package/examples/api/assembly-kinematics-four-bar.forge.js +115 -0
  119. package/examples/api/assembly-kinematics-limb.forge.js +116 -0
  120. package/examples/api/connector-frame-rig-chain.forge.js +102 -0
  121. package/examples/api/exact-sheet-shell-assembly.forge.js +0 -2
  122. package/examples/api/exact-surface-studio.forge.js +6 -8
  123. package/examples/api/helix-basics.forge.js +8 -8
  124. package/examples/api/lean-foundations/README.md +12 -0
  125. package/examples/api/lean-foundations/curve-blend-exact.forge.js +22 -0
  126. package/examples/api/lean-foundations/curve-fit-interpolation.forge.js +18 -0
  127. package/examples/api/lean-foundations/curve-helix-canonicalization.forge.js +27 -0
  128. package/examples/api/lean-foundations/curve-route-canonicalization.forge.js +16 -0
  129. package/examples/api/lean-foundations/curve-trim-reverse.forge.js +24 -0
  130. package/examples/api/lean-foundations/exact-curve-arc.forge.js +36 -0
  131. package/examples/api/mixed-edge-finishes-proof.forge.js +8 -11
  132. package/examples/api/route3d-elbow.forge.js +71 -0
  133. package/examples/api/transition-curves.forge.js +44 -15
  134. package/examples/api/variable-sweep-test.forge.js +3 -1
  135. package/examples/api/y-blend-corner-showcase.forge.js +0 -2
  136. package/examples/generative/coral-vase.forge.js +1 -1
  137. package/examples/nurbs-tube.forge.js +1 -1
  138. package/package.json +17 -13
  139. package/dist/assets/EditorApp-lXv53A1m.js +0 -13610
  140. package/dist/assets/app-CsHnaBWt.css +0 -1789
  141. package/dist/assets/forgecad_geometry_bg-C5_E9Oa9.wasm +0 -0
  142. package/dist/assets/solver_bg-CWvv4lnN.wasm +0 -0
  143. package/dist/docs-raw/API/README.md +0 -16
  144. package/dist/docs-raw/API/core/concepts.md +0 -118
  145. package/dist/docs-raw/INDEX.md +0 -138
  146. package/dist/docs-raw/RELEASING.md +0 -87
  147. package/dist/docs-raw/agent-native-api.md +0 -27
  148. package/dist/docs-raw/beta-deployment.md +0 -304
  149. package/dist/docs-raw/beta-operations.md +0 -325
  150. package/dist/docs-raw/blueprint-first.md +0 -145
  151. package/dist/docs-raw/cli-monetization.md +0 -112
  152. package/dist/docs-raw/coding-best-practices.md +0 -120
  153. package/dist/docs-raw/coding.md +0 -340
  154. package/dist/docs-raw/deployment.md +0 -374
  155. package/dist/docs-raw/guides/skill-maintenance.md +0 -161
  156. package/dist/docs-raw/guides/surface-members.md +0 -82
  157. package/dist/docs-raw/harbor-cli.md +0 -854
  158. package/dist/docs-raw/internals/backend-vocabulary.md +0 -35
  159. package/dist/docs-raw/internals/compiler.md +0 -307
  160. package/dist/docs-raw/internals/constraint-solver-quality.md +0 -161
  161. package/dist/docs-raw/internals/constraint-solver.md +0 -176
  162. package/dist/docs-raw/internals/shape-from-slices.md +0 -152
  163. package/dist/docs-raw/internals/sketch-2d-pipeline.md +0 -108
  164. package/dist/docs-raw/platform/admin.md +0 -45
  165. package/dist/docs-raw/platform/architecture.md +0 -82
  166. package/dist/docs-raw/platform/auth.md +0 -139
  167. package/dist/docs-raw/platform/email.md +0 -67
  168. package/dist/docs-raw/platform/google-oauth-setup.md +0 -88
  169. package/dist/docs-raw/platform/observability.md +0 -197
  170. package/dist/docs-raw/platform/projects.md +0 -111
  171. package/dist/docs-raw/platform/sharing.md +0 -90
  172. package/dist/docs-raw/product/README.md +0 -39
  173. package/dist/docs-raw/product/api-as-product-language.md +0 -13
  174. package/dist/docs-raw/product/business-model.md +0 -15
  175. package/dist/docs-raw/product/competitive-positioning.md +0 -17
  176. package/dist/docs-raw/product/creative-manufacturing.md +0 -15
  177. package/dist/docs-raw/product/founder-story.md +0 -11
  178. package/dist/docs-raw/product/manufacturing-workflows.md +0 -15
  179. package/dist/docs-raw/product/onboarding-first-experience.md +0 -256
  180. package/dist/docs-raw/product/product-loop.md +0 -17
  181. package/dist/docs-raw/product/strategic-decisions.md +0 -22
  182. package/dist/docs-raw/product/user-outreach-email-templates.md +0 -161
  183. package/dist/docs-raw/product/user-segments.md +0 -15
  184. package/dist/docs-raw/product/vision.md +0 -26
  185. package/dist/docs-raw/rl-environments.md +0 -350
  186. package/dist/docs-raw/runbook.md +0 -611
  187. package/dist-cli/check-compiler-U5SOPN7X.js.map +0 -1
  188. package/dist-cli/check-query-propagation-XOKNSSYU.js.map +0 -1
  189. package/dist-cli/chunk-EXWGNL6K.js.map +0 -1
  190. package/dist-cli/forgecad.js.map +0 -1
  191. package/dist-cli/forgecad_geometry-GYVNKPIE.js.map +0 -1
  192. package/dist-cli/solver-46FFSK2U.js.map +0 -1
  193. package/dist-skill/SKILL-dev.md +0 -145
  194. package/dist-skill/docs-dev/API/core/concepts.md +0 -118
  195. package/dist-skill/docs-dev/CLI.md +0 -677
  196. package/dist-skill/docs-dev/agent-native-api.md +0 -27
  197. package/dist-skill/docs-dev/blueprint-first.md +0 -145
  198. package/dist-skill/docs-dev/coding-best-practices.md +0 -120
  199. package/dist-skill/docs-dev/coding.md +0 -340
  200. package/dist-skill/docs-dev/component-model.md +0 -164
  201. package/dist-skill/docs-dev/generated/assembly.md +0 -794
  202. package/dist-skill/docs-dev/generated/core.md +0 -2117
  203. package/dist-skill/docs-dev/generated/curves.md +0 -2583
  204. package/dist-skill/docs-dev/generated/lib.md +0 -169
  205. package/dist-skill/docs-dev/generated/output.md +0 -247
  206. package/dist-skill/docs-dev/generated/sdf.md +0 -446
  207. package/dist-skill/docs-dev/generated/sheet-metal.md +0 -504
  208. package/dist-skill/docs-dev/generated/sketch.md +0 -1811
  209. package/dist-skill/docs-dev/generated/viewport.md +0 -585
  210. package/dist-skill/docs-dev/generated/wood.md +0 -108
  211. package/dist-skill/docs-dev/guides/coordinate-system.md +0 -46
  212. package/dist-skill/docs-dev/guides/geometry-conventions.md +0 -52
  213. package/dist-skill/docs-dev/guides/inspection-bundles.md +0 -485
  214. package/dist-skill/docs-dev/guides/joint-design.md +0 -78
  215. package/dist-skill/docs-dev/guides/modeling-recipes.md +0 -78
  216. package/dist-skill/docs-dev/guides/positioning.md +0 -161
  217. package/dist-skill/docs-dev/guides/skill-maintenance.md +0 -161
  218. package/dist-skill/docs-dev/internals/backend-vocabulary.md +0 -35
  219. package/dist-skill/docs-dev/internals/compiler.md +0 -307
  220. package/dist-skill/docs-dev/internals/constraint-solver-quality.md +0 -161
  221. package/dist-skill/docs-dev/internals/constraint-solver.md +0 -176
  222. package/dist-skill/docs-dev/internals/sketch-2d-pipeline.md +0 -108
  223. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.mjs +0 -289
  224. package/examples/api/bolted-service-cover.forge.js +0 -17
  225. package/examples/api/cable-gland-anchor.forge.js +0 -14
  226. package/examples/api/captured-cartridge-guide.forge.js +0 -14
  227. package/examples/api/captured-linear-slide.forge.js +0 -13
  228. package/examples/api/clevis-pin-joint.forge.js +0 -13
  229. package/examples/api/datum-enclosure.forge.js +0 -16
  230. package/examples/api/hose-barb-port.forge.js +0 -14
  231. package/examples/api/knuckled-hinge-assembly.forge.js +0 -15
  232. package/examples/api/living-hinge-cover.forge.js +0 -14
  233. package/examples/api/pcb-terminal-block.forge.js +0 -22
  234. package/examples/api/pinned-lever-pivot-stack.forge.js +0 -14
  235. package/examples/api/retained-shaft-knob-stack.forge.js +0 -15
  236. package/examples/api/routed-tube-clip.forge.js +0 -15
  237. package/examples/api/seated-bearing-stack.forge.js +0 -30
  238. package/examples/api/snap-latch-cover.forge.js +0 -14
  239. package/examples/api/thumb-screw-clamp.forge.js +0 -15
@@ -0,0 +1,50 @@
1
+ # AI-Native CAD Workflow
2
+
3
+ ForgeCAD is an AI-native CAD workflow for turning product ideas into editable, manufacturable parametric models. The core loop is simple: describe the goal, let an AI agent edit `.forge.js` source, validate the model with the CLI, inspect visual and manufacturing evidence, then revise or fork the next iteration.
4
+
5
+ The important distinction is that ForgeCAD does not stop at a pretty mesh. The model remains code. A hole can move, a wall can thicken, a fastener can change, and a product variant can branch from the same source instead of starting over.
6
+
7
+ ## What AI-Driven CAD Means Here
8
+
9
+ AI-driven CAD should produce a model that can survive feedback. In ForgeCAD, the agent works with normal files, not a hidden binary state:
10
+
11
+ - `.forge.js` files express dimensions, parameters, assemblies, connectors, materials, and export intent.
12
+ - `forgecad run` catches syntax errors, import problems, invalid geometry, collisions, and verification failures.
13
+ - `forgecad render` and `forgecad inspect` create visual evidence for design review, fit checks, wall thickness, sections, masks, depth, and normals.
14
+ - `forgecad export` sends the same source toward STL, 3MF, STEP, reports, cutting layouts, robot packages, or G-code depending on the job.
15
+
16
+ This makes the AI useful after the first answer. You can ask for changes in natural language, but the artifact being changed is still an editable engineering object.
17
+
18
+ ## Manufacturing Feedback Loop
19
+
20
+ A manufacturable model needs feedback before fabrication. ForgeCAD gives agents a concrete loop:
21
+
22
+ ```text
23
+ prompt -> edit source -> run -> render -> inspect -> fix -> export
24
+ ```
25
+
26
+ That loop is where quality improves. The agent can inspect collision reports, check thin walls, render multiple camera views, test parameter ranges, and produce evidence for the user instead of relying on a single screenshot.
27
+
28
+ ## Parallel Product Idea Iterations
29
+
30
+ Because ForgeCAD models are source files, parallel product exploration is cheap. An agent can create several variants in separate files or branches:
31
+
32
+ - one concept optimized for 3D printing
33
+ - one concept aimed at sheet metal or laser cutting
34
+ - one concept with purchased hardware and service access
35
+ - one simplified blockout for proportion and motion review
36
+ - one production-facing version with clearer tolerances and export targets
37
+
38
+ Each variant can keep the same validation contract: run it, render it, inspect it, compare it, and decide whether it deserves more detail.
39
+
40
+ ## Where ForgeCAD Fits
41
+
42
+ ForgeCAD is useful when you want AI-assisted CAD that remains inspectable and editable:
43
+
44
+ - founders exploring physical product ideas
45
+ - makers iterating 3D printed parts and fixtures
46
+ - engineers prototyping mechanisms, enclosures, brackets, and assemblies
47
+ - teams that want version-controlled CAD source and reproducible exports
48
+ - AI agents that need a deterministic toolchain instead of a purely visual prompt-to-mesh path
49
+
50
+ The goal is not to hide CAD behind a chatbot. The goal is to let AI do more of the modeling work while ForgeCAD keeps the result grounded in readable source, validation evidence, and manufacturing outputs.
@@ -64,6 +64,8 @@ forgecad studio .
64
64
 
65
65
  `forgecad studio .` opens the installed local editor around the current project. It requires an explicit project path; `.` means the current folder. `forgecad dev <project-path>` is for ForgeCAD source development and internal live-reload work, not the normal user onboarding path.
66
66
 
67
+ Keep one long-running `forgecad studio <project-path> [project-path ...]` process open with every active project folder listed in its arguments; the user opens the single printed localhost port once, and AI agents should only create or edit files under those folders so the browser updates live without starting more servers.
68
+
67
69
  ## Install Skills For Local Coding Agents
68
70
 
69
71
  Install the ForgeCAD public skill library:
@@ -103,15 +105,6 @@ If you only want the core modeling skill without companion workflows:
103
105
  forgecad skill install --core-only
104
106
  ```
105
107
 
106
- ForgeCAD developers can install the internal/development variant of the core skill:
107
-
108
- ```bash
109
- forgecad skill install --dev
110
- forgecad skill install --dev --target claude
111
- ```
112
-
113
- Use `--dev` only for work on ForgeCAD itself. It includes compiler internals, solver architecture, coding standards, release process, and skill maintenance notes.
114
-
115
108
  ## Recommended Agent Prompts
116
109
 
117
110
  Start the agent inside the initialized project folder. Do not ask it to create a model in a random empty folder or to work from one loose file on the desktop.
@@ -174,7 +167,7 @@ Do not accept a model just because it renders. CAD quality comes from command ev
174
167
 
175
168
  - `forgecad run` confirms the script executes and reports the fast inner-loop build summary.
176
169
  - `forgecad render 3d` gives visual views from deterministic cameras.
177
- - `forgecad inspect <family> <mode>` checks focused geometry evidence such as fit interference, manufacture thickness, visual objects, surface zebra, physical components, and precise or dense section slices.
170
+ - `forgecad inspect <family> <mode>` checks focused geometry evidence such as fit interference, manufacture thickness, visual objects, visual rig, surface zebra, physical components, and precise or dense section slices.
178
171
  - `forgecad inspect section` runs an agent-native one-off section probe with exact ray ruler measurements and a replay recipe.
179
172
  - `forgecad inspect mechanical-integrity` checks assembly-level verification intent and optional collision evidence.
180
173
  - `forgecad run -p "Name=Value"` validates important parameter values without editing source.
@@ -198,7 +191,7 @@ The CLI is not just a launcher. It gives the agent a measurable feedback loop.
198
191
  | Produce visual evidence | `forgecad render 3d model.forge.js --camera iso` | PNG viewport renders from deterministic camera angles. |
199
192
  | Measure a targeted section | `forgecad inspect section model.forge.js --plane yz --ray bore:-20,0:20,0` | A unique probe directory with `result.json`, `section.svg`, `section.png`, exact solid/gap intervals along each ray, and a `replaySpec` for candidate comparisons. Use `--offset` only when the cut should move away from the zero plane. |
200
193
  | Replay a targeted section | `forgecad inspect replay outputs/inspect/<probe>/result.json --source candidate.forge.js` | Reruns the same plane and ray rulers against another source and reports measurement deltas. |
201
- | Inspect targeted geometry evidence | `forgecad inspect fit interference model.forge.js --camera iso` | A bundle with manifest plus the requested evidence PNGs. Visual inspection evidence uses the light technical `inspection` style by default. Use `inspect visual cutaway`, `inspect visual objects`, `inspect manufacture thickness`, `inspect sections at|stack|sample`, `inspect visual depth`, `inspect visual normals`, `inspect physical components`, or `inspect physical gaps` for other questions. |
194
+ | Inspect targeted geometry evidence | `forgecad inspect fit interference model.forge.js --camera iso` | A bundle with manifest plus the requested evidence PNGs. Visual inspection evidence uses the light technical `inspection` style by default. Use `inspect visual cutaway`, `inspect visual objects`, `inspect visual rig`, `inspect manufacture thickness`, `inspect sections at|stack|sample`, `inspect visual depth`, `inspect visual normals`, `inspect physical components`, or `inspect physical gaps` for other questions. |
202
195
  | Export manufacturing files | `forgecad export stl model.forge.js` and `forgecad export 3mf model.forge.js` | Mesh exports for 3D printing. |
203
196
  | Export exact or advanced outputs | `forgecad export step`, `forgecad export brep`, `forgecad export report`, `forgecad export cutting-layout` | Production outputs for CAD interchange, reports, and sheet workflows. |
204
197
  | Sync hosted projects | `forgecad project pull`, `forgecad project push`, `forgecad project publish` | Local-agent workflow connected to forgecad.io projects and shares. |
@@ -223,7 +216,7 @@ For the full command reference, see [ForgeCAD CLI](../CLI.md).
223
216
  | `forgecad-visual-spec` | Producing builder-honest image prompts from a concrete model, HLD, LLD, or build brief. |
224
217
  | `forgecad-project` | Managing forgecad.io projects from the CLI: init, clone, pull, push, file commands, members, publish, and shares. |
225
218
 
226
- The source prompts live in the repository under `skills/`. Public export is controlled by `forgecad-public: true` in each skill's `SKILL.md` frontmatter. To list the current public set from a source checkout:
219
+ The source prompts for CLI-shipped companion skills live in the repository under `agent-skill-library/`. Public export is controlled by `forgecad-public: true` in each skill's `SKILL.md` frontmatter. Repo-local operational skills live under `.agents/skills/` and are not shipped through the CLI. To list the current public set from a source checkout:
227
220
 
228
221
  ```bash
229
222
  npm run sync:public-skills -- --list
@@ -48,6 +48,8 @@ ForgeCAD includes a local editor. Open it around a dedicated project folder, edi
48
48
 
49
49
  `forgecad studio <project-path>` is the normal installed-CLI command for users. `forgecad dev <project-path>` starts the Vite dev server and is mainly for ForgeCAD source development.
50
50
 
51
+ Keep one long-running `forgecad studio <project-path> [project-path ...]` process open with every active project folder listed in its arguments; the user opens the single printed localhost port once, and AI agents should only create or edit files under those folders so the browser updates live without starting more servers.
52
+
51
53
  <details>
52
54
  <summary>Common flags for studio / dev</summary>
53
55
 
@@ -162,11 +164,12 @@ Inspect a model by asking for one explicit kind of evidence.
162
164
 
163
165
  `forgecad inspect` is the evidence-first inspection surface. Pick the job you want to verify, then choose the view like you would with `render 3d`.
164
166
 
167
+ - `inspect sketch` — returned sketch/profile regions, selector dry-runs, and extrusion compatibility
165
168
  - `inspect history` — final-object feature recipes and feedback anchors
166
169
  - `inspect design-trace` — raw construction DAG, source spans, and cache diagnostics
167
170
  - `inspect section` — agent-native one-off section probe with optional ray rulers and replay JSON
168
171
  - `inspect replay` — rerun a saved section probe on the same or another source
169
- - `inspect visual image|cutaway|depth|normals|objects` — visual context, clipped 3D cutaways, depth, normals, and identity evidence
172
+ - `inspect visual image|cutaway|depth|normals|rig|objects` — visual context, clipped 3D cutaways, depth, normals, rig skeletons, and identity evidence
170
173
  - `inspect surface zebra|roughness` — surface continuity and roughness evidence
171
174
  - `inspect physical components|floating|gaps` — physical component graph evidence
172
175
  - `inspect fit interference` — positive-volume overlap evidence
@@ -189,8 +192,27 @@ forgecad inspect sections stack main.forge.js --plane yz --every 1
189
192
  forgecad inspect compare overlay candidate.forge.js --with reference.3mf
190
193
  ```
191
194
 
195
+ ### `forgecad inspect sketch`
196
+
197
+ Inspect returned sketches and profile regions used by returned shapes.
198
+
199
+ Runs a model and reports inspectable 2D sketch/profile regions without requiring model code to register inspection hooks. The command inspects returned Sketch objects and profile-bearing shape compile plans such as extrude, cut, and revolve. Use `--seed x,y` to dry-run which region a point selector would consume, and `--operation extrude` to check extrusion compatibility.
200
+
201
+ ```bash
202
+ forgecad inspect sketch examples/api/sketch-regions.forge.js
203
+ forgecad inspect sketch model.forge.js --object "Profile" --seed 45,15
204
+ forgecad inspect sketch model.forge.js --json --object "Body" --seed 45,15 --operation extrude
205
+ ```
206
+
207
+ `inspect sketch` is external inspection: it runs the script, then reads returned scene objects and shape compile plans. Model code should not call an inspection API. It reports selectable 2D `regions` from returned `Sketch` / `ConstraintSketch` objects and from profile-bearing returned shapes (`extrude.profile`, `cut.profile`, `revolve.profile`).
208
+
209
+ JSON contract: `targets[]` are inspectable sketches/profile uses; `regions[]` are filled selectable areas sorted largest-first with run-local ids like `R0`; `holes[]` are excluded interiors; `selection` is present only with `--seed`; `profileTree` is compile-plan provenance, not JavaScript variable names. Stable selection v1 is `--seed x,y`, not region id.
210
+
211
+ Seed failures are explicit and exit nonzero when no target matches: outside every region, on a boundary, inside a hole, ambiguous, no regions, or incompatible operation. `--operation extrude` only checks whether the selected filled region can be consumed by extrusion; open path/rail selection is intentionally unsupported in v1.
212
+
192
213
  | Command | Description |
193
214
  |---------|-------------|
215
+ | `inspect sketch` | Inspect returned sketches and profile regions used by returned shapes. |
194
216
  | `inspect visual image` | Capture standard shaded viewport evidence. |
195
217
  | `inspect visual objects` | Capture object identity evidence. |
196
218
  | `inspect section` | Run one exact section probe with optional ray rulers. |
@@ -229,7 +251,7 @@ forgecad render hq examples/products/cup.forge.js --preset dramatic
229
251
 
230
252
  Render a Forge scene to PNG using the real viewport renderer.
231
253
 
232
- Launches a headless Chrome instance, renders the scene with the same WebGL viewport as the editor, and saves a PNG. The output path defaults to `<script-name>.png` next to the input file.
254
+ Launches a headless Chrome instance, renders the scene with the same WebGL viewport as the editor, and saves a PNG. The output path defaults to `<script-name>.png` next to the input file. Each render uses a private renderer server by default, so parallel renders do not compete for the same Vite port.
233
255
 
234
256
  The input can be a `.forge.js` script or a direct `.stl`, `.obj`, `.3mf`, `.step`, or `.stp` asset. Direct STEP/STP rendering auto-selects OCCT unless you pass `--backend`.
235
257
 
@@ -299,9 +321,9 @@ forgecad render hq examples/products/cup.forge.js --transparent --preset glass
299
321
 
300
322
  ### `forgecad capture gif|mp4` **\[Pro\]**
301
323
 
302
- Animated orbit or joint playback.
324
+ Animated orbit, section sweep, or named joint playback.
303
325
 
304
- Renders an animated sequence by either orbiting the camera around the model or playing back a `jointsView` animation. Use `--capture orbit` (default) for a turntable rotation, `--capture animation --animation <name>` to play a named joints clip, or `--capture section-sweep` to move a clipping plane through the model. Supports `--cut-plane` to animate with a static cross-section visible. Use `--view`, `--camera`, `--camera-json`, or `--scene <file>` to choose the orbit base camera or the fixed camera for animations and section sweeps.
326
+ Renders an animated sequence by either orbiting the camera around the model or playing back a named joint animation. Use `--capture orbit` (default) for a turntable rotation, `--capture animation --animation <name>` to play a named joint clip, or `--capture section-sweep` to move a clipping plane through the model. Supports `--cut-plane` to animate with a static cross-section visible. Use `--view`, `--camera`, `--camera-json`, or `--scene <file>` to choose the orbit base camera or the fixed camera for animations and section sweeps.
305
327
 
306
328
  ```bash
307
329
  forgecad capture gif examples/products/cup.forge.js
@@ -311,7 +333,7 @@ forgecad capture gif model.forge.js out/front.gif --camera front
311
333
  forgecad capture gif model.forge.js out/hero.gif --view hero
312
334
  forgecad capture gif examples/3d-printer.forge.js out/sweep.gif --capture section-sweep --sweep-plane YZ
313
335
  forgecad capture mp4 examples/products/cup.forge.js
314
- forgecad capture mp4 examples/api/runtime-joints-view.forge.js out/step.mp4 --capture animation --animation Step
336
+ forgecad capture mp4 examples/api/assembly-kinematics-four-bar.forge.js out/four-bar.mp4 --view iso
315
337
  forgecad capture mp4 model.forge.js out/raw.mp4 --param "Output=raw-sdf"
316
338
  forgecad capture mp4 model.forge.js out/front.mp4 --camera front
317
339
  forgecad capture mp4 model.forge.js out/hero.mp4 --view hero
@@ -346,6 +368,7 @@ forgecad render section examples/furniture/01-table.forge.js out/bold.svg --edge
346
368
  |--------|-------------|
347
369
  | `--param <Key=Value>` | Override a parameter value (Key=Value). Repeatable. |
348
370
  | `-p <Key=Value>` | Shorthand for --param |
371
+ | `--joint <JointName=Value>` | Override a Motion tab joint value (JointName=Value). Repeatable. |
349
372
  | `--focus <names>` | Focus: no arg hides mocks; comma-separated names/globs show only those |
350
373
  | `--hide <names>` | Hide comma-separated object names/globs |
351
374
  | `--camera <front\|back\|side\|right\|top\|iso\|az:el\|az:el:dist\|spec>` | Camera preset, spherical (az:el), or full spec such as `proj=perspective;pos=x,y,z;target=x,y,z;up=x,y,z;fov=45`. Repeatable. |
@@ -356,9 +379,9 @@ forgecad render section examples/furniture/01-table.forge.js out/bold.svg --edge
356
379
  | `--background <color>` | Canvas background override |
357
380
  | `--render-mode <solid\|wireframe>` | Shaded solid (default) or wireframe only |
358
381
  | `--edges <off\|thin\|bold>` | Edge overlay preset in solid mode (default: off) |
359
- | `--render-style <classic\|studio\|fast\|glass\|inspection\|precision\|hybrid\|scan>` | Visual render style (render default: classic; inspect default: inspection) |
382
+ | `--render-style <classic\|studio\|fast\|glass\|inspection\|contour\|scan>` | Visual render style (render default: classic; inspect default: inspection) |
360
383
  | `--scan-granularity <12-144>` | Scan cells across the scene longest axis |
361
- | `--port <n>` | Vite dev server port |
384
+ | `--port <n>` | Renderer server port |
362
385
  | `--fresh-server` | Start a fresh renderer instead of reusing an existing one |
363
386
  | `--chrome-path <path>` | Chrome or Chromium executable path |
364
387
  | `--output <path>` | Output file path |
@@ -379,7 +402,7 @@ forgecad render section examples/furniture/01-table.forge.js out/bold.svg --edge
379
402
  | `--pitch <deg>` | Camera pitch angle in degrees |
380
403
  | `--format <gif\|mp4>` | Output format |
381
404
  | `--capture <orbit\|animation\|section-sweep>` | Capture preset |
382
- | `--animation <name>` | Named jointsView animation clip |
405
+ | `--animation <name>` | Named joint animation clip |
383
406
  | `--animation-loops <n>` | Repeat the selected animation clip |
384
407
  | `--cut-plane <name>` | Enable a named cut plane |
385
408
  | `--sweep-plane <XY\|XZ\|YZ>` | Moving plane for section-sweep |
@@ -448,9 +471,10 @@ forgecad export sdf rover.forge.js --output out/forge_scout
448
471
 
449
472
  | Option | Description |
450
473
  |--------|-------------|
474
+ | `--joint <JointName=Value>` | Override a Motion tab joint value (JointName=Value). Repeatable. |
451
475
  | `--output <path>` | Output STEP path |
476
+ | `--backend <occt\|truck>` | Exact BREP exporter: occt (default) or truck (native analytic kernel) |
452
477
  | `--quality <default\|live\|high>` | Forge quality preset |
453
- | `--backend <manifold\|occt\|truck>` | Geometry backend (default: manifold) |
454
478
  | `-o <path>` | Shorthand for --output |
455
479
  | `--dim-angle-tol <deg>` | Dimension routing tolerance in degrees |
456
480
  | `--format <pdf\|dxf>` | Output format |
@@ -484,7 +508,7 @@ cd start-here
484
508
  forgecad studio .
485
509
  ```
486
510
 
487
- `forgecad login` asks how you want to sign in, then prompts for either email/password or an API token. If your account was created through GitHub or Google, create an API token in Settings > API Tokens, run `forgecad login`, and choose API token. Use `FORGECAD_TOKEN=fc_pat_...` only for CI/CD and one-off automation. See [Platform authentication](platform/auth.md#cli-auth-for-oauth-accounts) for details.
511
+ `forgecad login` asks how you want to sign in, then prompts for either email/password or an API token. If your account was created through GitHub or Google, create an API token in Settings > API Tokens, run `forgecad login`, and choose API token. Use `FORGECAD_TOKEN=fc_pat_...` only for CI/CD and one-off automation.
488
512
 
489
513
  `forgecad project init` creates the remote project, writes `forgecad.json`, pushes any existing local source files, and records server file IDs. `forgecad project push` syncs an already initialized project; it does not create a remote project from an arbitrary folder.
490
514
 
@@ -35,18 +35,27 @@ return rack.withConnectors({
35
35
 
36
36
  ### Rule 2: Connectors Are the Interface
37
37
 
38
- Every part that participates in an assembly declares connectors. A connector says: "here's where I connect, and here's what direction I face." It's the part's public interface — the only thing the assembly needs to know.
38
+ Every part that participates in an assembly declares connectors. A connector says: "here's where I connect, what direction I face, and what roll I consider upright." It's the part's public interface — the only thing the assembly needs to know.
39
39
 
40
40
  ```js
41
41
  return mount.withConnectors({
42
42
  flange: connector("bolt-face", {
43
43
  origin: [0, 0, 0], // where the mating surface is
44
44
  axis: [0, 0, 1], // direction it faces (outward from part)
45
+ up: [1, 0, 0], // roll reference when orientation matters
45
46
  }),
46
47
  });
47
48
  ```
48
49
 
49
- Connectors meet **face-to-face**. Both axes point outward from their respective parts. The system brings them together from opposite sides — like plugging a USB cable into a port.
50
+ A connector is a small local frame:
51
+
52
+ - `origin` is the pivot, contact point, socket center, or mating-face point.
53
+ - `axis` is the primary direction: face normal, hinge line, or slide direction.
54
+ - `up` is the secondary direction that fixes roll around `axis`.
55
+
56
+ `up` is not world up. It is the connector's local roll reference and must not be parallel to `axis`. If `up` is omitted, ForgeCAD picks a deterministic perpendicular vector. That is fine when roll does not matter, but hinges, wheels, levers, and keyed parts should author `up` explicitly.
57
+
58
+ Connectors meet **face-to-face**. Both axes point outward from their respective parts. The system brings them together from opposite sides, then uses `up` to pin the rest orientation — like plugging in a keyed connector instead of a round peg.
50
59
 
51
60
  ### Rule 3: The Assembly Is Pure Composition
52
61
 
@@ -117,22 +126,29 @@ Change the servo model → the mount rebuilds with new cavity dimensions → its
117
126
 
118
127
  ## The Connector Convention
119
128
 
120
- Connectors follow one convention: **face-to-face**.
129
+ Connectors follow one convention: **face-to-face connector frames**.
121
130
 
122
- Each connector's axis points **outward** from its part — the direction the connection faces. When two connectors mate, the system negates one axis so they approach from opposite sides.
131
+ Each connector's axis points **outward** from its part — the direction the connection faces. When two connectors mate, the system makes their origins coincide and, for fixed/revolute joints, negates one axis so they approach from opposite sides. The `up` vectors define the roll reference that makes the rest pose deterministic.
123
132
 
124
133
  - **Fixed joints** (bolt flange): both faces point outward, system brings them together
125
- - **Revolute joints** (hinge): both parts point outward along the hinge line, system opposes them
126
- - **Prismatic joints** (slider): both connectors point along the slide direction (co-directional exception — the slide axis IS the shared direction)
134
+ - **Revolute joints** (hinge): both parts point outward along the hinge line, system opposes them, and `up` pins zero angle
135
+ - **Prismatic joints** (slider): both connectors point along the slide direction (co-directional exception — the slide axis IS the shared direction), while `up` still pins roll around the rail
136
+
137
+ Revolute joint values are still signed by the physical hinge axis. If a bilateral
138
+ mechanism mirrors a hinge axis, the mirrored pose uses the negated physical value
139
+ (`Right: +theta`, `Left: -theta`), and physical limits mirror as
140
+ `[min, max] -> [-max, -min]`. Prismatic joints do not have this angle-handedness
141
+ flip. Use a side-neutral link graph or explicit state mapping when equal semantic
142
+ pose values should drive both sides.
127
143
 
128
144
  ```js
129
145
  // Base bottom face points down, mount flange points up → meet in the middle
130
- base.withConnectors({ mount_face: connector("bolt-face", { origin: [0,0,0], axis: [0,0,-1] }) });
131
- mount.withConnectors({ flange: connector("bolt-face", { origin: [0,0,0], axis: [0,0,1] }) });
146
+ base.withConnectors({ mount_face: connector("bolt-face", { origin: [0,0,0], axis: [0,0,-1], up: [1,0,0] }) });
147
+ mount.withConnectors({ flange: connector("bolt-face", { origin: [0,0,0], axis: [0,0,1], up: [1,0,0] }) });
132
148
 
133
- // Hinge: frame points up along hinge line, door points down shared rotation axis
134
- frame.withConnectors({ hinge: connector("hinge", { origin: [0,0,40], axis: [0,0,1] }) });
135
- door.withConnectors({ hinge: connector("hinge", { origin: [0,0,40], axis: [0,0,-1] }) });
149
+ // Hinge: axes oppose along the pin, up pins the closed/rest roll
150
+ frame.withConnectors({ hinge: connector("hinge", { origin: [0,0,40], axis: [0,0,1], up: [1,0,0] }) });
151
+ door.withConnectors({ hinge: connector("hinge", { origin: [0,0,40], axis: [0,0,-1], up: [1,0,0] }) });
136
152
  ```
137
153
 
138
154
  ## One File vs. Many Files