create-aura3d 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-skills.d.ts +38 -0
  3. package/dist/agent-skills.d.ts.map +1 -0
  4. package/dist/agent-skills.js +103 -0
  5. package/dist/agent-skills.js.map +1 -0
  6. package/dist/cli.js +32 -5
  7. package/dist/cli.js.map +1 -1
  8. package/dist/index.d.ts +32 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +52 -10
  11. package/dist/index.js.map +1 -1
  12. package/dist/showcase-spec-artifacts.d.ts +1 -1
  13. package/dist/showcase-spec-game-geometry-extractor.js +8 -11
  14. package/dist/showcase-spec-game-geometry-extractor.js.map +1 -1
  15. package/dist/template-hdri.d.ts +12 -0
  16. package/dist/template-hdri.d.ts.map +1 -0
  17. package/dist/template-hdri.js +49 -0
  18. package/dist/template-hdri.js.map +1 -0
  19. package/hdri/ATTRIBUTION.md +8 -0
  20. package/hdri/autumn_field_puresky_1k.hdr +0 -0
  21. package/hdri/kloppenheim_06_puresky_1k.hdr +0 -0
  22. package/hdri/night-2k.hdr +0 -0
  23. package/hdri/studio_small_08_1k.hdr +0 -0
  24. package/package.json +14 -10
  25. package/skills/agent-files/AGENTS.md +3 -0
  26. package/skills/aura3d-animation-studio/SKILL.md +153 -0
  27. package/skills/aura3d-animation-studio/references/shot-looks.md +26 -0
  28. package/skills/aura3d-art-direction/SKILL.md +84 -0
  29. package/skills/aura3d-art-direction/references/failure-gallery.md +64 -0
  30. package/skills/aura3d-art-direction/references/framing-and-shots.md +45 -0
  31. package/skills/aura3d-art-direction/references/look-recipes.md +32 -0
  32. package/skills/aura3d-art-direction/references/quality-bar.md +103 -0
  33. package/skills/aura3d-art-direction/references/reference-frames.md +82 -0
  34. package/skills/aura3d-assets/SKILL.md +132 -0
  35. package/skills/aura3d-assets/references/preview-under-look.md +26 -0
  36. package/skills/aura3d-browser-game/SKILL.md +127 -0
  37. package/skills/aura3d-browser-game/references/genre-looks.md +52 -0
  38. package/skills/aura3d-character-animation/SKILL.md +129 -0
  39. package/skills/aura3d-character-animation/references/stage-and-lighting.md +31 -0
  40. package/skills/aura3d-core/SKILL.md +121 -0
  41. package/skills/aura3d-core/references/boundaries.md +91 -0
  42. package/skills/aura3d-evidence-review/SKILL.md +106 -0
  43. package/skills/aura3d-game-art/SKILL.md +118 -0
  44. package/skills/aura3d-game-art/references/sheet-check.mjs +58 -0
  45. package/skills/aura3d-game-art/references/sprite-palettes.md +25 -0
  46. package/skills/aura3d-materials-environments/SKILL.md +139 -0
  47. package/skills/aura3d-performance/SKILL.md +97 -0
  48. package/skills/aura3d-retexture/SKILL.md +115 -0
  49. package/skills/aura3d-retexture/references/geometry-hash.mjs +89 -0
  50. package/skills/aura3d-scene-authoring/SKILL.md +132 -0
  51. package/skills/aura3d-scene-authoring/references/look-by-family.md +28 -0
  52. package/skills/aura3d-threejs-migration/SKILL.md +125 -0
  53. package/skills/aura3d-threejs-migration/references/look-mapping.md +27 -0
  54. package/skills/llms.txt +117 -0
  55. package/skills/manifest.json +163 -0
  56. package/skills/meshy-cli/SKILL.md +133 -0
  57. package/templates/animation-channel/.claude/CLAUDE.md +3 -0
  58. package/templates/animation-channel/.github/workflows/aura3d-lookdev.yml +67 -0
  59. package/templates/animation-channel/AGENTS.md +3 -0
  60. package/templates/animation-channel/package.json +4 -3
  61. package/templates/animation-channel/src/main.ts +5 -6
  62. package/templates/animation-channel/src/render-plan.ts +5 -3
  63. package/templates/animation-channel/tests/look-floor.ts +270 -0
  64. package/templates/animation-channel/tests/route-health.spec.ts +13 -0
  65. package/templates/animation-channel/tests/screenshot.spec.ts +10 -5
  66. package/templates/animation-channel/vite.config.ts +7 -0
  67. package/templates/animation-studio/.claude/CLAUDE.md +3 -0
  68. package/templates/animation-studio/.github/workflows/aura3d-lookdev.yml +67 -0
  69. package/templates/animation-studio/AGENTS.md +2 -70
  70. package/templates/animation-studio/package.json +5 -4
  71. package/templates/animation-studio/public/aura-assets/luma.thumb.svg +1 -1
  72. package/templates/animation-studio/public/aura-assets/miko.thumb.svg +1 -1
  73. package/templates/{falling-blocks-starter/public/aura-assets/showcaseBlockfallCabinet.thumb.svg → animation-studio/public/aura-assets/moonGarden.thumb.svg} +1 -1
  74. package/templates/animation-studio/scripts/build-clip-library.ts +6 -5
  75. package/templates/animation-studio/scripts/resolve-asset.ts +7 -4
  76. package/templates/animation-studio/src/asset-contract.ts +19 -0
  77. package/templates/animation-studio/src/aura-assets.ts +651 -54
  78. package/templates/animation-studio/src/scene-player.ts +6 -6
  79. package/templates/animation-studio/src/set-templates.ts +13 -9
  80. package/templates/animation-studio/tests/look-floor.ts +270 -0
  81. package/templates/animation-studio/tests/route-health.spec.ts +2 -2
  82. package/templates/animation-studio/tests/screenshot.spec.ts +18 -10
  83. package/templates/animation-studio/vite.config.ts +2 -0
  84. package/templates/architecture-interior/.claude/CLAUDE.md +3 -0
  85. package/templates/architecture-interior/.github/workflows/aura3d-lookdev.yml +67 -0
  86. package/templates/architecture-interior/AGENTS.md +3 -0
  87. package/templates/architecture-interior/README.md +16 -0
  88. package/templates/architecture-interior/aura.assets.json +24 -0
  89. package/templates/architecture-interior/package.json +24 -0
  90. package/templates/architecture-interior/public/aura-assets/kenneyModularDungeonRoomSmall.a7e74a5f.glb +0 -0
  91. package/templates/architecture-interior/src/aura-assets.ts +16 -0
  92. package/templates/architecture-interior/src/main.ts +23 -0
  93. package/templates/architecture-interior/tests/look-floor.ts +270 -0
  94. package/templates/{three-compat-architecture-interior → architecture-interior}/tests/route-health.spec.ts +3 -3
  95. package/templates/architecture-interior/tests/screenshot.spec.ts +21 -0
  96. package/templates/architecture-interior/vite.config.ts +7 -0
  97. package/templates/arena-shooter/.claude/CLAUDE.md +3 -0
  98. package/templates/arena-shooter/.github/workflows/aura3d-lookdev.yml +67 -0
  99. package/templates/arena-shooter/AGENTS.md +3 -0
  100. package/templates/arena-shooter/README.md +45 -0
  101. package/templates/arena-shooter/aura.assets.json +62 -0
  102. package/templates/arena-shooter/index.html +32 -0
  103. package/templates/arena-shooter/package.json +23 -0
  104. package/templates/arena-shooter/playwright.config.ts +15 -0
  105. package/templates/arena-shooter/public/aura-assets/craft_miner.de323205.glb +0 -0
  106. package/templates/arena-shooter/public/aura-assets/craft_racer.bce8cb3d.glb +0 -0
  107. package/templates/arena-shooter/public/aura-assets/meteor_detailed.f30379ab.glb +0 -0
  108. package/templates/arena-shooter/src/aura-assets.ts +56 -0
  109. package/templates/arena-shooter/src/main.ts +616 -0
  110. package/templates/arena-shooter/tests/look-floor.ts +270 -0
  111. package/templates/arena-shooter/tests/playable.spec.ts +56 -0
  112. package/templates/arena-shooter/tests/route-health.spec.ts +87 -0
  113. package/templates/arena-shooter/tests/screenshot.spec.ts +22 -0
  114. package/templates/arena-shooter/tsconfig.json +15 -0
  115. package/templates/arena-shooter/vite.config.ts +7 -0
  116. package/templates/asset-inspector/.claude/CLAUDE.md +3 -0
  117. package/templates/asset-inspector/.github/workflows/aura3d-lookdev.yml +67 -0
  118. package/templates/asset-inspector/AGENTS.md +3 -0
  119. package/templates/asset-inspector/README.md +13 -0
  120. package/templates/asset-inspector/aura.assets.json +24 -0
  121. package/templates/{three-compat-custom-threejs-migration → asset-inspector}/package.json +6 -4
  122. package/templates/asset-inspector/public/aura-assets/kenneyCarKitSedanSports.2889c428.glb +0 -0
  123. package/templates/asset-inspector/src/aura-assets.ts +16 -0
  124. package/templates/asset-inspector/src/main.ts +23 -0
  125. package/templates/asset-inspector/tests/look-floor.ts +270 -0
  126. package/templates/{three-compat-character-viewer → asset-inspector}/tests/route-health.spec.ts +3 -3
  127. package/templates/asset-inspector/tests/screenshot.spec.ts +21 -0
  128. package/templates/asset-inspector/vite.config.ts +7 -0
  129. package/templates/character-controller/.claude/CLAUDE.md +3 -0
  130. package/templates/character-controller/.github/workflows/aura3d-lookdev.yml +67 -0
  131. package/templates/character-controller/AGENTS.md +3 -0
  132. package/templates/character-controller/README.md +7 -1
  133. package/templates/character-controller/aura.assets.json +29 -22
  134. package/templates/character-controller/index.html +4 -5
  135. package/templates/character-controller/package.json +6 -5
  136. package/templates/character-controller/playwright.config.ts +1 -0
  137. package/templates/character-controller/public/aura-assets/auraclash-player-rig.glb +0 -0
  138. package/templates/character-controller/src/aura-assets.ts +25 -7
  139. package/templates/character-controller/src/main.ts +190 -47
  140. package/templates/character-controller/tests/certified-rig.spec.ts +2 -2
  141. package/templates/character-controller/tests/look-floor.ts +270 -0
  142. package/templates/character-controller/tests/route-health.spec.ts +49 -4
  143. package/templates/character-controller/tests/screenshot.spec.ts +17 -5
  144. package/templates/character-controller/vite.config.ts +7 -0
  145. package/templates/character-viewer/.claude/CLAUDE.md +3 -0
  146. package/templates/character-viewer/.github/workflows/aura3d-lookdev.yml +67 -0
  147. package/templates/character-viewer/AGENTS.md +3 -0
  148. package/templates/character-viewer/README.md +13 -0
  149. package/templates/character-viewer/aura.assets.json +24 -0
  150. package/templates/{three-compat-asset-inspector → character-viewer}/package.json +6 -4
  151. package/templates/character-viewer/public/aura-assets/kenneyMiniForestCharacterArcher.0fd0f92e.glb +0 -0
  152. package/templates/character-viewer/src/aura-assets.ts +16 -0
  153. package/templates/character-viewer/src/main.ts +21 -0
  154. package/templates/character-viewer/tests/look-floor.ts +270 -0
  155. package/templates/{three-compat-custom-threejs-migration → character-viewer}/tests/route-health.spec.ts +3 -3
  156. package/templates/character-viewer/tests/screenshot.spec.ts +21 -0
  157. package/templates/character-viewer/vite.config.ts +7 -0
  158. package/templates/cinematic-scene/.claude/CLAUDE.md +3 -0
  159. package/templates/cinematic-scene/.github/workflows/aura3d-lookdev.yml +67 -0
  160. package/templates/cinematic-scene/AGENTS.md +3 -0
  161. package/templates/cinematic-scene/README.md +11 -2
  162. package/templates/cinematic-scene/package.json +4 -3
  163. package/templates/cinematic-scene/src/main.ts +46 -11
  164. package/templates/cinematic-scene/tests/look-floor.ts +270 -0
  165. package/templates/cinematic-scene/tests/route-health.spec.ts +31 -3
  166. package/templates/cinematic-scene/tests/screenshot.spec.ts +34 -45
  167. package/templates/cinematic-scene/vite.config.ts +7 -0
  168. package/templates/custom-scene/.claude/CLAUDE.md +3 -0
  169. package/templates/custom-scene/.github/workflows/aura3d-lookdev.yml +67 -0
  170. package/templates/custom-scene/AGENTS.md +3 -0
  171. package/templates/custom-scene/README.md +13 -0
  172. package/templates/custom-scene/aura.assets.json +24 -0
  173. package/templates/{three-compat-character-viewer → custom-scene}/package.json +6 -4
  174. package/templates/custom-scene/public/aura-assets/kenneyPirateKitShipMedium.279ea019.glb +0 -0
  175. package/templates/custom-scene/src/aura-assets.ts +16 -0
  176. package/templates/custom-scene/src/main.ts +23 -0
  177. package/templates/custom-scene/tests/look-floor.ts +270 -0
  178. package/templates/{three-compat-asset-inspector → custom-scene}/tests/route-health.spec.ts +3 -3
  179. package/templates/custom-scene/tests/screenshot.spec.ts +21 -0
  180. package/templates/custom-scene/vite.config.ts +7 -0
  181. package/templates/episode-builder/.claude/CLAUDE.md +3 -0
  182. package/templates/episode-builder/.github/workflows/aura3d-lookdev.yml +67 -0
  183. package/templates/episode-builder/AGENTS.md +3 -0
  184. package/templates/episode-builder/package.json +4 -3
  185. package/templates/episode-builder/src/main.ts +5 -3
  186. package/templates/episode-builder/src/render-plan.ts +5 -3
  187. package/templates/episode-builder/tests/look-floor.ts +270 -0
  188. package/templates/episode-builder/tests/route-health.spec.ts +11 -0
  189. package/templates/episode-builder/tests/screenshot.spec.ts +10 -4
  190. package/templates/episode-builder/vite.config.ts +7 -0
  191. package/templates/falling-blocks-starter/.claude/CLAUDE.md +3 -0
  192. package/templates/falling-blocks-starter/.github/workflows/aura3d-lookdev.yml +67 -0
  193. package/templates/falling-blocks-starter/AGENTS.md +3 -0
  194. package/templates/falling-blocks-starter/README.md +10 -1
  195. package/templates/falling-blocks-starter/aura.assets.json +40 -23
  196. package/templates/falling-blocks-starter/package.json +4 -3
  197. package/templates/falling-blocks-starter/public/aura-assets/quaternius-cube-crate.glb +0 -0
  198. package/templates/falling-blocks-starter/public/aura-assets/quaternius-wall-modular.glb +0 -0
  199. package/templates/falling-blocks-starter/src/aura-assets.ts +33 -10
  200. package/templates/falling-blocks-starter/src/main.ts +317 -96
  201. package/templates/falling-blocks-starter/tests/look-floor.ts +270 -0
  202. package/templates/falling-blocks-starter/tests/playable.spec.ts +51 -18
  203. package/templates/falling-blocks-starter/tests/route-health.spec.ts +17 -7
  204. package/templates/falling-blocks-starter/tests/screenshot.spec.ts +21 -0
  205. package/templates/falling-blocks-starter/vite.config.ts +7 -0
  206. package/templates/fighting-game/.claude/CLAUDE.md +3 -0
  207. package/templates/fighting-game/.github/workflows/aura3d-lookdev.yml +67 -0
  208. package/templates/fighting-game/AGENTS.md +3 -0
  209. package/templates/fighting-game/README.md +2 -0
  210. package/templates/fighting-game/aura.assets.json +56 -46
  211. package/templates/fighting-game/package.json +5 -3
  212. package/templates/fighting-game/public/aura-assets/auraclash-player-rig.glb +0 -0
  213. package/templates/fighting-game/public/aura-assets/auraclash-rival-rig.glb +0 -0
  214. package/templates/fighting-game/src/aura-assets.ts +54 -20
  215. package/templates/fighting-game/src/game/fighters.ts +57 -12
  216. package/templates/fighting-game/src/main.ts +135 -53
  217. package/templates/fighting-game/tests/certified-rig.spec.ts +1 -1
  218. package/templates/fighting-game/tests/gameplay-smoke.spec.ts +25 -33
  219. package/templates/fighting-game/tests/look-floor.ts +270 -0
  220. package/templates/fighting-game/tests/route-health.spec.ts +23 -4
  221. package/templates/fighting-game/tests/screenshot.spec.ts +10 -4
  222. package/templates/fighting-game/vite.config.ts +7 -0
  223. package/templates/large-scene/.claude/CLAUDE.md +3 -0
  224. package/templates/large-scene/.github/workflows/aura3d-lookdev.yml +67 -0
  225. package/templates/large-scene/AGENTS.md +3 -0
  226. package/templates/large-scene/README.md +13 -0
  227. package/templates/large-scene/aura.assets.json +40 -0
  228. package/templates/{three-compat-architecture-interior → large-scene}/package.json +6 -4
  229. package/templates/large-scene/public/aura-assets/kenneyMiniForestRocksHigh.226728a0.glb +0 -0
  230. package/templates/large-scene/public/aura-assets/kenneyMiniForestTree.0075d505.glb +0 -0
  231. package/templates/large-scene/src/aura-assets.ts +28 -0
  232. package/templates/large-scene/src/main.ts +43 -0
  233. package/templates/large-scene/tests/look-floor.ts +270 -0
  234. package/templates/large-scene/tests/route-health.spec.ts +16 -0
  235. package/templates/large-scene/tests/screenshot.spec.ts +21 -0
  236. package/templates/large-scene/vite.config.ts +7 -0
  237. package/templates/material-authoring/.claude/CLAUDE.md +3 -0
  238. package/templates/material-authoring/.github/workflows/aura3d-lookdev.yml +67 -0
  239. package/templates/material-authoring/AGENTS.md +3 -0
  240. package/templates/material-authoring/README.md +15 -0
  241. package/templates/material-authoring/aura.assets.json +24 -0
  242. package/templates/material-authoring/package.json +24 -0
  243. package/templates/material-authoring/public/aura-assets/kenneyCarKitSedanSports.2889c428.glb +0 -0
  244. package/templates/material-authoring/src/aura-assets.ts +16 -0
  245. package/templates/material-authoring/src/main.ts +78 -0
  246. package/templates/material-authoring/tests/look-floor.ts +270 -0
  247. package/templates/material-authoring/tests/route-health.spec.ts +16 -0
  248. package/templates/material-authoring/tests/screenshot.spec.ts +21 -0
  249. package/templates/material-authoring/vite.config.ts +7 -0
  250. package/templates/mini-game/.claude/CLAUDE.md +3 -0
  251. package/templates/mini-game/.github/workflows/aura3d-lookdev.yml +67 -0
  252. package/templates/mini-game/AGENTS.md +3 -0
  253. package/templates/mini-game/README.md +9 -6
  254. package/templates/mini-game/aura.assets.json +177 -36
  255. package/templates/mini-game/package.json +4 -2
  256. package/templates/mini-game/public/aura-assets/kaykit-barbarian.glb +0 -0
  257. package/templates/mini-game/public/aura-assets/kenneyPlatformerKitKey.2e930961.glb +0 -0
  258. package/templates/mini-game/public/aura-assets/kenneyPlatformerKitStar.a102a1b9.glb +0 -0
  259. package/templates/mini-game/public/aura-assets/quaternius-crate.glb +0 -0
  260. package/templates/mini-game/public/aura-assets/quaternius-cube-crate.glb +0 -0
  261. package/templates/mini-game/src/aura-assets.ts +140 -32
  262. package/templates/mini-game/src/main.ts +204 -71
  263. package/templates/mini-game/tests/certified-rig.spec.ts +2 -2
  264. package/templates/mini-game/tests/look-floor.ts +270 -0
  265. package/templates/mini-game/tests/playable.spec.ts +23 -2
  266. package/templates/mini-game/tests/route-health.spec.ts +2 -2
  267. package/templates/mini-game/tests/screenshot.spec.ts +44 -53
  268. package/templates/mini-game/vite.config.ts +7 -0
  269. package/templates/postprocess-scene/.claude/CLAUDE.md +3 -0
  270. package/templates/postprocess-scene/.github/workflows/aura3d-lookdev.yml +67 -0
  271. package/templates/postprocess-scene/AGENTS.md +3 -0
  272. package/templates/postprocess-scene/README.md +17 -0
  273. package/templates/postprocess-scene/aura.assets.json +38 -0
  274. package/templates/postprocess-scene/package.json +24 -0
  275. package/templates/postprocess-scene/public/aura-assets/showcaseLuma.ef389217.glb +0 -0
  276. package/templates/postprocess-scene/public/aura-assets/showcaseMiko.fcdc2b75.glb +0 -0
  277. package/templates/postprocess-scene/src/aura-assets.ts +28 -0
  278. package/templates/postprocess-scene/src/main.ts +29 -0
  279. package/templates/postprocess-scene/tests/look-floor.ts +270 -0
  280. package/templates/postprocess-scene/tests/route-health.spec.ts +16 -0
  281. package/templates/postprocess-scene/tests/screenshot.spec.ts +21 -0
  282. package/templates/postprocess-scene/vite.config.ts +7 -0
  283. package/templates/premium-product-viewer/.claude/CLAUDE.md +3 -0
  284. package/templates/premium-product-viewer/.github/workflows/aura3d-lookdev.yml +67 -0
  285. package/templates/premium-product-viewer/AGENTS.md +3 -0
  286. package/templates/premium-product-viewer/README.md +18 -0
  287. package/templates/premium-product-viewer/aura.assets.json +24 -0
  288. package/templates/premium-product-viewer/package.json +24 -0
  289. package/templates/premium-product-viewer/public/aura-assets/khronosToyCar.01a60862.glb +0 -0
  290. package/templates/premium-product-viewer/src/aura-assets.ts +16 -0
  291. package/templates/premium-product-viewer/src/main.ts +33 -0
  292. package/templates/premium-product-viewer/tests/look-floor.ts +270 -0
  293. package/templates/premium-product-viewer/tests/route-health.spec.ts +16 -0
  294. package/templates/premium-product-viewer/tests/screenshot.spec.ts +21 -0
  295. package/templates/premium-product-viewer/vite.config.ts +7 -0
  296. package/templates/product-viewer/.claude/CLAUDE.md +3 -0
  297. package/templates/product-viewer/.github/workflows/aura3d-lookdev.yml +67 -0
  298. package/templates/product-viewer/AGENTS.md +3 -0
  299. package/templates/product-viewer/README.md +10 -8
  300. package/templates/product-viewer/package.json +4 -2
  301. package/templates/product-viewer/src/aura-assets.ts +1 -1
  302. package/templates/product-viewer/src/main.ts +78 -19
  303. package/templates/product-viewer/tests/look-floor.ts +270 -0
  304. package/templates/product-viewer/tests/route-health.spec.ts +19 -1
  305. package/templates/product-viewer/tests/screenshot.spec.ts +35 -41
  306. package/templates/product-viewer/vite.config.ts +7 -0
  307. package/templates/prompt-animation-channel/.claude/CLAUDE.md +3 -0
  308. package/templates/prompt-animation-channel/.github/workflows/aura3d-lookdev.yml +67 -0
  309. package/templates/prompt-animation-channel/AGENTS.md +3 -0
  310. package/templates/prompt-animation-channel/package.json +4 -3
  311. package/templates/prompt-animation-channel/src/main.ts +5 -3
  312. package/templates/prompt-animation-channel/src/render-plan.ts +5 -3
  313. package/templates/prompt-animation-channel/tests/look-floor.ts +270 -0
  314. package/templates/prompt-animation-channel/tests/route-health.spec.ts +12 -1
  315. package/templates/prompt-animation-channel/tests/screenshot.spec.ts +10 -4
  316. package/templates/prompt-animation-channel/tests/storyboard-playback.spec.ts +1 -1
  317. package/templates/prompt-animation-channel/vite.config.ts +7 -0
  318. package/templates/racing-starter/.claude/CLAUDE.md +3 -0
  319. package/templates/racing-starter/.github/workflows/aura3d-lookdev.yml +67 -0
  320. package/templates/racing-starter/AGENTS.md +3 -0
  321. package/templates/racing-starter/README.md +8 -6
  322. package/templates/racing-starter/package.json +4 -3
  323. package/templates/racing-starter/src/main.ts +169 -123
  324. package/templates/racing-starter/tests/geometry-certification.json +34 -0
  325. package/templates/racing-starter/tests/look-floor.ts +270 -0
  326. package/templates/racing-starter/tests/playable.spec.ts +63 -80
  327. package/templates/racing-starter/tests/route-health.spec.ts +14 -12
  328. package/templates/racing-starter/tests/screenshot.spec.ts +21 -0
  329. package/templates/racing-starter/vite.config.ts +7 -0
  330. package/templates/character-controller/public/aura-assets/showcaseWalkAnimatedGirl.93872fc2.glb +0 -0
  331. package/templates/character-controller/public/aura-assets/showcaseWalkAnimatedGirl.thumb.svg +0 -1
  332. package/templates/falling-blocks-starter/public/aura-assets/showcaseBlockfallCabinet.679d52fe.glb +0 -0
  333. package/templates/fighting-game/public/aura-assets/showcaseRunnerRobot.252b3a16.glb +0 -0
  334. package/templates/fighting-game/public/aura-assets/showcaseRunnerRobot.thumb.svg +0 -1
  335. package/templates/fighting-game/public/aura-assets/showcaseWalkAnimatedGirl.93872fc2.glb +0 -0
  336. package/templates/fighting-game/public/aura-assets/showcaseWalkAnimatedGirl.thumb.svg +0 -1
  337. package/templates/mini-game/public/aura-assets/showcaseKenneyOobiPlatformerHero.3f821141.glb +0 -0
  338. package/templates/mini-game/public/aura-assets/showcaseKenneyOobiPlatformerHero.thumb.svg +0 -1
  339. package/templates/three-compat-architecture-interior/aura.assets.json +0 -7
  340. package/templates/three-compat-architecture-interior/src/aura-assets.ts +0 -3
  341. package/templates/three-compat-architecture-interior/src/main.ts +0 -27
  342. package/templates/three-compat-architecture-interior/tests/screenshot.spec.ts +0 -15
  343. package/templates/three-compat-asset-inspector/aura.assets.json +0 -7
  344. package/templates/three-compat-asset-inspector/src/aura-assets.ts +0 -3
  345. package/templates/three-compat-asset-inspector/src/main.ts +0 -17
  346. package/templates/three-compat-asset-inspector/tests/screenshot.spec.ts +0 -15
  347. package/templates/three-compat-character-viewer/aura.assets.json +0 -7
  348. package/templates/three-compat-character-viewer/src/aura-assets.ts +0 -3
  349. package/templates/three-compat-character-viewer/src/main.ts +0 -17
  350. package/templates/three-compat-character-viewer/tests/screenshot.spec.ts +0 -15
  351. package/templates/three-compat-custom-threejs-migration/aura.assets.json +0 -7
  352. package/templates/three-compat-custom-threejs-migration/src/aura-assets.ts +0 -3
  353. package/templates/three-compat-custom-threejs-migration/src/main.ts +0 -16
  354. package/templates/three-compat-custom-threejs-migration/tests/screenshot.spec.ts +0 -15
  355. package/templates/three-compat-large-scene/aura.assets.json +0 -7
  356. package/templates/three-compat-large-scene/package.json +0 -22
  357. package/templates/three-compat-large-scene/src/aura-assets.ts +0 -3
  358. package/templates/three-compat-large-scene/src/main.ts +0 -31
  359. package/templates/three-compat-large-scene/tests/route-health.spec.ts +0 -16
  360. package/templates/three-compat-large-scene/tests/screenshot.spec.ts +0 -15
  361. package/templates/three-compat-material-authoring/aura.assets.json +0 -7
  362. package/templates/three-compat-material-authoring/package.json +0 -22
  363. package/templates/three-compat-material-authoring/src/aura-assets.ts +0 -3
  364. package/templates/three-compat-material-authoring/src/main.ts +0 -33
  365. package/templates/three-compat-material-authoring/tests/route-health.spec.ts +0 -16
  366. package/templates/three-compat-material-authoring/tests/screenshot.spec.ts +0 -15
  367. package/templates/three-compat-postprocess-scene/aura.assets.json +0 -7
  368. package/templates/three-compat-postprocess-scene/package.json +0 -22
  369. package/templates/three-compat-postprocess-scene/src/aura-assets.ts +0 -3
  370. package/templates/three-compat-postprocess-scene/src/main.ts +0 -17
  371. package/templates/three-compat-postprocess-scene/tests/route-health.spec.ts +0 -16
  372. package/templates/three-compat-postprocess-scene/tests/screenshot.spec.ts +0 -15
  373. package/templates/three-compat-premium-product-viewer/aura.assets.json +0 -7
  374. package/templates/three-compat-premium-product-viewer/package.json +0 -22
  375. package/templates/three-compat-premium-product-viewer/src/aura-assets.ts +0 -3
  376. package/templates/three-compat-premium-product-viewer/src/main.ts +0 -18
  377. package/templates/three-compat-premium-product-viewer/tests/route-health.spec.ts +0 -16
  378. package/templates/three-compat-premium-product-viewer/tests/screenshot.spec.ts +0 -15
  379. /package/templates/{three-compat-architecture-interior → architecture-interior}/index.html +0 -0
  380. /package/templates/{three-compat-architecture-interior → architecture-interior}/playwright.config.ts +0 -0
  381. /package/templates/{three-compat-architecture-interior → architecture-interior}/tsconfig.json +0 -0
  382. /package/templates/{three-compat-asset-inspector → asset-inspector}/index.html +0 -0
  383. /package/templates/{three-compat-asset-inspector → asset-inspector}/playwright.config.ts +0 -0
  384. /package/templates/{three-compat-asset-inspector → asset-inspector}/tsconfig.json +0 -0
  385. /package/templates/{three-compat-character-viewer → character-viewer}/index.html +0 -0
  386. /package/templates/{three-compat-character-viewer → character-viewer}/playwright.config.ts +0 -0
  387. /package/templates/{three-compat-character-viewer → character-viewer}/tsconfig.json +0 -0
  388. /package/templates/{three-compat-custom-threejs-migration → custom-scene}/index.html +0 -0
  389. /package/templates/{three-compat-custom-threejs-migration → custom-scene}/playwright.config.ts +0 -0
  390. /package/templates/{three-compat-custom-threejs-migration → custom-scene}/tsconfig.json +0 -0
  391. /package/templates/{three-compat-large-scene → large-scene}/index.html +0 -0
  392. /package/templates/{three-compat-large-scene → large-scene}/playwright.config.ts +0 -0
  393. /package/templates/{three-compat-large-scene → large-scene}/tsconfig.json +0 -0
  394. /package/templates/{three-compat-material-authoring → material-authoring}/index.html +0 -0
  395. /package/templates/{three-compat-material-authoring → material-authoring}/playwright.config.ts +0 -0
  396. /package/templates/{three-compat-material-authoring → material-authoring}/tsconfig.json +0 -0
  397. /package/templates/{three-compat-postprocess-scene → postprocess-scene}/index.html +0 -0
  398. /package/templates/{three-compat-postprocess-scene → postprocess-scene}/playwright.config.ts +0 -0
  399. /package/templates/{three-compat-postprocess-scene → postprocess-scene}/tsconfig.json +0 -0
  400. /package/templates/{three-compat-premium-product-viewer → premium-product-viewer}/index.html +0 -0
  401. /package/templates/{three-compat-premium-product-viewer → premium-product-viewer}/playwright.config.ts +0 -0
  402. /package/templates/{three-compat-premium-product-viewer → premium-product-viewer}/tsconfig.json +0 -0
