create-aura3d 1.1.2 → 1.3.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 (215) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +5 -3
  4. package/dist/index.js.map +1 -1
  5. package/package.json +11 -9
  6. package/templates/{cartoon-channel → animation-channel}/README.md +11 -11
  7. package/templates/{cartoon-studio → animation-channel}/index.html +1 -1
  8. package/templates/{cartoon-channel → animation-channel}/package.json +2 -2
  9. package/templates/{cartoon-channel → animation-channel}/src/episode.ts +22 -22
  10. package/templates/{cartoon-channel → animation-channel}/src/experimental/README.md +5 -5
  11. package/templates/{cartoon-channel → animation-channel}/src/experimental/concept-episode-2-5d.css +3 -3
  12. package/templates/{cartoon-channel → animation-channel}/src/experimental/concept-episode-2-5d.ts +7 -7
  13. package/templates/{cartoon-channel → animation-channel}/src/experimental/image-puppet-episode.css +4 -4
  14. package/templates/{cartoon-channel → animation-channel}/src/experimental/image-puppet-episode.ts +6 -6
  15. package/templates/{cartoon-channel → animation-channel}/src/experimental/puppet-episode-2d.css +3 -3
  16. package/templates/{cartoon-channel → animation-channel}/src/experimental/puppet-episode-2d.ts +7 -7
  17. package/templates/{cartoon-channel → animation-channel}/src/main.ts +32 -32
  18. package/templates/{cartoon-channel → animation-channel}/src/render-plan.ts +13 -13
  19. package/templates/{cartoon-channel → animation-channel}/src/sample-episode-visual.css +34 -34
  20. package/templates/{cartoon-channel → animation-channel}/src/sample-episode-visual.ts +20 -20
  21. package/templates/{cartoon-channel → animation-channel}/tests/concept-2-5d-animation.spec.ts +3 -3
  22. package/templates/{cartoon-channel → animation-channel}/tests/concept-2-5d.spec.ts +6 -6
  23. package/templates/{cartoon-channel → animation-channel}/tests/image-puppet-animation.spec.ts +3 -3
  24. package/templates/{cartoon-channel → animation-channel}/tests/image-puppet.spec.ts +5 -5
  25. package/templates/{cartoon-channel → animation-channel}/tests/puppet-2d-animation.spec.ts +3 -3
  26. package/templates/{cartoon-channel → animation-channel}/tests/puppet-2d.spec.ts +4 -4
  27. package/templates/{prompt-cartoon-channel → animation-channel}/tests/route-health.spec.ts +1 -1
  28. package/templates/{cartoon-channel → animation-channel}/tests/sample-episode-visual.spec.ts +5 -5
  29. package/templates/{cartoon-channel → animation-channel}/tests/storyboard-playback.spec.ts +7 -7
  30. package/templates/animation-studio/AGENTS.md +71 -0
  31. package/templates/{cartoon-studio → animation-studio}/ASSET-LICENSES.md +7 -7
  32. package/templates/{cartoon-studio → animation-studio}/README.md +6 -6
  33. package/templates/animation-studio/aura.assets.json +669 -0
  34. package/templates/animation-studio/dist/episodes/scene/episode-3d.webm +0 -0
  35. package/templates/animation-studio/dist/episodes/scene/frames/action.png +0 -0
  36. package/templates/animation-studio/dist/episodes/scene/frames/dialogue.png +0 -0
  37. package/templates/animation-studio/dist/episodes/scene/frames/final.png +0 -0
  38. package/templates/animation-studio/dist/episodes/scene/frames/first.png +0 -0
  39. package/templates/animation-studio/dist/episodes/scene/frames/mouth-closed.png +0 -0
  40. package/templates/animation-studio/dist/episodes/scene/frames/mouth-open.png +0 -0
  41. package/templates/animation-studio/dist/episodes/scene/render-live-summary.json +10284 -0
  42. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/worker-1.png +0 -0
  43. package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/worker-2.png +0 -0
  44. package/templates/animation-studio/dist/generated/second-scene.document.json +1210 -0
  45. package/templates/animation-studio/dist/generated/studio-edited.document.json +1196 -0
  46. package/templates/animation-studio/dist/scene/inshader-accept.document.json +1 -0
  47. package/templates/animation-studio/dist/scene/inshader-test.document.json +1 -0
  48. package/templates/animation-studio/dist/scene/integ.document.json +1 -0
  49. package/templates/animation-studio/dist/scene/working.document.json +723 -0
  50. package/templates/animation-studio/dist/scene/working.history.json +1 -0
  51. package/templates/{cartoon-studio → animation-studio}/live-route.html +1 -1
  52. package/templates/{cartoon-studio → animation-studio}/package-lock.json +2 -2
  53. package/templates/animation-studio/package.json +32 -0
  54. package/templates/animation-studio/public/aura-assets/cast-a.catalog.glb +0 -0
  55. package/templates/animation-studio/public/aura-assets/cast-b.catalog.glb +0 -0
  56. package/templates/animation-studio/public/aura-assets/luma.catalog.glb +0 -0
  57. package/templates/animation-studio/public/aura-assets/luma2.catalog.glb +0 -0
  58. package/templates/animation-studio/public/aura-assets/miko.catalog.glb +0 -0
  59. package/templates/{cartoon-studio → animation-studio}/public/aura-assets/moonGarden.gltf +1 -1
  60. package/templates/animation-studio/public/aura-assets/mushroom.catalog.glb +0 -0
  61. package/templates/animation-studio/public/aura-assets/rusty.catalog.glb +0 -0
  62. package/templates/animation-studio/public/cast-library/cast-library.json +71 -0
  63. package/templates/animation-studio/public/clip-library/gesture.json +173903 -0
  64. package/templates/animation-studio/public/clip-library/idle.json +23035 -0
  65. package/templates/animation-studio/public/clip-library/manifest.json +154 -0
  66. package/templates/animation-studio/public/clip-library/nod.json +173903 -0
  67. package/templates/animation-studio/public/clip-library/point.json +69879 -0
  68. package/templates/animation-studio/public/clip-library/react.json +66084 -0
  69. package/templates/animation-studio/public/clip-library/run.json +9648 -0
  70. package/templates/animation-studio/public/clip-library/talk.json +69879 -0
  71. package/templates/animation-studio/public/clip-library/walk.json +8283 -0
  72. package/templates/animation-studio/public/hifi-cast/BrainStem.glb +0 -0
  73. package/templates/animation-studio/public/hifi-cast/CesiumMan.glb +0 -0
  74. package/templates/animation-studio/public/hifi-cast/RiggedFigure.glb +0 -0
  75. package/templates/animation-studio/public/hifi-cast/kaykit/Barbarian.glb +0 -0
  76. package/templates/animation-studio/public/hifi-cast/kaykit/Knight.glb +0 -0
  77. package/templates/animation-studio/public/hifi-cast/kaykit/Mage.glb +0 -0
  78. package/templates/animation-studio/public/hifi-cast/kaykit/Rogue.glb +0 -0
  79. package/templates/animation-studio/public/hifi-cast/kaykit/Rogue_Hooded.glb +0 -0
  80. package/templates/animation-studio/public/hifi-cast/khronos-report.json +295 -0
  81. package/templates/animation-studio/public/hifi-cast/quaternius-report.json +449 -0
  82. package/templates/animation-studio/public/hifi-cast/rpm/cesiumman.glb +0 -0
  83. package/templates/animation-studio/public/hifi-cast/rpm/fox.glb +0 -0
  84. package/templates/animation-studio/public/hifi-cast/rpm/riggedfigure.glb +0 -0
  85. package/templates/animation-studio/public/hifi-cast/rpm-report.json +301 -0
  86. package/templates/animation-studio/scripts/anim.ts +103 -0
  87. package/templates/animation-studio/scripts/animation-scene.ts +457 -0
  88. package/templates/animation-studio/scripts/asset-motion-probe.ts +450 -0
  89. package/templates/animation-studio/scripts/asset-render-probe.ts +152 -0
  90. package/templates/animation-studio/scripts/author-office-scene.ts +65 -0
  91. package/templates/animation-studio/scripts/build-cast-library.ts +97 -0
  92. package/templates/animation-studio/scripts/build-characters.ts +1543 -0
  93. package/templates/animation-studio/scripts/build-clip-library.ts +972 -0
  94. package/templates/animation-studio/scripts/clip-decision-cli.ts +51 -0
  95. package/templates/animation-studio/scripts/determinism-check.ts +48 -0
  96. package/templates/animation-studio/scripts/generate-scene.ts +95 -0
  97. package/templates/animation-studio/scripts/hifi-cast-validate.ts +572 -0
  98. package/templates/animation-studio/scripts/motion-evidence-cli.ts +150 -0
  99. package/templates/animation-studio/scripts/motion-evidence.ts +362 -0
  100. package/templates/animation-studio/scripts/preview-server.ts +52 -0
  101. package/templates/animation-studio/scripts/regen-manifest.ts +156 -0
  102. package/templates/animation-studio/scripts/render-core.ts +360 -0
  103. package/templates/animation-studio/scripts/render-live.ts +813 -0
  104. package/templates/animation-studio/scripts/render-parallel.ts +70 -0
  105. package/templates/animation-studio/scripts/render-server.ts +119 -0
  106. package/templates/animation-studio/scripts/resolve-asset.ts +669 -0
  107. package/templates/animation-studio/scripts/skeleton-overlay-cli.ts +82 -0
  108. package/templates/animation-studio/scripts/skeleton-overlay.ts +293 -0
  109. package/templates/animation-studio/scripts/studio-tools-demo.ts +45 -0
  110. package/templates/animation-studio/scripts/texture-bake.ts +297 -0
  111. package/templates/{cartoon-studio → animation-studio}/scripts/validate-characters.ts +0 -0
  112. package/templates/animation-studio/scripts/verify-extracted-overlay-cli.ts +264 -0
  113. package/templates/animation-studio/src/animation-episode-validator.ts +97 -0
  114. package/templates/animation-studio/src/animation-performance.ts +556 -0
  115. package/templates/animation-studio/src/aura-assets.ts +71 -0
  116. package/templates/animation-studio/src/character.ts +40 -0
  117. package/templates/animation-studio/src/director/compile-episode-document.ts +45 -0
  118. package/templates/animation-studio/src/director/director-heuristics.ts +697 -0
  119. package/templates/animation-studio/src/director/prompt-to-scene.ts +369 -0
  120. package/templates/animation-studio/src/empty-document.ts +77 -0
  121. package/templates/animation-studio/src/episode-document.ts +442 -0
  122. package/templates/animation-studio/src/examples/moon-garden.example.ts +183 -0
  123. package/templates/animation-studio/src/fidelity.ts +129 -0
  124. package/templates/animation-studio/src/graph.ts +14 -0
  125. package/templates/animation-studio/src/procedural-hdri.ts +243 -0
  126. package/templates/animation-studio/src/profile.ts +97 -0
  127. package/templates/animation-studio/src/render-live-route.ts +42 -0
  128. package/templates/animation-studio/src/render-modes.ts +137 -0
  129. package/templates/animation-studio/src/scene-player.ts +867 -0
  130. package/templates/animation-studio/src/set-templates.ts +361 -0
  131. package/templates/animation-studio/src/studio/episode-document-store.ts +72 -0
  132. package/templates/animation-studio/src/studio/scene-tool-registry.ts +86 -0
  133. package/templates/animation-studio/src/studio/scene-tools.ts +169 -0
  134. package/templates/animation-studio/tests/reports/animation-studio/hifi-cast-validation.json +938 -0
  135. package/templates/animation-studio/tsconfig.json +26 -0
  136. package/templates/{cartoon-studio → animation-studio}/vite.config.ts +6 -1
  137. package/templates/character-controller/README.md +33 -0
  138. package/templates/character-controller/index.html +19 -0
  139. package/templates/character-controller/package.json +23 -0
  140. package/templates/character-controller/playwright.config.ts +14 -0
  141. package/templates/character-controller/src/controller.ts +44 -0
  142. package/templates/character-controller/src/main.ts +62 -0
  143. package/templates/character-controller/tests/route-health.spec.ts +26 -0
  144. package/templates/character-controller/tests/screenshot.spec.ts +9 -0
  145. package/templates/character-controller/tsconfig.json +15 -0
  146. package/templates/cinematic-scene/package.json +1 -1
  147. package/templates/episode-builder/README.md +4 -4
  148. package/templates/episode-builder/package.json +1 -1
  149. package/templates/episode-builder/src/aura-assets.ts +1 -1
  150. package/templates/episode-builder/src/builder.ts +4 -4
  151. package/templates/episode-builder/src/episode.ts +21 -21
  152. package/templates/episode-builder/src/main.ts +20 -20
  153. package/templates/episode-builder/src/render-plan.ts +13 -13
  154. package/templates/episode-builder/tests/storyboard-playback.spec.ts +7 -7
  155. package/templates/fighting-game/package.json +1 -1
  156. package/templates/mini-game/package.json +1 -1
  157. package/templates/product-viewer/package.json +1 -1
  158. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/README.md +5 -5
  159. package/templates/{cartoon-channel → prompt-animation-channel}/index.html +1 -1
  160. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/package.json +2 -2
  161. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/aura-assets.ts +1 -1
  162. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/episode.ts +22 -22
  163. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/main.ts +28 -28
  164. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/render-plan.ts +13 -13
  165. package/templates/{cartoon-channel → prompt-animation-channel}/tests/route-health.spec.ts +1 -1
  166. package/templates/{prompt-cartoon-channel → prompt-animation-channel}/tests/storyboard-playback.spec.ts +8 -8
  167. package/templates/cartoon-studio/aura.assets.json +0 -400
  168. package/templates/cartoon-studio/package.json +0 -33
  169. package/templates/cartoon-studio/public/aura-assets/luma.authored.glb +0 -0
  170. package/templates/cartoon-studio/public/aura-assets/miko.authored.glb +0 -0
  171. package/templates/cartoon-studio/scripts/build-characters.ts +0 -738
  172. package/templates/cartoon-studio/scripts/build-dialogue-audio.ts +0 -262
  173. package/templates/cartoon-studio/scripts/episode.ts +0 -323
  174. package/templates/cartoon-studio/scripts/render-live.ts +0 -873
  175. package/templates/cartoon-studio/src/aura-assets.ts +0 -64
  176. package/templates/cartoon-studio/src/characters.ts +0 -65
  177. package/templates/cartoon-studio/src/episode-renderer.ts +0 -605
  178. package/templates/cartoon-studio/src/episode.ts +0 -306
  179. package/templates/cartoon-studio/src/main.ts +0 -400
  180. package/templates/cartoon-studio/src/render-live-route.ts +0 -913
  181. package/templates/cartoon-studio/src/render-plan.ts +0 -567
  182. package/templates/cartoon-studio/src/review.ts +0 -99
  183. package/templates/cartoon-studio/src/studio.ts +0 -101
  184. package/templates/cartoon-studio/test-results/.last-run.json +0 -4
  185. package/templates/cartoon-studio/tests/episode-render.spec.ts +0 -44
  186. package/templates/cartoon-studio/tests/motion-quality.spec.ts +0 -45
  187. package/templates/cartoon-studio/tests/route-health.spec.ts +0 -7
  188. package/templates/cartoon-studio/tests/storyboard-playback.spec.ts +0 -99
  189. package/templates/cartoon-studio/tests/visual-review.spec.ts +0 -21
  190. package/templates/cartoon-studio/tsconfig.json +0 -14
  191. package/templates/prompt-cartoon-channel/index.html +0 -13
  192. package/templates/prompt-cartoon-channel/src/sets.ts +0 -14
  193. /package/templates/{cartoon-channel → animation-channel}/aura.assets.json +0 -0
  194. /package/templates/{cartoon-channel → animation-channel}/playwright.config.ts +0 -0
  195. /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/luma.047f5e5f.glb +0 -0
  196. /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/luma.thumb.svg +0 -0
  197. /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/miko.047f5e5f.glb +0 -0
  198. /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/miko.thumb.svg +0 -0
  199. /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/moon-garden-feature-frame.png +0 -0
  200. /package/templates/{cartoon-channel → animation-channel}/src/aura-assets.ts +0 -0
  201. /package/templates/{cartoon-channel → animation-channel}/src/characters.ts +0 -0
  202. /package/templates/{cartoon-channel → animation-channel}/src/contract.ts +0 -0
  203. /package/templates/{cartoon-channel → animation-channel}/src/sets.ts +0 -0
  204. /package/templates/{cartoon-channel → animation-channel}/test-results/.last-run.json +0 -0
  205. /package/templates/{cartoon-channel → animation-channel}/tests/reports/prompt-animation/cartoon-sample-episode.png +0 -0
  206. /package/templates/{cartoon-channel → animation-channel}/tsconfig.json +0 -0
  207. /package/templates/{cartoon-studio → animation-studio}/playwright.config.ts +0 -0
  208. /package/templates/{cartoon-studio → animation-studio}/public/aura-assets/luma.thumb.svg +0 -0
  209. /package/templates/{cartoon-studio → animation-studio}/public/aura-assets/miko.thumb.svg +0 -0
  210. /package/templates/{cartoon-studio → animation-studio}/src/contract.ts +0 -0
  211. /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/playwright.config.ts +0 -0
  212. /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/characters.ts +0 -0
  213. /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/contract.ts +0 -0
  214. /package/templates/{cartoon-studio → prompt-animation-channel}/src/sets.ts +0 -0
  215. /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/tsconfig.json +0 -0
