forgecad 0.10.4 → 0.11.0

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 (121) hide show
  1. package/dist/assets/{AdminPage-B3L3W1Uo.js → AdminPage-B1nIvqLS.js} +1 -1
  2. package/dist/assets/{BenchmarkPage-DXKVXMrJ.js → BenchmarkPage-YZJbw5nd.js} +2 -2
  3. package/dist/assets/{BlogPage-B7BWxOCg.js → BlogPage-DIWRApKS.js} +1 -1
  4. package/dist/assets/{DocsPage-BPGGwht1.js → DocsPage-ClL6X1hR.js} +8 -22
  5. package/dist/assets/EditorApp-CYBDvSyT.js +17067 -0
  6. package/dist/assets/{EmbedViewer-DygByZS2.js → EmbedViewer-Dmfu_LIw.js} +2 -2
  7. package/dist/assets/{LandingPageProofDriven-BoVE7JGY.js → LandingPageProofDriven-XYTiYxfM.js} +2 -2
  8. package/dist/assets/{LegalPage-Din8wv8d.js → LegalPage-D5Z3CscF.js} +2 -2
  9. package/dist/assets/{PricingPage-C2PMzmDc.js → PricingPage-BP4lIGio.js} +2 -2
  10. package/dist/assets/{SettingsPage-BlJDCRe8.js → SettingsPage-D3bcPBsC.js} +1 -1
  11. package/dist/assets/{app-BsRYSfxY.js → app-BKjogwIZ.js} +3288 -512
  12. package/dist/assets/{backendInit-6C0DLgH0.js → backendInit-6a9-ilom.js} +80498 -74979
  13. package/dist/assets/cli/{render-XXol_ET7.js → render-CMNudGb0.js} +1264 -113
  14. package/dist/assets/{constructionHistoryWorker-cTHWRJEi.js → constructionHistoryWorker-BuZgc606.js} +8369 -6839
  15. package/dist/assets/{evalWorker-BssDYW9u.js → evalWorker-DQ82ueGu.js} +45438 -39996
  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-ymhBV4Ll.js → inspectWorker-Cuby2qfT.js} +4899 -1303
  19. package/dist/assets/{jointPose-B0blBj9A.js → jointPose-CFql5I-u.js} +1 -1
  20. package/dist/assets/{landing-proof-driven-Cpf-MIbI.css → landing-proof-driven-_u4v_xQb.css} +2 -2
  21. package/dist/assets/{manifold-CYlIm-M6.js → manifold-02pmr7O7.js} +2 -2
  22. package/dist/assets/{manifold-B_7QXpGB.js → manifold-C6KU0oII.js} +1 -1
  23. package/dist/assets/{manifold-CNShmpEJ.js → manifold-P1yF3GKn.js} +1 -1
  24. package/dist/assets/{reportWorker-Cb5eyM7D.js → reportWorker-kg065BVL.js} +76583 -65731
  25. package/dist/cli/render.html +1 -1
  26. package/dist/docs/index.html +2 -2
  27. package/dist/docs-raw/AI/usage.md +6 -8
  28. package/dist/docs-raw/CLI.md +14 -12
  29. package/dist/docs-raw/component-model.md +28 -9
  30. package/dist/docs-raw/generated/assembly.md +76 -3
  31. package/dist/docs-raw/generated/concepts.md +43 -7
  32. package/dist/docs-raw/generated/core.md +399 -73
  33. package/dist/docs-raw/generated/curves.md +357 -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 +235 -0
  38. package/dist/docs-raw/skills/forgecad-build-model.md +70 -147
  39. package/dist/docs-raw/skills/forgecad-image-prompt.md +1 -1
  40. package/dist/docs-raw/skills/forgecad-project-sync.md +3 -3
  41. package/dist/docs-raw/skills/forgecad-reconstruct-cad-file.md +2 -2
  42. package/dist/docs-raw/skills/forgecad-reconstruct-from-images.md +4 -5
  43. package/dist/docs-raw/skills/forgecad.md +4 -1
  44. package/dist/docs-raw/skills/index.md +1 -5
  45. package/dist/docs-raw/welcome.md +3 -4
  46. package/dist/index.html +1 -1
  47. package/dist/llms.txt +1 -2
  48. package/dist/sitemap.xml +15 -15
  49. package/dist-cli/{check-compiler-4RPB6SB5.js → check-compiler-UJWUEIDC.js} +1 -1
  50. package/dist-cli/{check-query-propagation-KN3DFQTX.js → check-query-propagation-O2EPDJSY.js} +1 -1
  51. package/dist-cli/{chunk-UHBRMYA6.js → chunk-MNDROM7T.js} +78926 -73392
  52. package/dist-cli/forgecad.js +6306 -1061
  53. package/dist-cli/forgecad_geometry_bg.wasm +0 -0
  54. package/dist-skill/CONTEXT.md +1257 -110
  55. package/dist-skill/SKILL.md +4 -1
  56. package/dist-skill/docs/API/core/concepts.md +31 -4
  57. package/dist-skill/docs/CLI.md +14 -12
  58. package/dist-skill/docs/generated/assembly.md +73 -3
  59. package/dist-skill/docs/generated/core.md +395 -74
  60. package/dist-skill/docs/generated/curves.md +356 -6
  61. package/dist-skill/docs/generated/runtime-names.md +12 -12
  62. package/dist-skill/docs/generated/sketch.md +16 -3
  63. package/dist-skill/docs/guides/inspection-bundles.md +5 -3
  64. package/dist-skill/docs/guides/manual-parameters.md +130 -0
  65. package/dist-skill/docs/guides/structural-fea.md +235 -0
  66. package/dist-skill/library/README.md +0 -4
  67. package/dist-skill/library/forgecad-build-model/SKILL.md +57 -150
  68. package/dist-skill/library/forgecad-build-model/references/inspection-feedback.md +58 -0
  69. package/dist-skill/library/forgecad-build-model/references/module-contracts.md +53 -0
  70. package/dist-skill/library/forgecad-build-model/references/parameter-controls.md +22 -0
  71. package/dist-skill/library/forgecad-build-model/references/readiness-review.md +43 -0
  72. package/dist-skill/library/forgecad-build-model/references/simulation-feedback.md +49 -0
  73. package/dist-skill/library/forgecad-build-model/references/stage-1-design-intent.md +21 -0
  74. package/dist-skill/library/forgecad-build-model/references/stage-2-architecture-plan.md +23 -0
  75. package/dist-skill/library/forgecad-build-model/references/stage-3-build-slices.md +39 -0
  76. package/dist-skill/library/forgecad-build-model/references/stage-4-feedback-iteration.md +24 -0
  77. package/dist-skill/library/forgecad-build-model/references/stage-5-readiness-package.md +34 -0
  78. package/dist-skill/library/forgecad-image-prompt/SKILL.md +1 -1
  79. package/dist-skill/library/forgecad-project-sync/SKILL.md +3 -3
  80. package/dist-skill/library/forgecad-reconstruct-cad-file/SKILL.md +2 -2
  81. package/dist-skill/library/forgecad-reconstruct-from-images/SKILL.md +4 -5
  82. package/dist-skill/website/skills/forgecad-build-model.md +70 -147
  83. package/dist-skill/website/skills/forgecad-image-prompt.md +1 -1
  84. package/dist-skill/website/skills/forgecad-project-sync.md +3 -3
  85. package/dist-skill/website/skills/forgecad-reconstruct-cad-file.md +2 -2
  86. package/dist-skill/website/skills/forgecad-reconstruct-from-images.md +4 -5
  87. package/dist-skill/website/skills/forgecad.md +4 -1
  88. package/dist-skill/website/skills/index.md +1 -5
  89. package/examples/analysis/structural-stress-fea.forge.js +19 -0
  90. package/examples/api/blend-full-round.forge.js +37 -0
  91. package/examples/api/blend-variable-radius.forge.js +51 -0
  92. package/examples/api/curve-project-and-intersect.forge.js +59 -0
  93. package/examples/api/extrude-up-to-face.forge.js +47 -0
  94. package/examples/api/param-path2d.forge.js +65 -0
  95. package/examples/api/param-placement2d.forge.js +80 -0
  96. package/examples/api/param-spline2d-g-continuity.forge.js +57 -0
  97. package/examples/api/spoon-full-tang-handle.forge.js +188 -0
  98. package/examples/api/surface-boundarynet-dished-bowl.forge.js +63 -0
  99. package/examples/api/surface-fill-interior-constraints.forge.js +59 -0
  100. package/examples/api/surface-variable-thickness-panel.forge.js +62 -0
  101. package/examples/mechanical/airplane-propeller.forge.js +81 -28
  102. package/package.json +5 -2
  103. package/dist/assets/EditorApp-BWUGCdD5.js +0 -16610
  104. package/dist/docs-raw/skills/forgecad-design-spec.md +0 -145
  105. package/dist/docs-raw/skills/forgecad-grade-model.md +0 -84
  106. package/dist/docs-raw/skills/forgecad-inspect-model.md +0 -80
  107. package/dist/docs-raw/skills/forgecad-verify-mujoco.md +0 -78
  108. package/dist-skill/library/forgecad-design-spec/SKILL.md +0 -132
  109. package/dist-skill/library/forgecad-design-spec/references/default-profiles.md +0 -99
  110. package/dist-skill/library/forgecad-design-spec/references/master-prompt.md +0 -73
  111. package/dist-skill/library/forgecad-grade-model/SKILL.md +0 -72
  112. package/dist-skill/library/forgecad-grade-model/agents/openai.yaml +0 -4
  113. package/dist-skill/library/forgecad-inspect-model/SKILL.md +0 -68
  114. package/dist-skill/library/forgecad-verify-mujoco/SKILL.md +0 -66
  115. package/dist-skill/website/skills/forgecad-design-spec.md +0 -145
  116. package/dist-skill/website/skills/forgecad-grade-model.md +0 -84
  117. package/dist-skill/website/skills/forgecad-inspect-model.md +0 -80
  118. package/dist-skill/website/skills/forgecad-verify-mujoco.md +0 -78
  119. /package/dist/assets/{landing-proof-driven-BxZZh5r5.js → landing-proof-driven-DNPRKL_p.js} +0 -0
  120. /package/dist-skill/library/{forgecad-verify-mujoco → forgecad-build-model}/scripts/mujoco_verify.py +0 -0
  121. /package/dist-skill/library/{forgecad-inspect-model → forgecad-build-model/scripts}/summarize_manifest.py +0 -0
