forgecad 0.10.3 → 0.10.5

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 (123) hide show
  1. package/dist/assets/{AdminPage-CK7ObBz3.js → AdminPage-raksfnNA.js} +1 -1
  2. package/dist/assets/{BenchmarkPage-Ds7Z2doN.js → BenchmarkPage-DP3RxhPs.js} +2 -2
  3. package/dist/assets/{BlogPage-DlPbpt6A.js → BlogPage-D7Dos-vl.js} +1 -1
  4. package/dist/assets/{DocsPage-vZb3b3Y0.js → DocsPage-DO1kvBns.js} +34 -43
  5. package/dist/assets/{EditorApp-HLoKfe15.js → EditorApp-DQJmcmRT.js} +51 -17
  6. package/dist/assets/{EmbedViewer--KnqBKrJ.js → EmbedViewer-DFDUhOma.js} +2 -2
  7. package/dist/assets/{LandingPageProofDriven-C_LssmnA.js → LandingPageProofDriven-DbE_tp8-.js} +54 -36
  8. package/dist/assets/{LegalPage-DGsyo4n1.js → LegalPage-CominSso.js} +2 -2
  9. package/dist/assets/{PricingPage-BOE27B-R.js → PricingPage-CcVIN9yj.js} +2 -2
  10. package/dist/assets/{SettingsPage-f47cnk39.js → SettingsPage-DLWcP289.js} +1 -1
  11. package/dist/assets/{app-D6ccu2Xx.js → app-xW3hOdq9.js} +1343 -4004
  12. package/dist/assets/{backendInit-DbTkQN9J.js → backendInit-mDHk97u7.js} +12346 -3803
  13. package/dist/assets/cli/{render-BsngirjC.js → render--SIU27W_.js} +1909 -146
  14. package/dist/assets/{constructionHistoryWorker-PCwXrTDB.js → constructionHistoryWorker-uEe_Q7Kg.js} +2362 -835
  15. package/dist/assets/{evalWorker-CS63PfZu.js → evalWorker-BqyDHDcI.js} +7755 -3127
  16. package/dist/assets/{forgecad_geometry-CZ_IfuvA.js → forgecad_geometry-D8rWX7nQ.js} +1 -1
  17. package/dist/assets/{forgecad_geometry_bg-C3rQHfwg.wasm → forgecad_geometry_bg-ObqfqjJT.wasm} +0 -0
  18. package/dist/assets/{inspectWorker-Y4cOzNyA.js → inspectWorker-UXMxlcR8.js} +6550 -2943
  19. package/dist/assets/{jointPose-AMvCywzS.js → jointPose-bYMlwU3v.js} +1 -1
  20. package/dist/assets/{landing-proof-driven-ORyigZ6p.css → landing-proof-driven-_u4v_xQb.css} +71 -11
  21. package/dist/assets/{manifold-Crd_F2qx.js → manifold-BR7UYI4P.js} +1 -1
  22. package/dist/assets/{manifold-CBry38ly.js → manifold-CyOV5B9S.js} +2 -2
  23. package/dist/assets/{manifold-k2kRcc85.js → manifold-D4d5NQst.js} +1 -1
  24. package/dist/assets/{reportWorker-CWvn0CEv.js → reportWorker-DsaICZsn.js} +7320 -2827
  25. package/dist/cli/render.html +1 -1
  26. package/dist/docs/index.html +2 -2
  27. package/dist/docs-raw/AI/usage.md +17 -15
  28. package/dist/docs-raw/CLI.md +4 -2
  29. package/dist/docs-raw/component-model.md +2 -2
  30. package/dist/docs-raw/generated/assembly.md +76 -3
  31. package/dist/docs-raw/generated/concepts.md +36 -5
  32. package/dist/docs-raw/generated/core.md +185 -21
  33. package/dist/docs-raw/generated/curves.md +344 -6
  34. package/dist/docs-raw/generated/runtime-names.md +12 -12
  35. package/dist/docs-raw/generated/sketch.md +16 -3
  36. package/dist/docs-raw/guides/inspection-bundles.md +5 -3
  37. package/dist/docs-raw/guides/structural-fea.md +224 -0
  38. package/dist/docs-raw/simulation-workflow.md +1 -1
  39. package/dist/docs-raw/skills/{forgecad-make-a-model.md → forgecad-build-model.md} +18 -8
  40. package/dist/docs-raw/skills/{forgecad-spec-by-walking-through-it.md → forgecad-design-spec.md} +6 -6
  41. package/dist/docs-raw/skills/{forgecad-model-grader.md → forgecad-grade-model.md} +8 -6
  42. package/{dist-skill/website/skills/forgecad-visual-spec.md → dist/docs-raw/skills/forgecad-image-prompt.md} +7 -7
  43. package/dist/docs-raw/skills/{forgecad-render-inspect.md → forgecad-inspect-model.md} +6 -6
  44. package/{dist-skill/website/skills/forgecad-project.md → dist/docs-raw/skills/forgecad-project-sync.md} +5 -5
  45. package/dist/docs-raw/skills/{forgecad-3d-reconstruction.md → forgecad-reconstruct-cad-file.md} +7 -7
  46. package/dist/docs-raw/skills/{forgecad-image-replicator.md → forgecad-reconstruct-from-images.md} +12 -12
  47. package/dist/docs-raw/skills/{forgecad-mujoco-verify.md → forgecad-verify-mujoco.md} +6 -6
  48. package/dist/docs-raw/skills/forgecad.md +1 -0
  49. package/dist/docs-raw/skills/index.md +9 -12
  50. package/dist/index.html +9 -9
  51. package/dist/llms.txt +7 -7
  52. package/dist/sitemap.xml +16 -16
  53. package/dist-cli/{check-compiler-HPF2T2FS.js → check-compiler-7YAHVXYM.js} +1 -1
  54. package/dist-cli/{check-query-propagation-HYSLTXAB.js → check-query-propagation-ZRR6IOJW.js} +1 -1
  55. package/dist-cli/{chunk-WLUKAW3H.js → chunk-VNM67DIV.js} +29671 -24865
  56. package/dist-cli/forgecad.js +5906 -714
  57. package/dist-cli/forgecad_geometry_bg.wasm +0 -0
  58. package/dist-skill/CONTEXT.md +853 -45
  59. package/dist-skill/SKILL.md +1 -0
  60. package/dist-skill/docs/CLI.md +4 -2
  61. package/dist-skill/docs/generated/assembly.md +73 -3
  62. package/dist-skill/docs/generated/core.md +185 -21
  63. package/dist-skill/docs/generated/curves.md +343 -6
  64. package/dist-skill/docs/generated/runtime-names.md +12 -12
  65. package/dist-skill/docs/generated/sketch.md +16 -3
  66. package/dist-skill/docs/guides/inspection-bundles.md +5 -3
  67. package/dist-skill/docs/guides/structural-fea.md +224 -0
  68. package/dist-skill/library/README.md +9 -12
  69. package/dist-skill/library/{forgecad-make-a-model → forgecad-build-model}/SKILL.md +16 -6
  70. package/dist-skill/library/{forgecad-spec-by-walking-through-it → forgecad-design-spec}/SKILL.md +4 -4
  71. package/dist-skill/library/{forgecad-spec-by-walking-through-it → forgecad-design-spec}/references/master-prompt.md +1 -1
  72. package/dist-skill/library/{forgecad-model-grader → forgecad-grade-model}/SKILL.md +6 -4
  73. package/dist-skill/library/forgecad-grade-model/agents/openai.yaml +4 -0
  74. package/dist-skill/library/{forgecad-visual-spec → forgecad-image-prompt}/SKILL.md +5 -5
  75. package/dist-skill/library/forgecad-image-prompt/agents/openai.yaml +4 -0
  76. package/dist-skill/library/{forgecad-render-inspect → forgecad-inspect-model}/SKILL.md +4 -4
  77. package/dist-skill/library/{forgecad-project → forgecad-project-sync}/SKILL.md +3 -3
  78. package/dist-skill/library/{forgecad-3d-reconstruction → forgecad-reconstruct-cad-file}/SKILL.md +5 -5
  79. package/dist-skill/library/forgecad-reconstruct-cad-file/agents/openai.yaml +4 -0
  80. package/dist-skill/library/{forgecad-image-replicator → forgecad-reconstruct-from-images}/SKILL.md +10 -10
  81. package/dist-skill/library/forgecad-reconstruct-from-images/agents/openai.yaml +4 -0
  82. package/dist-skill/library/{forgecad-mujoco-verify → forgecad-verify-mujoco}/SKILL.md +4 -4
  83. package/dist-skill/website/skills/{forgecad-make-a-model.md → forgecad-build-model.md} +18 -8
  84. package/dist-skill/website/skills/{forgecad-spec-by-walking-through-it.md → forgecad-design-spec.md} +6 -6
  85. package/dist-skill/website/skills/{forgecad-model-grader.md → forgecad-grade-model.md} +8 -6
  86. package/{dist/docs-raw/skills/forgecad-visual-spec.md → dist-skill/website/skills/forgecad-image-prompt.md} +7 -7
  87. package/dist-skill/website/skills/{forgecad-render-inspect.md → forgecad-inspect-model.md} +6 -6
  88. package/{dist/docs-raw/skills/forgecad-project.md → dist-skill/website/skills/forgecad-project-sync.md} +5 -5
  89. package/dist-skill/website/skills/{forgecad-3d-reconstruction.md → forgecad-reconstruct-cad-file.md} +7 -7
  90. package/dist-skill/website/skills/{forgecad-image-replicator.md → forgecad-reconstruct-from-images.md} +12 -12
  91. package/dist-skill/website/skills/{forgecad-mujoco-verify.md → forgecad-verify-mujoco.md} +6 -6
  92. package/dist-skill/website/skills/forgecad.md +1 -0
  93. package/dist-skill/website/skills/index.md +9 -12
  94. package/examples/analysis/structural-stress-fea.forge.js +19 -0
  95. package/examples/api/blend-full-round.forge.js +37 -0
  96. package/examples/api/blend-variable-radius.forge.js +51 -0
  97. package/examples/api/curve-project-and-intersect.forge.js +59 -0
  98. package/examples/api/extrude-up-to-face.forge.js +47 -0
  99. package/examples/api/spoon-full-tang-handle.forge.js +148 -0
  100. package/examples/api/surface-boundarynet-dished-bowl.forge.js +63 -0
  101. package/examples/api/surface-fill-interior-constraints.forge.js +59 -0
  102. package/examples/api/texture-projection.forge.js +75 -0
  103. package/examples/assets/uv-grid.png +0 -0
  104. package/package.json +4 -1
  105. package/dist/docs-raw/skills/forgecad-blockout-model.md +0 -49
  106. package/dist/docs-raw/skills/forgecad-component-model.md +0 -53
  107. package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +0 -60
  108. package/dist-skill/library/forgecad-3d-reconstruction/agents/openai.yaml +0 -4
  109. package/dist-skill/library/forgecad-blockout-model/SKILL.md +0 -42
  110. package/dist-skill/library/forgecad-component-model/SKILL.md +0 -46
  111. package/dist-skill/library/forgecad-image-replicator/agents/openai.yaml +0 -4
  112. package/dist-skill/library/forgecad-model-grader/agents/openai.yaml +0 -4
  113. package/dist-skill/library/forgecad-reconstruction-benchmark/SKILL.md +0 -48
  114. package/dist-skill/library/forgecad-reconstruction-benchmark/agents/openai.yaml +0 -4
  115. package/dist-skill/library/forgecad-visual-spec/agents/openai.yaml +0 -4
  116. package/dist-skill/website/skills/forgecad-blockout-model.md +0 -49
  117. package/dist-skill/website/skills/forgecad-component-model.md +0 -53
  118. package/dist-skill/website/skills/forgecad-reconstruction-benchmark.md +0 -60
  119. /package/dist/assets/{landing-proof-driven-DiGqdtWa.js → landing-proof-driven-DNPRKL_p.js} +0 -0
  120. /package/dist-skill/library/{forgecad-spec-by-walking-through-it → forgecad-design-spec}/references/default-profiles.md +0 -0
  121. /package/dist-skill/library/{forgecad-render-inspect → forgecad-inspect-model}/summarize_manifest.py +0 -0
  122. /package/dist-skill/library/{forgecad-image-replicator → forgecad-reconstruct-from-images}/scripts/compare_images.py +0 -0
  123. /package/dist-skill/library/{forgecad-mujoco-verify → forgecad-verify-mujoco}/scripts/mujoco_verify.py +0 -0