@@ -0,0 +1,115 @@
1
+ ---
2
+ name: aura3d-retexture
3
+ description: Restyles a finished, admitted mesh while proving the geometry is untouched: before and after `assets inspect` bounds plus a position-accessor hash diff, one material family per map set, and a matched before and after screenshot filmstrip. Use when retexturing, recoloring, reskinning, or restyling an existing GLB or typed `assets.<key>` model, including after `meshy retexture`, a DCC texture pass, or a `model(asset, { material })` tint.
4
+ ---
5
+
6
+ # Aura3D retexture (geometry untouched)
7
+
8
+ A retexture changes how a mesh looks, never its shape. The proof is numeric
9
+ (identical bounds and position data) plus visual (a matched before and after
10
+ filmstrip). Orbit or turnaround views are not produced: the engine renders any
11
+ angle of the real mesh through `camera.*`, and painted angles would be
12
+ unverifiable. Shared rules (claim labels, typed assets, paid generation,
13
+ benchmark mode) are in
14
+ [../aura3d-core/references/boundaries.md](../aura3d-core/references/boundaries.md).
15
+
16
+ ## Look target
17
+
18
+ Judge a retexture under the look it will ship in — the same map set reads warm
19
+ under `golden-hour` and cold under `night-city`. Fix the route's look preset
20
+ first, then iterate on maps; a recolor tuned against flat lighting drifts
21
+ again under the real grade.
22
+
23
+ ## Establish the contract
24
+
25
+ 1. Run `npx @aura3d/cli@latest --help` and read the `assets inspect` and
26
+ `assets add` lines.
27
+ 2. Read `aura.assets.json` and `src/aura-assets.ts`. The source mesh must be
28
+ an admitted typed asset with a license. Keep its original file; never
29
+ overwrite it in place.
30
+ 3. Choose the path:
31
+ - Offline: a new GLB with new maps (a `meshy retexture` result through the
32
+ `meshy-cli` skill, or a DCC texture pass). This is the only way to change
33
+ texture maps.
34
+ - Runtime tint: `model(assets.x, { material: material.pbr({ color, roughness, metallic }) })`.
35
+ On typed GLBs this applies a flat tint that replaces surface textures on
36
+ the whole model. It cannot target one part or add maps.
37
+ 4. Benchmark mode: `npm install && npm run build`, then stop.
38
+
39
+ ## Procedure
40
+
41
+ 1. Record the before state:
42
+
43
+ ```sh
44
+ npx @aura3d/cli@latest assets inspect ./assets/source.glb --license > artifacts/retexture/before.inspect.json
45
+ node .agents/skills/aura3d-retexture/references/geometry-hash.mjs ./assets/source.glb > artifacts/retexture/before.geometry.json
46
+ ```
47
+
48
+ (Adjust the script path to wherever your agent client installed this
49
+ skill.) Keep `bounds`, `boundsMetadata`, `materials`, and `nodeNames` from
50
+ the inspection, and `geometryHash` plus per-primitive hashes from the
51
+ script. `assets inspect` reports bounds but no vertex hash, and the
52
+ manifest `hash` covers the whole file (textures included), so it always
53
+ changes on a retexture and proves nothing about geometry.
54
+ 2. Plan one material family per map set. List each glTF material by name
55
+ (from `materials`), assign it one target family (for example painted
56
+ metal, worn leather, matte plastic), and give each family exactly one map
57
+ set (base color, normal, roughness and metalness, occlusion). Never share
58
+ one map set across two families, and never split one family across two
59
+ map sets.
60
+ 3. Produce the after file as a new GLB in `artifacts/retexture/`. Only
61
+ materials, images, and textures may change. The node tree, mesh
62
+ primitives, UVs, skin, and morph targets stay as they are.
63
+ 4. Prove the geometry is untouched:
64
+
65
+ ```sh
66
+ node .agents/skills/aura3d-retexture/references/geometry-hash.mjs ./assets/source.glb artifacts/retexture/after.glb
67
+ npx @aura3d/cli@latest assets inspect artifacts/retexture/after.glb --license > artifacts/retexture/after.inspect.json
68
+ ```
69
+
70
+ The script exits 0 only when `geometryUntouched` is true (the same
71
+ POSITION and index bytes for every primitive). The inspections must show
72
+ identical `boundsMetadata.min`, `boundsMetadata.max`, and `nodeNames`, and
73
+ the same material names unless you renamed them on purpose. Draco
74
+ geometry must be decoded before hashing. For a runtime tint the file is
75
+ unchanged, so record that and skip the hash.
76
+ 5. Admit the after file as its own asset with provenance, leaving the
77
+ original entry in place:
78
+
79
+ ```sh
80
+ npx @aura3d/cli@latest assets add artifacts/retexture/after.glb --name sourceRestyled --license CC-BY-4.0 --author "<author>" --quality candidate --role product
81
+ npx @aura3d/cli@latest assets typegen
82
+ ```
83
+
84
+ Carry the source license forward; a derived file inherits its terms.
85
+ 6. Capture the filmstrip (normal mode, via `npm run test` on CI or a remote
86
+ worker): the same camera, lights, environment, exposure, and viewport for
87
+ before and after, 3 to 5 fixed views, for example
88
+ `camera.frameAsset(assets.source)` plus fixed `camera.perspective(...)`
89
+ positions. Only the asset key may differ between the paired frames. Place
90
+ each before frame beside its after frame.
91
+ 7. Report: the family-to-map-set table, both geometry reports, the bounds
92
+ comparison, the filmstrip, and the new asset key. Hand the label to
93
+ `aura3d-evidence-review`; a retextured asset stays `candidate` until
94
+ reviewed.
95
+
96
+ ## Stop and report
97
+
98
+ - `geometryUntouched` is false, or bounds or node names differ: stop. The
99
+ file is a remesh or rebuild, not a retexture. Report the changed
100
+ primitives, and do not admit it as a restyle of the source.
101
+ - The request needs per-part maps, but only the runtime tint path is
102
+ available: report the gap; the tint recolors the whole model.
103
+ - The source has no license or provenance, or its terms forbid derivatives:
104
+ do not retexture it.
105
+ - A mismatched camera, lighting, or viewport between before and after frames
106
+ makes the filmstrip invalid: recapture it; do not describe the difference.
107
+ - Someone asks for orbit or turnaround renders painted from a 2D concept:
108
+ decline, and render real angles of the real mesh instead.
109
+
110
+ ## References
111
+
112
+ - [Geometry hash script](references/geometry-hash.mjs)
113
+ - [Asset workflow and `assets inspect`](https://github.com/auraoneai/aura3d/blob/main/docs/agents/asset-workflow.md)
114
+ - [Rendering proof rule](https://github.com/auraoneai/aura3d/blob/main/docs/agents/rendering-proof-required.md)
115
+ - Meshy retexture runs, approval, and `--max-credits`: load `meshy-cli`.
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+ // Geometry-untouched proof for a retexture: hashes every mesh primitive's
3
+ // POSITION (and index) accessor bytes in a .glb, ignoring materials, images,
4
+ // and textures. Two GLBs whose "geometryHash" matches have byte-identical
5
+ // vertex positions and topology. Dependency-free; reads GLB 2.0 (BIN chunk,
6
+ // data: URIs, or relative buffer files). Draco-compressed meshes are rejected.
7
+ //
8
+ // Usage: node geometry-hash.mjs before.glb [after.glb]
9
+ import { createHash } from "node:crypto";
10
+ import { readFileSync } from "node:fs";
11
+ import { dirname, resolve } from "node:path";
12
+
13
+ function readGlb(path) {
14
+ const buf = readFileSync(path);
15
+ if (buf.readUInt32LE(0) !== 0x46546c67) throw new Error(`${path}: not a GLB (bad magic)`);
16
+ let offset = 12;
17
+ let json;
18
+ let bin;
19
+ while (offset < buf.length) {
20
+ const length = buf.readUInt32LE(offset);
21
+ const type = buf.readUInt32LE(offset + 4);
22
+ const chunk = buf.subarray(offset + 8, offset + 8 + length);
23
+ if (type === 0x4e4f534a) json = JSON.parse(chunk.toString("utf8"));
24
+ else if (type === 0x004e4942) bin = chunk;
25
+ offset += 8 + length;
26
+ }
27
+ if (!json) throw new Error(`${path}: missing JSON chunk`);
28
+ // buffer 0 is the BIN chunk unless it declares a uri; data: and relative uris are also read.
29
+ const buffers = (json.buffers ?? []).map((buffer, index) => {
30
+ if (!buffer.uri) return index === 0 ? bin : undefined;
31
+ if (buffer.uri.startsWith("data:")) return Buffer.from(buffer.uri.split(",")[1] ?? "", "base64");
32
+ if (/^[a-z]+:/i.test(buffer.uri)) throw new Error(`${path}: remote buffer uri not supported`);
33
+ return readFileSync(resolve(dirname(path), decodeURIComponent(buffer.uri)));
34
+ });
35
+ return { json, buffers };
36
+ }
37
+
38
+ const COMPONENT_BYTES = { 5120: 1, 5121: 1, 5122: 2, 5123: 2, 5125: 4, 5126: 4 };
39
+ const TYPE_COUNT = { SCALAR: 1, VEC2: 2, VEC3: 3, VEC4: 4, MAT4: 16 };
40
+
41
+ function accessorBytes({ json, buffers }, index) {
42
+ const accessor = json.accessors[index];
43
+ if (accessor.bufferView === undefined) return Buffer.alloc(0);
44
+ const view = json.bufferViews[accessor.bufferView];
45
+ const bin = buffers[view.buffer ?? 0];
46
+ if (!bin) throw new Error(`buffer ${view.buffer ?? 0} is not readable`);
47
+ const elementSize = COMPONENT_BYTES[accessor.componentType] * TYPE_COUNT[accessor.type];
48
+ const stride = view.byteStride ?? elementSize;
49
+ const start = (view.byteOffset ?? 0) + (accessor.byteOffset ?? 0);
50
+ const out = Buffer.alloc(elementSize * accessor.count);
51
+ for (let i = 0; i < accessor.count; i += 1) bin.copy(out, i * elementSize, start + i * stride, start + i * stride + elementSize);
52
+ return out;
53
+ }
54
+
55
+ function geometryReport(path) {
56
+ const glb = readGlb(path);
57
+ const whole = createHash("sha256");
58
+ const primitives = [];
59
+ (glb.json.meshes ?? []).forEach((mesh, meshIndex) => {
60
+ (mesh.primitives ?? []).forEach((primitive, primitiveIndex) => {
61
+ if (primitive.extensions?.KHR_draco_mesh_compression) throw new Error("Draco-compressed geometry: decode before hashing");
62
+ const position = primitive.attributes?.POSITION;
63
+ if (position === undefined) return;
64
+ const positions = accessorBytes(glb, position);
65
+ const indices = primitive.indices === undefined ? Buffer.alloc(0) : accessorBytes(glb, primitive.indices);
66
+ const hash = createHash("sha256").update(positions).update(indices).digest("hex");
67
+ whole.update(hash);
68
+ const accessor = glb.json.accessors[position];
69
+ primitives.push({ mesh: mesh.name ?? `mesh${meshIndex}`, primitive: primitiveIndex, vertices: accessor.count, min: accessor.min, max: accessor.max, hash: `sha256-${hash}` });
70
+ });
71
+ });
72
+ return { file: path, primitiveCount: primitives.length, geometryHash: `sha256-${whole.digest("hex")}`, primitives };
73
+ }
74
+
75
+ const [before, after] = process.argv.slice(2);
76
+ if (!before) {
77
+ console.error("usage: node geometry-hash.mjs before.glb [after.glb]");
78
+ process.exit(2);
79
+ }
80
+ const a = geometryReport(before);
81
+ if (!after) {
82
+ console.log(JSON.stringify(a, null, 2));
83
+ } else {
84
+ const b = geometryReport(after);
85
+ const geometryUntouched = a.geometryHash === b.geometryHash;
86
+ const changed = a.primitives.filter((p, i) => p.hash !== b.primitives[i]?.hash).map((p) => `${p.mesh}#${p.primitive}`);
87
+ console.log(JSON.stringify({ geometryUntouched, before: a.geometryHash, after: b.geometryHash, primitiveCount: [a.primitiveCount, b.primitiveCount], changed }, null, 2));
88
+ process.exitCode = geometryUntouched ? 0 : 1;
89
+ }
@@ -0,0 +1,132 @@
1
+ ---
2
+ name: aura3d-scene-authoring
3
+ description: Turns a scene prompt into editable `@aura3d/engine` source by picking a scene kit or prompt plan, compiling it, and repairing weak screenshots from the compiled report. Use when writing a scene or route from a prompt, choosing among `sceneKits.*`, `prefabs.*`, or `primitives.*`, or using `definePromptPlan`, `compilePromptPlan`, `promptPlanToScene`, or `collectAuraSceneEvidence`.
4
+ ---
5
+
6
+ # Aura3D scene authoring
7
+
8
+ You turn prompt intent into maintainable TypeScript that calls public Aura3D
9
+ APIs. There is no hidden scene generator. Every scene gets a look — the preset
10
+ that supplies environment light, key shadow, fog, background and grade. Shared
11
+ rules (claim labels, forbidden patterns, typed assets, benchmark mode) are in
12
+ [boundaries](../aura3d-core/references/boundaries.md).
13
+
14
+ ## Look target
15
+
16
+ Read the genre recipe row in `../aura3d-art-direction/references/look-recipes.md`,
17
+ pick the look id, and carry it through the plan and the code. A scene without a
18
+ look renders flat on a void.
19
+
20
+ ## Establish the contract
21
+
22
+ 1. Run `npx @aura3d/cli@latest --help` and use only the commands it prints.
23
+ 2. Read `src/aura-assets.ts` and `aura.assets.json`. Every subject model comes
24
+ from a generated key. If the prompt names a real object and no key exists,
25
+ load `aura3d-assets` first.
26
+ 3. Read the installed `@aura3d/engine` type declarations before naming an
27
+ export. The prompt-plan enums are narrow: `sceneType` is `product-viewer`,
28
+ `cinematic-scene`, `mini-game`, or `material-studio`.
29
+ 4. Decide the mode. Benchmark mode: if `aura3d look capture` is available,
30
+ run the look-dev loop; otherwise copy the smallest matching recipe, run
31
+ `npm install && npm run build`, return the runner-owned run command, stop,
32
+ and label the result `prototype`.
33
+
34
+ ## Procedure
35
+
36
+ 1. Restate the prompt as scene intent: subject, scene family, camera, lighting,
37
+ effects, interaction, and what a screenshot must visibly show.
38
+ 2. Pick the starting point in this order: a template, then a scene kit, then
39
+ `prefabs.*`, and `primitives.*` only for set dressing, guides, or explicitly
40
+ abstract visuals.
41
+
42
+ | Prompt family | Start from | Screenshot must show |
43
+ | --- | --- | --- |
44
+ | Physics playground | `sceneKits.physicsPlayground` | falling cubes, settled pile, ramp, contact cues, reset |
45
+ | Particle fountain | `sceneKits.particleFountain` | dense upward flow, nozzle, splash, a real emission-rate control |
46
+ | Solar system | `sceneKits.solarSystem` | sun glow, six attached planet labels, orbit paths, stars |
47
+ | Neon tunnel | `sceneKits.neonTunnel` | inside-tube view, receding rings, rails, controlled bloom |
48
+ | Data visualization | `sceneKits.dataViz` | bars, axes, ticks, title, legend, selected value |
49
+ | Mini golf | `sceneKits.miniGolf` | ball, cup, aim and power, score, obstacle, boundaries |
50
+ | Material lab | `sceneKits.materialLab` | material classes distinct in pixels, not labels |
51
+ | City block | `sceneKits.cityBlock` | buildings, lit windows, streets, a real day/night state |
52
+ | Humanoid walk | `sceneKits.humanoidWalk` | one connected humanoid, planted feet, path |
53
+ | Product viewer | `sceneKits.productViewer` | typed model on plinth, contact shadow, softboxes |
54
+
55
+ 3. Kit path: mount the kit once and keep its diagnostics.
56
+
57
+ ```ts
58
+ import { createAuraApp, sceneKits } from "@aura3d/engine";
59
+ import { assets } from "./aura-assets";
60
+
61
+ const kit = sceneKits.productViewer(assets.product);
62
+ createAuraApp("#app", kit.toAppOptions());
63
+ console.log(kit.diagnostics, kit.evidence);
64
+ ```
65
+
66
+ 4. Plan path, when the prompt is product intent rather than a kit family:
67
+
68
+ ```ts
69
+ import { compilePromptPlan, createAuraApp, definePromptPlan, promptPlanToScene } from "@aura3d/engine";
70
+ import { assets } from "./aura-assets";
71
+
72
+ const plan = definePromptPlan({
73
+ sceneType: "product-viewer",
74
+ subject: { asset: assets.product },
75
+ camera: { preset: "product-orbit" },
76
+ lighting: { preset: "studio-softbox" },
77
+ interaction: "orbit",
78
+ acceptanceCriteria: ["product is centered and recognizable"]
79
+ } as const);
80
+
81
+ const compiled = compilePromptPlan(plan);
82
+ createAuraApp("#app", { scene: promptPlanToScene(plan), diagnostics: { overlay: true } });
83
+ console.log(compiled.report.visualSystems, compiled.report.repairHints);
84
+ ```
85
+
86
+ 5. Read the compiled report before editing: `visualSystems` lists what the
87
+ compiled scene actually contains; `rejected` lists what the engine could
88
+ not do (each with a code such as `unsupported-effect`); `repairHints`
89
+ carries the `lookLint` findings; `negativeCriteria` lists what must not
90
+ ship. Repair from `repairHints` plus `aura3d look lint` output.
91
+ 6. Controls go through `ui.*` helpers and must change rendered pixels; CSS and
92
+ DOM are UI only and never stand in for particles, bloom, trails, labels, or
93
+ renderer output.
94
+ 7. Mount one app per route. Never dispose and recreate the app inside a frame
95
+ loop to animate values.
96
+ 8. Normal mode only: collect `collectAuraSceneEvidence(scene)` or the kit
97
+ evidence, run `npm run build`, and hand screenshots and route health to
98
+ `aura3d-evidence-review`. The template `npm run test` gate runs Playwright;
99
+ run it in CI or on a remote runner, not on the local machine.
100
+ 9. Weak screenshot: apply the repair hints (tighter framing, foreground and
101
+ background structure, key/fill/rim contrast, visible state) or switch back
102
+ to the matching kit before changing any label or claim.
103
+
104
+ ## Look-dev loop
105
+
106
+ `aura3d look capture` → judge against `quality-bar.md` → `aura3d look lint` →
107
+ one change per round (lint first, then the weakest category). Full loop spec:
108
+ `aura3d-art-direction`.
109
+
110
+ ## Stop and report
111
+
112
+ - The subject is a named real object with no typed asset key: stop, load
113
+ `aura3d-assets`, and label the scene `blocked` until the key exists.
114
+ - The only way to satisfy the prompt is a primitive stand-in for the primary
115
+ subject: stop and label it `prototype`.
116
+ - An effect, PBR, skinning, WebGPU, or postprocess claim has no pixel evidence
117
+ from a route importing only `@aura3d/engine`: drop the claim or label it
118
+ `prototype`.
119
+ - `npm run build` fails on an export you guessed: remove it and re-read the
120
+ type declarations. Do not add casts to force it through.
121
+ - Benchmark mode: stop after the build and report the runner-owned command.
122
+
123
+ ## References
124
+
125
+ - [Shared boundaries](../aura3d-core/references/boundaries.md)
126
+ - [Build playbook](https://github.com/auraoneai/aura3d/blob/main/docs/agents/build-playbook.md)
127
+ - [Prompt to 3D workflow](https://github.com/auraoneai/aura3d/blob/main/docs/agents/prompt-to-3d-workflow.md)
128
+ - [Benchmark recipes](https://github.com/auraoneai/aura3d/blob/main/docs/agents/benchmark-recipes.md)
129
+ - [Agent guide llms.txt](https://github.com/auraoneai/aura3d/blob/main/llms.txt)
130
+ - [Prompt recipes](https://aura3d.auraone.ai/docs/prompt-recipes.html)
131
+ - [Look recipes](../aura3d-art-direction/references/look-recipes.md)
132
+ - [Look by scene family](references/look-by-family.md)
@@ -0,0 +1,28 @@
1
+ # Look by scene family
2
+
3
+ One look per scene family, matched to `aura3d-art-direction/references/look-recipes.md`
4
+ genres. Values are starting points; the look-dev loop refines them.
5
+
6
+ | Scene family | Look preset | Key light | Palette accent | Atmosphere | Post grade |
7
+ | --- | --- | --- | --- | --- | --- |
8
+ | Physics playground | `interior-industrial` | high window key, 60° elevation | safety orange on concrete | light haze for depth | `product-studio` |
9
+ | Particle fountain | `neon-night` | rim/back light through the spray | cyan-magenta emissive trail | thin fog catching bloom | `neon-night` |
10
+ | Solar system | `space` | single hard key from the sun | warm gold rim on planets | none — void is the look | `space` |
11
+ | Neon tunnel | `neon-arcade` | receding emissive rings | alternating ring hues | fog inside the tube | `neon-night` |
12
+ | Data visualization | `interior-neutral` | soft key over axis plane | single accent per series | none | `product-studio` |
13
+ | Mini golf | `outdoor-day` | warm afternoon key, 40° | turf greens + flag red | light fog on horizon | `daylight-outdoor` |
14
+ | Material lab | `product-studio` | triple softbox | neutral grey stage | none | `product-studio` |
15
+ | City block | `neon-night` | streetlight pools | sodium amber + sign neon | ground fog at street level | `neon-night` |
16
+ | Humanoid walk | `character-showcase` | 3/4 front key + rim | cloth accent color | light ground fog | `product-studio` |
17
+ | Product viewer | `product-studio` | hero softbox | brand accent on plinth | none | `product-studio` |
18
+ | Cinematic scene | `golden-hour` | low warm sun, 15° | teal shadow vs amber key | atmosphere haze layer | `cinematic-film` |
19
+ | Underwater | `underwater` | caustic shafts from surface | deep teal + biolume accent | volume haze, God rays | `underwater` |
20
+
21
+ ## Reading the row
22
+
23
+ - Look preset supplies IBL, background, fog base and grade; the row's key and
24
+ palette entries are the scene-specific tweak you apply on top.
25
+ - Fog density belongs to the look until the capture shows depth banding — then
26
+ raise it in the look, not with ad-hoc `world.fog` nodes.
27
+ - Palette accent is one saturated color the eye can find fast; the rest of the
28
+ frame stays in the look's own grade.
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: aura3d-threejs-migration
3
+ description: Ports three.js code to Aura3D by picking the matching migration template, rewriting to `@aura3d/engine` public APIs, and recording every approximation in the migration notes without drop-in claims. Use when porting three.js or R3F code, reading `THREE.*` imports, running the `aura3d migrate three` codemod (`migrateThreeToA3D`), or scaffolding a migration template (formerly `three-compat-*`).
4
+ ---
5
+
6
+ # Aura3D three.js migration
7
+
8
+ Aura3D is not a three.js drop-in. The target of a migration is a route written
9
+ against `@aura3d/engine` public APIs. There is no installed compat shim
10
+ package — `@aura3d/three-compat` was deleted in 4.0.0 — so the migration
11
+ codemod plus an honest written record of what could not be reproduced is the
12
+ on-ramp. Shared rules (claim labels, forbidden patterns, typed assets) are in
13
+ [../aura3d-core/references/boundaries.md](../aura3d-core/references/boundaries.md).
14
+
15
+ ## Look target
16
+
17
+ The migration replaces a hand-tuned renderer stack with a look preset: the
18
+ target genre's recipe row maps `toneMapping`, `scene.environment`, exposure and
19
+ fog into `looks.preset(<id>)` + `looks.appOptions(<id>)`. Keep the original
20
+ lighting intent visible in the migration notes rather than porting raw
21
+ toneMapping constants.
22
+
23
+ ## Establish the contract
24
+
25
+ 1. Run `npx @aura3d/cli@latest --help`, and check the installed
26
+ `@aura3d/engine` version. Name only exports you can see in its types.
27
+ 2. Inventory the source: list every `three`, `three/examples/jsm/*`, and
28
+ `three/addons/*` import, plus any `WebGLRenderer`, render loop, loader, and
29
+ `EffectComposer` use. That list is the migration scope.
30
+ 3. Read `src/aura-assets.ts`. Every GLB the old code loaded by URL must become
31
+ a typed asset (load `aura3d-assets`).
32
+ 4. Benchmark mode: `npm install && npm run build`, then stop.
33
+
34
+ ## Procedure
35
+
36
+ 1. Pick the closest template and scaffold it with
37
+ `npx create-aura3d@latest <dir> --template <name>`:
38
+
39
+ | Source code looks like | Template |
40
+ | --- | --- |
41
+ | Hand-rolled starter: renderer, ground, lit primitives | `custom-scene` |
42
+ | Product on a studio stage | `premium-product-viewer` |
43
+ | Room or interior built from boxes | `architecture-interior` |
44
+ | Single asset on an inspection stage | `asset-inspector` |
45
+ | Character on a pedestal | `character-viewer` |
46
+ | Material swatch row | `material-authoring` |
47
+ | Bloom or emissive post pass | `postprocess-scene` |
48
+ | Many repeated meshes | `large-scene` |
49
+
50
+ The former `three-compat-*` names scaffold the same templates through a
51
+ deprecation alias (removed next minor). All eight templates import only
52
+ `@aura3d/engine`. Keep it that way.
53
+ 2. Map each construct to the engine API. `createAuraApp` owns the renderer,
54
+ scene graph, camera, and frame loop, so delete them rather than port them.
55
+
56
+ | three.js | Aura3D |
57
+ | --- | --- |
58
+ | `WebGLRenderer` plus a render loop | `createAuraApp("#app", { scene })` |
59
+ | `new Scene()` | `scene()` |
60
+ | `PerspectiveCamera` | `camera.perspective(...)` or `camera.orbit(...)` |
61
+ | `OrbitControls` | `interactions.orbit(...)` |
62
+ | Lights | `lights.*` |
63
+ | `MeshStandardMaterial` and friends | `material.*` |
64
+ | Mesh plus a glTF loader | `model(assets.x)` |
65
+ | Box, sphere, plane geometry (set dressing) | `primitives.*` |
66
+ | `EffectComposer` bloom | `effects.bloom(...)` |
67
+
68
+ 3. When the port must stay three-shaped for a while, run the CLI codemod
69
+ and keep its output as a report, not as proof:
70
+ `aura3d migrate three "src/**/*.ts" --report` walks each file and prints
71
+ the per-construct verdicts; `--write` applies the rewrite in place. The
72
+ underlying adapter `migrateThreeToA3D(source)` returns `code`,
73
+ `rewrittenImports`, and `warnings`. Imports in `THREE_COMPAT_UNSUPPORTED_THREE_IMPORTS`
74
+ (`EffectComposer`, `RenderPass`, `UnrealBloomPass`, and others) are left
75
+ unchanged with a `postprocessing-unsupported` warning. Treat that as a
76
+ manual rewrite to `effects.*`, never as a pass.
77
+ 4. Triage coverage from the codemod's warning list, not a matrix: the
78
+ import map `THREE_COMPAT_THREE_IMPORT_MAP` names every specifier the
79
+ codemod rewrites; anything three-shaped it leaves alone shows up in
80
+ `warnings` as `postprocessing-unsupported` or an unmapped import. Each
81
+ warning is the work item — a manual rewrite to `effects.*` or
82
+ `material.*`, never a pass.
83
+ 5. There is no approximation ledger or compatibility matrix anymore — the
84
+ `@aura3d/three-compat` package was deleted in 4.0.0. For every construct
85
+ the codemod could not rewrite, record the approximation yourself in the
86
+ migration notes: what the three.js API did, what the Aura3D replacement
87
+ does, and the honest delta. For example, `MeshPhongMaterial`'s
88
+ Blinn-Phong specular maps to a native `material.*` preset with GGX —
89
+ write that delta down, do not imply equivalence.
90
+ 6. Keep `three` out of the engine route. The shipped route must pass
91
+ `aura3d check-deploy --dist dist --source`; a `three` import anywhere in
92
+ the shipped tree fails the deploy check.
93
+ 7. Write the migration notes: each supported API by name with the test that
94
+ covers it, each codemod warning and how it was resolved, and each dropped
95
+ or manually rewritten construct.
96
+ 8. Build and verify: `npm run build`, then `npm run test` (the template's
97
+ route-health and screenshot specs; run on CI or a remote worker), then
98
+ `aura3d assets validate --source`. Hand claim wording to
99
+ `aura3d-evidence-review`.
100
+
101
+ ## Stop and report
102
+
103
+ - The source depends on something with no engine equivalent (custom
104
+ `ShaderMaterial` passes, render targets, `EffectComposer` chains, or an
105
+ import the codemod leaves unmapped): stop and list each construct with the
106
+ codemod warning that flagged it. Do not fake it with CSS, a DOM overlay,
107
+ or a CPU pixel pass.
108
+ - A kept construct renders only approximately: it is not parity. Label that
109
+ part `prototype` or rewrite it natively.
110
+ - A codemod warning you cannot resolve: report it; do not silently keep the
111
+ three.js shape.
112
+ - The old code loaded a GLB by URL and no typed asset replaces it: stop and
113
+ hand off to `aura3d-assets`. Never keep the URL or use `unsafeModelUrl`.
114
+ - Never write "drop-in", "full parity", or "100% three.js compatible". Name
115
+ the specific supported API and the test that proves it.
116
+
117
+ ## References
118
+
119
+ - [Migration guide and boundaries](https://github.com/auraoneai/aura3d/blob/main/docs/project/migration.md)
120
+ - [Migration codemod adapter](https://github.com/auraoneai/aura3d/blob/main/packages/aura3d-cli/src/migrate-three/ThreeToA3DAdapter.ts)
121
+ - [Codemod import map](https://github.com/auraoneai/aura3d/blob/main/packages/aura3d-cli/src/migrate-three/ImportMap.ts)
122
+ - [Codemod warnings](https://github.com/auraoneai/aura3d/blob/main/packages/aura3d-cli/src/migrate-three/CompatibilityWarnings.ts)
123
+ - [Codemod CLI command (`aura3d migrate three`)](https://github.com/auraoneai/aura3d/blob/main/packages/aura3d-cli/src/commands/prd15/index.ts)
124
+ - [Custom migration template](https://github.com/auraoneai/aura3d/blob/main/packages/create-aura3d/templates/custom-scene/src/main.ts)
125
+ - [three.js lighting stack → Aura3D look](references/look-mapping.md)
@@ -0,0 +1,27 @@
1
+ # three.js lighting stack → Aura3D look
2
+
3
+ The single largest visual change in a migration: a hand-assembled renderer,
4
+ lighting and post stack collapses into one look preset. Map by intent, not by
5
+ constant.
6
+
7
+ | three.js source pattern | Replaced by | Watch for |
8
+ | --- | --- | --- |
9
+ | `scene.environment` + PMREM + env map | the look's IBL | do not re-add a second environment — lint `look/no-ibl`/`double-aa` guards |
10
+ | `AmbientLight` (any intensity) | drop — the look fills ambient | re-adding it flattens the grade (`look/ambient-kills-ibl`) |
11
+ | `DirectionalLight` key + `castShadow` | the look's key (elevation/azimuth baked per genre) | a second DirectionalLight doubles the shadow read |
12
+ | `toneMapping`, `toneMappingExposure` | the look's `output.preset` | exposure moves inside the preset, not the renderer |
13
+ | `scene.fog = new Fog(...)` | the look's fog/atmosphere | recipe rows give per-genre density |
14
+ | `scene.background = color` | the look's backdrop | a solid color is `look/solid-void` unless declared |
15
+ | `EffectComposer` bloom/vignette | the look's post stack | do not stack `antiAlias`/post twice (`look/double-aa`) |
16
+ | `setPixelRatio` | `looks.appOptions(<id>)` DPR cap | `look/low-dpr` catches manual low ratios |
17
+ | `HemisphereLight` | the look fill (or `lights.hemisphere` when you must override) | hemisphere + IBL flattens (`look/ambient-flattens`) |
18
+
19
+ ## Procedure tie-in
20
+
21
+ 1. Delete the lighting/renderer block entirely, apply `looks.preset(<genre>)` +
22
+ `looks.appOptions(<genre>)`.
23
+ 2. Recapture: the migrated scene's palette, shadow density and background come
24
+ from the look; the ledger records *intent deltas* (e.g. "original had a
25
+ cooler fill"), not constant deltas.
26
+ 3. `aura3d look lint` catches the leftovers the ledger cannot: orphaned
27
+ fog nodes, double AA, ambient that kills the IBL.
@@ -0,0 +1,117 @@
1
+ Aura3D agent guide — a typed scene API for building real 3D apps: scenes, looks,
2
+ lighting, materials, typed assets, camera rigs and gameplay through
3
+ `@aura3d/engine` plus the `@aura3d/cli` toolchain. Current release: Aura3D 3.0.1.
4
+
5
+ Hello world: every scene gets a look first.
6
+
7
+ ```ts
8
+ import { createAuraApp, looks, model, scene } from "@aura3d/engine";
9
+ import { assets } from "./aura-assets";
10
+
11
+ createAuraApp("#app", {
12
+ scene: scene().add(looks.preset("product-studio")).add(model(assets.robot)),
13
+ ...looks.appOptions("product-studio")
14
+ });
15
+ ```
16
+
17
+ The quality floor — what the defaults give you, and the never list:
18
+
19
+ - A `looks.preset` supplies environment light (IBL), a shadow-casting key, fog,
20
+ background and a post grade as one unit — never hand-wire
21
+ `lights.ambient()` as the only fill, it flattens shading and kills IBL.
22
+ - Never a solid void background: the look's sky, biome or studio backdrop owns it.
23
+ - Never `pixelRatio`/`qualityProfile`/`safe-basic`/FXAA overrides or
24
+ `replaceTextures: true` — `looks.appOptions(id)` carries the renderer contract.
25
+ - Never a hero subject made of primitives; `model(assets.x)` with a typed
26
+ catalog asset.
27
+ - Never emissive cards or sprites faking reflections, puddles, splashes or glows —
28
+ use the look's `post` grade and `effects.*`.
29
+ - Never CSS/DOM particles, overlays or labels standing in for rendered output;
30
+ HUD lives in the DOM, the scene does not.
31
+ - Keep the key shadow at full strength with contact darkening at the subject's
32
+ feet; fog or atmosphere carries depth to the horizon.
33
+
34
+ three.js → Aura3D mapping (corrected):
35
+
36
+ | three.js | Aura3D |
37
+ | --- | --- |
38
+ | `new THREE.Scene()` | `scene()` |
39
+ | `new THREE.Mesh(...)` + `new GLTFLoader()` | `model(assets.x)` (typed asset) |
40
+ | `new THREE.PerspectiveCamera(...)` | `camera.perspective(...)`, `camera.rigs.*` |
41
+ | `AmbientLight` | `lights.hemisphere(...)` or the look's environment fill |
42
+ | `DirectionalLight` key/fill | the look's `key`/`rim` slots |
43
+ | `scene.environment` + PMREM | `environments.preset|hdri`, `world.biome` |
44
+ | `toneMapping`/exposure | `output.preset` and the look's post grade |
45
+ | `setPixelRatio` | `quality: "auto"` via `looks.appOptions` |
46
+ | `castShadow = true` | `shadow: true` on the light/node |
47
+ | `EffectComposer` passes | `output.preset` + `effects.*` |
48
+ | `AnimationMixer` | `AnimationController` / `createAnimationController` |
49
+ | `new OrbitControls(...)` | `interactions.orbit(...)` |
50
+
51
+ Genre recipes (see `aura3d-art-direction/references/look-recipes.md`):
52
+
53
+ | Genre | Look | Camera + fov | Palette/accent | Atmosphere |
54
+ | --- | --- | --- | --- | --- |
55
+ | platformer | `outdoor-day` | follow2d fov 50 | greens/sky/wood + gold | fog 0.0025 |
56
+ | racing | `golden-hour` | chase fov 60 | asphalt/orange/charcoal + amber | fog 30–180 m |
57
+ | fighting | `arena-fight` | fighting fov 45 | arena dark/rope/crowd + rim | haze cone |
58
+ | arena shooter | `space` | topDown fov 55 | space blue/graphite/teal + magenta | none |
59
+ | sports/table | `interior-industrial` | topDown fov 40 | turf/white/dark + ball | indoor haze |
60
+ | product | `product-studio` | orbit fov 35 | grey/white/metal + brand | none |
61
+ | character | `character-showcase` | orbit fov 40 | costume neutrals + rim | room haze |
62
+ | outdoor env | `overcast` | wide fov 55 | green/slate/fog blue + wildflower | fog 0.004 |
63
+ | interior | `interior-warm` | orbit fov 45 | wood/cream/spines + plant | dust shafts |
64
+ | night city | `night-city` | tele fov 35 | sodium/neon/asphalt + cyan | fog 15–90 m |
65
+ | space | `space` | orbit fov 60 | void blue/limb/stars + aurora | none |
66
+ | underwater | `underwater` | follow fov 50 | deep blue/teal/kelp + coral | scatter 0.03 |
67
+ | cinematic | `polar-night` | dolly fov 35 | aurora/snow/night + lantern | snow mist 0.006 |
68
+
69
+ The look-dev loop:
70
+
71
+ 1. Pick the genre recipe row and 1–3 reference frames; write a 3-line look brief.
72
+ 2. Build with the look preset and typed assets; no renderer overrides.
73
+ 3. Capture `aura3d look capture --route / --shots opening,mid,action`.
74
+ 4. Judge each frame against the quality-bar rubric; read `aura3d look lint`.
75
+ 5. Fix the single highest-leverage thing; one change per round; repeat until
76
+ every category reads 7+ or the loop exits flat.
77
+
78
+ Assets — resolve real objects from the catalog first. Do not invent asset paths,
79
+ URLs or ids — every model comes from a generated `assets.<key>`:
80
+
81
+ - `npx @aura3d/cli@latest assets search "<object>"` (natural descriptive phrase;
82
+ the catalog is ~850k license-verified GLB/glTF aggregated from Objaverse,
83
+ Sketchfab, Poly Pizza, Poly Haven, OS3A, Khronos and CC0 packs).
84
+ - `assets resolve "<object>" --name <name>` pulls the top auto-pullable match
85
+ and types it as `assets.<name>` → `model(assets.<name>)`.
86
+ - Add local files with `assets add ./assets/model.glb --name model`, then read
87
+ the generated `src/aura-assets.ts`.
88
+ - Playable characters: `assets resolve "animated humanoid fighting character"
89
+ --profile fighting-character` keeps provenance in `aura.assets.json`.
90
+
91
+ Scaffold:
92
+
93
+ ```bash
94
+ npx create-aura3d@latest my-scene --template product-viewer
95
+ npx create-aura3d@latest my-fighter --template fighting-game
96
+ cd my-scene && npm run dev
97
+ ```
98
+
99
+ Claims: use every feature freely. Claim only what a judged capture shows.
100
+
101
+ - Label every capability as one of: `createAuraApp` root safe API,
102
+ `production-runtime`, `rendering` internals, CLI asset pipeline, template-only
103
+ scaffold, prototype, or roadmap.
104
+ - Public examples prove only what the safe API renders through `@aura3d/engine`.
105
+ - A compiling route is not proof: route health, typed provenance and a readable
106
+ frame are required.
107
+
108
+ Release integrity rules:
109
+ - no raw string asset IDs, raw GLB/glTF URLs, `unsafeModelUrl(...)`, `three` imports, or `GLTFLoader` in public examples;
110
+ - no primary character, vehicle, product, weapon, creature, world, or hero environment made only from primitives unless the route is explicitly abstract visualization;
111
+ - no CSS/DOM particle implementation for examples claiming Aura3D particle rendering;
112
+ - no WebGPU, PBR, postprocess, skinned animation, morph, or game-runtime claim without matching browser evidence;
113
+ - no public showcase or README claim that exceeds detected capability, route-health evidence, or screenshots.
114
+
115
+ Benchmark mode: if `aura3d look capture` is available, run the look-dev loop;
116
+ otherwise run finite commands (`npm install && npm run build`) then stop and
117
+ label the result `prototype`.