@@ -0,0 +1,130 @@
1
+ ---
2
+ skill-group: core
3
+ skill-order: 6
4
+ ---
5
+
6
+ # Manual Parameter Sheets
7
+
8
+ Manual parameters are constrained design data: the script owns the structure and
9
+ the user edits only the declared values. They are for cases where a numeric
10
+ slider is the wrong shape of input.
11
+
12
+ ## Contents
13
+
14
+ - Decision Ladder
15
+ - Path2D
16
+ - Spline2D
17
+ - Placement2D
18
+ - Spatial Anchors
19
+ - Saving
20
+
21
+ ## Decision Ladder
22
+
23
+ Use the smallest parameter type that matches the design intent:
24
+
25
+ | Intent | Use |
26
+ | --- | --- |
27
+ | One scalar dimension, count, angle, or toggle | `Param.number()`, `Param.bool()`, `Param.choice()` |
28
+ | A repeated table of named scalar fields | `Param.list()` |
29
+ | A hand-shaped polygon, section outline, or open centerline | `Param.path2d()` |
30
+ | A smooth hand-shaped curve with tangent/curvature intent | `Param.spline2d()` |
31
+ | Named semantic blocks arranged in zones | `Param.placement2d()` |
32
+
33
+ Do not use `path2d` or `spline2d` as a generic table. Use them when dragging
34
+ points is meaningfully better than editing numbers.
35
+
36
+ ## Path2D
37
+
38
+ `Param.path2d(name, points, opts)` returns a `Path2DParamValue`.
39
+
40
+ - Closed paths are filled profile intent: call `.toSketch()`.
41
+ - Open paths are centerline intent: call `.toStroke(width)`.
42
+ - `x` and `y` ranges define the initial editor frame, not hard movement limits.
43
+ - Override keys are `Name[0].x`, `Name[0].y`, and `Name.__count__`.
44
+
45
+ ```javascript
46
+ const outline = Param.path2d('Outline', [[-30, -15], [30, -15], [24, 18], [-28, 16]], {
47
+ closed: true,
48
+ minPoints: 3,
49
+ maxPoints: 12,
50
+ unit: 'mm',
51
+ anchor: Param.anchor.sheetOnXY([0, 0, 8], { label: 'Top outline' }),
52
+ });
53
+
54
+ return outline.toSketch().extrude(4);
55
+ ```
56
+
57
+ ## Spline2D
58
+
59
+ `Param.spline2d(name, points, opts)` returns a `Spline2DParamValue`.
60
+
61
+ - Each point has `g`: `G0` for a hard break, `G1` for tangent smooth, `G2` for
62
+ curvature smooth.
63
+ - Use `.toCurveOnXY()`, `.toCurveOnXZ()`, or `.toCurveOnYZ()` for sweeps and
64
+ curve consumers.
65
+ - Use `.toPathOnXY()`, `.toPathOnXZ()`, or `.toPathOnYZ()` when an API expects
66
+ sampled points.
67
+ - Override keys are `Name[0].x`, `Name[0].y`, `Name[0].g`, and `Name.__count__`.
68
+
69
+ ```javascript
70
+ const sideProfile = Param.spline2d('Side Profile', [
71
+ { x: 0, y: 0, g: 'G2' },
72
+ { x: 35, y: 8, g: 'G2' },
73
+ { x: 70, y: 3, g: 'G1' },
74
+ ], {
75
+ unit: 'mm',
76
+ anchor: Param.anchor.sheetOnXZ([0, -20, 0], { label: 'Side profile' }),
77
+ });
78
+
79
+ const rail = sideProfile.toCurveOnXZ();
80
+ ```
81
+
82
+ ## Placement2D
83
+
84
+ `Param.placement2d(name, spec)` returns a `Placement2DParamValue`.
85
+
86
+ - The script declares stable item IDs, footprints, optional zones, and rules.
87
+ - The user moves named items; the model decides what each item creates.
88
+ - Use `.item(id)` for one placement or `.positions()` for keyed lookup.
89
+ - Override keys are item based: `Layout.battery.x`, `Layout.battery.y`,
90
+ `Layout.battery.angle`, and `Layout.battery.zone`.
91
+
92
+ ```javascript
93
+ const layout = Param.placement2d('Internal Layout', {
94
+ frame: { size: [120, 80] },
95
+ zones: [{ id: 'electronics', size: [70, 70], center: [-20, 0] }],
96
+ items: [
97
+ { id: 'battery', footprint: { type: 'rect', size: [42, 24] }, zone: 'electronics', at: [-25, 0] },
98
+ { id: 'speaker', footprint: { type: 'circle', radius: 12 }, at: [32, 8] },
99
+ ],
100
+ rules: { bounds: 'prevent', collisions: 'warn', snap: 1 },
101
+ anchor: Param.anchor.sheetOnXY([0, 0, 12], { label: 'Internal layout' }),
102
+ });
103
+
104
+ const battery = layout.item('battery');
105
+ const batteryBlock = box(42, 24, 6).translate(battery.x, battery.y, 3);
106
+ ```
107
+
108
+ ## Spatial Anchors
109
+
110
+ Every parameter type can carry optional viewport metadata through `anchor`.
111
+ Anchors do not change geometry.
112
+
113
+ - `Param.anchor.point([x, y, z])` creates a clickable pin for scalar, string,
114
+ list, boolean, or choice parameters.
115
+ - `Param.anchor.sheetOnXY([x, y, z])` places a 2D sheet in the XY plane at
116
+ fixed Z.
117
+ - `Param.anchor.sheetOnXZ([x, y, z])` places a 2D sheet in the XZ plane at
118
+ fixed Y.
119
+ - `Param.anchor.sheetOnYZ([x, y, z])` places a 2D sheet in the YZ plane at
120
+ fixed X.
121
+
122
+ The parameter still appears in the parameter panel when `anchor` is omitted; it
123
+ just has no 3D pin or spatial sheet.
124
+
125
+ ## Saving
126
+
127
+ Dragging a manual sheet writes parameter overrides first. The source model keeps
128
+ the declared defaults until those overrides are intentionally folded back into
129
+ code. Use snapshots for named parameter states, and use the parameter panel's
130
+ AI handoff for manual canvas edits when the desired result should become source.
@@ -0,0 +1,235 @@
1
+ ---
2
+ skill-group: cli
3
+ skill-order: 3
4
+ ---
5
+
6
+ # Structural FEA Stress Inspection
7
+
8
+ Use structural FEA when you want a ForgeCAD model to answer a load-case question:
9
+
10
+ - Where does this part see the highest stress?
11
+ - How far does it deflect?
12
+ - What is the minimum safety factor against the material yield strength?
13
+ - Did the mesh and solver produce evidence that is good enough to inspect?
14
+
15
+ ForgeCAD owns the authoring contract, solver orchestration, result feedback, and inspection report. The numerical solve is done out of process with Gmsh and CalculiX. Users author a study in the model, run `forgecad fea run`, and inspect a result bundle.
16
+
17
+ ## Contents
18
+
19
+ - What You Get
20
+ - What You Need Installed
21
+ - Author The Study
22
+ - Choose Stable Regions
23
+ - Run The Flow
24
+ - Read The Results
25
+ - Current Scope
26
+ - Troubleshooting
27
+
28
+ ## What You Get
29
+
30
+ A solved FEA result bundle can produce:
31
+
32
+ - max von Mises stress
33
+ - max displacement
34
+ - minimum safety factor
35
+ - mesh quality and solver trust flags
36
+ - region-level hot spots
37
+ - `report.html`
38
+ - `summary.json`
39
+ - a safety-factor heatmap PNG
40
+ - a solver stress heatmap PNG
41
+ - a displacement magnitude heatmap PNG
42
+
43
+ The deformed render is display-only. It helps explain the displacement shape; it does not change the stress, displacement, or safety-factor numbers reported by the solver.
44
+
45
+ ## What You Need Installed
46
+
47
+ The ForgeCAD CLI creates the package and renders the heatmap. The package runner uses self-contained `uv` Python scripts for Gmsh so every package resolves the same Python dependency set by default.
48
+
49
+ Run `forgecad doctor` to check these optional FEA tools in a separate section. Missing FEA tools do not block core ForgeCAD modeling, export, or render commands.
50
+
51
+ | Tool | Used For | Quick Check |
52
+ | --- | --- | --- |
53
+ | `uv` | Runs the packaged Python scripts with pinned dependencies | `uv --version` |
54
+ | CalculiX `ccx` | Solves the static stress deck | `ccx -v` |
55
+ | Bash | Runs the package script | `bash --version` |
56
+ | Chrome or Chromium | Renders PNG heatmaps from solved evidence | Chrome installed in a standard location, `CHROME_PATH=/path/to/chrome`, or `--chrome-path /path/to/chrome` |
57
+
58
+ If `uv` is not on `PATH`, set `UV=/path/to/uv` when running `forgecad fea run` or `forgecad fea check`.
59
+
60
+ If `ccx` is not on `PATH`, set `CCX=/path/to/ccx` when running `forgecad fea run` or `forgecad fea check`.
61
+
62
+ If you need an offline or pre-provisioned Python environment, set `PYTHON=/path/to/python`. That opt-out Python must be able to `import gmsh`; use `GMSH_PYTHONPATH` / `GMSH_PYTHON_PATH` only for that override path.
63
+
64
+ ForgeCAD does not bundle CalculiX. The generated `uv` scripts pin the Gmsh Python package, and `uv` downloads/caches it from the configured Python package index. If you redistribute solver binaries or Python wheels to customers, handle their licenses as part of your distribution.
65
+
66
+ ## Author The Study
67
+
68
+ Structural FEA starts in the `.forge.js` file. The script should return an authored `assembly(...)` with:
69
+
70
+ 1. a structural part marked with `Fea.body(...)`
71
+ 2. one or more static stress studies from `Fea.study.staticStress(...)`
72
+ 3. explicit fixtures and loads
73
+ 4. a second-order tetrahedral mesh intent
74
+
75
+ ```js
76
+ const aluminum = Fea.material("6061-T6", {
77
+ densityKgM3: 2700,
78
+ youngsModulusMPa: 68900,
79
+ poissonRatio: 0.33,
80
+ yieldStrengthMPa: 276,
81
+ });
82
+
83
+ const beam = box(120, 12, 12);
84
+
85
+ return assembly("Cantilever Stress Study")
86
+ .addPart("Beam", beam, {
87
+ fea: Fea.body({ material: aluminum }),
88
+ })
89
+ .withFeaStudy(
90
+ Fea.study.staticStress("end-load", {
91
+ fixtures: [
92
+ Fea.fix.fixed(Fea.region.face("fixed-end", beam.face("left"))),
93
+ ],
94
+ loads: [
95
+ Fea.load.force(Fea.region.face("load-end", beam.face("right")), {
96
+ newtons: 80,
97
+ direction: [0, 0, -1],
98
+ }),
99
+ ],
100
+ target: Fea.target.minSafetyFactor(2),
101
+ mesh: Fea.mesh.quadraticTets({ maxSizeMm: 4 }),
102
+ }),
103
+ );
104
+ ```
105
+
106
+ The complete API reference is generated from source in [Assembly](../generated/assembly.md). Keep reusable examples in `.forge.js` files; do not duplicate every API signature in handwritten docs.
107
+
108
+ ## Choose Stable Regions
109
+
110
+ Fixtures and loads must name real geometric regions. ForgeCAD will not guess them later.
111
+
112
+ Use `Fea.region.face(...)` when you can refer to a compiler-owned exact face, such as a simple box face or a named face from the model API.
113
+
114
+ Use `Fea.region.plane(...)` when the target is a planar face created by profiles, booleans, or imported geometry and the face name is not stable enough. Make the plane specific enough that it matches exactly one STEP/Gmsh surface.
115
+
116
+ During export, ForgeCAD writes a region map and a STEP tag plan. During the package run, the Gmsh preflight matches every authored fixture/load region against the STEP surfaces. Missing or ambiguous matches fail hard. That is intentional: a silent substitute face would make the stress result untrustworthy.
117
+
118
+ ## Run The Flow
119
+
120
+ Installed users run the CLI as `forgecad`. Developers running inside this repository can replace `forgecad` with `node dist-cli/forgecad.js`.
121
+
122
+ Run every authored FEA study and save an inspection result bundle:
123
+
124
+ ```bash
125
+ forgecad fea run examples/analysis/structural-stress-fea.forge.js
126
+ ```
127
+
128
+ Run one named study:
129
+
130
+ ```bash
131
+ forgecad fea run bracket.forge.js --study side-load
132
+ ```
133
+
134
+ Open the report:
135
+
136
+ ```bash
137
+ forgecad fea open out/bracket-fea
138
+ ```
139
+
140
+ Render a customer-facing safety view:
141
+
142
+ ```bash
143
+ forgecad fea render out/bracket-fea/side-load --field safety
144
+ ```
145
+
146
+ Render the engineering stress heatmap:
147
+
148
+ ```bash
149
+ forgecad fea render out/bracket-fea/side-load --field stress
150
+ ```
151
+
152
+ Render the displacement magnitude heatmap:
153
+
154
+ ```bash
155
+ forgecad fea render out/bracket-fea/side-load --field displacement
156
+ ```
157
+
158
+ Render a deformed stress view only when the displacement shape is useful to inspect:
159
+
160
+ ```bash
161
+ forgecad fea render out/bracket-fea/side-load \
162
+ --field stress \
163
+ --shape deformed \
164
+ --exaggerate 10
165
+ ```
166
+
167
+ The deformation scale only affects the render. It does not change the reported stress, displacement, or safety factor.
168
+
169
+ Each solved study result directory includes:
170
+
171
+ - `report.html` for the human inspection report
172
+ - `summary.json` for automation
173
+ - `renders/safety-factor.png` for the customer-facing safety heatmap
174
+ - `renders/stress.png` for the engineering von Mises stress heatmap
175
+
176
+ Displacement and deformed-shape PNGs are explicit render outputs from `forgecad fea render --field displacement` or `--shape deformed`.
177
+
178
+ Compare two solved result bundles:
179
+
180
+ ```bash
181
+ forgecad fea compare out/baseline-fea/side-load out/four-x-fea/side-load
182
+ ```
183
+
184
+ Comparison renders use one shared camera, image size, and safety-factor legend.
185
+
186
+ Run in CI and fail the process when authored targets fail:
187
+
188
+ ```bash
189
+ forgecad fea check bracket.forge.js --json
190
+ ```
191
+
192
+ ## Read The Results
193
+
194
+ Start with `report.html` or `summary.json` in the result directory. The important fields are the maximum stress, maximum displacement, minimum safety factor, hot spots, and any mesh or solver trust findings.
195
+
196
+ The default user-facing result is safety factor because it answers "is this part okay?" Use stress when you need the raw engineering von Mises field.
197
+
198
+ Advanced users can still run the lower-level package flow:
199
+
200
+ ```bash
201
+ forgecad export fea model.forge.js --output out/beam.feapkg
202
+ forgecad sim fea out/beam.feapkg --json
203
+ forgecad inspect structural stress out/beam.feapkg --camera iso --output out/stress.png
204
+ ```
205
+
206
+ Those commands are useful for debugging package evidence. Customer docs should prefer `forgecad fea ...`.
207
+
208
+ ## Current Scope
209
+
210
+ Structural FEA V1 is intentionally narrow:
211
+
212
+ - linear static stress only
213
+ - one structural body per package
214
+ - exact OCCT STEP export only
215
+ - second-order tetrahedral elements only
216
+ - fixed fixtures and force loads only
217
+ - no contacts, bonded assemblies, thermal loads, buckling, fatigue, plasticity, or certification workflow
218
+
219
+ ForgeCAD refuses mesh or faceted fallback for FEA export. If exact geometry export, region mapping, mesh quality, solver convergence, result parsing, or evidence trust fails, the command should fail with an actionable error instead of inventing a weaker path.
220
+
221
+ ## Troubleshooting
222
+
223
+ | Symptom | What It Means | What To Do |
224
+ | --- | --- | --- |
225
+ | `FEA.TOOLCHAIN_UV_MISSING` | The package runner cannot find `uv`. | Install `uv` or run with `UV=/path/to/uv`. |
226
+ | `FEA.TOOLCHAIN_PYTHON_MISSING` | A `PYTHON=...` override points to a missing Python executable. | Install Python 3 or fix the `PYTHON` path. |
227
+ | `FEA.TOOLCHAIN_GMSH_MISSING` | The selected Python process cannot import Gmsh. | Prefer the default `uv` path, or install the Gmsh Python module for the `PYTHON=...` override. |
228
+ | `FEA.TOOLCHAIN_CCX_MISSING` | CalculiX is not available as `ccx`. | Install CalculiX or run with `CCX=/path/to/ccx`. |
229
+ | `FEA.GMSH_FACE_MATCH_NONE` | An authored fixture/load region did not match a STEP surface. | Use a more stable face reference or a more precise planar region. |
230
+ | `FEA.GMSH_FACE_MATCH_AMBIGUOUS` | A region matched more than one STEP surface. | Make the target region more specific or change the model so the load/fixture face is unique. |
231
+ | `FEA.MESH_QUALITY_BELOW_TARGET` | The mesh exists but did not meet the package quality target. | Reduce mesh size, simplify tiny features, or improve the geometry around the hot area. |
232
+ | `FEA.SOLVER_FAILED` | CalculiX did not complete the solve. | Inspect `solver/static_stress.log`, then check fixtures, loads, material values, and over-constraint. |
233
+ | `FEA.FIELD_UNTRUSTED` | The heatmap input is not trusted package evidence. | Run inspection on the `.feapkg` directory after `forgecad sim fea`, not a copied JSON file. |
234
+
235
+ For command flags, use the [CLI reference](../CLI.md). For the public API, use the generated [Assembly reference](../generated/assembly.md).
@@ -9,11 +9,7 @@ forgecad skill install
9
9
  The installed skill names are namespaced to avoid collisions with a user's existing generic skills.
10
10
 
11
11
  - `forgecad-build-model`
12
- - `forgecad-design-spec`
13
- - `forgecad-grade-model`
14
12
  - `forgecad-image-prompt`
15
- - `forgecad-inspect-model`
16
13
  - `forgecad-project-sync`
17
14
  - `forgecad-reconstruct-cad-file`
18
15
  - `forgecad-reconstruct-from-images`
19
- - `forgecad-verify-mujoco`