forgecad 0.10.2 → 0.10.3

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 (95) hide show
  1. package/README.md +7 -6
  2. package/dist/assets/{AdminPage-CHY6ZN-p.js → AdminPage-CK7ObBz3.js} +1 -1
  3. package/dist/assets/{BenchmarkPage-BcRT5iGN.js → BenchmarkPage-Ds7Z2doN.js} +1 -1
  4. package/dist/assets/{BlogPage-BssBbnb-.js → BlogPage-DlPbpt6A.js} +1 -1
  5. package/dist/assets/{DocsPage-DsvdiRNK.js → DocsPage-vZb3b3Y0.js} +9 -14
  6. package/dist/assets/{EditorApp-BpjZgzk0.css → EditorApp-C5f24ZN9.css} +8 -0
  7. package/dist/assets/{EditorApp-Bfd3jbtC.js → EditorApp-HLoKfe15.js} +141 -12
  8. package/dist/assets/{EmbedViewer-D5t8WamV.js → EmbedViewer--KnqBKrJ.js} +2 -2
  9. package/dist/assets/{LandingPageProofDriven-DbN7o-Be.js → LandingPageProofDriven-C_LssmnA.js} +1 -1
  10. package/dist/assets/{LegalPage-DNGrrY0p.js → LegalPage-DGsyo4n1.js} +1 -1
  11. package/dist/assets/{PricingPage-Nczr3pRz.js → PricingPage-BOE27B-R.js} +1 -1
  12. package/dist/assets/{SettingsPage-DZlyu4d4.js → SettingsPage-f47cnk39.js} +1 -1
  13. package/dist/assets/{app-C9ct2hRD.js → app-D6ccu2Xx.js} +6854 -7373
  14. package/dist/assets/{backendInit-ymjonyQp.js → backendInit-DbTkQN9J.js} +2557 -809
  15. package/dist/assets/cli/{render-B_0lQwKU.js → render-BsngirjC.js} +114 -9
  16. package/dist/assets/{constructionHistoryWorker-CZ42Dksy.js → constructionHistoryWorker-PCwXrTDB.js} +175 -36
  17. package/dist/assets/{evalWorker-C2pm8LHP.js → evalWorker-CS63PfZu.js} +1125 -447
  18. package/dist/assets/{forgecad_geometry-BlMtqluF.js → forgecad_geometry-CZ_IfuvA.js} +1 -9
  19. package/dist/assets/{forgecad_geometry_bg-BllP_WiL.wasm → forgecad_geometry_bg-C3rQHfwg.wasm} +0 -0
  20. package/dist/assets/{inspectWorker-D5T5VbfK.js → inspectWorker-Y4cOzNyA.js} +4345 -373
  21. package/dist/assets/{jointPose-4r8ed8_5.js → jointPose-AMvCywzS.js} +1 -1
  22. package/dist/assets/{manifold-C4r6B-XY.js → manifold-CBry38ly.js} +2 -2
  23. package/dist/assets/{manifold-5PP1eGLN.js → manifold-Crd_F2qx.js} +1 -1
  24. package/dist/assets/{manifold-DjBkyIc8.js → manifold-k2kRcc85.js} +1 -1
  25. package/dist/assets/{reportWorker-CwenM7wB.js → reportWorker-CWvn0CEv.js} +1095 -400
  26. package/dist/cli/render.html +1 -1
  27. package/dist/docs/index.html +2 -2
  28. package/dist/docs-raw/AI/usage.md +2 -4
  29. package/dist/docs-raw/CLI.md +9 -7
  30. package/dist/docs-raw/README.md +1 -1
  31. package/dist/docs-raw/component-model.md +1 -1
  32. package/dist/docs-raw/generated/assembly.md +1 -1
  33. package/dist/docs-raw/generated/concepts.md +5 -3
  34. package/dist/docs-raw/generated/core.md +70 -1
  35. package/dist/docs-raw/generated/curves.md +8 -1
  36. package/dist/docs-raw/generated/output.md +0 -64
  37. package/dist/docs-raw/generated/runtime-names.md +6 -6
  38. package/dist/docs-raw/generated/viewport.md +3 -12
  39. package/dist/docs-raw/guides/inspection-bundles.md +1 -1
  40. package/dist/docs-raw/simulation-workflow.md +58 -0
  41. package/dist/docs-raw/skills/forgecad-blockout-model.md +1 -1
  42. package/dist/docs-raw/skills/forgecad-image-replicator.md +2 -2
  43. package/dist/docs-raw/skills/forgecad-mujoco-verify.md +78 -0
  44. package/dist/docs-raw/skills/forgecad-spec-by-walking-through-it.md +145 -0
  45. package/dist/docs-raw/skills/forgecad-visual-spec.md +1 -1
  46. package/dist/docs-raw/skills/forgecad.md +24 -24
  47. package/dist/docs-raw/skills/index.md +2 -3
  48. package/dist/index.html +1 -1
  49. package/dist/sitemap.xml +15 -15
  50. package/dist-cli/{check-compiler-SP7FAL7R.js → check-compiler-HPF2T2FS.js} +1 -1
  51. package/dist-cli/{check-query-propagation-BRLSHP22.js → check-query-propagation-HYSLTXAB.js} +1 -1
  52. package/dist-cli/{chunk-RQQ42YCP.js → chunk-WLUKAW3H.js} +1025 -158
  53. package/dist-cli/forgecad.js +2621 -232
  54. package/dist-cli/{forgecad_geometry-7TVSNVUB.js → forgecad_geometry-2IMYCUWW.js} +0 -8
  55. package/dist-cli/forgecad_geometry_bg.wasm +0 -0
  56. package/dist-skill/CONTEXT.md +85 -73
  57. package/dist-skill/SKILL.md +1 -1
  58. package/dist-skill/docs/CLI.md +9 -7
  59. package/dist-skill/docs/generated/assembly.md +1 -1
  60. package/dist-skill/docs/generated/core.md +70 -1
  61. package/dist-skill/docs/generated/curves.md +8 -1
  62. package/dist-skill/docs/generated/output.md +0 -64
  63. package/dist-skill/docs/generated/runtime-names.md +6 -6
  64. package/dist-skill/docs/generated/viewport.md +3 -12
  65. package/dist-skill/docs/guides/inspection-bundles.md +1 -1
  66. package/dist-skill/library/README.md +2 -3
  67. package/dist-skill/library/forgecad-blockout-model/SKILL.md +1 -1
  68. package/dist-skill/library/forgecad-image-replicator/SKILL.md +2 -2
  69. package/dist-skill/library/forgecad-mujoco-verify/SKILL.md +66 -0
  70. package/dist-skill/library/forgecad-mujoco-verify/scripts/mujoco_verify.py +385 -0
  71. package/dist-skill/library/forgecad-spec-by-walking-through-it/SKILL.md +132 -0
  72. package/dist-skill/library/forgecad-visual-spec/SKILL.md +1 -1
  73. package/dist-skill/website/skills/forgecad-blockout-model.md +1 -1
  74. package/dist-skill/website/skills/forgecad-image-replicator.md +2 -2
  75. package/dist-skill/website/skills/forgecad-mujoco-verify.md +78 -0
  76. package/dist-skill/website/skills/forgecad-spec-by-walking-through-it.md +145 -0
  77. package/dist-skill/website/skills/forgecad-visual-spec.md +1 -1
  78. package/dist-skill/website/skills/forgecad.md +24 -24
  79. package/dist-skill/website/skills/index.md +2 -3
  80. package/examples/analysis/clearance-fit.forge.js +31 -0
  81. package/examples/analysis/lever-arm-actuator.forge.js +43 -0
  82. package/examples/analysis/tipping-tripod.forge.js +35 -0
  83. package/examples/products/sportscar.forge.js +77 -0
  84. package/package.json +1 -3
  85. package/dist/docs-raw/skills/forgecad-high-level-spec.md +0 -101
  86. package/dist/docs-raw/skills/forgecad-lld.md +0 -41
  87. package/dist/docs-raw/skills/forgecad-prepare-prompt.md +0 -63
  88. package/dist-skill/library/forgecad-high-level-spec/SKILL.md +0 -94
  89. package/dist-skill/library/forgecad-lld/SKILL.md +0 -34
  90. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +0 -50
  91. package/dist-skill/website/skills/forgecad-high-level-spec.md +0 -101
  92. package/dist-skill/website/skills/forgecad-lld.md +0 -41
  93. package/dist-skill/website/skills/forgecad-prepare-prompt.md +0 -63
  94. /package/dist-skill/library/{forgecad-prepare-prompt → forgecad-spec-by-walking-through-it}/references/default-profiles.md +0 -0
  95. /package/dist-skill/library/{forgecad-prepare-prompt → forgecad-spec-by-walking-through-it}/references/master-prompt.md +0 -0