@@ -97,7 +97,7 @@ To verify installation, ask the agent:
97
97
  What ForgeCAD skills are available?
98
98
  ```
99
99
 
100
- You should see `forgecad` plus companion skills such as `forgecad-make-a-model`, `forgecad-render-inspect`, `forgecad-spec-by-walking-through-it`, and `forgecad-project`.
100
+ You should see `forgecad` plus companion skills such as `forgecad-build-model`, `forgecad-inspect-model`, `forgecad-design-spec`, and `forgecad-project-sync`.
101
101
 
102
102
  If you only want the core modeling skill without companion workflows:
103
103
 
@@ -130,16 +130,17 @@ push when the result is ready for the browser.
130
130
  ### Mechanism Or Assembly
131
131
 
132
132
  ```text
133
- Use forgecad-component-model and forgecad. Parts must build at origin. The
134
- assembly positions parts with connectors or explicit assembly-level placement.
135
- Validate with forgecad run, inspect physical components, inspect fit interference and visual objects,
136
- and run parameter checks before calling it done.
133
+ Use forgecad-build-model and forgecad. For multi-part assemblies, parts must
134
+ build at origin, expose connectors/metadata, and let the parent assembly position
135
+ them with connectors or matchTo(). Validate with forgecad run, inspect physical
136
+ components, inspect fit interference and visual objects, and run parameter
137
+ checks before calling it done.
137
138
  ```
138
139
 
139
- ### Image Or Product Replication
140
+ ### Image Or Product Reconstruction
140
141
 
141
142
  ```text
