The Problem
Generating usable CAD geometry from natural language usually means either hand-coding parametric models or fighting brittle OpenSCAD-style scripts. Teams that need STEP, STL, URDF, and DXF outputs from a single prompt end up maintaining several disconnected toolchains. This repo packages those workflows as agent skills, so an LLM can produce and preview real CAD artifacts from a project directory.
What This Does
This is a portfolio of four self-contained projects, not one codebase: skills/ (448 files) holds the agent skill definitions, plugins/ (441 files) contains the CAD viewer and related tooling, viewer/ (373 files) is a browser-based preview workbench, and packages/ (229 files) holds the core libraries. The main skill is skills/cad/SKILL.md, which generates and edits CAD models with STEP as the primary output, plus STL, 3MF, and GLB exports. Companion skills cover DXF drawings, URDF/SRDF robot descriptions, and off-the-shelf part sourcing.
The stack is mixed: JavaScript/TypeScript for the viewer and cadjs package, Python for cadpy and the skill scripts. The packages/cadjs/src/common/cadScene.js file is the most-connected module, with 105 functions called from 39 other files.
How It Is Wired
Execution starts at main in packages/implicitjs/scripts/export.mjs, which reaches 343 functions. The traced path from entry to process exit is main -> exportImplicitCadFile, which writes to the filesystem via fs.mkdir. That is the shortest route; framework callbacks (like the viewer's HTTP handlers) are not visible as source edges.
The internal call graph shows 3,878 resolved edges. The highest-blast-radius functions are clamp (68 call sites), abs (67), and normalizeString (60). The tests/python/support/paths.py module is a hub with 23 dependents, meaning any change there ripples widely. Four modules sit in circular dependencies.
File responsibilities concentrate in cadScene.js for scene normalization, sdfEvaluator.js for implicit geometry evaluation, and displaySettings.js for theme/color normalization. The viewer's CadWorkspace component imports 22 modules, making it the heaviest client-side dependency.
How To Use It
Setup is per-project. The Python packages use pyproject.toml (install with pip or uv), the JS packages use package.json (npm), and the docs site uses Next.js. Clone with:
git clone https://github.com/moses-y/text-to-cad
Install the CAD skill's Python dependencies from plugins/cad/skills/cad-viewer/requirements.txt. For the viewer, run the dev server from viewer/ using its package scripts. The README documents the skill workflows but does not give a single install command for the whole repo.
Real-World Use
A robotics team prompts an agent to design a motor mount. The agent uses the CAD skill to generate a STEP file, the DXF skill for a mounting plate profile, and the URDF skill to produce robot description files. The viewer renders all three locally in the browser before any fabrication order is placed.
Code Health & Issues
Static analysis found 539 findings (62 high, 477 medium). The high-severity issues are oversized files — viewer/src/server/catalog/cadDirectoryScanner.mjs and packages/cadjs/src/common/cadScene.js exceed 1,400 lines each — and deep nesting in three workbench components.
The SDLC audit found four high-severity issues:
- High -
next@16.2.6carries CVE-2026-64642 and eight more advisories; upgrade and commit the lockfile. - High -
packages/cadpy/pyproject.tomlhas no lockfile; the shipped artifact can differ from the tested one. - High - CI has no test command despite 193 test files; the green check proves nothing.
- High -
release.ymlpushes directly to the default branch with--force-with-lease.
Medium issues: no least-privilege token permissions, no Dependabot, no dependency scan in CI.
The Bottom Line
The skill-based approach is practical and the benchmark suite (10 documented cases with GIFs) shows real capability. The main risk is operational: unlocked dependencies, untested CI, and direct pushes to a deploying branch. Use it if you want a working CAD-generation workflow; fix the CI and lockfile gaps before trusting it in production.