@@ -31,13 +31,6 @@ function geometry_chamfer_edges(handle, spec_json) {
31
31
  }
32
32
  return ret[0] >>> 0;
33
33
  }
34
- function geometry_clone(handle) {
35
- const ret = wasm.geometry_clone(handle);
36
- if (ret[2]) {
37
- throw takeFromExternrefTable0(ret[1]);
38
- }
39
- return ret[0] >>> 0;
40
- }
41
34
  function geometry_create_box(width, depth, height) {
42
35
  const ret = wasm.geometry_create_box(width, depth, height);
43
36
  return ret >>> 0;
@@ -889,7 +882,6 @@ export {
889
882
  geometry_boolean,
890
883
  geometry_capabilities,
891
884
  geometry_chamfer_edges,
892
- geometry_clone,
893
885
  geometry_create_box,
894
886
  geometry_create_cylinder,
895
887
  geometry_create_empty,
Binary file
@@ -141,12 +141,12 @@ lib, Line2D, linearPattern, linearPattern2d, loadFont, loft, Loft, mirrorCopy
141
141
  mock, ngon, NurbsCurve3D, NurbsSurface, offsetSolid, param, Param, path
142
142
  Point2D, Points, polygon, polygonVertices, port, Product, ProductPanelBuilder, ProductRibbonBuilder
143
143
  ProductSkin, ProductSkinBuilder, ProductStationBuilder, ProductSurfaceBuilder, ProductSurfaceRef, projectToPlane, queueMicrotask, rect
144
- Rectangle2D, robotExport, roundedRect, Route3D, scene, Sculpt, sdf, SdfShape
145
- selectEdge, selectEdges, self, setActiveBackend, setImmediate, setInterval, setTimeout, Shape
146
- ShapeGroup, sheetMetal, SheetMetalPart, sheetStock, Sim, Sketch, sketchToDxf, sketchToSvg
147
- slot, SolvedAssembly, spec, sphere, spline2d, stroke, Surface, SurfaceBody
148
- SurfaceMembers, sweep, text2d, textWidth, torus, toShape, Transform, union
149
- union2d, variableSweep, verify, Viewport, window, Wood
144
+ Rectangle2D, roundedRect, Route3D, scene, Sculpt, sdf, SdfShape, selectEdge
145
+ selectEdges, self, setActiveBackend, setImmediate, setInterval, setTimeout, Shape, ShapeGroup
146
+ sheetMetal, SheetMetalPart, sheetStock, Sim, Sketch, sketchToDxf, sketchToSvg, slot
147
+ SolvedAssembly, spec, sphere, spline2d, stroke, Surface, SurfaceBody, SurfaceMembers
148
+ sweep, text2d, textWidth, torus, toShape, Transform, union, union2d
149
+ variableSweep, verify, Viewport, window, Wood
150
150
  ```
151
151
 
152
152
  `showLabels` is also a runtime global, but it is not part of the top-level collision check. Avoid reusing it unless you intentionally want a local value with that name.
@@ -176,6 +176,10 @@ union2d, variableSweep, verify, Viewport, window, Wood
176
176
  - [SurfacePattern](#surfacepattern)
177
177
  - [Pattern2D](#pattern2d)
178
178
  - [Pattern2DBuilder](#pattern2dbuilder)
179
+ - [Sheet](#sheet)
180
+ - [CurveNetBuilder](#curvenetbuilder)
181
+ - [MatchEdgeBuilder](#matchedgebuilder)
182
+ - [BridgeBuilder](#bridgebuilder)
179
183
  - [ShapeRef](#shaperef)
180
184
  - [ANCHOR3D_NAMES](#anchor3d-names)
181
185
  - [verify](#verify)
@@ -860,7 +864,7 @@ Supports transforms (translate, rotate, scale, mirror, transform, rotateAround,
860
864
 
861
865
  Returns a new Shape with the specified material properties merged on top of any previously set properties. All properties are optional — omitted keys retain their current value. Material properties survive transforms and boolean operations.
862
866
 
863
- Use `.color()` to set the base diffuse color; `.material()` controls how that color behaves under light (metalness, roughness, clearcoat) and can add emissive glow independent of lighting. Emissive glow pairs naturally with the `postProcessing.bloom` effect in [`scene()`](/docs/viewport#scene).
867
+ Use `.color()` to set the base diffuse color; `.material()` controls how that color behaves under light (metalness, roughness, clearcoat) and can add emissive glow independent of lighting.
864
868
 
865
869
  ```js
866
870
  box(50, 50, 50).material({ metalness: 0.9, roughness: 0.1 }); // polished metal
@@ -1485,6 +1489,71 @@ const bracket = group(
1485
1489
  | `depth?` | `number` | Thread groove depth in millimeters. Default: 0.8. |
1486
1490
  | `underScale?` | `number` | Relative height of the under-crossing thread. Default: 0.15. |
1487
1491
 
1492
+ ### `Sheet`
1493
+
1494
+ A parametric open surface value (control grid + knots + analytic differential geometry).
1495
+
1496
+ **Properties:**
1497
+
1498
+ | Property | Type | Description |
1499
+ |----------|------|-------------|
1500
+ | `surface` | `BSplineSurface` | — |
1501
+
1502
+ **Methods:**
1503
+
1504
+ #### `get frontEdge(): SheetEdge` — Edge naming follows parameter direction (documented): front=v0, rear=v1, left=u0, right=u1.
1505
+
1506
+ #### `thicken(wall: number, options?: { resolution?: number; }): Shape` — Offset the sheet along its analytic normals into a watertight solid shell of the given wall thickness. Throws if the wall would self-intersect on a concave region (no silent degenerate solid).
1507
+
1508
+ #### `matchEdge(edge: SheetEdge): MatchEdgeBuilder` — Per-edge continuity match against a neighbor (returns a NEW Sheet).
1509
+
1510
+ **`SheetEdge`**
1511
+ - `fixed: "u" | "v"` — Which parameter is held fixed along this edge.
1512
+ - `value: 0 | 1` — The fixed value (0 or 1).
1513
+ - Also: `sheet: Sheet`.
1514
+
1515
+ - `get rearEdge(): SheetEdge`
1516
+ - `get leftEdge(): SheetEdge`
1517
+ - `get rightEdge(): SheetEdge`
1518
+ - `pointAt(u: number, v: number): Vec3`
1519
+ - `normalAt(u: number, v: number): Vec3`
1520
+ - `curvatureAt(u: number, v: number): SurfaceCurvature`
1521
+
1522
+ ### `CurveNetBuilder`
1523
+
1524
+ #### `toSheet(): Sheet` — Build (once) and return the Sheet.
1525
+
1526
+ - `lengthwise(...curves: CurveInput[]): this`
1527
+ - `crosswise(...curves: CurveInput[]): this`
1528
+ - `alongRails(railA: CurveInput, railB: CurveInput): this`
1529
+ - `sections(...curves: CurveInput[]): this`
1530
+ - `cage(grid: Vec3[][]): this`
1531
+ - `degree(u: number, v: number): this`
1532
+ - `get frontEdge(): SheetEdge`
1533
+ - `get rearEdge(): SheetEdge`
1534
+ - `get leftEdge(): SheetEdge`
1535
+ - `get rightEdge(): SheetEdge`
1536
+ - `get surface(): BSplineSurface`
1537
+ - `pointAt(u: number, v: number): Vec3`
1538
+ - `normalAt(u: number, v: number): Vec3`
1539
+ - `curvatureAt(u: number, v: number): SurfaceCurvature`
1540
+ - `thicken(wall: number, options?: { resolution?: number; }): Shape`
1541
+ - `matchEdge(edge: SheetEdge): MatchEdgeBuilder`
1542
+
1543
+ ### `MatchEdgeBuilder`
1544
+
1545
+ - `toG0(neighbor: SheetEdge): Sheet`
1546
+ - `toG1(neighbor: SheetEdge): Sheet`
1547
+ - `toG2(neighbor: SheetEdge): Sheet`
1548
+
1549
+ ### `BridgeBuilder`
1550
+
1551
+ #### `bulge(a: number, b: number): this` — Tune the influence of each side (Rhino-style bulge).
1552
+
1553
+ - `g0(): Sheet`
1554
+ - `g1(): Sheet`
1555
+ - `g2(): Sheet`
1556
+
1488
1557
  ### `ShapeRef`
1489
1558
 
1490
1559
  A first-class reference path over a shape's semantic faces and face relationships.
@@ -3025,7 +3094,11 @@ const outlet = route.port("outlet");
3025
3094
 
3026
3095
  #### `pointAt(u: number, v: number): Vec3` — Evaluate the surface at parameters (u, v) ∈ [0, 1]². Uses tensor product evaluation: evaluate basis functions in U and V independently.
3027
3096
 
3028
- #### `normalAt(u: number, v: number): Vec3` — Evaluate the surface normal at (u, v) via cross product of partial derivatives.
3097
+ #### `normalAt(u: number, v: number): Vec3` — Evaluate the surface unit normal at (u, v) from analytic first derivatives.
3098
+
3099
+ Uses Algorithm A2.3 basis-function derivatives with the rational quotient rule, so the normal is exact (no finite-difference epsilon, no error near the boundary). Constant chain-rule factors from the parameter remap scale Su and Sv positively and cancel under normalization, so they are omitted.
3100
+
3101
+ #### `derivativesAt(u: number, v: number): { S: Vec3; Su: Vec3; Sv: Vec3; }` — Analytic first partial derivatives S_u, S_v (rational quotient rule).
3029
3102
 
3030
3103
  #### `tessellate(resU?: number, resV?: number): { positions: Vec3[]; normals: Vec3[]; indices: number[]; }` — Tessellate the surface into a triangle mesh. Returns positions, normals, and triangle indices.
3031
3104
 
@@ -3764,16 +3837,19 @@ Members (full entries under [Curves & Surfacing](#curves-surfacing)): `Curve.Ble
3764
3837
  - `Trim(shape: Shape, tool: Shape | SurfacePlaneOp): Shape`
3765
3838
  - `Split(shape: Shape, tool: Shape | SurfacePlaneOp): [ Shape, Shape ]`
3766
3839
  - `Match(shape: Shape, options: { edge: "u0" | "u1" | "v0" | "v1"; target: EdgeRef; continuity?: SurfaceContinuity; }): Shape`
3840
+ - `Net(): CurveNet` — Begin a curve-network (Gordon) surface — the class-A keystone. Chain `.lengthwise(...)/.crosswise(...)` (or `.alongRails(a,b).sections(...)`, or `.cage(grid)`), then `.thicken(wall)` to get a solid Shape. Returns a fluent [`Sheet`](/docs/core#sheet) builder with analytic point/normal/curvature queries and named edges.
3767
3841
 
3768
3842
  ### `Blend`
3769
3843
 
3770
3844
  - `Edge(options: BlendEdgeOptions): Shape`
3771
3845
  - `Surface(options: BlendSurfaceOptions): Shape`
3846
+ - `Bridge(edgeA: SheetEdge, edgeB: SheetEdge): BridgeBuilder` — Build a transition strip between two `Surface.Net` sheet edges. Chain `.bulge(a, b)` then `.g0()/.g1()/.g2()` for the continuity order. Returns a [`Sheet`](/docs/core#sheet); verify the seam with `Analysis.EdgeMatch`.
3772
3847
 
3773
3848
  ### `Analysis`
3774
3849
 
3775
3850
  - `EdgeContinuity(shape: Shape, options?: EdgeContinuityThresholds): EdgeContinuityReport`
3776
3851
  - `SurfaceContinuity(shape: Shape, options?: EdgeContinuityThresholds): EdgeContinuityReport`
3852
+ - `EdgeMatch(edgeA: SheetEdge, edgeB: SheetEdge, options?: { samples?: number; }): ContinuityReport` — Measure G0/G1/G2 agreement between two `Surface.Net` sheet edges: worst position gap, cross-boundary tangent angle (0 = G1), and normal-curvature mismatch (0 = G2). The reflection/fairness check for matched panel seams.
3777
3853
  - `CurvatureComb(input: NurbsCurve3D | EdgeRef, options?: { samples?: number; }): CurvatureSample[]`
3778
3854
  - `SurfaceHealth(shape: Shape, options?: { tinyEdgeThreshold?: number; sliverThreshold?: number; }): SurfaceHealthReport`
3779
3855
  - `BRepValidity(shape: Shape, options?: BRepValidityOptions): BRepValidityReport` — Validate B-rep/shell/solid structure and return closedness, manifoldness, orientation, and issue diagnostics.
@@ -4226,7 +4302,7 @@ return mech.solve({ theta: 45 });
4226
4302
 
4227
4303
  #### `withSimulation(options: SimAssemblySimulationOptions): Assembly` — Attach the root simulation contract for this assembly.
4228
4304
 
4229
- Use this after adding physical parts and joints. Robot-body profiles require `rootPart`; asset profiles can describe one-part or multi-part physical assets. URDF/SDF exporters and `forgecad check simready` read this contract directly, so model files no longer need a separate `robotExport(...)` side effect.
4305
+ Use this after adding physical parts and joints. Robot-body profiles require `rootPart`; asset profiles can describe one-part or multi-part physical assets. URDF/SDF/MJCF/USD exporters and `forgecad check simready` read this contract directly from the returned assembly.
4230
4306
 
4231
4307
  `SimAssemblySimulationOptions`: `{ profile: SimProfileDef, rootPart?: string, controllers?: SimControllerDef[] }`
4232
4308
 
@@ -4498,70 +4574,6 @@ bom(tubeLen, "rectangular steel tube", {
4498
4574
  | `notes?` | `string` | Free-form notes |
4499
4575
  | `grain?` | `string` | Wood grain direction, e.g. "long", "cross" |
4500
4576
 
4501
- #### `robotExport(options: RobotExportOptions): CollectedRobotExport` — Compatibility shim for SDF/URDF robot package metadata.
4502
-
4503
- Prefer returning `assembly(...).withSimulation(...)` with `Sim.body(...)`, `Sim.drive.*(...)`, and `Sim.controller.*(...)` metadata. The CLI commands `forgecad export sdf` and `forgecad export urdf` now read that assembly simulation contract directly.
4504
-
4505
- `robotExport()` remains available for one compatibility window. It converts the legacy descriptor into the same internal simulation model used by source-authored `Sim` metadata and produces a robot package with:
4506
-
4507
- - Mesh-based inertia tensors (full 6-component, not bounding-box approximations)
4508
- - Separate collision meshes
4509
- - Joint limits, effort/velocity/damping/friction metadata from assembly joints
4510
-
4511
- **Collision mesh modes** (set per-link via `links["PartName"].collision`):
4512
-
4513
- | Mode | Description | Default |
4514
- |------|-------------|---------|
4515
- | `'convex'` | Convex hull (separate `_collision.stl`) | Yes |
4516
- | `'box'` | AABB primitive — fastest physics | |
4517
- | `'visual'` | Same mesh as visual — exact but slow | |
4518
- | `'none'` | No collision geometry | |
4519
-
4520
- **Unit conventions:**
4521
-
4522
- - Revolute `velocity` is in degrees/second in Forge; exporters convert to rad/s.
4523
- - Prismatic distances are in mm in Forge; exported in meters.
4524
- - `massKg` is preferred; `densityKgM3` is used when mass is unknown.
4525
- - Compatibility coupling metadata, when present, maps only the primary term (largest ratio) to `<mimic>` — SDF/URDF support single-leader mimic only. Dropped terms emit a warning.
4526
-
4527
- **Legacy example**
4528
-
4529
- ```ts
4530
- robotExport({
4531
- assembly: rover, // assembly() with parts + revolute wheel joints
4532
- modelName: "Scout",
4533
- links: { Chassis: { massKg: 10 }, "Left Wheel": { massKg: 0.8 } },
4534
- plugins: {
4535
- diffDrive: {
4536
- leftJoints: ["leftWheel"], rightJoints: ["rightWheel"],
4537
- wheelSeparationMm: 280, wheelRadiusMm: 60,
4538
- },
4539
- },
4540
- world: { generateDemoWorld: true },
4541
- });
4542
- ```
4543
-
4544
- **Preferred CLI usage**
4545
-
4546
- ```bash
4547
- forgecad export sdf model.forge.js # SDF package (Gazebo/Ignition)
4548
- forgecad export urdf model.forge.js # URDF package (ROS/PyBullet/MuJoCo)
4549
- ```
4550
-
4551
- **`RobotExportOptions`**: `assembly: Assembly`, `modelName?: string`, `state?: JointState`, `static?: boolean`, `selfCollide?: boolean`, `allowAutoDisable?: boolean`, `links?: Record<string, RobotLinkExportOptions>`, `joints?: Record<string, RobotJointExportOptions>`, `plugins?: { diffDrive?: RobotDiffDrivePluginOptions; jointStatePublisher?: RobotJointStatePublisherOptions; }`, `world?: RobotWorldOptions`
4552
-
4553
- `RobotLinkExportOptions`: `{ massKg?: number, densityKgM3?: number, collision?: "visual" | "convex" | "box" | "none" }`
4554
-
4555
- `RobotJointExportOptions`: `{ effort?: number, velocity?: number, damping?: number, friction?: number }`
4556
-
4557
- **`RobotDiffDrivePluginOptions`**: `leftJoints: string[]`, `rightJoints: string[]`, `wheelSeparationMm: number`, `wheelRadiusMm: number`, `topic?: string`, `odomTopic?: string`, `tfTopic?: string`, `frameId?: string`, `odomFrameId?: string`, `maxLinearVelocity?: number`, `maxAngularVelocity?: number`, `linearAcceleration?: number`, `angularAcceleration?: number`
4558
-
4559
- `RobotJointStatePublisherOptions`: `{ enabled?: boolean, joints?: string[], topic?: string, updateRate?: number }`
4560
-
4561
- `RobotWorldOptions`: `{ name?: string, generateDemoWorld?: boolean, spawnPose?: RobotPose6, keyboardTeleop?: RobotWorldKeyboardTeleopOptions }`
4562
-
4563
- `RobotWorldKeyboardTeleopOptions`: `{ enabled?: boolean, linearStep?: number, angularStep?: number }`
4564
-
4565
4577
  #### `dim()` — Add a dimension annotation between two points, or along an entity.
4566
4578
 
4567
4579
  Overloads:
@@ -65,7 +65,7 @@ Smooth curves, Hermite splines, lofted and swept solids. For straps, inlays, gua
65
65
 
66
66
  ### 5. Assemblies and Mechanisms (for joints or kinematics)
67
67
 
68
- Assembly graph, joint types, couplings, validation, robot export.
68
+ Assembly graph, joint types, couplings, validation, and simulation export.
69
69
 
70
70
  - `{{SKILL_DIR}}/docs/generated/assembly.md`
71
71
 
@@ -265,7 +265,7 @@ forgecad render section model.forge.js --output out/section.svg --plane XZ --off
265
265
 
266
266
  ### Cross-cutting flags
267
267
 
268
- These flags work across run / render / capture / inspect commands:
268
+ These flags work across script-backed run, render, export, capture, inspect, and check commands that evaluate `.forge.js` files. Use `--param Key=Value` for parameter overrides; repeat it for multiple parameters.
269
269
 
270
270
  | Option | Description |
271
271
  |--------|-------------|
@@ -306,39 +306,41 @@ Export to every format you need.
306
306
 
307
307
  ```bash
308
308
  # Sheet material
309
- forgecad cut-list shelf.forge.js
309
+ forgecad cut-list shelf.forge.js --param Material=plywood
310
310
  forgecad export cutting-layout shelf.forge.js --sheet-width 420 --sheet-height 594 --kerf 3
311
311
  forgecad export cutting-layout shelf.forge.js --output out/layout.dxf
312
312
 
313
313
  # 3D printing
314
314
  forgecad check print bracket.forge.js
315
- forgecad export stl bracket.forge.js
315
+ forgecad export stl bracket.forge.js --param Width=42
316
316
  forgecad export 3mf bracket.forge.js --quality high
317
317
 
318
318
  # CAD interchange
319
- forgecad export step bracket.forge.js
319
+ forgecad export step bracket.forge.js --param Width=42
320
320
 
321
321
  # Technical drawings
322
322
  forgecad export report bracket.forge.js --output out/report.pdf
323
323
 
324
324
  # Robot simulation
325
325
  forgecad export sdf rover.forge.js --output out/forge_scout
326
- forgecad export mjcf rover.forge.js --output out/forge_scout_mjcf
326
+ forgecad export mjcf rover.forge.js --param Wheelbase=180 --output out/forge_scout_mjcf
327
327
  forgecad export usd rover.forge.js --output out/forge_scout_usd
328
328
  ```
329
329
 
330
+ Script-backed exports accept repeatable `--param Key=Value` overrides before the model is evaluated. The MuJoCo/MJX package export command is `export mjcf`.
331
+
330
332
  <details>
331
333
  <summary>Export flags</summary>
332
334
 
333
335
  | Option | Description |
334
336
  |--------|-------------|
337
+ | `--param <Key=Value>` | Override a parameter value (Key=Value). Repeatable. |
338
+ | `-p <Key=Value>` | Shorthand for --param |
335
339
  | `--joint <JointName=Value>` | Override a Motion tab joint value (JointName=Value). Repeatable. |
336
340
  | `--output <path>` | Output SVG path for a single input |
337
341
  | `--backend <occt\|truck>` | Exact BREP exporter: occt (default) or truck (native analytic kernel) |
338
342
  | `--quality <default\|live\|high>` | Forge quality preset |
339
343
  | `-o <path>` | Shorthand for --output |
340
- | `--param <Key=Value>` | Override a parameter value (Key=Value). Repeatable. |
341
- | `-p <Key=Value>` | Shorthand for --param |
342
344
  | `--format <json\|webgpu-brick>` | Implicit artifact format |
343
345
  | `-q <live\|default\|high>` | Shorthand for --quality |
344
346
  | `--workgroup-size <x>x<y>x<z>` | WebGPU compute workgroup size |
@@ -356,7 +356,7 @@ return mech.solve({ theta: 45 });
356
356
 
357
357
  #### `withSimulation(options: SimAssemblySimulationOptions): Assembly` — Attach the root simulation contract for this assembly.
358
358
 
359
- Use this after adding physical parts and joints. Robot-body profiles require `rootPart`; asset profiles can describe one-part or multi-part physical assets. URDF/SDF exporters and `forgecad check simready` read this contract directly, so model files no longer need a separate `robotExport(...)` side effect.
359
+ Use this after adding physical parts and joints. Robot-body profiles require `rootPart`; asset profiles can describe one-part or multi-part physical assets. URDF/SDF/MJCF/USD exporters and `forgecad check simready` read this contract directly from the returned assembly.
360
360
 
361
361
  `SimAssemblySimulationOptions`: `{ profile: SimProfileDef, rootPart?: string, controllers?: SimControllerDef[] }`
362
362
 
@@ -24,6 +24,10 @@ skill-order: 100
24
24
  - [SurfacePattern](#surfacepattern)
25
25
  - [Pattern2D](#pattern2d)
26
26
  - [Pattern2DBuilder](#pattern2dbuilder)
27
+ - [Sheet](#sheet)
28
+ - [CurveNetBuilder](#curvenetbuilder)
29
+ - [MatchEdgeBuilder](#matchedgebuilder)
30
+ - [BridgeBuilder](#bridgebuilder)
27
31
  - [ShapeRef](#shaperef)
28
32
  - [ANCHOR3D_NAMES](#anchor3d-names)
29
33
  - [verify](#verify)
@@ -708,7 +712,7 @@ Supports transforms (translate, rotate, scale, mirror, transform, rotateAround,
708
712
 
709
713
  Returns a new Shape with the specified material properties merged on top of any previously set properties. All properties are optional — omitted keys retain their current value. Material properties survive transforms and boolean operations.
710
714
 
711
- Use `.color()` to set the base diffuse color; `.material()` controls how that color behaves under light (metalness, roughness, clearcoat) and can add emissive glow independent of lighting. Emissive glow pairs naturally with the `postProcessing.bloom` effect in [`scene()`](/docs/viewport#scene).
715
+ Use `.color()` to set the base diffuse color; `.material()` controls how that color behaves under light (metalness, roughness, clearcoat) and can add emissive glow independent of lighting.
712
716
 
713
717
  ```js
714
718
  box(50, 50, 50).material({ metalness: 0.9, roughness: 0.1 }); // polished metal
@@ -1333,6 +1337,71 @@ const bracket = group(
1333
1337
  | `depth?` | `number` | Thread groove depth in millimeters. Default: 0.8. |
1334
1338
  | `underScale?` | `number` | Relative height of the under-crossing thread. Default: 0.15. |
1335
1339
 
1340
+ ### `Sheet`
1341
+
1342
+ A parametric open surface value (control grid + knots + analytic differential geometry).
1343
+
1344
+ **Properties:**
1345
+
1346
+ | Property | Type | Description |
1347
+ |----------|------|-------------|
1348
+ | `surface` | `BSplineSurface` | — |
1349
+
1350
+ **Methods:**
1351
+
1352
+ #### `get frontEdge(): SheetEdge` — Edge naming follows parameter direction (documented): front=v0, rear=v1, left=u0, right=u1.
1353
+
1354
+ #### `thicken(wall: number, options?: { resolution?: number; }): Shape` — Offset the sheet along its analytic normals into a watertight solid shell of the given wall thickness. Throws if the wall would self-intersect on a concave region (no silent degenerate solid).
1355
+
1356
+ #### `matchEdge(edge: SheetEdge): MatchEdgeBuilder` — Per-edge continuity match against a neighbor (returns a NEW Sheet).
1357
+
1358
+ **`SheetEdge`**
1359
+ - `fixed: "u" | "v"` — Which parameter is held fixed along this edge.
1360
+ - `value: 0 | 1` — The fixed value (0 or 1).
1361
+ - Also: `sheet: Sheet`.
1362
+
1363
+ - `get rearEdge(): SheetEdge`
1364
+ - `get leftEdge(): SheetEdge`
1365
+ - `get rightEdge(): SheetEdge`
1366
+ - `pointAt(u: number, v: number): Vec3`
1367
+ - `normalAt(u: number, v: number): Vec3`
1368
+ - `curvatureAt(u: number, v: number): SurfaceCurvature`
1369
+
1370
+ ### `CurveNetBuilder`
1371
+
1372
+ #### `toSheet(): Sheet` — Build (once) and return the Sheet.
1373
+
1374
+ - `lengthwise(...curves: CurveInput[]): this`
1375
+ - `crosswise(...curves: CurveInput[]): this`
1376
+ - `alongRails(railA: CurveInput, railB: CurveInput): this`
1377
+ - `sections(...curves: CurveInput[]): this`
1378
+ - `cage(grid: Vec3[][]): this`
1379
+ - `degree(u: number, v: number): this`
1380
+ - `get frontEdge(): SheetEdge`
1381
+ - `get rearEdge(): SheetEdge`
1382
+ - `get leftEdge(): SheetEdge`
1383
+ - `get rightEdge(): SheetEdge`
1384
+ - `get surface(): BSplineSurface`
1385
+ - `pointAt(u: number, v: number): Vec3`
1386
+ - `normalAt(u: number, v: number): Vec3`
1387
+ - `curvatureAt(u: number, v: number): SurfaceCurvature`
1388
+ - `thicken(wall: number, options?: { resolution?: number; }): Shape`
1389
+ - `matchEdge(edge: SheetEdge): MatchEdgeBuilder`
1390
+
1391
+ ### `MatchEdgeBuilder`
1392
+
1393
+ - `toG0(neighbor: SheetEdge): Sheet`
1394
+ - `toG1(neighbor: SheetEdge): Sheet`
1395
+ - `toG2(neighbor: SheetEdge): Sheet`
1396
+
1397
+ ### `BridgeBuilder`
1398
+
1399
+ #### `bulge(a: number, b: number): this` — Tune the influence of each side (Rhino-style bulge).
1400
+
1401
+ - `g0(): Sheet`
1402
+ - `g1(): Sheet`
1403
+ - `g2(): Sheet`
1404
+
1336
1405
  ### `ShapeRef`
1337
1406
 
1338
1407
  A first-class reference path over a shape's semantic faces and face relationships.
@@ -426,7 +426,11 @@ const outlet = route.port("outlet");
426
426
 
427
427
  #### `pointAt(u: number, v: number): Vec3` — Evaluate the surface at parameters (u, v) ∈ [0, 1]². Uses tensor product evaluation: evaluate basis functions in U and V independently.
428
428
 
429
- #### `normalAt(u: number, v: number): Vec3` — Evaluate the surface normal at (u, v) via cross product of partial derivatives.
429
+ #### `normalAt(u: number, v: number): Vec3` — Evaluate the surface unit normal at (u, v) from analytic first derivatives.
430
+
431
+ Uses Algorithm A2.3 basis-function derivatives with the rational quotient rule, so the normal is exact (no finite-difference epsilon, no error near the boundary). Constant chain-rule factors from the parameter remap scale Su and Sv positively and cancel under normalization, so they are omitted.
432
+
433
+ #### `derivativesAt(u: number, v: number): { S: Vec3; Su: Vec3; Sv: Vec3; }` — Analytic first partial derivatives S_u, S_v (rational quotient rule).
430
434
 
431
435
  #### `tessellate(resU?: number, resV?: number): { positions: Vec3[]; normals: Vec3[]; indices: number[]; }` — Tessellate the surface into a triangle mesh. Returns positions, normals, and triangle indices.
432
436
 
@@ -1165,16 +1169,19 @@ Members (full entries under [Curves & Surfacing](#curves-surfacing)): `Curve.Ble
1165
1169
  - `Trim(shape: Shape, tool: Shape | SurfacePlaneOp): Shape`
1166
1170
  - `Split(shape: Shape, tool: Shape | SurfacePlaneOp): [ Shape, Shape ]`
1167
1171
  - `Match(shape: Shape, options: { edge: "u0" | "u1" | "v0" | "v1"; target: EdgeRef; continuity?: SurfaceContinuity; }): Shape`
1172
+ - `Net(): CurveNet` — Begin a curve-network (Gordon) surface — the class-A keystone. Chain `.lengthwise(...)/.crosswise(...)` (or `.alongRails(a,b).sections(...)`, or `.cage(grid)`), then `.thicken(wall)` to get a solid Shape. Returns a fluent [`Sheet`](/docs/core#sheet) builder with analytic point/normal/curvature queries and named edges.
1168
1173
 
1169
1174
  ### `Blend`
1170
1175
 
1171
1176
  - `Edge(options: BlendEdgeOptions): Shape`
1172
1177
  - `Surface(options: BlendSurfaceOptions): Shape`
1178
+ - `Bridge(edgeA: SheetEdge, edgeB: SheetEdge): BridgeBuilder` — Build a transition strip between two `Surface.Net` sheet edges. Chain `.bulge(a, b)` then `.g0()/.g1()/.g2()` for the continuity order. Returns a [`Sheet`](/docs/core#sheet); verify the seam with `Analysis.EdgeMatch`.
1173
1179
 
1174
1180
  ### `Analysis`
1175
1181
 
1176
1182
  - `EdgeContinuity(shape: Shape, options?: EdgeContinuityThresholds): EdgeContinuityReport`
1177
1183
  - `SurfaceContinuity(shape: Shape, options?: EdgeContinuityThresholds): EdgeContinuityReport`
1184
+ - `EdgeMatch(edgeA: SheetEdge, edgeB: SheetEdge, options?: { samples?: number; }): ContinuityReport` — Measure G0/G1/G2 agreement between two `Surface.Net` sheet edges: worst position gap, cross-boundary tangent angle (0 = G1), and normal-curvature mismatch (0 = G2). The reflection/fairness check for matched panel seams.
1178
1185
  - `CurvatureComb(input: NurbsCurve3D | EdgeRef, options?: { samples?: number; }): CurvatureSample[]`
1179
1186
  - `SurfaceHealth(shape: Shape, options?: { tinyEdgeThreshold?: number; sliverThreshold?: number; }): SurfaceHealthReport`
1180
1187
  - `BRepValidity(shape: Shape, options?: BRepValidityOptions): BRepValidityReport` — Validate B-rep/shell/solid structure and return closedness, manifoldness, orientation, and issue diagnostics.
@@ -58,70 +58,6 @@ bom(tubeLen, "rectangular steel tube", {
58
58
  | `notes?` | `string` | Free-form notes |
59
59
  | `grain?` | `string` | Wood grain direction, e.g. "long", "cross" |
60
60
 
61
- #### `robotExport(options: RobotExportOptions): CollectedRobotExport` — Compatibility shim for SDF/URDF robot package metadata.
62
-
63
- Prefer returning `assembly(...).withSimulation(...)` with `Sim.body(...)`, `Sim.drive.*(...)`, and `Sim.controller.*(...)` metadata. The CLI commands `forgecad export sdf` and `forgecad export urdf` now read that assembly simulation contract directly.
64
-
65
- `robotExport()` remains available for one compatibility window. It converts the legacy descriptor into the same internal simulation model used by source-authored `Sim` metadata and produces a robot package with:
66
-
67
- - Mesh-based inertia tensors (full 6-component, not bounding-box approximations)
68
- - Separate collision meshes
69
- - Joint limits, effort/velocity/damping/friction metadata from assembly joints
70
-
71
- **Collision mesh modes** (set per-link via `links["PartName"].collision`):
72
-
73
- | Mode | Description | Default |
74
- |------|-------------|---------|
75
- | `'convex'` | Convex hull (separate `_collision.stl`) | Yes |
76
- | `'box'` | AABB primitive — fastest physics | |
77
- | `'visual'` | Same mesh as visual — exact but slow | |
78
- | `'none'` | No collision geometry | |
79
-
80
- **Unit conventions:**
81
-
82
- - Revolute `velocity` is in degrees/second in Forge; exporters convert to rad/s.
83
- - Prismatic distances are in mm in Forge; exported in meters.
84
- - `massKg` is preferred; `densityKgM3` is used when mass is unknown.
85
- - Compatibility coupling metadata, when present, maps only the primary term (largest ratio) to `<mimic>` — SDF/URDF support single-leader mimic only. Dropped terms emit a warning.
86
-
87
- **Legacy example**
88
-
89
- ```ts
90
- robotExport({
91
- assembly: rover, // assembly() with parts + revolute wheel joints
92
- modelName: "Scout",
93
- links: { Chassis: { massKg: 10 }, "Left Wheel": { massKg: 0.8 } },
94
- plugins: {
95
- diffDrive: {
96
- leftJoints: ["leftWheel"], rightJoints: ["rightWheel"],
97
- wheelSeparationMm: 280, wheelRadiusMm: 60,
98
- },
99
- },
100
- world: { generateDemoWorld: true },
101
- });
102
- ```
103
-
104
- **Preferred CLI usage**
105
-
106
- ```bash
107
- forgecad export sdf model.forge.js # SDF package (Gazebo/Ignition)
108
- forgecad export urdf model.forge.js # URDF package (ROS/PyBullet/MuJoCo)
109
- ```
110
-
111
- **`RobotExportOptions`**: `assembly: Assembly`, `modelName?: string`, `state?: JointState`, `static?: boolean`, `selfCollide?: boolean`, `allowAutoDisable?: boolean`, `links?: Record<string, RobotLinkExportOptions>`, `joints?: Record<string, RobotJointExportOptions>`, `plugins?: { diffDrive?: RobotDiffDrivePluginOptions; jointStatePublisher?: RobotJointStatePublisherOptions; }`, `world?: RobotWorldOptions`
112
-
113
- `RobotLinkExportOptions`: `{ massKg?: number, densityKgM3?: number, collision?: "visual" | "convex" | "box" | "none" }`
114
-
115
- `RobotJointExportOptions`: `{ effort?: number, velocity?: number, damping?: number, friction?: number }`
116
-
117
- **`RobotDiffDrivePluginOptions`**: `leftJoints: string[]`, `rightJoints: string[]`, `wheelSeparationMm: number`, `wheelRadiusMm: number`, `topic?: string`, `odomTopic?: string`, `tfTopic?: string`, `frameId?: string`, `odomFrameId?: string`, `maxLinearVelocity?: number`, `maxAngularVelocity?: number`, `linearAcceleration?: number`, `angularAcceleration?: number`
118
-
119
- `RobotJointStatePublisherOptions`: `{ enabled?: boolean, joints?: string[], topic?: string, updateRate?: number }`
120
-
121
- `RobotWorldOptions`: `{ name?: string, generateDemoWorld?: boolean, spawnPose?: RobotPose6, keyboardTeleop?: RobotWorldKeyboardTeleopOptions }`
122
-
123
- `RobotWorldKeyboardTeleopOptions`: `{ enabled?: boolean, linearStep?: number, angularStep?: number }`
124
-
125
61
  #### `dim()` — Add a dimension annotation between two points, or along an entity.
126
62
 
127
63
  Overloads:
@@ -24,12 +24,12 @@ lib, Line2D, linearPattern, linearPattern2d, loadFont, loft, Loft, mirrorCopy
24
24
  mock, ngon, NurbsCurve3D, NurbsSurface, offsetSolid, param, Param, path
25
25
  Point2D, Points, polygon, polygonVertices, port, Product, ProductPanelBuilder, ProductRibbonBuilder
26
26
  ProductSkin, ProductSkinBuilder, ProductStationBuilder, ProductSurfaceBuilder, ProductSurfaceRef, projectToPlane, queueMicrotask, rect
27
- Rectangle2D, robotExport, roundedRect, Route3D, scene, Sculpt, sdf, SdfShape
28
- selectEdge, selectEdges, self, setActiveBackend, setImmediate, setInterval, setTimeout, Shape
29
- ShapeGroup, sheetMetal, SheetMetalPart, sheetStock, Sim, Sketch, sketchToDxf, sketchToSvg
30
- slot, SolvedAssembly, spec, sphere, spline2d, stroke, Surface, SurfaceBody
31
- SurfaceMembers, sweep, text2d, textWidth, torus, toShape, Transform, union
32
- union2d, variableSweep, verify, Viewport, window, Wood
27
+ Rectangle2D, roundedRect, Route3D, scene, Sculpt, sdf, SdfShape, selectEdge
28
+ selectEdges, self, setActiveBackend, setImmediate, setInterval, setTimeout, Shape, ShapeGroup
29
+ sheetMetal, SheetMetalPart, sheetStock, Sim, Sketch, sketchToDxf, sketchToSvg, slot
30
+ SolvedAssembly, spec, sphere, spline2d, stroke, Surface, SurfaceBody, SurfaceMembers
31
+ sweep, text2d, textWidth, torus, toShape, Transform, union, union2d
32
+ variableSweep, verify, Viewport, window, Wood
33
33
  ```
34
34
 
35
35
  `showLabels` is also a runtime global, but it is not part of the top-level collision check. Avoid reusing it unless you intentionally want a local value with that name.
@@ -79,7 +79,7 @@ return b;
79
79
 
80
80
  #### `scene(options: SceneOptions): void` — Configure the scene environment for the current script execution.
81
81
 
82
- Controls camera, named render views, guided journeys, lighting, background, fog, environment maps, post-processing, capture defaults, and the joint-control helper overlay (`jointOverlay` — axis arrows and arc indicators, renderer-only). Multiple `scene()` calls merge per-key — later values win — so configuration can be split across calls.
82
+ Controls camera, named render views, guided journeys, lighting, background, fog, environment maps, capture defaults, and the joint-control helper overlay (`jointOverlay` — axis arrows and arc indicators, renderer-only). Multiple `scene()` calls merge per-key — later values win — so configuration can be split across calls.
83
83
 
84
84
  Two behavioral cliffs:
85
85
 
@@ -90,7 +90,7 @@ Named views are repeatable cameras checked in with the model code. Canonical sha
90
90
 
91
91
  Journeys are ordered `steps`, each focusing a returned object by name/tree path with an optional caption and camera. In the viewer they are opt-in (an Explore control; the camera does not move until started). Inspect resolved targets with `forgecad run --journeys`.
92
92
 
93
- Post-processing (`bloom`, `vignette`, `grain`) is browser-only; the CLI applies camera, lights, background, fog, and `toneMappingExposure` but skips shader effects.
93
+ Post-processing is disabled for now while the browser EffectComposer flicker path is being rebuilt. Existing scripts that pass `postProcessing` continue running, but the option is not part of the active scene API.
94
94
 
95
95
  All numeric values accept `param()` expressions.
96
96
 
@@ -109,7 +109,6 @@ scene({
109
109
  { type: 'directional', position: [50, -30, 200], color: '#ffd60a', intensity: 1.2 },
110
110
  ],
111
111
  fog: { color: '#000814', near: 100, far: 450 },
112
- postProcessing: { bloom: { intensity: param('bloom', 1.5, 0, 4) } },
113
112
  jointOverlay: { axisColor: '#13dfff', arcColor: '#ff7a1a' },
114
113
  });
115
114
  ```
@@ -120,7 +119,7 @@ scene({
120
119
  |--------|------|-------------|
121
120
  | `capture?` | `SceneCaptureConfig` | Default capture parameters for `forgecad capture` — CLI flags override these. |
122
121
 
123
- Also: `background?: string | SceneBackgroundGradient`, `camera?: SceneCameraConfig`, `views?: Record<string, SceneViewInputConfig>`, `journeys?: Record<string, SceneJourneyConfig>`, `lights?: SceneLightConfig[]`, `environment?: SceneEnvironmentConfig`, `fog?: SceneFogConfig`, `postProcessing?: ScenePostProcessingConfig`, `ground?: SceneGroundConfig`.
122
+ Also: `background?: string | SceneBackgroundGradient`, `camera?: SceneCameraConfig`, `views?: Record<string, SceneViewInputConfig>`, `journeys?: Record<string, SceneJourneyConfig>`, `lights?: SceneLightConfig[]`, `environment?: SceneEnvironmentConfig`, `fog?: SceneFogConfig`, `ground?: SceneGroundConfig`.
124
123
 
125
124
  `SceneBackgroundGradient`: `{ top: string, bottom: string }`
126
125
 
@@ -174,14 +173,6 @@ Also: `type: SceneLightType`, `color?: string`, `intensity?: number`, `position?
174
173
  - `density?: number` — Exponential fog density (if set, uses FogExp2 instead of linear Fog)
175
174
  - Also: `color?: string`.
176
175
 
177
- `ScenePostProcessingConfig`: `{ bloom?: SceneBloomConfig, vignette?: SceneVignetteConfig, grain?: SceneGrainConfig, toneMappingExposure?: number }`
178
-
179
- `SceneBloomConfig`: `{ intensity?: number, threshold?: number, radius?: number }`
180
-
181
- `SceneVignetteConfig`: `{ darkness?: number, offset?: number }`
182
-
183
- `SceneGrainConfig`: `{ intensity?: number }`
184
-
185
176
  **`SceneGroundConfig`**
186
177
 
187
178
  | Option | Type | Description |
@@ -5,7 +5,7 @@ skill-order: 2
5
5
 
6
6
  # Inspection Bundles — Evidence Contract
7
7
 
8
- `forgecad inspect <family> <mode>` writes a deterministic bundle: evidence PNGs under `evidence/<type>/` plus a root `manifest.json`. **The manifest is the authoritative contract** — take file paths, encodings, per-view ranges, thresholds, tolerances, and identity maps from it; never hard-code bundle layout or infer object identity from object order. The PNGs are a visual index for locating findings, not standalone artifacts. Command tree, flags, and `--focus`/`--hide` filtering live in `docs/permanent/CLI.md` and `forgecad inspect evidence`; the inspection workflow lives in the `forgecad-render-inspect` skill. Model-authored `scene()` background, lights, fog, and exposure are ignored for inspection captures so evidence stays stable; named scene views remain available via `--view`.
8
+ `forgecad inspect <family> <mode>` writes a deterministic bundle: evidence PNGs under `evidence/<type>/` plus a root `manifest.json`. **The manifest is the authoritative contract** — take file paths, encodings, per-view ranges, thresholds, tolerances, and identity maps from it; never hard-code bundle layout or infer object identity from object order. The PNGs are a visual index for locating findings, not standalone artifacts. Command tree, flags, and `--focus`/`--hide` filtering live in `docs/skill/CLI.md` and `forgecad inspect evidence`; the inspection workflow lives in the `forgecad-render-inspect` skill. Model-authored `scene()` background, lights, fog, and exposure are ignored for inspection captures so evidence stays stable; named scene views remain available via `--view`.
9
9
 
10
10
  Manifest evidence keys are evidence-oriented and stable for bundle readers: e.g. `fit interference` writes `manifest.evidence.collisions`, `physical components` writes `manifest.evidence.connectivity`.
11
11
 
@@ -11,13 +11,12 @@ The installed skill names are namespaced to avoid collisions with a user's exist
11
11
  - `forgecad-3d-reconstruction`
12
12
  - `forgecad-blockout-model`
13
13
  - `forgecad-component-model`
14
- - `forgecad-high-level-spec`
15
14
  - `forgecad-image-replicator`
16
- - `forgecad-lld`
17
15
  - `forgecad-make-a-model`
18
16
  - `forgecad-model-grader`
19
- - `forgecad-prepare-prompt`
17
+ - `forgecad-mujoco-verify`
20
18
  - `forgecad-project`
21
19
  - `forgecad-reconstruction-benchmark`
22
20
  - `forgecad-render-inspect`
21
+ - `forgecad-spec-by-walking-through-it`
23
22
  - `forgecad-visual-spec`
@@ -11,7 +11,7 @@ A blockout is a spatial planning artifact: 3-7 simple masses that answer where p
11
11
  | Need | Skill |
12
12
  |------|-------|
13
13
  | High-level 3D idea using simple masses | `forgecad-blockout-model` |
14
- | Written concept or architecture before CAD | `forgecad-high-level-spec` |
14
+ | Written concept or architecture before CAD | `forgecad-spec-by-walking-through-it` |
15
15
  | Accurate, detailed, parametric ForgeCAD model | `forgecad-make-a-model` |
16
16
 
17
17
  ## Method