142
- Use the ForgeCAD image-replication workflow. Treat the reference images as
143
+ Use forgecad-reconstruct-from-images. Treat the reference images as
143
144
  evidence, infer dimensions explicitly, build real CAD geometry, and compare
144
145
  renders against the references. Do not stop at a decorative approximation.
145
146
  Validate with forgecad run and targeted forgecad inspect evidence before finalizing.
@@ -205,14 +206,15 @@ For the full command reference, see [ForgeCAD CLI](../CLI.md).
205
206
  | Skill | Use it for |
206
207
  |---|---|
207
208
  | `forgecad` | Core model authoring, editing, debugging, imports, assembly, render/export commands, and CLI validation. |
208
- | `forgecad-spec-by-walking-through-it` | Designing in a git-reviewed document before code: fuzzy-request intake and process choice, the HLD (requirements, alternatives, decisions), and the LLD (exact dimensions, constraints, parameters, verification). |
209
- | `forgecad-make-a-model` | Creating a new `.forge.js` model in the active ForgeCAD project and validating it. |
210
- | `forgecad-component-model` | Building or reviewing multi-file assemblies where parts build at origin and the parent assembly positions them through connectors. |
211
- | `forgecad-blockout-model` | Making rough concept geometry to explore proportions, layout, motion envelope, or spatial intuition before detailed modeling. |
212
- | `forgecad-image-replicator` | Recreating an object from reference images as real ForgeCAD geometry through camera-calibrated render/compare/iterate loops. |
213
- | `forgecad-render-inspect` | Generating and interpreting `forgecad inspect <family> <mode>` bundles for fit interference, wall thickness, connectivity, masks, depth, normals, and sections. |
214
- | `forgecad-visual-spec` | Producing builder-honest image prompts from a concrete model, HLD, LLD, or build brief. |
215
- | `forgecad-project` | Managing forgecad.io projects from the CLI: init, clone, pull, push, file commands, members, publish, and shares. |
209
+ | `forgecad-design-spec` | Designing in a git-reviewed document before code: fuzzy-request intake and process choice, the HLD (requirements, alternatives, decisions), and the LLD (exact dimensions, constraints, parameters, verification). |
210
+ | `forgecad-build-model` | Creating a new `.forge.js` model in the active ForgeCAD project, including multi-part assembly discipline and validation. |
211
+ | `forgecad-reconstruct-cad-file` | Reconstructing a readable parametric ForgeCAD model from an existing STL, OBJ, 3MF, STEP, or STP file. |
212
+ | `forgecad-reconstruct-from-images` | Recreating an object from reference images as real ForgeCAD geometry through camera-calibrated render/compare/iterate loops. |
213
+ | `forgecad-inspect-model` | Generating and interpreting `forgecad inspect <family> <mode>` bundles for fit interference, wall thickness, connectivity, masks, depth, normals, and sections. |
214
+ | `forgecad-grade-model` | Reviewing and scoring a model against a requirement, brief, prompt, reference, or acceptance criteria. |
215
+ | `forgecad-verify-mujoco` | Verifying MJCF exports in MuJoCo with dynamics, contacts, controls, joint travel, and rendered evidence. |
216
+ | `forgecad-image-prompt` | Producing builder-honest image prompts from a concrete model, HLD, LLD, or build brief. |
217
+ | `forgecad-project-sync` | Managing forgecad.io projects from the CLI: init, clone, pull, push, file commands, members, publish, and shares. |
216
218
 
217
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:
218
220
 
@@ -136,7 +136,8 @@ Inspect a model by asking for one explicit kind of evidence.
136
136
  - `inspect surface zebra|roughness` — surface continuity and roughness evidence
137
137
  - `inspect physical components|floating|gaps` — physical component graph evidence
138
138
  - `inspect fit interference` — positive-volume overlap evidence
139
- - `inspect manufacture thickness` — wall-thickness evidence
139
+ - `inspect manufacture thickness|through-thickness` — wall-thickness and minimum solid span evidence
140
+ - `inspect structural stress` — solver-produced structural stress scalar-field evidence
140
141
  - `inspect compare overlay` — candidate-vs-reference visual mismatch evidence
