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.
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/package.json +11 -9
- package/templates/{cartoon-channel → animation-channel}/README.md +11 -11
- package/templates/{cartoon-studio → animation-channel}/index.html +1 -1
- package/templates/{cartoon-channel → animation-channel}/package.json +2 -2
- package/templates/{cartoon-channel → animation-channel}/src/episode.ts +22 -22
- package/templates/{cartoon-channel → animation-channel}/src/experimental/README.md +5 -5
- package/templates/{cartoon-channel → animation-channel}/src/experimental/concept-episode-2-5d.css +3 -3
- package/templates/{cartoon-channel → animation-channel}/src/experimental/concept-episode-2-5d.ts +7 -7
- package/templates/{cartoon-channel → animation-channel}/src/experimental/image-puppet-episode.css +4 -4
- package/templates/{cartoon-channel → animation-channel}/src/experimental/image-puppet-episode.ts +6 -6
- package/templates/{cartoon-channel → animation-channel}/src/experimental/puppet-episode-2d.css +3 -3
- package/templates/{cartoon-channel → animation-channel}/src/experimental/puppet-episode-2d.ts +7 -7
- package/templates/{cartoon-channel → animation-channel}/src/main.ts +32 -32
- package/templates/{cartoon-channel → animation-channel}/src/render-plan.ts +13 -13
- package/templates/{cartoon-channel → animation-channel}/src/sample-episode-visual.css +34 -34
- package/templates/{cartoon-channel → animation-channel}/src/sample-episode-visual.ts +20 -20
- package/templates/{cartoon-channel → animation-channel}/tests/concept-2-5d-animation.spec.ts +3 -3
- package/templates/{cartoon-channel → animation-channel}/tests/concept-2-5d.spec.ts +6 -6
- package/templates/{cartoon-channel → animation-channel}/tests/image-puppet-animation.spec.ts +3 -3
- package/templates/{cartoon-channel → animation-channel}/tests/image-puppet.spec.ts +5 -5
- package/templates/{cartoon-channel → animation-channel}/tests/puppet-2d-animation.spec.ts +3 -3
- package/templates/{cartoon-channel → animation-channel}/tests/puppet-2d.spec.ts +4 -4
- package/templates/{prompt-cartoon-channel → animation-channel}/tests/route-health.spec.ts +1 -1
- package/templates/{cartoon-channel → animation-channel}/tests/sample-episode-visual.spec.ts +5 -5
- package/templates/{cartoon-channel → animation-channel}/tests/storyboard-playback.spec.ts +7 -7
- package/templates/animation-studio/AGENTS.md +71 -0
- package/templates/{cartoon-studio → animation-studio}/ASSET-LICENSES.md +7 -7
- package/templates/{cartoon-studio → animation-studio}/README.md +6 -6
- package/templates/animation-studio/aura.assets.json +669 -0
- package/templates/animation-studio/dist/episodes/scene/episode-3d.webm +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/action.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/dialogue.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/final.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/first.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/mouth-closed.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/frames/mouth-open.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/render-live-summary.json +10284 -0
- package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/worker-1.png +0 -0
- package/templates/animation-studio/dist/episodes/scene/skeleton-overlays/worker-2.png +0 -0
- package/templates/animation-studio/dist/generated/second-scene.document.json +1210 -0
- package/templates/animation-studio/dist/generated/studio-edited.document.json +1196 -0
- package/templates/animation-studio/dist/scene/inshader-accept.document.json +1 -0
- package/templates/animation-studio/dist/scene/inshader-test.document.json +1 -0
- package/templates/animation-studio/dist/scene/integ.document.json +1 -0
- package/templates/animation-studio/dist/scene/working.document.json +723 -0
- package/templates/animation-studio/dist/scene/working.history.json +1 -0
- package/templates/{cartoon-studio → animation-studio}/live-route.html +1 -1
- package/templates/{cartoon-studio → animation-studio}/package-lock.json +2 -2
- package/templates/animation-studio/package.json +32 -0
- package/templates/animation-studio/public/aura-assets/cast-a.catalog.glb +0 -0
- package/templates/animation-studio/public/aura-assets/cast-b.catalog.glb +0 -0
- package/templates/animation-studio/public/aura-assets/luma.catalog.glb +0 -0
- package/templates/animation-studio/public/aura-assets/luma2.catalog.glb +0 -0
- package/templates/animation-studio/public/aura-assets/miko.catalog.glb +0 -0
- package/templates/{cartoon-studio → animation-studio}/public/aura-assets/moonGarden.gltf +1 -1
- package/templates/animation-studio/public/aura-assets/mushroom.catalog.glb +0 -0
- package/templates/animation-studio/public/aura-assets/rusty.catalog.glb +0 -0
- package/templates/animation-studio/public/cast-library/cast-library.json +71 -0
- package/templates/animation-studio/public/clip-library/gesture.json +173903 -0
- package/templates/animation-studio/public/clip-library/idle.json +23035 -0
- package/templates/animation-studio/public/clip-library/manifest.json +154 -0
- package/templates/animation-studio/public/clip-library/nod.json +173903 -0
- package/templates/animation-studio/public/clip-library/point.json +69879 -0
- package/templates/animation-studio/public/clip-library/react.json +66084 -0
- package/templates/animation-studio/public/clip-library/run.json +9648 -0
- package/templates/animation-studio/public/clip-library/talk.json +69879 -0
- package/templates/animation-studio/public/clip-library/walk.json +8283 -0
- package/templates/animation-studio/public/hifi-cast/BrainStem.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/CesiumMan.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/RiggedFigure.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/kaykit/Barbarian.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/kaykit/Knight.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/kaykit/Mage.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/kaykit/Rogue.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/kaykit/Rogue_Hooded.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/khronos-report.json +295 -0
- package/templates/animation-studio/public/hifi-cast/quaternius-report.json +449 -0
- package/templates/animation-studio/public/hifi-cast/rpm/cesiumman.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/rpm/fox.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/rpm/riggedfigure.glb +0 -0
- package/templates/animation-studio/public/hifi-cast/rpm-report.json +301 -0
- package/templates/animation-studio/scripts/anim.ts +103 -0
- package/templates/animation-studio/scripts/animation-scene.ts +457 -0
- package/templates/animation-studio/scripts/asset-motion-probe.ts +450 -0
- package/templates/animation-studio/scripts/asset-render-probe.ts +152 -0
- package/templates/animation-studio/scripts/author-office-scene.ts +65 -0
- package/templates/animation-studio/scripts/build-cast-library.ts +97 -0
- package/templates/animation-studio/scripts/build-characters.ts +1543 -0
- package/templates/animation-studio/scripts/build-clip-library.ts +972 -0
- package/templates/animation-studio/scripts/clip-decision-cli.ts +51 -0
- package/templates/animation-studio/scripts/determinism-check.ts +48 -0
- package/templates/animation-studio/scripts/generate-scene.ts +95 -0
- package/templates/animation-studio/scripts/hifi-cast-validate.ts +572 -0
- package/templates/animation-studio/scripts/motion-evidence-cli.ts +150 -0
- package/templates/animation-studio/scripts/motion-evidence.ts +362 -0
- package/templates/animation-studio/scripts/preview-server.ts +52 -0
- package/templates/animation-studio/scripts/regen-manifest.ts +156 -0
- package/templates/animation-studio/scripts/render-core.ts +360 -0
- package/templates/animation-studio/scripts/render-live.ts +813 -0
- package/templates/animation-studio/scripts/render-parallel.ts +70 -0
- package/templates/animation-studio/scripts/render-server.ts +119 -0
- package/templates/animation-studio/scripts/resolve-asset.ts +669 -0
- package/templates/animation-studio/scripts/skeleton-overlay-cli.ts +82 -0
- package/templates/animation-studio/scripts/skeleton-overlay.ts +293 -0
- package/templates/animation-studio/scripts/studio-tools-demo.ts +45 -0
- package/templates/animation-studio/scripts/texture-bake.ts +297 -0
- package/templates/{cartoon-studio → animation-studio}/scripts/validate-characters.ts +0 -0
- package/templates/animation-studio/scripts/verify-extracted-overlay-cli.ts +264 -0
- package/templates/animation-studio/src/animation-episode-validator.ts +97 -0
- package/templates/animation-studio/src/animation-performance.ts +556 -0
- package/templates/animation-studio/src/aura-assets.ts +71 -0
- package/templates/animation-studio/src/character.ts +40 -0
- package/templates/animation-studio/src/director/compile-episode-document.ts +45 -0
- package/templates/animation-studio/src/director/director-heuristics.ts +697 -0
- package/templates/animation-studio/src/director/prompt-to-scene.ts +369 -0
- package/templates/animation-studio/src/empty-document.ts +77 -0
- package/templates/animation-studio/src/episode-document.ts +442 -0
- package/templates/animation-studio/src/examples/moon-garden.example.ts +183 -0
- package/templates/animation-studio/src/fidelity.ts +129 -0
- package/templates/animation-studio/src/graph.ts +14 -0
- package/templates/animation-studio/src/procedural-hdri.ts +243 -0
- package/templates/animation-studio/src/profile.ts +97 -0
- package/templates/animation-studio/src/render-live-route.ts +42 -0
- package/templates/animation-studio/src/render-modes.ts +137 -0
- package/templates/animation-studio/src/scene-player.ts +867 -0
- package/templates/animation-studio/src/set-templates.ts +361 -0
- package/templates/animation-studio/src/studio/episode-document-store.ts +72 -0
- package/templates/animation-studio/src/studio/scene-tool-registry.ts +86 -0
- package/templates/animation-studio/src/studio/scene-tools.ts +169 -0
- package/templates/animation-studio/tests/reports/animation-studio/hifi-cast-validation.json +938 -0
- package/templates/animation-studio/tsconfig.json +26 -0
- package/templates/{cartoon-studio → animation-studio}/vite.config.ts +6 -1
- package/templates/character-controller/README.md +33 -0
- package/templates/character-controller/index.html +19 -0
- package/templates/character-controller/package.json +23 -0
- package/templates/character-controller/playwright.config.ts +14 -0
- package/templates/character-controller/src/controller.ts +44 -0
- package/templates/character-controller/src/main.ts +62 -0
- package/templates/character-controller/tests/route-health.spec.ts +26 -0
- package/templates/character-controller/tests/screenshot.spec.ts +9 -0
- package/templates/character-controller/tsconfig.json +15 -0
- package/templates/cinematic-scene/package.json +1 -1
- package/templates/episode-builder/README.md +4 -4
- package/templates/episode-builder/package.json +1 -1
- package/templates/episode-builder/src/aura-assets.ts +1 -1
- package/templates/episode-builder/src/builder.ts +4 -4
- package/templates/episode-builder/src/episode.ts +21 -21
- package/templates/episode-builder/src/main.ts +20 -20
- package/templates/episode-builder/src/render-plan.ts +13 -13
- package/templates/episode-builder/tests/storyboard-playback.spec.ts +7 -7
- package/templates/fighting-game/package.json +1 -1
- package/templates/mini-game/package.json +1 -1
- package/templates/product-viewer/package.json +1 -1
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/README.md +5 -5
- package/templates/{cartoon-channel → prompt-animation-channel}/index.html +1 -1
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/package.json +2 -2
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/aura-assets.ts +1 -1
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/episode.ts +22 -22
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/main.ts +28 -28
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/render-plan.ts +13 -13
- package/templates/{cartoon-channel → prompt-animation-channel}/tests/route-health.spec.ts +1 -1
- package/templates/{prompt-cartoon-channel → prompt-animation-channel}/tests/storyboard-playback.spec.ts +8 -8
- package/templates/cartoon-studio/aura.assets.json +0 -400
- package/templates/cartoon-studio/package.json +0 -33
- package/templates/cartoon-studio/public/aura-assets/luma.authored.glb +0 -0
- package/templates/cartoon-studio/public/aura-assets/miko.authored.glb +0 -0
- package/templates/cartoon-studio/scripts/build-characters.ts +0 -738
- package/templates/cartoon-studio/scripts/build-dialogue-audio.ts +0 -262
- package/templates/cartoon-studio/scripts/episode.ts +0 -323
- package/templates/cartoon-studio/scripts/render-live.ts +0 -873
- package/templates/cartoon-studio/src/aura-assets.ts +0 -64
- package/templates/cartoon-studio/src/characters.ts +0 -65
- package/templates/cartoon-studio/src/episode-renderer.ts +0 -605
- package/templates/cartoon-studio/src/episode.ts +0 -306
- package/templates/cartoon-studio/src/main.ts +0 -400
- package/templates/cartoon-studio/src/render-live-route.ts +0 -913
- package/templates/cartoon-studio/src/render-plan.ts +0 -567
- package/templates/cartoon-studio/src/review.ts +0 -99
- package/templates/cartoon-studio/src/studio.ts +0 -101
- package/templates/cartoon-studio/test-results/.last-run.json +0 -4
- package/templates/cartoon-studio/tests/episode-render.spec.ts +0 -44
- package/templates/cartoon-studio/tests/motion-quality.spec.ts +0 -45
- package/templates/cartoon-studio/tests/route-health.spec.ts +0 -7
- package/templates/cartoon-studio/tests/storyboard-playback.spec.ts +0 -99
- package/templates/cartoon-studio/tests/visual-review.spec.ts +0 -21
- package/templates/cartoon-studio/tsconfig.json +0 -14
- package/templates/prompt-cartoon-channel/index.html +0 -13
- package/templates/prompt-cartoon-channel/src/sets.ts +0 -14
- /package/templates/{cartoon-channel → animation-channel}/aura.assets.json +0 -0
- /package/templates/{cartoon-channel → animation-channel}/playwright.config.ts +0 -0
- /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/luma.047f5e5f.glb +0 -0
- /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/luma.thumb.svg +0 -0
- /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/miko.047f5e5f.glb +0 -0
- /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/miko.thumb.svg +0 -0
- /package/templates/{cartoon-channel → animation-channel}/public/aura-assets/moon-garden-feature-frame.png +0 -0
- /package/templates/{cartoon-channel → animation-channel}/src/aura-assets.ts +0 -0
- /package/templates/{cartoon-channel → animation-channel}/src/characters.ts +0 -0
- /package/templates/{cartoon-channel → animation-channel}/src/contract.ts +0 -0
- /package/templates/{cartoon-channel → animation-channel}/src/sets.ts +0 -0
- /package/templates/{cartoon-channel → animation-channel}/test-results/.last-run.json +0 -0
- /package/templates/{cartoon-channel → animation-channel}/tests/reports/prompt-animation/cartoon-sample-episode.png +0 -0
- /package/templates/{cartoon-channel → animation-channel}/tsconfig.json +0 -0
- /package/templates/{cartoon-studio → animation-studio}/playwright.config.ts +0 -0
- /package/templates/{cartoon-studio → animation-studio}/public/aura-assets/luma.thumb.svg +0 -0
- /package/templates/{cartoon-studio → animation-studio}/public/aura-assets/miko.thumb.svg +0 -0
- /package/templates/{cartoon-studio → animation-studio}/src/contract.ts +0 -0
- /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/playwright.config.ts +0 -0
- /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/characters.ts +0 -0
- /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/src/contract.ts +0 -0
- /package/templates/{cartoon-studio → prompt-animation-channel}/src/sets.ts +0 -0
- /package/templates/{prompt-cartoon-channel → prompt-animation-channel}/tsconfig.json +0 -0
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { episode, publicCartoonAssetInstructions, typedCartoonAssetSummary } from "./episode";
|
|
2
|
-
import { publishReadiness, renderPlan } from "./render-plan";
|
|
3
|
-
|
|
4
|
-
export const cartoonStudioSupport = {
|
|
5
|
-
template: "cartoon-studio",
|
|
6
|
-
panels: ["timeline", "assets", "performance", "render"] as const,
|
|
7
|
-
timelineTracks: [
|
|
8
|
-
{
|
|
9
|
-
id: "shots",
|
|
10
|
-
label: "Shots",
|
|
11
|
-
clips: episode.shotTimeline.shots.map((shot) => ({
|
|
12
|
-
id: shot.shotId,
|
|
13
|
-
startTime: shot.startTime,
|
|
14
|
-
endTime: shot.endTime,
|
|
15
|
-
cameraMove: shot.camera.move,
|
|
16
|
-
transitionOut: shot.transitionOut ?? "cut"
|
|
17
|
-
}))
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
id: "dialogue",
|
|
21
|
-
label: "Dialogue",
|
|
22
|
-
clips: episode.dialogueTrack.lines.map((line) => ({
|
|
23
|
-
id: line.lineId,
|
|
24
|
-
speakerId: line.speakerId,
|
|
25
|
-
startTime: line.startTime,
|
|
26
|
-
endTime: line.endTime,
|
|
27
|
-
text: line.text
|
|
28
|
-
}))
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
id: "render",
|
|
32
|
-
label: "Render",
|
|
33
|
-
clips: renderPlan.items.map((item) => ({
|
|
34
|
-
id: item.id,
|
|
35
|
-
time: item.time,
|
|
36
|
-
outputIds: item.outputIds,
|
|
37
|
-
width: item.viewport.width,
|
|
38
|
-
height: item.viewport.height
|
|
39
|
-
}))
|
|
40
|
-
}
|
|
41
|
-
],
|
|
42
|
-
assetLibrary: {
|
|
43
|
-
requiredCharacters: typedCartoonAssetSummary.requiredCharacterAssets,
|
|
44
|
-
optionalProps: typedCartoonAssetSummary.optionalPropAssets,
|
|
45
|
-
missingCharacters: typedCartoonAssetSummary.missingCharacterAssets,
|
|
46
|
-
commands: publicCartoonAssetInstructions
|
|
47
|
-
},
|
|
48
|
-
renderPipeline: {
|
|
49
|
-
outputs: renderPlan.outputs.map((output) => output.kind),
|
|
50
|
-
itemCount: renderPlan.items.length,
|
|
51
|
-
publishReadyFromCurrentEvidence: publishReadiness.ready,
|
|
52
|
-
issueCount: publishReadiness.issues.length
|
|
53
|
-
}
|
|
54
|
-
} as const;
|
|
55
|
-
|
|
56
|
-
export function installCartoonStudioPanel(target: HTMLElement): void {
|
|
57
|
-
const panel = document.createElement("section");
|
|
58
|
-
panel.id = "cartoon-studio-panel";
|
|
59
|
-
panel.style.cssText = [
|
|
60
|
-
"position:fixed",
|
|
61
|
-
"left:18px",
|
|
62
|
-
"top:18px",
|
|
63
|
-
"width:min(360px,calc(100vw - 36px))",
|
|
64
|
-
"display:grid",
|
|
65
|
-
"grid-template-columns:repeat(4,1fr)",
|
|
66
|
-
"gap:6px",
|
|
67
|
-
"padding:10px",
|
|
68
|
-
"border:1px solid rgba(248,255,242,0.22)",
|
|
69
|
-
"border-radius:8px",
|
|
70
|
-
"background:rgba(3,12,20,0.78)",
|
|
71
|
-
"color:#f8fff2",
|
|
72
|
-
"font:600 12px/1.2 system-ui,sans-serif",
|
|
73
|
-
"z-index:9"
|
|
74
|
-
].join(";");
|
|
75
|
-
|
|
76
|
-
for (const name of cartoonStudioSupport.panels) {
|
|
77
|
-
const button = document.createElement("button");
|
|
78
|
-
button.type = "button";
|
|
79
|
-
button.textContent = name;
|
|
80
|
-
button.dataset.panel = name;
|
|
81
|
-
button.style.cssText = [
|
|
82
|
-
"min-width:0",
|
|
83
|
-
"height:30px",
|
|
84
|
-
"border:1px solid rgba(125,226,255,0.42)",
|
|
85
|
-
"border-radius:6px",
|
|
86
|
-
"background:rgba(24,45,63,0.84)",
|
|
87
|
-
"color:#f8fff2",
|
|
88
|
-
"font:inherit",
|
|
89
|
-
"text-transform:capitalize"
|
|
90
|
-
].join(";");
|
|
91
|
-
panel.appendChild(button);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const status = document.createElement("div");
|
|
95
|
-
status.id = "cartoon-studio-status";
|
|
96
|
-
status.textContent = `${episode.shotTimeline.shots.length} shots | ${episode.dialogueTrack.lines.length} lines | ${renderPlan.items.length} render cues`;
|
|
97
|
-
status.style.cssText = "grid-column:1 / -1;color:#7de2ff;white-space:normal";
|
|
98
|
-
panel.appendChild(status);
|
|
99
|
-
|
|
100
|
-
target.appendChild(panel);
|
|
101
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "@playwright/test";
|
|
2
|
-
import {
|
|
3
|
-
createCartoonEpisodePackage,
|
|
4
|
-
createCartoonRenderManifestArtifact,
|
|
5
|
-
createRenderedPromptAnimationEvidenceArtifact
|
|
6
|
-
} from "../src/episode-renderer";
|
|
7
|
-
import { requiredCartoonEpisodePackageFiles } from "../src/review";
|
|
8
|
-
|
|
9
|
-
test("episode renderer package declares encoded video and required package files", () => {
|
|
10
|
-
const pkg = createCartoonEpisodePackage("package");
|
|
11
|
-
const filePaths = new Set(pkg.files.map((file) => file.path));
|
|
12
|
-
const manifest = createCartoonRenderManifestArtifact();
|
|
13
|
-
const evidence = createRenderedPromptAnimationEvidenceArtifact();
|
|
14
|
-
|
|
15
|
-
expect(pkg.packageDirectory).toBe("dist/episodes/moon-garden-001");
|
|
16
|
-
expect(pkg.hasWebm).toBe(true);
|
|
17
|
-
expect(pkg.hasPngSequenceFallback).toBe(false);
|
|
18
|
-
expect(pkg.requiredFiles).toEqual([...requiredCartoonEpisodePackageFiles]);
|
|
19
|
-
expect([...requiredCartoonEpisodePackageFiles]
|
|
20
|
-
.filter((file) => file !== "episode.webm" && file !== "thumbnail.png")
|
|
21
|
-
.every((file) => filePaths.has(file))).toBe(true);
|
|
22
|
-
expect(filePaths.has("episode.webm")).toBe(false);
|
|
23
|
-
expect(filePaths.has("thumbnail.png")).toBe(false);
|
|
24
|
-
expect(pkg.files.filter((file) => /^frames\/frame-\d+\.svg$/.test(file.path)).length).toBeGreaterThan(20);
|
|
25
|
-
|
|
26
|
-
expect(manifest).toMatchObject({
|
|
27
|
-
artifact: "cartoon-render-manifest",
|
|
28
|
-
outputMode: "encoded-webm",
|
|
29
|
-
hasEncodedVideo: true,
|
|
30
|
-
encodedVideo: {
|
|
31
|
-
path: "episode.webm",
|
|
32
|
-
codec: "vp9"
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
expect(evidence).toMatchObject({
|
|
36
|
-
artifact: "prompt-animation-evidence",
|
|
37
|
-
ok: true,
|
|
38
|
-
renderOutput: {
|
|
39
|
-
mode: "encoded-webm",
|
|
40
|
-
encodedVideoPresent: true,
|
|
41
|
-
pngSequenceFallbackPresent: false
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
});
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "@playwright/test";
|
|
2
|
-
import { createCartoonMotionQualityArtifact, createCartoonVisualAcceptanceArtifact } from "../src/episode-renderer";
|
|
3
|
-
|
|
4
|
-
test("motion quality rejects still-image wobble and requires regional character motion", () => {
|
|
5
|
-
const motion = createCartoonMotionQualityArtifact();
|
|
6
|
-
|
|
7
|
-
expect(motion).toMatchObject({
|
|
8
|
-
artifact: "cartoon-motion-quality",
|
|
9
|
-
videoPath: "episode.webm",
|
|
10
|
-
globalOnlyMotion: false,
|
|
11
|
-
flatLayerMotion: false,
|
|
12
|
-
cameraMotionDeclared: true,
|
|
13
|
-
rejectedEvidence: {
|
|
14
|
-
stillImageWobbleAccepted: false,
|
|
15
|
-
subtitleOverStillAccepted: false,
|
|
16
|
-
sourceOnlyAccepted: false
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
expect(motion.independentRegionMotionSegments).toBeGreaterThanOrEqual(2);
|
|
20
|
-
expect(motion.characterRegionMotionSegments).toBeGreaterThanOrEqual(2);
|
|
21
|
-
expect(motion.bodyRegionMotionSegments).toBeGreaterThanOrEqual(2);
|
|
22
|
-
expect(motion.mouthMotionSegments).toBeGreaterThanOrEqual(2);
|
|
23
|
-
expect(motion.regions.some((region) => region.kind === "mouth" && region.movesDuringDialogue)).toBe(true);
|
|
24
|
-
expect(motion.regions.some((region) => region.kind === "limb" && region.movesDuringAction)).toBe(true);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test("visual acceptance requires both characters and refuses source-only publish evidence", () => {
|
|
28
|
-
const visual = createCartoonVisualAcceptanceArtifact();
|
|
29
|
-
|
|
30
|
-
expect(visual).toMatchObject({
|
|
31
|
-
artifact: "cartoon-visual-acceptance",
|
|
32
|
-
ok: true,
|
|
33
|
-
visualOk: true,
|
|
34
|
-
encodedVideoPresent: true,
|
|
35
|
-
notTrue3DAccepted: false,
|
|
36
|
-
sourceOnlyAcceptedAsPublishProof: false,
|
|
37
|
-
requiredHumanReview: true,
|
|
38
|
-
visibleCharacterCount: 2,
|
|
39
|
-
globalOnlyMotion: false,
|
|
40
|
-
flatLayerMotion: false,
|
|
41
|
-
reviewerRequiredBeforePublish: true
|
|
42
|
-
});
|
|
43
|
-
expect(visual.frameHashChanges).toBeGreaterThan(1);
|
|
44
|
-
expect(visual.motionSegments.every((segment) => segment.independentRegionMotion)).toBe(true);
|
|
45
|
-
});
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "@playwright/test";
|
|
2
|
-
|
|
3
|
-
test("cartoon studio storyboard caption renders", async ({ page }) => {
|
|
4
|
-
await page.goto("/");
|
|
5
|
-
await expect(page.locator("#caption-overlay")).toContainText(/moon|sparkle|garden/i);
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
test("storyboard playback, character performance, caption timing, cuts, and nonblank cartoon frames are sourced", async ({
|
|
9
|
-
page
|
|
10
|
-
}) => {
|
|
11
|
-
await page.goto("/");
|
|
12
|
-
|
|
13
|
-
const routeProof = (await page.evaluate(() => {
|
|
14
|
-
const proof = (window as unknown as {
|
|
15
|
-
__AURA3D_CARTOON_EPISODE_PROOF__?: {
|
|
16
|
-
proofKind: string;
|
|
17
|
-
shotIds: readonly string[];
|
|
18
|
-
captionIds: readonly string[];
|
|
19
|
-
storyBible?: unknown;
|
|
20
|
-
studio?: unknown;
|
|
21
|
-
sourceOnlyAcceptedAsPublishProof: boolean;
|
|
22
|
-
playbackProbeSamples: readonly unknown[];
|
|
23
|
-
sampleAt(time: number): unknown;
|
|
24
|
-
};
|
|
25
|
-
}).__AURA3D_CARTOON_EPISODE_PROOF__;
|
|
26
|
-
return {
|
|
27
|
-
proofKind: proof?.proofKind,
|
|
28
|
-
shotIds: proof?.shotIds ?? [],
|
|
29
|
-
captionIds: proof?.captionIds ?? [],
|
|
30
|
-
storyBible: proof?.storyBible,
|
|
31
|
-
studio: proof?.studio,
|
|
32
|
-
sourceOnlyAcceptedAsPublishProof: proof?.sourceOnlyAcceptedAsPublishProof,
|
|
33
|
-
samples: [1, 21, 43].map((time) => proof?.sampleAt(time)),
|
|
34
|
-
playbackProbeSamples: proof?.playbackProbeSamples ?? [],
|
|
35
|
-
bodyShotCount: document.body.dataset.cartoonShotCount,
|
|
36
|
-
bodyCaptionCount: document.body.dataset.cartoonCaptionCount,
|
|
37
|
-
bodyPanels: document.body.dataset.cartoonStudioPanels
|
|
38
|
-
};
|
|
39
|
-
})) as {
|
|
40
|
-
proofKind?: string;
|
|
41
|
-
shotIds: string[];
|
|
42
|
-
captionIds: string[];
|
|
43
|
-
storyBible?: {
|
|
44
|
-
props?: unknown[];
|
|
45
|
-
styleGuide?: { visualStyle?: string };
|
|
46
|
-
shotList?: unknown[];
|
|
47
|
-
};
|
|
48
|
-
studio?: {
|
|
49
|
-
panels?: readonly string[];
|
|
50
|
-
timelineTracks?: readonly { id: string; clips: readonly unknown[] }[];
|
|
51
|
-
assetLibrary?: { commands?: readonly string[] };
|
|
52
|
-
renderPipeline?: { itemCount?: number };
|
|
53
|
-
};
|
|
54
|
-
samples: Array<{
|
|
55
|
-
shotId?: string;
|
|
56
|
-
captionId?: string;
|
|
57
|
-
captionText?: string;
|
|
58
|
-
cameraMove?: string;
|
|
59
|
-
transitionOut?: string;
|
|
60
|
-
nodeUpdates?: Array<{ characterId?: string; action?: string; emotion?: string }>;
|
|
61
|
-
}>;
|
|
62
|
-
playbackProbeSamples: unknown[];
|
|
63
|
-
sourceOnlyAcceptedAsPublishProof?: boolean;
|
|
64
|
-
bodyShotCount?: string;
|
|
65
|
-
bodyCaptionCount?: string;
|
|
66
|
-
bodyPanels?: string;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
expect(routeProof.proofKind).toBe("aura3d-cartoon-episode-proof");
|
|
70
|
-
expect(routeProof.sourceOnlyAcceptedAsPublishProof).toBe(false);
|
|
71
|
-
expect(routeProof.shotIds).toEqual([
|
|
72
|
-
"shot-moon-garden-open",
|
|
73
|
-
"shot-glow-stone-teamwork",
|
|
74
|
-
"shot-moon-garden-finish"
|
|
75
|
-
]);
|
|
76
|
-
expect(new Set(routeProof.samples.map((sample) => sample.shotId)).size).toBe(3);
|
|
77
|
-
expect(routeProof.captionIds).toHaveLength(6);
|
|
78
|
-
expect(routeProof.samples.every((sample) => sample.captionId && sample.captionText)).toBe(true);
|
|
79
|
-
expect(routeProof.samples.some((sample) => sample.cameraMove === "push-in" || sample.transitionOut === "cut")).toBe(true);
|
|
80
|
-
expect(routeProof.samples.flatMap((sample) => sample.nodeUpdates ?? []).some((update) => update.action === "speak")).toBe(true);
|
|
81
|
-
expect(routeProof.samples.flatMap((sample) => sample.nodeUpdates ?? []).some((update) => update.characterId === "miko")).toBe(true);
|
|
82
|
-
expect(routeProof.samples.flatMap((sample) => sample.nodeUpdates ?? []).some((update) => update.characterId === "luma")).toBe(true);
|
|
83
|
-
expect(routeProof.storyBible?.props?.length).toBeGreaterThanOrEqual(3);
|
|
84
|
-
expect(routeProof.storyBible?.styleGuide?.visualStyle).toMatch(/cartoon/i);
|
|
85
|
-
expect(routeProof.storyBible?.shotList).toHaveLength(3);
|
|
86
|
-
expect(routeProof.playbackProbeSamples).toHaveLength(3);
|
|
87
|
-
expect(routeProof.bodyShotCount).toBe("3");
|
|
88
|
-
expect(routeProof.bodyCaptionCount).toBe("6");
|
|
89
|
-
expect(routeProof.studio?.panels).toEqual(["timeline", "assets", "performance", "render"]);
|
|
90
|
-
expect(routeProof.studio?.timelineTracks?.map((track) => track.id)).toEqual(["shots", "dialogue", "render"]);
|
|
91
|
-
expect(routeProof.studio?.timelineTracks?.every((track) => track.clips.length > 0)).toBe(true);
|
|
92
|
-
expect(routeProof.studio?.assetLibrary?.commands?.some((command) => command.includes("assets validate-cartoon"))).toBe(true);
|
|
93
|
-
expect(routeProof.studio?.renderPipeline?.itemCount).toBeGreaterThan(0);
|
|
94
|
-
expect(routeProof.bodyPanels).toBe("timeline,assets,performance,render");
|
|
95
|
-
await expect(page.locator("#cartoon-studio-panel")).toBeVisible();
|
|
96
|
-
|
|
97
|
-
const screenshot = await page.screenshot();
|
|
98
|
-
expect(screenshot.byteLength).toBeGreaterThan(2048);
|
|
99
|
-
});
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "@playwright/test";
|
|
2
|
-
import { createCartoonEpisodeReviewPackage } from "../src/review";
|
|
3
|
-
|
|
4
|
-
test("review package includes human approval checklist and publish boundary", () => {
|
|
5
|
-
const review = createCartoonEpisodeReviewPackage({
|
|
6
|
-
hasWebm: true,
|
|
7
|
-
hasPngSequenceFallback: false,
|
|
8
|
-
generatedAt: "2026-06-06T00:00:00.000Z"
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
expect(review).toContain("# Moon Garden 001 Review Package");
|
|
12
|
-
expect(review).toContain("Output mode: `encoded-webm`");
|
|
13
|
-
expect(review).toContain("Review status: `ready-for-human-review`");
|
|
14
|
-
expect(review).toContain("- [ ] Both characters are readable in representative frames.");
|
|
15
|
-
expect(review).toContain("- [ ] Captions do not cover important action.");
|
|
16
|
-
expect(review).toContain("- [ ] Mouth movement is visible during dialogue in the browser route.");
|
|
17
|
-
expect(review).toContain("- [ ] Character body motion is more than still-image wobble.");
|
|
18
|
-
expect(review).toContain("- [ ] No route chrome, proof panels, or debug overlays appear in encoded output.");
|
|
19
|
-
expect(review).toContain("- [ ] Reviewer name and approval date are recorded before publish-ready claims.");
|
|
20
|
-
expect(review).toContain("Human review and asset readiness are still required before public publish-ready claims.");
|
|
21
|
-
});
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "Bundler",
|
|
6
|
-
"strict": true,
|
|
7
|
-
"jsx": "react-jsx",
|
|
8
|
-
"types": ["vite/client"]
|
|
9
|
-
},
|
|
10
|
-
"include": ["src"],
|
|
11
|
-
"//": "render-live-route.ts is the experimental real-3D path; it needs engine exports newer than the published @aura3d/engine and runs only via `npm run episode:render-3d` (which aliases @aura3d/* to a monorepo build). Excluded from the default scaffold typecheck/build.",
|
|
12
|
-
"exclude": ["src/render-live-route.ts"]
|
|
13
|
-
}
|
|
14
|
-
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>Aura3D Cartoon Channel</title>
|
|
7
|
-
</head>
|
|
8
|
-
<body>
|
|
9
|
-
<div id="app"></div>
|
|
10
|
-
<script type="module" src="/src/main.ts"></script>
|
|
11
|
-
</body>
|
|
12
|
-
</html>
|
|
13
|
-
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID } from "./contract";
|
|
2
|
-
|
|
3
|
-
export const setContractId = AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID;
|
|
4
|
-
|
|
5
|
-
export const sets = [
|
|
6
|
-
{
|
|
7
|
-
id: "moon-garden",
|
|
8
|
-
name: "Moon Garden",
|
|
9
|
-
layers: ["foreground flowers", "midground robot path", "background planet skyline"],
|
|
10
|
-
primitiveFallbackProps: ["glow-broom", "glow-stones", "moon-lilies"],
|
|
11
|
-
optionalTypedAssetKeys: ["glowBroom", "glowStones", "moonLilies"],
|
|
12
|
-
safety: "soft colors, readable captions, reduced flash by default"
|
|
13
|
-
}
|
|
14
|
-
];
|
|
File without changes
|
|
File without changes
|
/package/templates/{cartoon-channel → animation-channel}/public/aura-assets/luma.047f5e5f.glb
RENAMED
|
File without changes
|
|
File without changes
|
/package/templates/{cartoon-channel → animation-channel}/public/aura-assets/miko.047f5e5f.glb
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|