@@ -1,6 +1,6 @@
1
1
  import { expect, test } from "@playwright/test";
2
2
 
3
- test("2D puppet query is quarantined from release-facing cartoon-channel proof", async ({ page }) => {
3
+ test("2D puppet query is quarantined from release-facing animation-channel proof", async ({ page }) => {
4
4
  await page.setViewportSize({ width: 1440, height: 900 });
5
5
  await page.goto("/?view=puppet-2d&sampleTime=24");
6
6
 
@@ -9,14 +9,14 @@ test("2D puppet query is quarantined from release-facing cartoon-channel proof",
9
9
  await expect(page.locator(".puppet-robot")).toHaveCount(0);
10
10
 
11
11
  const quarantine = await page.evaluate(() => ({
12
- puppetProof: (window as unknown as { __AURA3D_CARTOON_2D_PUPPET_PROOF__?: unknown }).__AURA3D_CARTOON_2D_PUPPET_PROOF__,
12
+ puppetProof: (window as unknown as { __AURA3D_ANIMATION_2D_PUPPET_PROOF__?: unknown }).__AURA3D_ANIMATION_2D_PUPPET_PROOF__,
13
13
  template: (window as unknown as {
14
- __AURA3D_CARTOON_TEMPLATE__?: {
14
+ __AURA3D_ANIMATION_TEMPLATE__?: {
15
15
  readonly releaseFacingViews?: readonly string[];
16
16
  readonly rejectedViews?: readonly string[];
17
17
  readonly rejectedViewReason?: string;
18
18
  };
19
- }).__AURA3D_CARTOON_TEMPLATE__
19
+ }).__AURA3D_ANIMATION_TEMPLATE__
20
20
  }));
21
21
 
22
22
  expect(quarantine.puppetProof).toBeUndefined();
@@ -1,6 +1,6 @@
1
1
  import { expect, test } from "@playwright/test";
2
2
 
3
- test("cartoon channel route loads", async ({ page }) => {
3
+ test("animation channel route loads", async ({ page }) => {
4
4
  await page.goto("/");
5
5
  await expect(page.locator("#app")).toBeVisible();
6
6
  });
@@ -2,7 +2,7 @@ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
2
  import { dirname, resolve } from "node:path";
3
3
  import { expect, test } from "@playwright/test";
4
4
 
5
- test("sample episode visual renders a reviewable cartoon frame", async ({ page }) => {
5
+ test("sample episode visual renders a reviewable animation frame", async ({ page }) => {
6
6
  await page.setViewportSize({ width: 1440, height: 900 });
7
7
  await page.goto("/?sampleTime=24");
8
8
 
@@ -10,16 +10,16 @@ test("sample episode visual renders a reviewable cartoon frame", async ({ page }
10
10
  await expect(frame).toBeVisible();
11
11
  await expect(page.locator("[data-sample-caption]")).toContainText(/tiny circle|stones|cleanup/i);
12
12
 
13
- const proof = await page.evaluate(() => window.__AURA3D_CARTOON_SAMPLE_EPISODE__);
13
+ const proof = await page.evaluate(() => window.__AURA3D_ANIMATION_SAMPLE_EPISODE__);
14
14
  expect(proof?.episodeId).toBe("moon-garden-cleanup-001");
15
15
  expect(proof?.sample.shotId).toBe("shot-glow-stone-teamwork");
16
16
  expect(proof?.visualLayer.characters).toEqual(["miko", "luma"]);
17
17
  expect(proof?.visualLayer.screenshotTarget).toBe("#sample-episode-visual");
18
- expect(proof?.visualLayer.styleGuide).toMatch(/cartoon/i);
18
+ expect(proof?.visualLayer.styleGuide).toMatch(/animation/i);
19
19
  expect(proof?.visualLayer.renderedBy).toBe("aura3d-scene");
20
20
  expect(proof?.visualLayer.usesTypedAssets).toBe(true);
21
21
  await expect(frame).toHaveAttribute("data-uses-typed-assets", "true");
22
- await expect(page.locator(".cartoon-robot").first()).toBeHidden();
22
+ await expect(page.locator(".animation-robot").first()).toBeHidden();
23
23
 
24
24
  const box = await frame.boundingBox();
25
25
  expect(box?.width).toBeGreaterThan(900);
@@ -28,7 +28,7 @@ test("sample episode visual renders a reviewable cartoon frame", async ({ page }
28
28
  const screenshot = await frame.screenshot({ animations: "disabled" });
29
29
  expect(screenshot.byteLength).toBeGreaterThan(40_000);
30
30
 
31
- const outputPath = resolve(findWorkspaceRoot(process.cwd()), "tests/reports/prompt-animation/cartoon-sample-episode.png");
31
+ const outputPath = resolve(findWorkspaceRoot(process.cwd()), "tests/reports/prompt-animation/animation-sample-episode.png");
32
32
  mkdirSync(dirname(outputPath), { recursive: true });
33
33
  writeFileSync(outputPath, screenshot);
34
34
  });
@@ -1,33 +1,33 @@
1
1
  import { expect, test } from "@playwright/test";
2
2
 
3
- test("cartoon channel storyboard caption renders", async ({ page }) => {
3
+ test("animation channel storyboard caption renders", async ({ page }) => {
4
4
  await page.goto("/");
5
5
  await expect(page.locator("#sample-episode-visual [data-sample-caption]")).toContainText(/moon|robot|lilies|stones/i);
6
6
  });
7
7
 
8
- test("storyboard playback, character performance, caption timing, cuts, and nonblank cartoon frames are sourced", async ({
8
+ test("storyboard playback, character performance, caption timing, cuts, and nonblank animation frames are sourced", async ({
9
9
  page
10
10
  }) => {
11
11
  await page.goto("/");
12
12
 
13
13
  const routeProof = (await page.evaluate(() => {
14
14
  const template = (window as unknown as {
15
- __AURA3D_CARTOON_TEMPLATE__?: {
15
+ __AURA3D_ANIMATION_TEMPLATE__?: {
16
16
  shotIds: readonly string[];
17
17
  captionIds: readonly string[];
18
18
  storyBible?: unknown;
19
19
  playbackProbeSamples: readonly unknown[];
20
20
  sampleAt(time: number): unknown;
21
21
  };
22
- }).__AURA3D_CARTOON_TEMPLATE__;
22
+ }).__AURA3D_ANIMATION_TEMPLATE__;
23
23
  return {
24
24
  shotIds: template?.shotIds ?? [],
25
25
  captionIds: template?.captionIds ?? [],
26
26
  storyBible: template?.storyBible,
27
27
  samples: [1, 21, 43].map((time) => template?.sampleAt(time)),
28
28
  playbackProbeSamples: template?.playbackProbeSamples ?? [],
29
- bodyShotCount: document.body.dataset.cartoonShotCount,
30
- bodyCaptionCount: document.body.dataset.cartoonCaptionCount
29
+ bodyShotCount: document.body.dataset.animationShotCount,
30
+ bodyCaptionCount: document.body.dataset.animationCaptionCount
31
31
  };
32
32
  })) as {
33
33
  shotIds: string[];
@@ -63,7 +63,7 @@ test("storyboard playback, character performance, caption timing, cuts, and nonb
63
63
  expect(routeProof.samples.flatMap((sample) => sample.nodeUpdates ?? []).some((update) => update.characterId === "miko")).toBe(true);
64
64
  expect(routeProof.samples.flatMap((sample) => sample.nodeUpdates ?? []).some((update) => update.characterId === "luma")).toBe(true);
65
65
  expect(routeProof.storyBible?.props?.length).toBeGreaterThanOrEqual(3);
66
- expect(routeProof.storyBible?.styleGuide?.visualStyle).toMatch(/cartoon/i);
66
+ expect(routeProof.storyBible?.styleGuide?.visualStyle).toMatch(/animation/i);
67
67
  expect(routeProof.storyBible?.shotList).toHaveLength(3);
68
68
  expect(routeProof.playbackProbeSamples).toHaveLength(3);
69
69
  expect(routeProof.bodyShotCount).toBe("3");
@@ -0,0 +1,71 @@
1
+ # Animation Studio — you are the director
2
+
3
+ **You** (Claude Code, Codex, Cursor, the API, whatever coding agent the user is already
4
+ running) are the director. There is **no separate AI model and no API key** wired into this
5
+ studio. The user gives a prompt; **you** turn it into a finished scene by driving the
6
+ Scene-Tool CLI. You generate everything — the cast, the script/subtitles, the staging, the
7
+ performance. The CLI is your hands; the renderer is deterministic.
8
+
9
+ Every command edits one working document (`dist/scene/working.document.json`), is **validated**
10
+ before it commits, and is **rejected** if it would break the scene (off-set, missing clip,
11
+ bad framing). You cannot produce a broken document.
12
+
13
+ ## The loop (run these as shell commands)
14
+
15
+ ```bash
16
+ S="pnpm exec tsx --tsconfig tsconfig.base.json packages/create-aura3d/templates/animation-studio/scripts/animation-scene.ts"
17
+ # or, from an installed project: aura3d animation scene <args...>
18
+ ```
19
+
20
+ 1. **Start a skeleton from the prompt** (picks a SET template + shots + timeline; NO dialogue —
21
+ you write that):
22
+ ```bash
23
+ $S new --prompt "two robots argue on a space station"
24
+ ```
25
+
26
+ 2. **Cast real characters** — resolve them from the live asset catalog by description. Use
27
+ DISTINCT queries so they look and move differently (each GLB brings its own clips):
28
+ ```bash
29
+ $S cast add --id rusty --query "rusty industrial robot"
30
+ $S cast add --id sleek --query "sleek white android robot"
31
+ ```
32
+ Provenance/license/scale are recorded automatically. `--scale N` overrides auto-fit.
33
+
34
+ 3. **Write the script** — this is the story AND the subtitles AND the AuraVoice lip-sync
35
+ contract, all one timed track. Author every line yourself; make it an actual arc:
36
+ ```bash
37
+ $S dialogue --line l1 --speaker rusty --text "You rerouted the coolant without telling me." --start 1 --end 6
38
+ $S dialogue --line l2 --speaker sleek --text "Because you'd have said no. The core was overheating." --start 7 --end 13
39
+ $S dialogue --line l3 --speaker rusty --text "That was MY system to balance." --start 21 --end 27
40
+ # …carry the argument to a turn and a resolution across the shots.
41
+ ```
42
+
43
+ 4. **Direct distinct performance per beat** — make the two characters DO different things so
44
+ it reads as an argument, not two idle loops. Move one in, push one back, face them off,
45
+ assign gestures. Motion is bounded by each GLB's clips — pick the clip that fits the beat:
46
+ ```bash
47
+ $S block --character rusty --shot shot-1 --to -1.2,0 --yaw 1.2 --clip walk
48
+ $S block --character sleek --shot shot-1 --to 1.2,0 --yaw -1.2
49
+ $S gesture --character rusty --shot shot-3 --clip <a-clip-the-GLB-has>
50
+ $S shot retime --id shot-2 --duration 24 # give the escalation room
51
+ ```
52
+ Use `$S show` to see the cast's real clip names before assigning them.
53
+
54
+ 5. **Render** and review:
55
+ ```bash
56
+ $S render
57
+ ```
58
+
59
+ ## Honest boundaries (do not oversell to the user)
60
+
61
+ - **You write the story.** The skeleton has no dialogue on purpose. If you skip step 3 there
62
+ are no captions — that is correct, not a bug.
63
+ - **Performance is limited by the asset's clips.** You can stage position, facing, camera, who
64
+ moves, and which existing clip plays — but you cannot synthesize motion a GLB doesn't contain.
65
+ If both characters look the same, you cast look-alike GLBs or left them on one clip; fix it by
66
+ casting distinct characters (step 2) and assigning per-beat clips/blocking (step 4).
67
+ - **Subtitles ≠ voice.** Aura3D never does TTS. The dialogue track you write is the timed
68
+ contract AuraVoice consumes later to generate the voice locked to this timeline.
69
+
70
+ The user's measure is "is this a watchable animation with a real story." That is **your** job as
71
+ director — the tools guarantee a *valid* document, not a *good* one. Make it good.
@@ -1,7 +1,7 @@
1
- # Cartoon Studio — Asset Licenses & Provenance
1
+ # Animation Studio — Asset Licenses & Provenance
2
2
 
3
3
  > **Honesty note:** the two character assets (`miko`, `luma`) are now **Aura3D-authored,
4
- > procedurally generated CC0 cartoon characters** — genuine authored rigged GLBs with a
4
+ > procedurally generated CC0 animation characters** — genuine authored rigged GLBs with a
5
5
  > real face blendshape — that REPLACE the former reused three.js RobotExpressive + Mixamo
6
6
  > Soldier placeholders. They are simple, low-poly, stylized helper robots (not finished
7
7
  > production hero art); a commercial release would still benefit from art-directed
@@ -11,8 +11,8 @@
11
11
 
12
12
  | Asset | File | What it actually is | License / provenance | Status |
13
13
  |---|---|---|---|---|
14
- | `miko` | `miko.authored.glb` | **Aura3D-authored procedural** cartoon helper robot (rounded, cyan). Skinned low-poly mesh, 7-joint skeleton (root/spine/head + 2 arms + 2 legs), clips `Idle/Wave/Walk`, and ONE real `mouthOpen` face blendshape (lower-lip drop) that drives lip-sync in pixels. Generated by `scripts/build-characters.ts`; verified to load through the engine GLTF loader by `scripts/validate-characters.ts`. | **CC0-1.0**, authored by Aura3D (no third-party source) | Authored — distinct stylized "Miko" |
15
- | `luma` | `luma.authored.glb` | **Aura3D-authored procedural** cartoon helper robot (taller, warm-gold). Same rig/clip/morph structure as Miko, visibly different proportions + color. | **CC0-1.0**, authored by Aura3D (no third-party source) | Authored — distinct stylized "Luma" |
14
+ | `miko` | `miko.authored.glb` | **Aura3D-authored procedural** animation helper robot (rounded, cyan). Skinned low-poly mesh, 7-joint skeleton (root/spine/head + 2 arms + 2 legs), clips `Idle/Wave/Walk`, and ONE real `mouthOpen` face blendshape (lower-lip drop) that drives lip-sync in pixels. Generated by `scripts/build-characters.ts`; verified to load through the engine GLTF loader by `scripts/validate-characters.ts`. | **CC0-1.0**, authored by Aura3D (no third-party source) | Authored — distinct stylized "Miko" |
15
+ | `luma` | `luma.authored.glb` | **Aura3D-authored procedural** animation helper robot (taller, warm-gold). Same rig/clip/morph structure as Miko, visibly different proportions + color. | **CC0-1.0**, authored by Aura3D (no third-party source) | Authored — distinct stylized "Luma" |
16
16
  | `moonGarden` | `moonGarden.gltf` | 3-quad anchor stub (floor / glow-stone / skyline markers) — not real garden geometry | Aura3D starter stub, **MIT** | Placeholder — the live-3D route builds a primitive garden instead |
17
17
 
18
18
  > The previous placeholders `miko.047f5e5f.glb` (three.js RobotExpressive, CC0) and
@@ -20,9 +20,9 @@
20
20
  > or `aura.assets.json`.
21
21
 
22
22
  ## Catalog / starter pack
23
- The `@aura3d/asset-index` cartoon starter pack maps to **Kenney CC0** game-kit GLBs
23
+ The `@aura3d/asset-index` animation starter pack maps to **Kenney CC0** game-kit GLBs
24
24
  (`cdn.jsdelivr.net/gh/gchahal1982/aura3d-cc0-assets`). These are generic blocks (e.g.
25
- "moon-garden" → a grass cube), suitable as license-clean filler, not art-directed cartoon assets.
25
+ "moon-garden" → a grass cube), suitable as license-clean filler, not art-directed animation assets.
26
26
 
27
27
  ## Live-3D render path (`episode:render-3d`)
28
28
  The real-3D path (`src/render-live-route.ts`) loads the two **Aura3D-authored** rigged GLBs
@@ -38,4 +38,4 @@ lilies, broom) — procedural primitives/emissive materials, no third-party art.
38
38
  art-directed hero models with textures.)
39
39
  2. Author a real **moon-garden set** + props (broom, glow-stones, lilies) or source license-clean equivalents.
40
40
  3. Record/synthesize **dialogue audio** (none ships; AuraVoice is timing metadata only).
41
- 4. Re-run `assets validate-cartoon --require-license --no-placeholders` against the new assets and update this file.
41
+ 4. Re-run `assets validate-animation --require-license --no-placeholders` against the new assets and update this file.
@@ -1,6 +1,6 @@
1
- # Aura3D Cartoon Studio Template
1
+ # Aura3D Animation Studio Template
2
2
 
3
- This template demonstrates a compact cartoon production workspace on top of the
3
+ This template demonstrates a compact animation production workspace on top of the
4
4
  AuraVoice-to-Aura3D prompt-animation contract.
5
5
 
6
6
  It uses:
@@ -24,7 +24,7 @@ Replace primitive characters with typed GLB assets by running:
24
24
  ```bash
25
25
  npx @aura3d/cli@latest assets add ./assets/miko.glb --name miko
26
26
  npx @aura3d/cli@latest assets add ./assets/luma.glb --name luma
27
- npx @aura3d/cli@latest assets validate-cartoon
27
+ npx @aura3d/cli@latest assets validate-animation
28
28
  ```
29
29
 
30
30
  Then import `assets.miko` and `assets.luma` from `src/aura-assets.ts` and pass them to `model(assets.miko)` and `model(assets.luma)`.
@@ -42,13 +42,13 @@ Do not replace this with a string asset id or a raw loader.
42
42
 
43
43
  This scaffold intentionally does not claim publish readiness from source alone.
44
44
  Before closing build, route, asset, screenshot, render, or visual-quality gates,
45
- archive the matching `npm run build`, `assets validate-cartoon`, browser
45
+ archive the matching `npm run build`, `assets validate-animation`, browser
46
46
  evidence, screenshot hashes, render outputs, and human or automated review
47
47
  artifacts.
48
48
 
49
49
  ## Episode package scripts
50
50
 
51
- The template includes the 1.1 Cartoon Studio command lane:
51
+ The template includes the 1.1 Animation Studio command lane:
52
52
 
53
53
  ```bash
54
54
  npm run episode:plan
@@ -77,6 +77,6 @@ dist/episodes/moon-garden-001/
77
77
  If no browser video encoder adapter is available, `episode:render` writes
78
78
  `episode.png-sequence-fallback.json` and deterministic PNG frame placeholders
79
79
  under `frames/`. That fallback proves the package/review workflow, but it is not
80
- publish-ready cartoon video evidence. A release build must attach a real
80
+ publish-ready animation video evidence. A release build must attach a real
81
81
  WebM/MP4 encoder, use typed character/set assets, and pass human visual review
82
82
  before claiming the episode is ready to publish.