141
142
  - `inspect sections at|stack|sample` — exact section evidence for precise cuts, dense scans, or sparse samples
142
143
  - `inspect mechanical-integrity` — model-focused integrity audit for generated assemblies
@@ -292,6 +293,7 @@ Export to every format you need.
292
293
  | `export svg` | SVG | 2D vector output from sketches |
293
294
  | `export sketch-pdf` **\[Production\]** | PDF | Sketch with dimensions and constraints |
294
295
  | `export step` **\[Production\]** | STEP | CAD interchange (exact geometry) |
296
+ | `export fea` **\[Production\]** | FEA package | Exact STEP plus authored structural load-case metadata |
295
297
  | `export brep` **\[Production\]** | BREP | Boundary representation |
296
298
  | `export 3mf` | 3MF | 3D printing (color, multi-part) |
297
299
  | `export stl` | STL | 3D printing |
@@ -543,7 +545,7 @@ The CLI is free for personal non-commercial use. Pro covers human-operated comme
543
545
 
544
546
  | Free | Production outputs | Pro | Enterprise |
545
547
  |------|--------------------|-----|------------|
546
- | `run`, `dev`, `studio`, `render 3d`, `export stl`, `export 3mf`, `export svg`, `compare 3d`, `check print`, `inspect fit interference`, `inspect mechanical-integrity` for personal non-commercial use | `cut-list`, `export sketch-pdf`, `export step`, `export brep`, `export gcode`, `export implicit`, `export sdf`, `export mjcf`, `export urdf`, `export usd`, `export report`, `export cutting-layout` are free to run for personal non-commercial use; Pro covers human-operated commercial CAD work | `render hq`, `capture gif`, `capture mp4` plus commercial coverage for client/customer work | Backend, hosted, embedded, or application workflows that call ForgeCAD automatically |
548
+ | `run`, `dev`, `studio`, `render 3d`, `export stl`, `export 3mf`, `export svg`, `compare 3d`, `check print`, `inspect fit interference`, `inspect mechanical-integrity` for personal non-commercial use | `cut-list`, `export sketch-pdf`, `export step`, `export fea`, `export brep`, `export gcode`, `export implicit`, `export sdf`, `export mjcf`, `export urdf`, `export usd`, `export report`, `export cutting-layout` are free to run for personal non-commercial use; Pro covers human-operated commercial CAD work | `render hq`, `capture gif`, `capture mp4` plus commercial coverage for client/customer work | Backend, hosted, embedded, or application workflows that call ForgeCAD automatically |
547
549
 
