forgecad 0.10.2 → 0.10.4
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.
- package/README.md +7 -6
- package/dist/assets/{AdminPage-CHY6ZN-p.js → AdminPage-B3L3W1Uo.js} +1 -1
- package/dist/assets/{BenchmarkPage-BcRT5iGN.js → BenchmarkPage-DXKVXMrJ.js} +2 -2
- package/dist/assets/{BlogPage-BssBbnb-.js → BlogPage-B7BWxOCg.js} +1 -1
- package/dist/assets/{DocsPage-DsvdiRNK.js → DocsPage-BPGGwht1.js} +28 -48
- package/dist/assets/{EditorApp-Bfd3jbtC.js → EditorApp-BWUGCdD5.js} +183 -21
- package/dist/assets/{EditorApp-BpjZgzk0.css → EditorApp-C5f24ZN9.css} +8 -0
- package/dist/assets/{EmbedViewer-D5t8WamV.js → EmbedViewer-DygByZS2.js} +2 -2
- package/dist/assets/{LandingPageProofDriven-DbN7o-Be.js → LandingPageProofDriven-BoVE7JGY.js} +54 -36
- package/dist/assets/{LegalPage-DNGrrY0p.js → LegalPage-Din8wv8d.js} +2 -2
- package/dist/assets/{PricingPage-Nczr3pRz.js → PricingPage-C2PMzmDc.js} +2 -2
- package/dist/assets/{SettingsPage-DZlyu4d4.js → SettingsPage-BlJDCRe8.js} +1 -1
- package/dist/assets/{app-C9ct2hRD.js → app-BsRYSfxY.js} +2264 -6259
- package/dist/assets/{backendInit-ymjonyQp.js → backendInit-6C0DLgH0.js} +8290 -2136
- package/dist/assets/cli/{render-B_0lQwKU.js → render-XXol_ET7.js} +822 -105
- package/dist/assets/{constructionHistoryWorker-CZ42Dksy.js → constructionHistoryWorker-cTHWRJEi.js} +699 -284
- package/dist/assets/{evalWorker-C2pm8LHP.js → evalWorker-BssDYW9u.js} +2559 -1330
- package/dist/assets/{forgecad_geometry-BlMtqluF.js → forgecad_geometry-CZ_IfuvA.js} +1 -9
- package/dist/assets/{forgecad_geometry_bg-BllP_WiL.wasm → forgecad_geometry_bg-C3rQHfwg.wasm} +0 -0
- package/dist/assets/{inspectWorker-D5T5VbfK.js → inspectWorker-ymhBV4Ll.js} +6254 -671
- package/dist/assets/{jointPose-4r8ed8_5.js → jointPose-B0blBj9A.js} +1 -1
- package/dist/assets/{landing-proof-driven-ORyigZ6p.css → landing-proof-driven-Cpf-MIbI.css} +73 -13
- package/dist/assets/{manifold-5PP1eGLN.js → manifold-B_7QXpGB.js} +1 -1
- package/dist/assets/{manifold-DjBkyIc8.js → manifold-CNShmpEJ.js} +1 -1
- package/dist/assets/{manifold-C4r6B-XY.js → manifold-CYlIm-M6.js} +2 -2
- package/dist/assets/{reportWorker-CwenM7wB.js → reportWorker-Cb5eyM7D.js} +2485 -1275
- package/dist/cli/render.html +1 -1
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/AI/usage.md +17 -17
- package/dist/docs-raw/CLI.md +9 -7
- package/dist/docs-raw/README.md +1 -1
- package/dist/docs-raw/component-model.md +2 -2
- package/dist/docs-raw/generated/assembly.md +1 -1
- package/dist/docs-raw/generated/concepts.md +10 -4
- package/dist/docs-raw/generated/core.md +96 -1
- package/dist/docs-raw/generated/curves.md +8 -1
- package/dist/docs-raw/generated/output.md +0 -64
- package/dist/docs-raw/generated/runtime-names.md +6 -6
- package/dist/docs-raw/generated/viewport.md +3 -12
- package/dist/docs-raw/guides/inspection-bundles.md +1 -1
- package/dist/docs-raw/simulation-workflow.md +58 -0
- package/{dist-skill/website/skills/forgecad-make-a-model.md → dist/docs-raw/skills/forgecad-build-model.md} +18 -8
- package/dist/docs-raw/skills/forgecad-design-spec.md +145 -0
- package/dist/docs-raw/skills/{forgecad-model-grader.md → forgecad-grade-model.md} +8 -6
- package/{dist-skill/website/skills/forgecad-visual-spec.md → dist/docs-raw/skills/forgecad-image-prompt.md} +7 -7
- package/dist/docs-raw/skills/{forgecad-render-inspect.md → forgecad-inspect-model.md} +6 -6
- package/{dist-skill/website/skills/forgecad-project.md → dist/docs-raw/skills/forgecad-project-sync.md} +5 -5
- package/{dist-skill/website/skills/forgecad-3d-reconstruction.md → dist/docs-raw/skills/forgecad-reconstruct-cad-file.md} +7 -7
- package/dist/docs-raw/skills/{forgecad-image-replicator.md → forgecad-reconstruct-from-images.md} +12 -12
- package/dist/docs-raw/skills/forgecad-verify-mujoco.md +78 -0
- package/dist/docs-raw/skills/forgecad.md +24 -24
- package/dist/docs-raw/skills/index.md +9 -13
- package/dist/index.html +9 -9
- package/dist/llms.txt +7 -7
- package/dist/sitemap.xml +16 -16
- package/dist-cli/{check-compiler-SP7FAL7R.js → check-compiler-4RPB6SB5.js} +1 -1
- package/dist-cli/{check-query-propagation-BRLSHP22.js → check-query-propagation-KN3DFQTX.js} +1 -1
- package/dist-cli/{chunk-RQQ42YCP.js → chunk-UHBRMYA6.js} +30770 -29253
- package/dist-cli/forgecad.js +3277 -237
- package/dist-cli/{forgecad_geometry-7TVSNVUB.js → forgecad_geometry-2IMYCUWW.js} +0 -8
- package/dist-cli/forgecad_geometry_bg.wasm +0 -0
- package/dist-skill/CONTEXT.md +111 -73
- package/dist-skill/SKILL.md +1 -1
- package/dist-skill/docs/CLI.md +9 -7
- package/dist-skill/docs/generated/assembly.md +1 -1
- package/dist-skill/docs/generated/core.md +96 -1
- package/dist-skill/docs/generated/curves.md +8 -1
- package/dist-skill/docs/generated/output.md +0 -64
- package/dist-skill/docs/generated/runtime-names.md +6 -6
- package/dist-skill/docs/generated/viewport.md +3 -12
- package/dist-skill/docs/guides/inspection-bundles.md +1 -1
- package/dist-skill/library/README.md +9 -13
- package/dist-skill/library/{forgecad-make-a-model → forgecad-build-model}/SKILL.md +16 -6
- package/dist-skill/library/forgecad-design-spec/SKILL.md +132 -0
- package/dist-skill/library/{forgecad-prepare-prompt → forgecad-design-spec}/references/master-prompt.md +1 -1
- package/dist-skill/library/{forgecad-model-grader → forgecad-grade-model}/SKILL.md +6 -4
- package/dist-skill/library/forgecad-grade-model/agents/openai.yaml +4 -0
- package/dist-skill/library/{forgecad-visual-spec → forgecad-image-prompt}/SKILL.md +5 -5
- package/dist-skill/library/forgecad-image-prompt/agents/openai.yaml +4 -0
- package/dist-skill/library/{forgecad-render-inspect → forgecad-inspect-model}/SKILL.md +4 -4
- package/dist-skill/library/{forgecad-project → forgecad-project-sync}/SKILL.md +3 -3
- package/dist-skill/library/{forgecad-3d-reconstruction → forgecad-reconstruct-cad-file}/SKILL.md +5 -5
- package/dist-skill/library/forgecad-reconstruct-cad-file/agents/openai.yaml +4 -0
- package/dist-skill/library/{forgecad-image-replicator → forgecad-reconstruct-from-images}/SKILL.md +10 -10
- package/dist-skill/library/forgecad-reconstruct-from-images/agents/openai.yaml +4 -0
- package/dist-skill/library/forgecad-verify-mujoco/SKILL.md +66 -0
- package/dist-skill/library/forgecad-verify-mujoco/scripts/mujoco_verify.py +385 -0
- package/{dist/docs-raw/skills/forgecad-make-a-model.md → dist-skill/website/skills/forgecad-build-model.md} +18 -8
- package/dist-skill/website/skills/forgecad-design-spec.md +145 -0
- package/dist-skill/website/skills/{forgecad-model-grader.md → forgecad-grade-model.md} +8 -6
- package/{dist/docs-raw/skills/forgecad-visual-spec.md → dist-skill/website/skills/forgecad-image-prompt.md} +7 -7
- package/dist-skill/website/skills/{forgecad-render-inspect.md → forgecad-inspect-model.md} +6 -6
- package/{dist/docs-raw/skills/forgecad-project.md → dist-skill/website/skills/forgecad-project-sync.md} +5 -5
- package/{dist/docs-raw/skills/forgecad-3d-reconstruction.md → dist-skill/website/skills/forgecad-reconstruct-cad-file.md} +7 -7
- package/dist-skill/website/skills/{forgecad-image-replicator.md → forgecad-reconstruct-from-images.md} +12 -12
- package/dist-skill/website/skills/forgecad-verify-mujoco.md +78 -0
- package/dist-skill/website/skills/forgecad.md +24 -24
- package/dist-skill/website/skills/index.md +9 -13
- package/examples/analysis/clearance-fit.forge.js +31 -0
- package/examples/analysis/lever-arm-actuator.forge.js +43 -0
- package/examples/analysis/tipping-tripod.forge.js +35 -0
- package/examples/api/texture-projection.forge.js +75 -0
- package/examples/assets/uv-grid.png +0 -0
- package/examples/products/sportscar.forge.js +77 -0
- package/package.json +1 -3
- package/dist/docs-raw/skills/forgecad-blockout-model.md +0 -49
- package/dist/docs-raw/skills/forgecad-component-model.md +0 -53
- package/dist/docs-raw/skills/forgecad-high-level-spec.md +0 -101
- package/dist/docs-raw/skills/forgecad-lld.md +0 -41
- package/dist/docs-raw/skills/forgecad-prepare-prompt.md +0 -63
- package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +0 -60
- package/dist-skill/library/forgecad-3d-reconstruction/agents/openai.yaml +0 -4
- package/dist-skill/library/forgecad-blockout-model/SKILL.md +0 -42
- package/dist-skill/library/forgecad-component-model/SKILL.md +0 -46
- package/dist-skill/library/forgecad-high-level-spec/SKILL.md +0 -94
- package/dist-skill/library/forgecad-image-replicator/agents/openai.yaml +0 -4
- package/dist-skill/library/forgecad-lld/SKILL.md +0 -34
- package/dist-skill/library/forgecad-model-grader/agents/openai.yaml +0 -4
- package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +0 -50
- package/dist-skill/library/forgecad-reconstruction-benchmark/SKILL.md +0 -48
- package/dist-skill/library/forgecad-reconstruction-benchmark/agents/openai.yaml +0 -4
- package/dist-skill/library/forgecad-visual-spec/agents/openai.yaml +0 -4
- package/dist-skill/website/skills/forgecad-blockout-model.md +0 -49
- package/dist-skill/website/skills/forgecad-component-model.md +0 -53
- package/dist-skill/website/skills/forgecad-high-level-spec.md +0 -101
- package/dist-skill/website/skills/forgecad-lld.md +0 -41
- package/dist-skill/website/skills/forgecad-prepare-prompt.md +0 -63
- package/dist-skill/website/skills/forgecad-reconstruction-benchmark.md +0 -60
- /package/dist/assets/{landing-proof-driven-DiGqdtWa.js → landing-proof-driven-BxZZh5r5.js} +0 -0
- /package/dist-skill/library/{forgecad-prepare-prompt → forgecad-design-spec}/references/default-profiles.md +0 -0
- /package/dist-skill/library/{forgecad-render-inspect → forgecad-inspect-model}/summarize_manifest.py +0 -0
- /package/dist-skill/library/{forgecad-image-replicator → forgecad-reconstruct-from-images}/scripts/compare_images.py +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Bitmap Texturing: Projected UV
|
|
2
|
+
//
|
|
3
|
+
// Wrap an imported bitmap onto a surface with `Shape.wrapTexture(image,
|
|
4
|
+
// projection)`. The projection (a `Wrap.*` helper) decides how each point of the
|
|
5
|
+
// surface maps into the image — no UV unwrapping, no Math.sin/cos.
|
|
6
|
+
//
|
|
7
|
+
// The image's colored edges (top=red, right=green, bottom=blue, left=orange) and
|
|
8
|
+
// the dark top-left corner wedge make the mapping orientation easy to read on
|
|
9
|
+
// every shape.
|
|
10
|
+
//
|
|
11
|
+
// Two key properties:
|
|
12
|
+
// 1. AUTO-FIT — a bare `Wrap.flat/box/aroundCylinder` (no width/height/size)
|
|
13
|
+
// maps ONE copy of the image across the shape's extent. No magic numbers:
|
|
14
|
+
// the fit is read from the shape's bounding box.
|
|
15
|
+
// 2. WORLD-SPACE & BOOLEAN-SAFE — the UV is derived from each vertex's final
|
|
16
|
+
// world position at render time, so the texture survives cuts/unions AND so
|
|
17
|
+
// you must texture a shape *after* positioning it (auto-fit reads the final
|
|
18
|
+
// world box; see the rightmost part, textured *then* bored).
|
|
19
|
+
|
|
20
|
+
const tile = Param.number("Tile repeat", 1, { min: 1, max: 6, step: 1 });
|
|
21
|
+
|
|
22
|
+
const art = Import.image("assets/uv-grid.png");
|
|
23
|
+
|
|
24
|
+
// Laid out left-to-right in a tidy row on the z = 0 ground plane, ~25 mm gaps so
|
|
25
|
+
// nothing overlaps. box() and sphere() are origin-centered (lift them by half
|
|
26
|
+
// their height to sit on the ground); cylinder(height, radius) already has its
|
|
27
|
+
// base at z = 0, so the can needs no z lift.
|
|
28
|
+
//
|
|
29
|
+
// In every case: build → translate → wrapTexture LAST, so auto-fit reads the
|
|
30
|
+
// final world bounding box.
|
|
31
|
+
|
|
32
|
+
// 1. FLAT — lay the image onto one axis-aligned face (a logo on a plate's top).
|
|
33
|
+
// No width/height: auto-fit maps the face span to the image once. `repeat`
|
|
34
|
+
// tiles that single fitted copy.
|
|
35
|
+
const plate = box(50, 50, 8)
|
|
36
|
+
.translate(-140, 0, 4)
|
|
37
|
+
.wrapTexture(art, Wrap.flat({ onto: "top", repeat: [tile, tile] }));
|
|
38
|
+
|
|
39
|
+
// 2. AROUND A CYLINDER — wrap the image like a can label. `axis` is the cylinder
|
|
40
|
+
// axis; the seam falls on the -X side (the atan2 wrap at ±π). No height:
|
|
41
|
+
// auto-fit maps the can's full height to the image once.
|
|
42
|
+
const can = cylinder(55, 20)
|
|
43
|
+
.translate(-70, 0, 0)
|
|
44
|
+
.wrapTexture(art, Wrap.aroundCylinder({ axis: "z" }));
|
|
45
|
+
|
|
46
|
+
// 3. ONTO A SPHERE — longitude/latitude mapping, like a globe. Auto-fit centers
|
|
47
|
+
// the projection on the sphere wherever it sits.
|
|
48
|
+
const globe = sphere(26)
|
|
49
|
+
.translate(0, 0, 26)
|
|
50
|
+
.wrapTexture(art, Wrap.onSphere());
|
|
51
|
+
|
|
52
|
+
// 4. BOX (cube-map) — the dominant face axis picks one of three planar maps, so
|
|
53
|
+
// each of the six sides shows one copy of the image. No size: auto-fit reads
|
|
54
|
+
// the box extent.
|
|
55
|
+
const crate = box(40, 40, 40)
|
|
56
|
+
.translate(70, 0, 20)
|
|
57
|
+
.wrapTexture(art, Wrap.box());
|
|
58
|
+
|
|
59
|
+
// 5. BOOLEAN-SAFE — position the plate, texture it (auto-fit over the solid
|
|
60
|
+
// plate), THEN subtract a bore. The image keeps flowing across the top and
|
|
61
|
+
// around the freshly-cut hole because the UV is re-derived from world position
|
|
62
|
+
// every frame, not baked into the original mesh. (Texture-then-cut, no
|
|
63
|
+
// translate after — the world-space UV must be locked before the boolean.)
|
|
64
|
+
const bored = box(50, 50, 16)
|
|
65
|
+
.translate(140, 0, 8)
|
|
66
|
+
.wrapTexture(art, Wrap.flat({ onto: "top", repeat: [tile, tile] }))
|
|
67
|
+
.subtract(cylinder(40, 12).translate(140, 0, -12)); // through-hole, centered on the plate
|
|
68
|
+
|
|
69
|
+
return [
|
|
70
|
+
{ name: "Flat (plate top)", shape: plate },
|
|
71
|
+
{ name: "Cylinder (label)", shape: can },
|
|
72
|
+
{ name: "Sphere (globe)", shape: globe },
|
|
73
|
+
{ name: "Box (cube-map)", shape: crate },
|
|
74
|
+
{ name: "Boolean-safe (bored)", shape: bored },
|
|
75
|
+
];
|
|
Binary file
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Sports-car body — a showcase of class-A curve-network surfacing (Surface.Net).
|
|
2
|
+
// Two Gordon surfaces compose the car: a near-closed lower body with fender
|
|
3
|
+
// bulges, and an inset fastback greenhouse. Each is thickened to a glassy shell
|
|
4
|
+
// (analytic vertex normals that survive the boolean wheel-arch cuts), then the
|
|
5
|
+
// tyres are tucked into the arches.
|
|
6
|
+
|
|
7
|
+
// Normalized body cross-section outline (right side, bottom edge -> deck centre).
|
|
8
|
+
// y is a fraction of the half-width, z a fraction of floor..deck height.
|
|
9
|
+
const BODY_OUTLINE = [
|
|
10
|
+
[0.12, 0.00], [0.60, 0.01], [0.95, 0.10], [1.00, 0.32],
|
|
11
|
+
[0.99, 0.55], [0.90, 0.78], [0.62, 0.93], [0.00, 1.00],
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
// Wrap the outline into a full closed-ish section (right bottom -> deck -> left
|
|
15
|
+
// bottom), open only along a narrow underbody seam, so the thickened shell reads
|
|
16
|
+
// as a solid body.
|
|
17
|
+
function bodySection(halfW, floorZ, topZ) {
|
|
18
|
+
const cols = [];
|
|
19
|
+
for (let i = 0; i < BODY_OUTLINE.length; i++) {
|
|
20
|
+
const [yf, zf] = BODY_OUTLINE[i];
|
|
21
|
+
cols.push([yf * halfW, floorZ + zf * (topZ - floorZ)]);
|
|
22
|
+
}
|
|
23
|
+
for (let i = BODY_OUTLINE.length - 2; i >= 0; i--) {
|
|
24
|
+
const [yf, zf] = BODY_OUTLINE[i];
|
|
25
|
+
cols.push([-yf * halfW, floorZ + zf * (topZ - floorZ)]);
|
|
26
|
+
}
|
|
27
|
+
return cols; // [y, z] columns, right-bottom -> deck -> left-bottom
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// A simpler open arch (rocker/deck edge -> spine -> other edge) for the cabin dome.
|
|
31
|
+
function archSection(halfW, baseZ, topZ) {
|
|
32
|
+
const half = 7;
|
|
33
|
+
const cols = 2 * half - 1;
|
|
34
|
+
const out = [];
|
|
35
|
+
for (let c = 0; c < cols; c++) {
|
|
36
|
+
const s = c / (cols - 1);
|
|
37
|
+
const f = 1 - Math.abs(2 * s - 1);
|
|
38
|
+
const ease = f * f * (3 - 2 * f);
|
|
39
|
+
out.push([Math.sign(0.5 - s) * halfW * Math.pow(1 - f, 0.8), baseZ + (topZ - baseZ) * ease]);
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Assemble a cage from per-station section columns.
|
|
45
|
+
function cageFrom(xs, sectionAt) {
|
|
46
|
+
return xs.map((x, i) => sectionAt(i).map(([y, z]) => [x, y, z]));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ── Lower body: long & wide, fender bulges over the wheels, low deck ──────────
|
|
50
|
+
const bodyX = [0, 400, 950, 1500, 2100, 2700, 3250, 3800, 4200];
|
|
51
|
+
const deckZ = [420, 600, 690, 705, 710, 715, 730, 700, 560];
|
|
52
|
+
const floorZ = [300, 180, 150, 150, 155, 160, 165, 240, 380];
|
|
53
|
+
const fenderW = [300, 620, 880, 760, 780, 760, 890, 760, 380];
|
|
54
|
+
const body0 = Surface.Net().cage(cageFrom(bodyX, (i) => bodySection(fenderW[i], floorZ[i], deckZ[i]))).degree(3, 3);
|
|
55
|
+
let body = body0.thicken(10).color('#c01622');
|
|
56
|
+
|
|
57
|
+
// ── Greenhouse / cabin: long, low fastback set back on the deck ───────────────
|
|
58
|
+
const ghX = [1480, 1950, 2420, 2900, 3450];
|
|
59
|
+
const ghBase = [700, 706, 710, 714, 724];
|
|
60
|
+
const ghRoof = [725, 915, 975, 930, 745]; // windshield -> roof -> long backlight
|
|
61
|
+
const ghW = [560, 610, 580, 500, 330];
|
|
62
|
+
const cabin = Surface.Net().cage(cageFrom(ghX, (i) => archSection(ghW[i], ghBase[i], ghRoof[i]))).degree(3, 3);
|
|
63
|
+
body = union(body, cabin.thicken(10));
|
|
64
|
+
body = body.color('#c01622').material({ metalness: 0.55, roughness: 0.28, clearcoat: 1 });
|
|
65
|
+
|
|
66
|
+
// ── Wheel arches + tyres (tucked under the fenders) ──────────────────────────
|
|
67
|
+
const wheelR = 360;
|
|
68
|
+
const archZ = 360; // wheel centre height -> bottom near the ground, top inside the fender
|
|
69
|
+
const axleX = [1000, 3250];
|
|
70
|
+
for (const x of axleX) body = body.subtract(cylinder(2 * 980, wheelR + 30).rotateX(90).translate(x, 980, archZ));
|
|
71
|
+
|
|
72
|
+
const tyre = (x, side) =>
|
|
73
|
+
cylinder(240, wheelR).rotateX(90).translate(x, side * 740, archZ).color('#141414').material({ roughness: 0.85 });
|
|
74
|
+
const wheels = [];
|
|
75
|
+
for (const x of axleX) for (const side of [1, -1]) wheels.push(tyre(x, side));
|
|
76
|
+
|
|
77
|
+
export default group(body, ...wheels);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "forgecad",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.4",
|
|
4
4
|
"description": "Code-first parametric CAD for JavaScript/TypeScript, in the browser and CLI.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"homepage": "https://forgecad.io",
|
|
@@ -204,7 +204,6 @@
|
|
|
204
204
|
"@fastify/static": "^9.0.0",
|
|
205
205
|
"@fontsource/inter": "^5.2.8",
|
|
206
206
|
"@oclif/core": "^4.11.3",
|
|
207
|
-
"@react-three/postprocessing": "^3.0.4",
|
|
208
207
|
"argon2": "^0.44.0",
|
|
209
208
|
"chokidar": "^4.0.0",
|
|
210
209
|
"clipper-lib": "^6.4.2",
|
|
@@ -224,7 +223,6 @@
|
|
|
224
223
|
"pngjs": "^7.0.0",
|
|
225
224
|
"polygon-clipping": "^0.15.7",
|
|
226
225
|
"postgres": "^3.4.8",
|
|
227
|
-
"postprocessing": "^6.39.0",
|
|
228
226
|
"prom-client": "^15.1.3",
|
|
229
227
|
"puppeteer-core": "^24.37.2",
|
|
230
228
|
"react-router-dom": "^7.13.2",
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
<!-- Generated by scripts/build-forgecad-skill.mjs — do not edit. Edit agent-skill-library/forgecad-blockout-model/SKILL.md instead. -->
|
|
2
|
-
|
|
3
|
-
# forgecad-blockout-model
|
|
4
|
-
|
|
5
|
-
Create rough high-level ForgeCAD concept models from simple primitives to explore layout, proportions, motion, and part relationships without production detail. Use when asked for a quick model sketch, blockout, spatial mockup, or intuitive low-detail 3D concept.
|
|
6
|
-
|
|
7
|
-
| Field | Value |
|
|
8
|
-
| --- | --- |
|
|
9
|
-
| Installed by | `forgecad skill install` |
|
|
10
|
-
| Source | `agent-skill-library/forgecad-blockout-model/SKILL.md` |
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Block Out a Model
|
|
15
|
-
|
|
16
|
-
A blockout is a spatial planning artifact: 3-7 simple masses that answer where parts go, whether a mechanism makes spatial sense, and what the silhouette, footprint, or motion envelope looks like. Not for print-ready geometry, exact fit, tolerances, or detail work.
|
|
17
|
-
|
|
18
|
-
| Need | Skill |
|
|
19
|
-
|------|-------|
|
|
20
|
-
| High-level 3D idea using simple masses | `forgecad-blockout-model` |
|
|
21
|
-
| Written concept or architecture before CAD | `forgecad-high-level-spec` |
|
|
22
|
-
| Accurate, detailed, parametric ForgeCAD model | `forgecad-make-a-model` |
|
|
23
|
-
|
|
24
|
-
### Method
|
|
25
|
-
|
|
26
|
-
- Load the `forgecad` skill first; read its Core API and CLI docs. Load nothing else unless the concept demands it.
|
|
27
|
-
- Translate the idea into 3-7 conceptual parts BEFORE writing geometry: masses and zones (base, arm, payload, sweep volume, keep-out, hand access).
|
|
28
|
-
- One primitive stands in for many eventual details. A bounding box beats a fake detailed part. Never add detail as a substitute for clarity — simplify or reposition instead.
|
|
29
|
-
- Use round-number dimensions; "believably shaped" beats numerically correct. Name uncertainty honestly: `armLengthGuess`, `baseWidthApprox`, `clearanceEnvelope`.
|
|
30
|
-
- At most a handful of `param()` values, for comparing proportions. Do not parameterize every dimension.
|
|
31
|
-
- Color by meaning; keep each conceptual part visually distinct via color or opacity. Return named shape objects so the viewer can inspect the concept part-by-part.
|
|
32
|
-
- Ghost geometry: transparent volumes only for REAL physical envelopes — sweep arcs, keep-out volumes, approximate payloads, reach/access zones. Never decorative teaching overlays. Exaggerate tiny clearances when needed for readability.
|
|
33
|
-
- Even a blockout represents the object in its normal assembled state: no labels, legends, cutaways, or permanently exploded layouts (full rule in the `forgecad` skill).
|
|
34
|
-
- Leave out: fasteners and screw holes, wall thicknesses, fillets and blend radii, polished materials, hidden internal structure that does not affect the concept.
|
|
35
|
-
|
|
36
|
-
### Verify
|
|
37
|
-
|
|
38
|
-
Rendering is mandatory even for rough models. Run the script, then render from 2-3 angles with the installed `forgecad` CLI (syntax: the `forgecad` skill's CLI docs). Judge by the reader test:
|
|
39
|
-
|
|
40
|
-
- Can someone unfamiliar with the idea tell what each mass represents?
|
|
41
|
-
- Are proportions believable enough to discuss?
|
|
42
|
-
- Is motion or interference visible where it matters?
|
|
43
|
-
- Are unknowns shown honestly, not hidden behind fake detail?
|
|
44
|
-
|
|
45
|
-
If any answer is no, simplify or add clearer ghost volumes.
|
|
46
|
-
|
|
47
|
-
### Handoff
|
|
48
|
-
|
|
49
|
-
File placement and naming follow `forgecad-make-a-model` conventions; suffix the filename `-blockout` or `-concept` unless the user supplied a clearer name. Once the high-level questions are answered, stop. If the next question is real fit, tunable dimensions, part details, or manufacturing logic, switch to `forgecad-make-a-model` instead of refining the blockout indefinitely.
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
<!-- Generated by scripts/build-forgecad-skill.mjs — do not edit. Edit agent-skill-library/forgecad-component-model/SKILL.md instead. -->
|
|
2
|
-
|
|
3
|
-
# forgecad-component-model
|
|
4
|
-
|
|
5
|
-
Enforce the ForgeCAD Component Model when building multi-part assemblies. Parts build at origin, connectors position them, data flows down from parent. Use when building or reviewing any multi-file ForgeCAD project.
|
|
6
|
-
|
|
7
|
-
| Field | Value |
|
|
8
|
-
| --- | --- |
|
|
9
|
-
| Installed by | `forgecad skill install` |
|
|
10
|
-
| Source | `agent-skill-library/forgecad-component-model/SKILL.md` |
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Component Model
|
|
15
|
-
|
|
16
|
-
The React of CAD: a part is a function from props to `{ shape, connectors, metadata }`, built at origin in local space. Parts never position themselves — the assembly positions them via connectors.
|
|
17
|
-
|
|
18
|
-
### Rules
|
|
19
|
-
|
|
20
|
-
1. **Parts build at origin.** Geometry starts at `[0,0,0]` in local coordinates; no assembly-space offsets; internal structure derives from the part's own props only.
|
|
21
|
-
2. **Connectors are the only interface.** Declare via `.withConnectors({})`; axes point outward, mating is face-to-face (exception: prismatic joints share a co-directional slide axis). Mechanics: the forgecad skill's `docs/guides/positioning.md` and `docs/generated/assembly.md`.
|
|
22
|
-
3. **Assembly is pure composition.** Zero `translate()` to position structural parts, zero coordinate math — connect connectors, pass props down, read metadata up.
|
|
23
|
-
4. **Data flows down, never sideways.** Props down via `require('./part.forge.js', { Height: 20 })` overrides; metadata up via the part's return object; siblings NEVER import each other — the assembly mediates all sibling communication.
|
|
24
|
-
5. **Validate with `verify.*`, never `console.log` + `if`.**
|
|
25
|
-
|
|
26
|
-
### Part return shape
|
|
27
|
-
|
|
28
|
-
```js
|
|
29
|
-
return { shape, boltPattern, pinionZ }; // shape + metadata the parent may route to siblings
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### File structure
|
|
33
|
-
|
|
34
|
-
Default: ONE file per project-specific assembly — parts as sections, shared data as variables. Split only for cross-project reuse or past ~300 lines. Never split for "organization".
|
|
35
|
-
|
|
36
|
-
### Anti-patterns (reject on review)
|
|
37
|
-
|
|
38
|
-
- `shared-dims.js` — a file that only computes derived dimensions; the assembly derives and passes them.
|
|
39
|
-
- Sibling `require()` — e.g. `require('./motor-mount.forge.js')` inside `cover-plate.forge.js`; route through the parent.
|
|
40
|
-
- Assembly-space coordinates inside a part — a part knowing `pinionZ = 14` from a sibling's geometry; receive it as a prop.
|
|
41
|
-
- `translate()` to position a structural part in an assembly — add a connector instead.
|
|
42
|
-
- `console.log` + `if` validation — use `verify.*`.
|
|
43
|
-
- Bare `connector.neutral()` outside a reusable component library with compatibility checking.
|
|
44
|
-
|
|
45
|
-
### Design gate
|
|
46
|
-
|
|
47
|
-
Before committing any multi-part assembly:
|
|
48
|
-
|
|
49
|
-
1. Can you understand each part without reading other files?
|
|
50
|
-
2. Does the assembly contain zero coordinate math?
|
|
51
|
-
3. Do all inter-part relationships flow through connectors and props?
|
|
52
|
-
|
|
53
|
-
If any answer is no, refactor.
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
<!-- Generated by scripts/build-forgecad-skill.mjs — do not edit. Edit agent-skill-library/forgecad-high-level-spec/SKILL.md instead. -->
|
|
2
|
-
|
|
3
|
-
# forgecad-high-level-spec
|
|
4
|
-
|
|
5
|
-
Write a high-level design document (HLD) for a model, mechanism, or assembly before detailed specification or coding. Use when starting a new design, rethinking an existing one, or when the user asks to spec out, plan, or think through a model at a high level. Works backwards from requirements — defines the problem, explores alternatives, records decisions. Produces a right-sized design document for review and iteration.
|
|
6
|
-
|
|
7
|
-
| Field | Value |
|
|
8
|
-
| --- | --- |
|
|
9
|
-
| Installed by | `forgecad skill install` |
|
|
10
|
-
| Source | `agent-skill-library/forgecad-high-level-spec/SKILL.md` |
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## High-Level Design (HLD)
|
|
15
|
-
|
|
16
|
-
The HLD aligns the user and the agent on *what* to build before anyone thinks about *how*. Every design concern, risk, and tradeoff lives in the document — not in conversation, not in the agent's head. Brevity is a readability tool, not a success metric: there is no page limit; include whatever evidence, diagrams, and dimensions a good decision needs. Decision-driving dimensions belong here; exhaustive construction dimensions belong in the LLD.
|
|
17
|
-
|
|
18
|
-
Manufacturing process is a design decision, not a default — never assume 3D printing/FDM. If the user didn't specify a process, treat process choice as an HLD alternative (full posture taxonomy: `/forgecad-prepare-prompt`).
|
|
19
|
-
|
|
20
|
-
Write an HLD before any LLD, and whenever an existing design is wrong in approach, not just in numbers. Output: `<name>-hld.md` beside the model files, or `hld.md` for a whole project.
|
|
21
|
-
|
|
22
|
-
### Document Structure
|
|
23
|
-
|
|
24
|
-
The section order is the workflow — write it top to bottom, following the embedded instructions.
|
|
25
|
-
|
|
26
|
-
```markdown
|
|
27
|
-
# [Name] — High-Level Design
|
|
28
|
-
|
|
29
|
-
## Problem
|
|
30
|
-
What must this do? Hard requirements (must grip objects, fit a 60mm
|
|
31
|
-
housing, use purchased bearings). State the problem without implying
|
|
32
|
-
a solution. Unspecified process choice is an open design dimension.
|
|
33
|
-
|
|
34
|
-
## Approach
|
|
35
|
-
How it works at a conceptual level. ASCII diagram of the key elements
|
|
36
|
-
and their spatial relationships — diagram labels stay in this markdown;
|
|
37
|
-
never carry them into CAD geometry unless the real artifact needs
|
|
38
|
-
markings.
|
|
39
|
-
|
|
40
|
-
## Key Interfaces
|
|
41
|
-
Every point where this touches another part or the outside world:
|
|
42
|
-
mating surfaces, shared dimensions, coordination points. These are the
|
|
43
|
-
contracts that constrain the design.
|
|
44
|
-
|
|
45
|
-
## Dictionary
|
|
46
|
-
| Term | What it is |
|
|
47
|
-
|------|-----------|
|
|
48
|
-
Define every domain term in plain words, with dimensions where relevant.
|
|
49
|
-
Write for a developer without a mechanical-engineering background.
|
|
50
|
-
|
|
51
|
-
## Alternatives
|
|
52
|
-
| Option | Description | Tradeoff |
|
|
53
|
-
|--------|-------------|----------|
|
|
54
|
-
2-3 genuinely different strategies, not minor variations. Enough detail
|
|
55
|
-
per row to see why it fits or loses. Mark one recommended and say why.
|
|
56
|
-
If there is honestly only one approach, say so and skip the table.
|
|
57
|
-
|
|
58
|
-
## Usage Guide
|
|
59
|
-
The strongest validation: work backwards from how someone uses,
|
|
60
|
-
assembles, or operates the thing, step by step (physical product:
|
|
61
|
-
assembly steps, tools, what connects to what; mechanism: how it moves
|
|
62
|
-
and what the user does). If a step doesn't make sense ("how does the
|
|
63
|
-
servo get inside?"), the design has a gap — flag it inline with ⚠️ and
|
|
64
|
-
promote it to Concerns.
|
|
65
|
-
|
|
66
|
-
## Concerns
|
|
67
|
-
1. Numbered, falsifiably specific — a reviewer must be able to say
|
|
68
|
-
"real problem" or "fine, because…". "Tolerances might be tight" is
|
|
69
|
-
useless; "the 12mm arm cantilevers under gripping load, may flex
|
|
70
|
-
>0.5mm" is useful.
|
|
71
|
-
|
|
72
|
-
## Decisions
|
|
73
|
-
| # | Decision | Rationale |
|
|
74
|
-
|---|----------|-----------|
|
|
75
|
-
Filled ONLY after user review — never pre-decide. Each row resolves a
|
|
76
|
-
concern or alternative.
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### Review via git
|
|
80
|
-
|
|
81
|
-
HLDs and LLDs iterate through git, not conversation:
|
|
82
|
-
|
|
83
|
-
- **Commit every version.** No drafts floating in chat. After writing, commit and tell the user it's ready for review.
|
|
84
|
-
- **Feedback arrives as file edits** (inline comments, strikethroughs) **or chat — check both.** Read `git diff`: the diff is the review artifact.
|
|
85
|
-
- **Update, commit, repeat** until the Decisions table is filled and the user says "go."
|
|
86
|
-
|
|
87
|
-
### Rules
|
|
88
|
-
|
|
89
|
-
- If you're speccing every part, formula, tolerance, and fabrication step, you're writing an LLD — back up.
|
|
90
|
-
- If you can't draw it, you don't understand it yet.
|
|
91
|
-
- Tables are welcome where they clarify (interfaces, requirements, visible evidence); full parameter catalogs go to the LLD.
|
|
92
|
-
|
|
93
|
-
### Pipeline
|
|
94
|
-
|
|
95
|
-
| Stage | Skill | Output |
|
|
96
|
-
|-------|-------|--------|
|
|
97
|
-
| 1. Explore the problem space | this skill | `*-hld.md` |
|
|
98
|
-
| 2. Detailed design | `/forgecad-lld` | `*-lld.md` |
|
|
99
|
-
| 3. Implementation | `/forgecad-make-a-model` + `/forgecad` | `.forge.js` |
|
|
100
|
-
|
|
101
|
-
The Decisions table must be filled before writing the LLD. Simple models may skip straight from HLD to code.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
<!-- Generated by scripts/build-forgecad-skill.mjs — do not edit. Edit agent-skill-library/forgecad-lld/SKILL.md instead. -->
|
|
2
|
-
|
|
3
|
-
# forgecad-lld
|
|
4
|
-
|
|
5
|
-
Write a Low-Level Design (LLD) for a CAD model — exact dimensions, constraints, parameters, and verification criteria. Use after a High-Level Design (HLD) exists and decisions are locked, or for simple parts that don't need an HLD. The detailed design document that code implements.
|
|
6
|
-
|
|
7
|
-
| Field | Value |
|
|
8
|
-
| --- | --- |
|
|
9
|
-
| Installed by | `forgecad skill install` |
|
|
10
|
-
| Source | `agent-skill-library/forgecad-lld/SKILL.md` |
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Low-Level Design (LLD)
|
|
15
|
-
|
|
16
|
-
### When and prerequisites
|
|
17
|
-
|
|
18
|
-
- An HLD (`/forgecad-high-level-spec`) with a filled Decisions table must exist. The LLD implements those decisions — it never revisits them.
|
|
19
|
-
- Simple parts (single body, no alternatives to explore) skip the HLD and go straight to the LLD.
|
|
20
|
-
- Output: `<name>-lld.md` next to the model files. Complex assemblies split into a numbered directory: overview, global constraints, per-component files, assembly, verification.
|
|
21
|
-
|
|
22
|
-
### What an LLD is
|
|
23
|
-
|
|
24
|
-
- **Narrative first** — reads like describing the object over the phone: shape, behavior, purpose, proportions, feel.
|
|
25
|
-
- **Authoritative** — the single source of truth that code implements.
|
|
26
|
-
- **Implementation-blind** — the LLD knows nothing about ForgeCAD's capabilities; never let API convenience shape the design.
|
|
27
|
-
- **Every number has a rationale** — each constraint and each parameter default/range gets an explicit reason; show the math (e.g. `wallThickness = 2.4mm = 6 × 0.4mm nozzle`).
|
|
28
|
-
|
|
29
|
-
### Required structure
|
|
30
|
-
|
|
31
|
-
1. **Narrative** — what it is, how it behaves and interacts, why it exists. Concrete comparisons ("about the size of a deck of cards"); no vague terms without grounding.
|
|
32
|
-
2. **Technical** — typed parameter table (length / angle / count / boolean / choice / ratio / clearance — this is design-document vocabulary, not the runtime `Param.*` API), always with units (mm and degrees are the defaults) and a rationale for every default and range; derived dimensions shown as math; geometry and constraints, each constraint with rationale.
|
|
33
|
-
3. **Verification** — mandatory checklist: dimensional checks, functional checks, printability checks.
|
|
34
|
-
|
|
35
|
-
Don'ts: never open with a parameter list (story before numbers), never leave a constraint implicit, never skip verification.
|
|
36
|
-
|
|
37
|
-
### Process
|
|
38
|
-
|
|
39
|
-
Iterate via git exactly as in `/forgecad-high-level-spec`: commit every version; the diff, not the conversation, is the review artifact.
|
|
40
|
-
|
|
41
|
-
Completeness gate before presenting: Can someone build from this alone? Does it implement every HLD decision? Is every constraint explicit with rationale?
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
<!-- Generated by scripts/build-forgecad-skill.mjs — do not edit. Edit agent-skill-library/forgecad-prepare-prompt/SKILL.md instead. -->
|
|
2
|
-
|
|
3
|
-
# forgecad-prepare-prompt
|
|
4
|
-
|
|
5
|
-
Turn a fuzzy physical product, mechanism, or CAD artifact request into a concrete manufacture-realistic prototype ForgeCAD build brief and a single master prompt for the modeling pass. Use when the engineering brief is incomplete, manufacturing/process choice is underspecified, or the work needs a specific operating story to avoid generic toy solutions.
|
|
6
|
-
|
|
7
|
-
| Field | Value |
|
|
8
|
-
| --- | --- |
|
|
9
|
-
| Installed by | `forgecad skill install` |
|
|
10
|
-
| Source | `agent-skill-library/forgecad-prepare-prompt/SKILL.md` |
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Prepare ForgeCAD Prompt
|
|
15
|
-
|
|
16
|
-
Use before modeling when the user wants something physically real and buildable but the request is fuzzy ("make me a robot gripper", "make it production ready", "I don't know the numbers, make sensible choices"). This skill owns intake and prompt preparation; once the brief is concrete, hand off to the `forgecad` skill.
|
|
17
|
-
|
|
18
|
-
### Core Rules
|
|
19
|
-
|
|
20
|
-
**Manufacturing is a design decision, not a default.** Never assume FDM, 3D printing, "printable", or plastic parts unless the user explicitly asked, the artifact family honestly points there, or the chosen process stack includes printed parts. Derive the process stack from artifact family, load path, scale, safety expectations, material properties, production intent, and operating story — family→process examples and all numeric anchors live in `references/default-profiles.md`. If the user names a process, honor it but warn when it is unsafe or dishonest for the duty.
|
|
21
|
-
|
|
22
|
-
**Posture taxonomy.** Default output posture is **manufacture-realistic prototype**: a serious build candidate with real materials, purchased-part boundaries, assembly logic, and validation — no claims of production tooling, certification, rider safety, or release-ready DFM. Other postures only when the brief justifies them: `production-realistic` (explicit production intent), `printable` (printing is the selected process), `visual-CAD` (form study), or a specific process posture (`sheet-metal`, `CNC-machined`, `laser-cut`, `welded tube`, `injection-molded`, `cast`, `hybrid purchased-hardware`). Pick the posture that is honest for the artifact, not the easiest CAD surface.
|
|
23
|
-
|
|
24
|
-
**Family-scoped numbers.** Every starter assumption is scoped to one artifact family. Never reuse numbers across families; never apply one default profile to unrelated artifacts.
|
|
25
|
-
|
|
26
|
-
### Workflow
|
|
27
|
-
|
|
28
|
-
1. **Normalize the ask** into plain mechanism language. "6 DOF gripper" usually means one of: standalone gripper with finger joints, wrist plus gripper, or full arm plus gripper.
|
|
29
|
-
|
|
30
|
-
2. **Build the specific operating story**: an invented specific (non-famous) org, a named program, a prototype revision, a review moment, a test setting, mission pressure (pilot gate, demo date, investor milestone, customer deployment), and the generic failure mode to avoid. Prefer bold high-agency stories — go/no-go gates, first-customer pilots, investor demos — over modest lab exercises.
|
|
31
|
-
- Good: "RivetLine Automation is racing toward a first-customer kitting-cell pilot and needs the RG-4 gripper jaw for a live demo next Wednesday. The jaw must pick 40-90 mm plastic housings from a tray, use hardware the build tech can source this week, and make finger-pad replacement possible without rebuilding the linkage."
|
|
32
|
-
- Bad: vague prestige labels ("frontier robotics startup") with no program/rig/milestone specifics.
|
|
33
|
-
- Never assert the user works for a named real company unless they said so. Named real products only as public comparison anchors. Never clone proprietary designs — public-domain patterns and first-principles engineering only.
|
|
34
|
-
|
|
35
|
-
3. **Classify the artifact family** (`references/default-profiles.md`): grippers and small mechanisms; fixtures/jigs/holders; enclosures and electronics housings; furniture and load-bearing structures; chassis and mobile robot structures; human vehicles and rideable forms. Rideables always route to human-vehicles, never chassis. If no family fits, use the no-family-fits escape there — never force one.
|
|
36
|
-
|
|
37
|
-
4. **Choose the process posture** per the taxonomy above.
|
|
38
|
-
|
|
39
|
-
5. **Pick the qualitative levers** — duty: `light-duty`/`general-duty`/`sturdy-duty`; scale: `compact`/`medium`/`large`; cost: `cheapest`/`balanced`/`performance-first` — and translate them into family-scoped starter assumptions.
|
|
40
|
-
|
|
41
|
-
6. **Close only the critical gaps.** At most 3 grouped questions, always choice menus, never raw engineering inputs (payload mass, torque budget, backlash tolerance) unless the architecture truly depends on them and cannot be bracketed safely. Good: "Which feels closest: a light desk demo, a useful hobby tool, or a sturdier bench mechanism?" Bad: "What payload mass?"
|
|
42
|
-
|
|
43
|
-
7. **Write the engineering brief.** Required fields: artifact + family + normalized interpretation; operating story + production reason + test setting + generic failure mode to avoid; output posture; intended objects/loads, size envelope, motion style and DOF; process stack and material defaults; purchased-part (BOM) boundary; validation standard; variant policy — multiple versions of one object are selectable params (`Variant`/`Preset`/`Style`), one rendered at a time, a comparison lineup only as an explicit non-default debug mode so collision inspection proves one real assembly; file organization — `main.forge.js` entry point for multi-file projects (convention owned by `forgecad-make-a-model`); explicit uncertainty policy.
|
|
44
|
-
|
|
45
|
-
8. **Emit one master prompt.** Fill `references/master-prompt.md` from the chosen profile and assumptions. Return the finished prompt, not notes about it.
|
|
46
|
-
|
|
47
|
-
9. **Hand off** to the `forgecad` skill if implementation continues; for moving mechanisms its index routes to the assembly and joint-design docs.
|
|
48
|
-
|
|
49
|
-
### Defaults And Verdict
|
|
50
|
-
|
|
51
|
-
If the user stays vague: `general-duty` / `medium` / `balanced`, invent the operating story, and use the family starter assumptions from `references/default-profiles.md`.
|
|
52
|
-
|
|
53
|
-
The prompt must demand exactly `BUILD-READY` or `BEST-EFFORT BUILD CANDIDATE`. If the request outruns the chosen profile, downgrade the claim and keep going. No placeholders ("appropriate motor", "adjust as needed") — choose a defensible value, state it, continue. No follow-up questions unless the architecture would materially change and no safe assumption bundle exists. Human-bearing furniture and rideable vehicles usually end `BEST-EFFORT BUILD CANDIDATE`.
|
|
54
|
-
|
|
55
|
-
### Output Contract
|
|
56
|
-
|
|
57
|
-
Reply with a short interpretation of the request, the chosen family + operating story + assumption bundle (compact, options menu only if truly needed), then the single filled master prompt last. Do not bury the prompt under theory.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
## Bundled Files
|
|
61
|
-
|
|
62
|
-
- `references/default-profiles.md`
|
|
63
|
-
- `references/master-prompt.md`
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
<!-- Generated by scripts/build-forgecad-skill.mjs — do not edit. Edit agent-skill-library/forgecad-reconstruction-benchmark/SKILL.md instead. -->
|
|
2
|
-
|
|
3
|
-
# forgecad-reconstruction-benchmark
|
|
4
|
-
|
|
5
|
-
Solve ForgeCAD CAD reconstruction benchmark or RL episodes in a prepared workspace by rebuilding a visible reference asset as readable parametric ForgeCAD in the fixed submission path, using visual and geometric self-checks while respecting sandbox limits.
|
|
6
|
-
|
|
7
|
-
| Field | Value |
|
|
8
|
-
| --- | --- |
|
|
9
|
-
| Installed by | `forgecad skill install` |
|
|
10
|
-
| Source | `agent-skill-library/forgecad-reconstruction-benchmark/SKILL.md` |
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## ForgeCAD Reconstruction Benchmark
|
|
15
|
-
|
|
16
|
-
Benchmark adaptation of `forgecad-3d-reconstruction`: same reconstruction loop, but with a fixed submission path, a local CLI wrapper, sandbox limits, and a short wall-clock budget. This sheet owns only those deltas — follow `forgecad-3d-reconstruction` for the reconstruction craft.
|
|
17
|
-
|
|
18
|
-
### Workspace
|
|
19
|
-
|
|
20
|
-
Read first: `AGENTS.md`, `task/instructions.md`, this skill, and `agent-home/.agents/skills/forgecad/SKILL.md` (API + CLI reference).
|
|
21
|
-
|
|
22
|
-
- Reference asset (evidence only): `task/reference/*`
|
|
23
|
-
- Final answer: `submission/main.forge.js`, unless `task/task.json` overrides
|
|
24
|
-
- CLI: the local wrapper `./bin/forgecad`, never global commands
|
|
25
|
-
- Scratch renders/notes: `outputs/`
|
|
26
|
-
- Stay inside the prepared workspace.
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
./bin/forgecad run submission/main.forge.js
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Rules and Done Criteria
|
|
33
|
-
|
|
34
|
-
- Deliverable is readable parametric ForgeCAD source at the required submission path. A clean parametric approximation beats an unreadable mesh mimic.
|
|
35
|
-
- The final source must not call `Import.mesh`, `Import.step`, `importMesh`, `importStep`, `readFile`, `readFileSync`, or any equivalent asset-embedding trick, and must contain no `compareWith(...)`, external reference paths, base64 payloads, or debug probes.
|
|
36
|
-
- Sandbox: allowed local tools only — no web search, no broad home-directory access, no subagents, no remote services.
|
|
37
|
-
- Before exit: the run command above succeeds; visual/section evidence checked after the last meaningful edit; model recognizable against the reference from the main views.
|
|
38
|
-
|
|
39
|
-
### Budget Discipline
|
|
40
|
-
|
|
41
|
-
A runnable first candidate beats a perfect investigation with no model.
|
|
42
|
-
|
|
43
|
-
1. Run the starter submission once before editing so syntax/runtime problems surface early.
|
|
44
|
-
2. Inspect only the highest-value reference evidence: dimensions, volume, object count, one visual or sectional view. If a reference render/inspect command fails or stalls, continue from task instructions, filename, starter code, and mechanical inference — do not burn the budget retrying.
|
|
45
|
-
3. Write a short reconstruction brief in `outputs/brief.md` (fields per `forgecad-3d-reconstruction`).
|
|
46
|
-
4. Edit the submission early: coarse bbox, orientation, and main masses first, then iterate coarse-to-fine per `forgecad-3d-reconstruction`.
|
|
47
|
-
5. 3MF references: the `forgecad run` source-structure table is evidence — account for every substantial 3MF item in the reconstruction (the final model may be one part or many).
|
|
48
|
-
6. `inspect section` probes are replayable against the candidate via `inspect replay` — the cheap way to verify an exact local measurement transfers. Mechanics: `forgecad-render-inspect`.
|
|
49
|
-
|
|
50
|
-
### Pointers
|
|
51
|
-
|
|
52
|
-
- `forgecad-3d-reconstruction` — the evidence → brief → coarse → fine loop and metric diagnosis
|
|
53
|
-
- `forgecad-render-inspect` — inspection bundles, section probes, replay
|
|
54
|
-
- forgecad skill at `agent-home/.agents/skills/forgecad/` — API and CLI syntax
|
|
55
|
-
- `forgecad-make-a-model` — general quality patterns only; its date-based file-placement workflow does not apply in benchmark workspaces
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
## Bundled Files
|
|
59
|
-
|
|
60
|
-
- `agents/openai.yaml`
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: forgecad-blockout-model
|
|
3
|
-
description: Create rough high-level ForgeCAD concept models from simple primitives to explore layout, proportions, motion, and part relationships without production detail. Use when asked for a quick model sketch, blockout, spatial mockup, or intuitive low-detail 3D concept.
|
|
4
|
-
forgecad-public: true
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Block Out a Model
|
|
8
|
-
|
|
9
|
-
A blockout is a spatial planning artifact: 3-7 simple masses that answer where parts go, whether a mechanism makes spatial sense, and what the silhouette, footprint, or motion envelope looks like. Not for print-ready geometry, exact fit, tolerances, or detail work.
|
|
10
|
-
|
|
11
|
-
| Need | Skill |
|
|
12
|
-
|------|-------|
|
|
13
|
-
| High-level 3D idea using simple masses | `forgecad-blockout-model` |
|
|
14
|
-
| Written concept or architecture before CAD | `forgecad-high-level-spec` |
|
|
15
|
-
| Accurate, detailed, parametric ForgeCAD model | `forgecad-make-a-model` |
|
|
16
|
-
|
|
17
|
-
## Method
|
|
18
|
-
|
|
19
|
-
- Load the `forgecad` skill first; read its Core API and CLI docs. Load nothing else unless the concept demands it.
|
|
20
|
-
- Translate the idea into 3-7 conceptual parts BEFORE writing geometry: masses and zones (base, arm, payload, sweep volume, keep-out, hand access).
|
|
21
|
-
- One primitive stands in for many eventual details. A bounding box beats a fake detailed part. Never add detail as a substitute for clarity — simplify or reposition instead.
|
|
22
|
-
- Use round-number dimensions; "believably shaped" beats numerically correct. Name uncertainty honestly: `armLengthGuess`, `baseWidthApprox`, `clearanceEnvelope`.
|
|
23
|
-
- At most a handful of `param()` values, for comparing proportions. Do not parameterize every dimension.
|
|
24
|
-
- Color by meaning; keep each conceptual part visually distinct via color or opacity. Return named shape objects so the viewer can inspect the concept part-by-part.
|
|
25
|
-
- Ghost geometry: transparent volumes only for REAL physical envelopes — sweep arcs, keep-out volumes, approximate payloads, reach/access zones. Never decorative teaching overlays. Exaggerate tiny clearances when needed for readability.
|
|
26
|
-
- Even a blockout represents the object in its normal assembled state: no labels, legends, cutaways, or permanently exploded layouts (full rule in the `forgecad` skill).
|
|
27
|
-
- Leave out: fasteners and screw holes, wall thicknesses, fillets and blend radii, polished materials, hidden internal structure that does not affect the concept.
|
|
28
|
-
|
|
29
|
-
## Verify
|
|
30
|
-
|
|
31
|
-
Rendering is mandatory even for rough models. Run the script, then render from 2-3 angles with the installed `forgecad` CLI (syntax: the `forgecad` skill's CLI docs). Judge by the reader test:
|
|
32
|
-
|
|
33
|
-
- Can someone unfamiliar with the idea tell what each mass represents?
|
|
34
|
-
- Are proportions believable enough to discuss?
|
|
35
|
-
- Is motion or interference visible where it matters?
|
|
36
|
-
- Are unknowns shown honestly, not hidden behind fake detail?
|
|
37
|
-
|
|
38
|
-
If any answer is no, simplify or add clearer ghost volumes.
|
|
39
|
-
|
|
40
|
-
## Handoff
|
|
41
|
-
|
|
42
|
-
File placement and naming follow `forgecad-make-a-model` conventions; suffix the filename `-blockout` or `-concept` unless the user supplied a clearer name. Once the high-level questions are answered, stop. If the next question is real fit, tunable dimensions, part details, or manufacturing logic, switch to `forgecad-make-a-model` instead of refining the blockout indefinitely.
|