1 view
earthtojake/text-to-cad
Give your agent CAD superpowers.
Python★ 18,086+619 that day#2 on trending
D51.7/100
Duplication70
4.3% in python, javascript, tsx, jsx, typescript, bash, c, perl, sqlDead code44
8.9%Complexity44
58.9% The score is jscpd's own --health model: markup, data and text left out, tests kept. The numbers below are the trending scan's.
4.77%duplicated code · 15,372 of 322,142 lines
839clones in code
1,630code files of 2,742 scanned
5.56%duplicated over all files · 1,477 clones
Most complex files
- packages/ui/src/renderers/step/StepSurface.jsx1101 cx
- packages/core/src/common/cadScene.js863 cx
- packages/core/src/lib/surf/tessellate.js625 cx
- packages/core/src/lib/selectors/runtime.js609 cx
- packages/cadgen/src/cadgen/snapshot_core.py562 cx
- packages/ui/src/renderers/step/components/workbench/hooks/useCadAssets.js474 cx
- models/radial/src/lib/gate.py467 cx
- packages/ui/src/renderers/step/StepRenderer.browser.test.mjs438 cx
- packages/ui/src/renderers/step/components/workbench/ModelingTree.jsx430 cx
- packages/cadgen/src/cadgen/_internal/generation.py423 cx
Dead code 8.86% unused · 703 findings
- packages/ui/src/renderers/step/StepSurface.jsxunused-file
- packages/ui/src/renderers/step/components/workbench/hooks/useCadAssets.jsunused-file
- packages/ui/src/renderers/step/scene/useStepPicking.jsunused-file
- packages/core/src/lib/glb/writeGlb.jsunused-file
- packages/core/src/lib/export/packageTubeMorph.jsunused-file
- packages/ui/src/renderers/step/components/workbench/hooks/packageProgressiveLoad.jsunused-file
- packages/core/src/lib/step/stepTree.jsunused-file
- packages/core/src/lib/viewer/measurement.jsunused-file
- packages/ui/src/renderers/step/render/lodScheduler.jsunused-file
- packages/core/src/lib/export/packageMeshExport.jsunused-file
The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code, and 1 generated file: models/radial/src/lib/anim_js.py.
Largest clones in the code
- 7 lines in 5 placespython50,299 tokensmodels/tendon_hand/src/hand_export_repair_context.py:8–14models/tendon_hand/src/hand_mechanical_candidate.py:27–33models/tendon_hand/src/hand_native_review.py:8–14models/tendon_hand/src/phalanx_beauty_context.py:7–13models/tendon_hand/src/phalanx_continuous_context_r5.py:7–13
8ANIMATION_JS = r'''// Static surface presentation only; no joint choreography. 9const ropes = [{"name":"thumb_cmc_abduction_positive","normal":[1,0,0],"segments":[{"kind":"bezier","points":[[-20.0,-252.0,30.6],[-20.0,-248.13400675118444,30… 10export const clips={presentation:{label:"Braided surface study",duration:1,loop:false,update(t,m){for(const rope of ropes){const rest={normal:rope.normal,segme… 11''' 12 13 14@step(out='../STEP/hand_export_repair_context.step', materials=ASSEMBLY_MATERIALS, animation=ANIMATION_JS)27ANIMATION_JS = r'''// Static surface presentation only; no joint choreography. 28const ropes = [{"name":"thumb_cmc_abduction_positive","normal":[1,0,0],"segments":[{"kind":"bezier","points":[[-20.0,-252.0,30.6],[-20.0,-248.13400675118444,30… 29export const clips={presentation:{label:"Braided surface study",duration:1,loop:false,update(t,m){for(const rope of ropes){const rest={normal:rope.normal,segme… 30''' 31 32 33@step(out='../STEP/hand_mechanical_candidate.step', materials=ASSEMBLY_MATERIALS, animation=ANIMATION_JS) - 33 lines in 3 placespython50,505 tokensmodels/tendon_hand/src/hand_mechanical_candidate.py:1–33models/tendon_hand/src/hand_mechanical_candidate_r11.py:1–33models/tendon_hand/src/hand_mechanical_candidate_r12.py:1–33
1"""Complete mechanical candidate assembled from the actual exported components. 2 3The pose/explode gauntlet is still separate. Native reconstruction here keeps 4this assembled export aligned with the components used by the physical audits. 5""" 6import hashlib,json 7from pathlib import Path 8from cadgen import step,read_step 9from lib.native_integration import integrated_native_bodies,overlay,ROOT 10from lib.assembly import compoundFirst 10 of 33 lines.
- 10 lines in 2 placespython50,315 tokensmodels/tendon_hand/src/phalanx_beauty_context.py:4–13models/tendon_hand/src/phalanx_sculpt_representative_context.py:4–13
4from lib.native_integration import frozen_bodies 5from lib.palette import ASSEMBLY_MATERIALS 6from phalanx_beauty_review import replacements 7ANIMATION_JS = r'''// Static surface presentation only; no joint choreography. 8const ropes = [{"name":"thumb_cmc_abduction_positive","normal":[1,0,0],"segments":[{"kind":"bezier","points":[[-20.0,-252.0,30.6],[-20.0,-248.13400675118444,30… 9export const clips={presentation:{label:"Braided surface study",duration:1,loop:false,update(t,m){for(const rope of ropes){const rest={normal:rope.normal,segme… 10''' 11 12 13@step(out='../STEP/phalanx_beauty_context.step', animation=ANIMATION_JS, materials=ASSEMBLY_MATERIALS)4from lib.native_integration import frozen_bodies 5from lib.palette import ASSEMBLY_MATERIALS 6from phalanx_beauty_review import replacements 7ANIMATION_JS = r'''// Static surface presentation only; no joint choreography. 8const ropes = [{"name":"thumb_cmc_abduction_positive","normal":[1,0,0],"segments":[{"kind":"bezier","points":[[-20.0,-252.0,30.6],[-20.0,-248.13400675118444,30… 9export const clips={presentation:{label:"Braided surface study",duration:1,loop:false,update(t,m){for(const rope of ropes){const rest={normal:rope.normal,segme… 10''' 11 12 13@step(out='../STEP/phalanx_sculpt_representative_context.step', animation=ANIMATION_JS, materials=ASSEMBLY_MATERIALS)
7 more
- 8 lines in 2 placespython50,303 tokens
- 6 lines in 2 placespython38,144 tokens
- 955 lines in 2 placespython7,131 tokens
- 391 lines in 2 placespython2,855 tokens
- 180 lines in 2 placespython2,836 tokens
- 330 lines in 2 placespython2,150 tokens
- 86 lines in 3 placespython1,032 tokens
Largest clones over all files, tests and data included
- 7 lines in 5 placespython50,299 tokensmodels/tendon_hand/src/hand_export_repair_context.py:8–14models/tendon_hand/src/hand_mechanical_candidate.py:27–33models/tendon_hand/src/hand_native_review.py:8–14models/tendon_hand/src/phalanx_beauty_context.py:7–13models/tendon_hand/src/phalanx_continuous_context_r5.py:7–13
8ANIMATION_JS = r'''// Static surface presentation only; no joint choreography. 9const ropes = [{"name":"thumb_cmc_abduction_positive","normal":[1,0,0],"segments":[{"kind":"bezier","points":[[-20.0,-252.0,30.6],[-20.0,-248.13400675118444,30… 10export const clips={presentation:{label:"Braided surface study",duration:1,loop:false,update(t,m){for(const rope of ropes){const rest={normal:rope.normal,segme… 11''' 12 13 14@step(out='../STEP/hand_export_repair_context.step', materials=ASSEMBLY_MATERIALS, animation=ANIMATION_JS)27ANIMATION_JS = r'''// Static surface presentation only; no joint choreography. 28const ropes = [{"name":"thumb_cmc_abduction_positive","normal":[1,0,0],"segments":[{"kind":"bezier","points":[[-20.0,-252.0,30.6],[-20.0,-248.13400675118444,30… 29export const clips={presentation:{label:"Braided surface study",duration:1,loop:false,update(t,m){for(const rope of ropes){const rest={normal:rope.normal,segme… 30''' 31 32 33@step(out='../STEP/hand_mechanical_candidate.step', materials=ASSEMBLY_MATERIALS, animation=ANIMATION_JS) - 33 lines in 3 placespython50,505 tokensmodels/tendon_hand/src/hand_mechanical_candidate.py:1–33models/tendon_hand/src/hand_mechanical_candidate_r11.py:1–33models/tendon_hand/src/hand_mechanical_candidate_r12.py:1–33
1"""Complete mechanical candidate assembled from the actual exported components. 2 3The pose/explode gauntlet is still separate. Native reconstruction here keeps 4this assembled export aligned with the components used by the physical audits. 5""" 6import hashlib,json 7from pathlib import Path 8from cadgen import step,read_step 9from lib.native_integration import integrated_native_bodies,overlay,ROOT 10from lib.assembly import compoundFirst 10 of 33 lines.
- 10 lines in 2 placespython50,315 tokensmodels/tendon_hand/src/phalanx_beauty_context.py:4–13models/tendon_hand/src/phalanx_sculpt_representative_context.py:4–13
4from lib.native_integration import frozen_bodies 5from lib.palette import ASSEMBLY_MATERIALS 6from phalanx_beauty_review import replacements 7ANIMATION_JS = r'''// Static surface presentation only; no joint choreography. 8const ropes = [{"name":"thumb_cmc_abduction_positive","normal":[1,0,0],"segments":[{"kind":"bezier","points":[[-20.0,-252.0,30.6],[-20.0,-248.13400675118444,30… 9export const clips={presentation:{label:"Braided surface study",duration:1,loop:false,update(t,m){for(const rope of ropes){const rest={normal:rope.normal,segme… 10''' 11 12 13@step(out='../STEP/phalanx_beauty_context.step', animation=ANIMATION_JS, materials=ASSEMBLY_MATERIALS)4from lib.native_integration import frozen_bodies 5from lib.palette import ASSEMBLY_MATERIALS 6from phalanx_beauty_review import replacements 7ANIMATION_JS = r'''// Static surface presentation only; no joint choreography. 8const ropes = [{"name":"thumb_cmc_abduction_positive","normal":[1,0,0],"segments":[{"kind":"bezier","points":[[-20.0,-252.0,30.6],[-20.0,-248.13400675118444,30… 9export const clips={presentation:{label:"Braided surface study",duration:1,loop:false,update(t,m){for(const rope of ropes){const rest={normal:rope.normal,segme… 10''' 11 12 13@step(out='../STEP/phalanx_sculpt_representative_context.step', animation=ANIMATION_JS, materials=ASSEMBLY_MATERIALS) - 8 lines in 2 placespython50,303 tokens
- 6 lines in 2 placespython38,144 tokens
By format, code only
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| python | 1,087 | 220,705 | 695 | 13,263 | 6.01% |
| javascript | 385 | 81,290 | 126 | 1,918 | 2.36% |
| jsx | 67 | 11,800 | 10 | 113 | 0.96% |
| typescript | 46 | 2,849 | 6 | 51 | 1.79% |
| bash | 21 | 2,504 | 1 | 14 | 0.56% |
| tsx | 22 | 2,067 | 1 | 13 | 0.63% |
| c | 1 | 753 | 0 | 0 | 0% |
| perl | 1 | 174 | 0 | 0 | 0% |
By format, all files
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| python | 1,391 | 292,485 | 841 | 15,041 | 5.14% |
| javascript | 700 | 138,061 | 374 | 4,738 | 3.43% |
| json | 115 | 67,551 | 184 | 9,498 | 14.06% |
| markdown | 169 | 27,060 | 21 | 1,001 | 3.7% |
| tsx | 101 | 12,067 | 14 | 108 | 0.9% |
| css | 7 | 788 | 11 | 105 | 13.32% |
| jsx | 68 | 11,819 | 10 | 113 | 0.96% |
| typescript | 67 | 4,472 | 7 | 57 | 1.27% |
| txt | 13 | 744 | 7 | 537 | 72.18% |
| yaml | 18 | 1,418 | 5 | 63 | 4.44% |
Trending appearances
| Day | Rank | Stars | Files | Lines | Clones | All files | Code | Health | Commit |
|---|---|---|---|---|---|---|---|---|---|
| Oct 7, 2026 | #2 | 18,086 (+619) | 2,742 | 563,271 | 1,477 | 5.56% | 4.77% | D 51.7 | af990e6 |
| Oct 6, 2026 | #3 | 17,530 (+437) | 2,741 | 563,151 | 1,476 | 5.55% | 4.77% | D 51.7 | 941ac2f |
| Oct 5, 2026 | #2 | 16,966 (+83) | 2,735 | 561,226 | 1,472 | 5.56% | 4.78% | D 51.6 | d749a19 |
| Sep 10, 2026 | #4 | 15,147 (+124) | 1,344 | 313,411 | 621 | 2.93% | 2.44% | — | d0e4cb6 |
Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.