548
550
  ```bash
549
551
  forgecad license # Check local license status
@@ -5,7 +5,7 @@ skill-order: 4
5
5
 
6
6
  # The Component Model
7
7
 
8
- Long-form rationale for ForgeCAD's multi-part architecture. The enforceable rule sheet anti-patterns, design gate, file-structure rules — lives in the `forgecad-component-model` skill (`agent-skill-library/forgecad-component-model/SKILL.md`). Connector and joint mechanics (frame semantics, mating, mirrored-revolute handedness) live in the assembly JSDoc, surfaced in `docs/skill/generated/assembly.md`.
8
+ Long-form rationale for ForgeCAD's multi-part architecture. The public rule sheet is embedded where agents need it: `forgecad-build-model` for authoring and `forgecad-grade-model` for review caps. Connector and joint mechanics (frame semantics, mating, mirrored-revolute handedness) live in the assembly JSDoc, surfaced in `docs/skill/generated/assembly.md`.
9
9
 
10
10
  ## The Principle
11
11
 
@@ -44,4 +44,4 @@ One file per project-specific assembly is the default because it maximizes local
44
44
 
45
45
  ## Enforcement
46
46
 
47
- The anti-pattern list and the three-question design gate live in the `forgecad-component-model` skill; every multi-part example and agent-built assembly must pass that gate.
47
+ The anti-pattern list and design gate are enforced by the public build and grading skills; every multi-part example and agent-built assembly must pass that gate.
@@ -27,12 +27,14 @@ Assembly-owned links, constraints, connectors, solved poses, and source-level si
27
27
 
28
28
  #### `Sim.body(options: SimBodyOptions): SimBodyDef` — Describe one assembly part as a physical body with mass/density, material, collider intent, and optional contact surfaces.
29
29
 
30
- **`SimBodyOptions`**: `massKg?: number`, `densityKgM3?: number`, `material?: SimMaterialDef`, `collider?: SimColliderDef`, `contacts?: Record<string, SimContactDef>`
30
+ **`SimBodyOptions`**: `massKg?: number`, `densityKgM3?: number`, `material?: SimMaterialDef`, `collider?: SimColliderDef`, `contacts?: Record<string, SimContactDef>`, `motion?: SimMotionDef`
31
31
 
32
- `SimColliderDef`: `{ kind: "collider", mode: SimColliderMode, reason?: string }`
32
+ `SimColliderDef`: `{ kind: "collider", mode: SimColliderMode, reason?: string, sdfResolution?: number }`
33
33
 
34
34
  `SimContactDef`: `{ kind: "wheelSurface" | "gripperSurface", connectorName: string }`
35
35
 
36
+ `SimMotionDef`: `{ kind: "motion", mode: SimMotionMode }`
37
+
36
38
 
37
39
  `SimBodyDef`: `{ kind: "body" }`
38
40
 
@@ -41,8 +43,15 @@ Assembly-owned links, constraints, connectors, solved poses, and source-level si
41
43
  - `Sim.collider.convexHull(): SimColliderDef` — Use a generated collision mesh for the part. This is the default fast rigid-body collider for irregular parts.
42
44
  - `Sim.collider.boundingBox(): SimColliderDef` — Use the part bounding box as the collision geometry. This is fastest and works well for chassis and simple blocks.
43
45
  - `Sim.collider.visualMesh(): SimColliderDef` — Use the visual mesh as collision geometry. This is exact but usually slower in physics engines.
46
+ - `Sim.collider.sdfMesh: (options?: { resolution?: number` — Use an SDF mesh collider for complex concave contact geometry. Exporters warn when their target cannot encode it.
44
47
  - `Sim.collider.none(reason: string): SimColliderDef` — Disable collision for a part with an explicit reason, such as a sensor-only or decorative object.
45
48
 
49
+ #### `Sim.motion` — Body motion-state intent for simulation export. Dynamic is the default when omitted.
50
+
51
+ - `Sim.motion.dynamic(): SimMotionDef` — Simulate this body as a normal dynamic rigid body with mass and inertia.
52
+ - `Sim.motion.kinematic(): SimMotionDef` — Simulate this body as kinematic: moved by the simulator/user, but not force-integrated.
53
+ - `Sim.motion.static(): SimMotionDef` — Keep this body fixed in the world as a static collision/environment body.
54
+
46
55
  #### `Sim.drive` — Joint-drive intent constructors for passive or powered assembly joints.
47
56
 
48
57
  - `Sim.drive.passive(options?: SimPassiveDriveOptions): SimDriveDef` — Mark a joint as passive while preserving damping and friction metadata for simulation export.
@@ -75,6 +84,60 @@ Assembly-owned links, constraints, connectors, solved poses, and source-level si
75
84
 
76
85
  `SimDiffDriveControllerDef`: `{ kind: "diffDrive" }`
77
86
 
87
+ #### `Fea.material(name: string, options: FeaMaterialOptions): FeaMaterialDef` — Create a named linear-elastic structural material for static stress studies.
88
+
89
+ #### `Fea.body(options: FeaBodyOptions): FeaBodyDef` — Mark one assembly part as a structural body with a `Fea.material(...)` value.
90
+
91
+ #### `Fea.region` — Stable explicit region references for solver package manifests.
92
+
93
+ - `Fea.region.face(partName: string, faceName: string): FeaPartFaceRegionRef` — Reference a named face on a named assembly part without relying on object identity.
94
+ - `Fea.region.plane(partName: string, faceName: string, options: FeaPlaneRegionOptions): FeaPartPlaneRegionRef` — Reference a planar face by a point on the face and its outward normal in part-local coordinates.
95
+
96
+ `FeaPartFaceRegionRef`: `{ kind: "fea-region-face", partName: string, faceName: string }`
97
+
98
+ `FeaPlaneRegionOptions`: `{ center: Vec3, normal: Vec3 }`
99
+
100
+ `FeaPartPlaneRegionRef`: `{ kind: "fea-region-plane", partName: string, faceName: string, center: Vec3, normal: Vec3 }`
101
+
102
+ #### `Fea.fix` — Fixture constructors over authored face/region references.
103
+
104
+ - `Fea.fix.fixed(region: FeaRegionRef): FeaFixedFixtureDef` — Fully fix all translational degrees of freedom on a face/region.
105
+
106
+ `FeaFixedFixtureDef`: `{ kind: "fixed", region: FeaRegionRef }`
107
+
108
+ #### `Fea.load` — Load constructors over authored face/region references.
109
+
110
+ - `Fea.load.force(region: FeaRegionRef, options: FeaForceLoadOptions): FeaForceLoadDef` — Apply a force with magnitude in newtons along the given direction vector.
111
+
112
+ `FeaForceLoadOptions`: `{ newtons: number, direction: Vec3 }`
113
+
114
+
115
+ `FeaForceLoadDef`: `{ kind: "force", region: FeaRegionRef }`
116
+
117
+ #### `Fea.target` — Study target constructors used by feedback and pass/fail gates.
118
+
119
+ - `Fea.target.minSafetyFactor(value: number): FeaMinSafetyFactorTargetDef` — Require the solved minimum safety factor to be at least `value`.
120
+
121
+ `FeaMinSafetyFactorTargetDef`: `{ kind: "minSafetyFactor", value: number }`
122
+
123
+ #### `Fea.mesh` — Volume mesh intent. V1 structural stress uses second-order tetrahedra only.
124
+
125
+ - `Fea.mesh.quadraticTets(options: FeaQuadraticTetMeshOptions): FeaQuadraticTetMeshDef` — Request quadratic tetrahedral C3D10 elements with a maximum size in mm.
126
+
127
+ `FeaQuadraticTetMeshOptions`: `{ maxSizeMm: number, minQuality?: number }`
128
+
129
+
130
+ `FeaQuadraticTetMeshDef`: `{ kind: "quadraticTets", order: 2, element: "C3D10" }`
131
+
132
+ #### `Fea.study` — Study constructors.
133
+
134
+ - `Fea.study.staticStress(name: string, options: FeaStaticStressStudyOptions): FeaStaticStressStudyDef` — Create a linear static structural stress study.
135
+
136
+ `FeaStaticStressStudyOptions`: `{ fixtures: FeaFixtureDef[], loads: FeaLoadDef[], target?: FeaTargetDef, mesh: FeaMeshDef }`
137
+
138
+
139
+ `FeaStaticStressStudyDef`: `{ kind: "staticStress", name: string }`
140
+
78
141
  #### `assembly(name?: string): Assembly` — Create an assembly container with named parts, connectors, and kinematic links.
79
142
 
80
143
  **Use this from iteration 1 for any model with moving parts.** Do not build one static pose and retrofit motion later.
@@ -208,7 +271,7 @@ const housing = group(
208
271
  assembly.addPart("Base Assembly", housing);
209
272
  ```
210
273
 
211
- **`PartOptions`**: `transform?: TransformInput`, `metadata?: PartMetadata`, `sim?: SimBodyDef`, `mate?: AssemblyPartMateInput | AssemblyPartMateInput[]`, `bindToFrame?: string`
274
+ **`PartOptions`**: `transform?: TransformInput`, `metadata?: PartMetadata`, `sim?: SimBodyDef`, `fea?: FeaBodyDef`, `mate?: AssemblyPartMateInput | AssemblyPartMateInput[]`, `bindToFrame?: string`
212
275
 
213
276
  **`PartMetadata`**
214
277
 
@@ -218,6 +281,12 @@ assembly.addPart("Base Assembly", housing);
218
281
 
219
282
  Also: `material?: string`, `process?: string`, `tolerance?: string`, `qty?: number`, `notes?: string`, `densityKgM3?: number`, `massKg?: number`.
220
283
 
284
+ `FeaBodyDef`: `{ kind: "fea-body", material: FeaMaterialDef }`
285
+
286
+ `FeaMaterialOptions`: `{ densityKgM3: number, youngsModulusMPa: number, poissonRatio: number, yieldStrengthMPa: number }`
287
+
288
+ `FeaMaterialDef`: `{ kind: "fea-material", name: string }`
289
+
221
290
  **`AssemblyPartMateInput`**
222
291
  - `connector: string` — Name of a connector declared on the part (via `withConnectors()`).
223
292
  - `toLink: string` — Name of the link this connector's origin is pinned to.
@@ -377,6 +446,10 @@ Use this after adding physical parts and joints. Robot-body profiles require `ro
377
446
 
378
447
  `SimAssemblySimulationOptions`: `{ profile: SimProfileDef, rootPart?: string, controllers?: SimControllerDef[] }`
379
448
 
449
+ #### `withFeaStudy(study: FeaStudyDef): Assembly` — Attach a structural FEA study to this assembly.
450
+
451
+ The study is authored with `Fea.study.staticStress(...)` and consumed by `forgecad export fea`. This records load-case intent only; ForgeCAD refuses to invent fixtures, loads, mesh order, or region tags during export.
452
+
380
453
  #### `edgeBetweenFrames(a: string, b: string, options?: AssemblyFrameEdgeOptions): Assembly` — Add a visual skeleton edge between two rig frame origins.
381
454
 
382
455
  Frame edges follow the solved frame poses produced by `fixedJoint()`, `revoluteJoint()`, and `prismaticJoint()`. They do not add constraints, degrees of freedom, parts, or geometry; use them to make a frame-only rig readable in the Motion/rig inspection overlay.
@@ -7,17 +7,17 @@ Every public API function belongs to one of 16 fundamental concepts. This is an
7
7
  - **[C1: Primitive Construction](#c1-primitive-construction)** — Create geometry from parameters — no input geometry required. *(66 functions)*
8
8
  - **[C2: Boolean Combination](#c2-boolean-combination)** — Combine same-dimension geometry using CSG set operations. *(6 functions)*
9
9
  - **[C3: Rigid Transform](#c3-rigid-transform)** — Reposition or reorient geometry without changing its shape. *(0 functions)*
10
- - **[C4: Dimensional Promotion](#c4-dimensional-promotion)** — Convert a 2D profile into a 3D solid (extrude, revolve, loft, sweep). *(50 functions)*
10
+ - **[C4: Dimensional Promotion](#c4-dimensional-promotion)** — Convert a 2D profile into a 3D solid (extrude, revolve, loft, sweep). *(64 functions)*
11
11
  - **[C5: Topology Query](#c5-topology-query)** — Select or inspect named faces and edges on a shape. *(3 functions)*
12
12
  - **[C6: Edge Feature](#c6-edge-feature)** — Modify edges of a solid — fillets, chamfers, draft, offset. *(4 functions)*
13
13
  - **[C7: Pattern Replication](#c7-pattern-replication)** — Duplicate geometry in regular arrangements (linear, circular, mirror). *(6 functions)*
14
14
  - **[C8: Constraint Solving](#c8-constraint-solving)** — Define geometry by relationships and let a solver find positions. *(1 functions)*
15
15
  - **[C9: Spatial Placement](#c9-spatial-placement)** — Position geometry relative to other geometry using semantic anchors. *(6 functions)*
16
- - **[C10: Assembly & Kinematics](#c10-assembly-kinematics)** — Compose parts with joints for kinematic simulation. *(15 functions)*
16
+ - **[C10: Assembly & Kinematics](#c10-assembly-kinematics)** — Compose parts with joints for kinematic simulation. *(28 functions)*
17
17
  - **[C11: Parameterization & UI](#c11-parameterization-ui)** — Declare user-facing controls that drive model geometry. *(6 functions)*
18
18
  - **[C12: Dimensional Demotion](#c12-dimensional-demotion)** — Extract 2D geometry from a 3D solid (section, projection). *(3 functions)*
19
19
  - **[C13: Export & Output](#c13-export-output)** — Convert geometry to external formats (STL, 3MF, SVG, DXF, G-code, PDF). *(14 functions)*
20
- - **[C14: Visual & Debugging](#c14-visual-debugging)** — Control viewport appearance and debugging aids. *(35 functions)*
20
+ - **[C14: Visual & Debugging](#c14-visual-debugging)** — Control viewport appearance and debugging aids. *(39 functions)*
21
21
  - **[C15: Import & Composition](#c15-import-composition)** — Bring external geometry or other ForgeCAD modules into the current script. *(1 functions)*
22
22
  - **[C16: Part Library](#c16-part-library)** — Pre-built parametric parts accessible via `lib.*`. *(4 functions)*
23
23
 
@@ -123,12 +123,21 @@ Convert a 2D profile into a 3D solid (extrude, revolve, loft, sweep).
123
123
 
124
124
  - `Curve.Blend(start, end)` — Create an exact G1 blend curve between two directed endpoints. → [curves](/docs/curves#curve)
125
125
  - `Curve.BlendG2(start, end)` — Create an exact G2 blend curve between two directed endpoints. → [curves](/docs/curves#curve)
126
+ - `Curve.Bridge(options)` — Bridge two existing curve endpoints with inferred tangent or curvature continuity. → [curves](/docs/curves#curve)
126
127
  - `Curve.Arc(options)` — Create an exact circular 3D arc from start, end, and start tangent. → [curves](/docs/curves#curve)
127
128
  - `Curve.Line(start, end)` — Create an exact straight 3D NURBS line segment. → [curves](/docs/curves#curve)
128
129
  - `Curve.Nurbs(points, options?)` — Create an exact NURBS 3D curve from control points, weights, knots, and degree. → [curves](/docs/curves#curve)
129
130
  - `Curve.Fit(points, options?)` — Fit a non-rational NURBS curve that interpolates every input point. → [curves](/docs/curves#curve)
131
+ - `Curve.ProjectOnSurface(curve, sheet, options?)` — Project a curve onto a `Sheet` along the surface normal and return the exact NURBS foot curve. → [curves](/docs/curves#curve)
132
+ - `Curve.Intersect(sheetA, sheetB, options?)` — Intersect two `Sheet` surfaces and return the exact NURBS intersection branches. → [curves](/docs/curves#curve)
130
133
  - `Curve.Trim(curve, start, end)` — Extract an exact curve segment from normalized parameter `start` to `end`. → [curves](/docs/curves#curve)
131
134
  - `Curve.Reverse(curve)` — Reverse an exact curve without changing its geometry. → [curves](/docs/curves#curve)
135
+ - `Curve.closestParameter(curve, point, options?)` — Find the normalized parameter on an exact curve closest to a world point. → [curves](/docs/curves#curve)
136
+ - `Curve.join(curves, options?)` — Join touching curve segments into one sampled sweep path. → [curves](/docs/curves#curve)
137
+ - `Curve.placeOnXY(path, z?, options?)` — Place a 2D path onto the XY plane at world Z. → [curves](/docs/curves#curve)
138
+ - `Curve.placeOnXZ(path, y?, options?)` — Place a 2D path onto the XZ plane at world Y. → [curves](/docs/curves#curve)
139
+ - `Curve.placeOnYZ(path, x?, options?)` — Place a 2D path onto the YZ plane at world X. → [curves](/docs/curves#curve)
140
+ - `Curve.placeOnPlane(path, options)` — Place a 2D path onto an arbitrary world plane. → [curves](/docs/curves#curve)
132
141
  - `Curve.Route` — Build analytic 3D line/arc routes for sweeps. → [curves](/docs/curves#curve)
133
142
  - `Curve.Helix(options)` — Build helical paths and swept coils. → [curves](/docs/curves#curve)
134
143
  - `Loft.station(profile, position)` — Create a loft station from a 2D profile and an axis position. → [curves](/docs/curves#curves-surfacing)
@@ -148,19 +157,23 @@ Convert a 2D profile into a 3D solid (extrude, revolve, loft, sweep).
148
157
  - `Analysis.CurvatureComb(input, options?)` → [curves](/docs/curves#analysis)
149
158
  - `Analysis.SurfaceHealth(shape, options?)` → [curves](/docs/curves#analysis)
150
159
  - `Analysis.BRepValidity(shape, options?)` — Validate B-rep/shell/solid structure and return closedness, manifoldness, orientation, and issue diagnostics. → [curves](/docs/curves#analysis)
151
- - `Blend.Edge(options)` → [curves](/docs/curves#blend)
160
+ - `Blend.Edge(options)` — Fillet one or more edges with constant or variable radius. → [curves](/docs/curves#blend)
152
161
  - `Blend.Surface(options)` → [curves](/docs/curves#blend)
153
162
  - `Blend.Bridge(edgeA, edgeB)` — Build a transition strip between two `Surface.Net` sheet edges. → [curves](/docs/curves#blend)
163
+ - `Blend.Face(options)` — Fillet every edge SHARED by a pair of faces — a "face fillet". → [curves](/docs/curves#blend)
164
+ - `Blend.FullRound(options)` — Full round — roll a blend over a narrow center face so it is consumed and its two neighbouring faces meet tangentially (classic 3-face full round). → [curves](/docs/curves#blend)
154
165
  - `Surface.Plane(options)` — Create a finite analytic plane sheet that can be trimmed, sewn, thickened, or used as a low-level face. → [curves](/docs/curves#surface)
155
166
  - `Surface.Cylinder(options)` — Create a finite analytic cylindrical sheet, optionally bounded by start/end angles. → [curves](/docs/curves#surface)
156
167
  - `Surface.Cone(options)` — Create a finite analytic conical or frustum sheet, optionally bounded by start/end angles. → [curves](/docs/curves#surface)
157
168
  - `Surface.Sphere(options)` — Create a finite analytic spherical sheet bounded by longitude and latitude ranges. → [curves](/docs/curves#surface)
158
169
  - `Surface.Torus(options)` — Create a finite analytic torus sheet bounded by major and tube angle ranges. → [curves](/docs/curves#surface)
170
+ - `Surface.Sweep(profile, spine, options?)` — Sweep an open 2D profile path along a 3D spine to create an open surface sheet. → [curves](/docs/curves#surface)
171
+ - `Surface.Loft(input)` — Loft an open surface sheet through ordered profile stations. → [curves](/docs/curves#surface)
159
172
  - `Surface.Nurbs(controlGrid, options?)` — Create an exact NURBS surface from a grid of control points. → [curves](/docs/curves#surface)
160
173
  - `Surface.Ruled(curveA, curveB, options?)` → [curves](/docs/curves#surface)
161
174
  - `Surface.Patch(curves, options?)` — Create a smooth open surface sheet from 4 boundary curves (Coons patch). → [curves](/docs/curves#surface)
162
175
  - `Surface.Boundary(input)` → [curves](/docs/curves#surface)
163
- - `Surface.Fill(input)` → [curves](/docs/curves#surface)
176
+ - `Surface.Fill(input)` — Create an n-sided open surface sheet from 3 or more boundary curves (energy-minimizing constrained fill). → [curves](/docs/curves#surface)
164
177
  - `Surface.Sew(shapes, options?)` → [curves](/docs/curves#surface)
165
178
  - `Surface.Solid(input, options?)` — Sew surface faces or consume an existing sewn shell and make a solid B-rep. → [curves](/docs/curves#surface)
166
179
  - `Surface.Extend(shape, options)` → [curves](/docs/curves#surface)
@@ -168,6 +181,7 @@ Convert a 2D profile into a 3D solid (extrude, revolve, loft, sweep).
168
181
  - `Surface.Split(shape, tool)` → [curves](/docs/curves#surface)
169
182
  - `Surface.Match(shape, options)` → [curves](/docs/curves#surface)
170
183
  - `Surface.Net()` — Begin a curve-network (Gordon) surface — the class-A keystone. → [curves](/docs/curves#surface)
184
+ - `Surface.BoundaryNet()` — Begin a **Boundary Surface** — the canonical class-A surfacing primitive (SolidWorks "Boundary Boss/Base", Onshape "Boundary surface", Rhino NetworkSrf). → [curves](/docs/curves#surface)
171
185
  - `loft(profiles, heights, options?)` — Loft between multiple sketches along Z stations. → [curves](/docs/curves#loft)
172
186
  - `sweep(profile, path, options?)` → [curves](/docs/curves#sweep)
173
187
  - `variableSweep(spine, sections, options?)` — Sweep a variable cross-section along a 3D spine curve. → [curves](/docs/curves#variablesweep)
@@ -233,12 +247,25 @@ Position geometry relative to other geometry using semantic anchors.
233
247
 
234
248
  Compose parts with joints for kinematic simulation.
235
249
 
250
+ - `Fea.material(name, options)` — Create a named linear-elastic structural material for static stress studies. → [assembly](/docs/assembly#assembly-joints)
251
+ - `Fea.body(options)` — Mark one assembly part as a structural body with a `Fea.material(...)` value. → [assembly](/docs/assembly#assembly-joints)
252
+ - `Fea.region.face(partName, faceName)` — Reference a named face on a named assembly part without relying on object identity. → [assembly](/docs/assembly#assembly-joints)
253
+ - `Fea.region.plane(partName, faceName, options)` — Reference a planar face by a point on the face and its outward normal in part-local coordinates. → [assembly](/docs/assembly#assembly-joints)
254
+ - `Fea.fix.fixed(region)` — Fully fix all translational degrees of freedom on a face/region. → [assembly](/docs/assembly#assembly-joints)
255
+ - `Fea.load.force(region, options)` — Apply a force with magnitude in newtons along the given direction vector. → [assembly](/docs/assembly#assembly-joints)
256
+ - `Fea.target.minSafetyFactor(value)` — Require the solved minimum safety factor to be at least `value`. → [assembly](/docs/assembly#assembly-joints)
257
+ - `Fea.mesh.quadraticTets(options)` — Request quadratic tetrahedral C3D10 elements with a maximum size in mm. → [assembly](/docs/assembly#assembly-joints)
258
+ - `Fea.study.staticStress(name, options)` — Create a linear static structural stress study. → [assembly](/docs/assembly#assembly-joints)
236
259
  - `Sim.material(name, options?)` — Create a named physical material with density and contact coefficients for simulation export and checks. → [assembly](/docs/assembly#assembly-joints)
237
260
  - `Sim.body(options)` — Describe one assembly part as a physical body with mass/density, material, collider intent, and optional contact surfaces. → [assembly](/docs/assembly#assembly-joints)
238
261
  - `Sim.collider.convexHull()` — Use a generated collision mesh for the part. → [assembly](/docs/assembly#assembly-joints)
239
262
  - `Sim.collider.boundingBox()` — Use the part bounding box as the collision geometry. → [assembly](/docs/assembly#assembly-joints)
240
263
  - `Sim.collider.visualMesh()` — Use the visual mesh as collision geometry. → [assembly](/docs/assembly#assembly-joints)
264
+ - `Sim.collider.sdfMesh` — Use an SDF mesh collider for complex concave contact geometry. → [assembly](/docs/assembly#assembly-joints)
241
265
  - `Sim.collider.none(reason)` — Disable collision for a part with an explicit reason, such as a sensor-only or decorative object. → [assembly](/docs/assembly#assembly-joints)
266
+ - `Sim.motion.dynamic()` — Simulate this body as a normal dynamic rigid body with mass and inertia. → [assembly](/docs/assembly#assembly-joints)
267
+ - `Sim.motion.kinematic()` — Simulate this body as kinematic: moved by the simulator/user, but not force-integrated. → [assembly](/docs/assembly#assembly-joints)
268
+ - `Sim.motion.static()` — Keep this body fixed in the world as a static collision/environment body. → [assembly](/docs/assembly#assembly-joints)
242
269
  - `Sim.drive.passive(options?)` — Mark a joint as passive while preserving damping and friction metadata for simulation export. → [assembly](/docs/assembly#assembly-joints)
243
270
  - `Sim.drive.velocity(options)` — Mark a revolute joint as velocity-driven with torque and speed limits. → [assembly](/docs/assembly#assembly-joints)
244
271
  - `Sim.contact.wheelSurface(connectorName)` — Mark a connector as the wheel tread contact surface for offline checks and downstream simulation metadata. → [assembly](/docs/assembly#assembly-joints)
@@ -301,6 +328,10 @@ Control viewport appearance and debugging aids.
301
328
 
302
329
  - `Viewport.label(text, at, options?)` — Add a render-only viewport label at a world-space point. → [viewport](/docs/viewport#viewport-runtime)
303
330
  - `Viewport.highlight(target, options?)` — Highlight any geometry for visual debugging in the viewport. → [viewport](/docs/viewport#viewport-runtime)
331
+ - `Wrap.flat(opts)` — Project the image flat onto an axis-aligned face — `onto` is one of top/bottom/front/back/left/right. → [core](/docs/core#wrap)
332
+ - `Wrap.aroundCylinder(opts)` — Wrap the image around a cylinder like a can label — `axis` is 'x' | 'y' | 'z'. → [core](/docs/core#wrap)
333
+ - `Wrap.onSphere(opts?)` — Map the image over a sphere like a globe (longitude/latitude). → [core](/docs/core#wrap)
334
+ - `Wrap.box(opts?)` — Cube-map the image onto a box — one copy per face. → [core](/docs/core#wrap)
304
335
  - `verify.that(label, check, message?)` — Custom predicate check. → [core](/docs/core#verify)
305
336
  - `verify.equal(label, actual, expected, tolerance?, message?)` — Check that two numbers are approximately equal (within tolerance). → [core](/docs/core#verify)
306
337
  - `verify.notEqual(label, actual, unexpected, tolerance?, message?)` — Check that two numbers are NOT equal (differ by more than tolerance). → [core](/docs/core#verify)