create-aura3d 1.0.5
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/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +27 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/package.json +55 -0
- package/templates/cartoon-channel/README.md +42 -0
- package/templates/cartoon-channel/index.html +13 -0
- package/templates/cartoon-channel/package.json +21 -0
- package/templates/cartoon-channel/playwright.config.ts +13 -0
- package/templates/cartoon-channel/src/aura-assets.ts +14 -0
- package/templates/cartoon-channel/src/characters.ts +28 -0
- package/templates/cartoon-channel/src/contract.ts +1 -0
- package/templates/cartoon-channel/src/episode.ts +300 -0
- package/templates/cartoon-channel/src/main.ts +322 -0
- package/templates/cartoon-channel/src/render-plan.ts +405 -0
- package/templates/cartoon-channel/src/sets.ts +14 -0
- package/templates/cartoon-channel/tests/route-health.spec.ts +7 -0
- package/templates/cartoon-channel/tests/storyboard-playback.spec.ts +74 -0
- package/templates/cartoon-channel/tsconfig.json +12 -0
- package/templates/cinematic-scene/README.md +11 -0
- package/templates/cinematic-scene/index.html +13 -0
- package/templates/cinematic-scene/package.json +21 -0
- package/templates/cinematic-scene/playwright.config.ts +14 -0
- package/templates/cinematic-scene/public/aura-assets/hero-fixture.glb +0 -0
- package/templates/cinematic-scene/public/aura-assets/hero.thumb.svg +1 -0
- package/templates/cinematic-scene/src/aura-assets.ts +17 -0
- package/templates/cinematic-scene/src/main.ts +27 -0
- package/templates/cinematic-scene/tests/route-health.spec.ts +16 -0
- package/templates/cinematic-scene/tests/screenshot.spec.ts +56 -0
- package/templates/cinematic-scene/tsconfig.json +15 -0
- package/templates/fighting-game/README.md +64 -0
- package/templates/fighting-game/index.html +13 -0
- package/templates/fighting-game/package.json +21 -0
- package/templates/fighting-game/playwright.config.ts +12 -0
- package/templates/fighting-game/src/aura-assets.ts +11 -0
- package/templates/fighting-game/src/game/fighters.ts +152 -0
- package/templates/fighting-game/src/game/moves.ts +70 -0
- package/templates/fighting-game/src/game/stage.ts +98 -0
- package/templates/fighting-game/src/main.ts +417 -0
- package/templates/fighting-game/src/styles.css +124 -0
- package/templates/fighting-game/tests/gameplay-smoke.spec.ts +23 -0
- package/templates/fighting-game/tests/route-health.spec.ts +11 -0
- package/templates/fighting-game/tsconfig.json +19 -0
- package/templates/mini-game/README.md +10 -0
- package/templates/mini-game/index.html +13 -0
- package/templates/mini-game/package.json +21 -0
- package/templates/mini-game/playwright.config.ts +14 -0
- package/templates/mini-game/public/aura-assets/player-fixture.glb +0 -0
- package/templates/mini-game/public/aura-assets/player.thumb.svg +8 -0
- package/templates/mini-game/src/aura-assets.ts +17 -0
- package/templates/mini-game/src/main.ts +27 -0
- package/templates/mini-game/tests/route-health.spec.ts +16 -0
- package/templates/mini-game/tests/screenshot.spec.ts +63 -0
- package/templates/mini-game/tsconfig.json +15 -0
- package/templates/product-viewer/README.md +16 -0
- package/templates/product-viewer/index.html +16 -0
- package/templates/product-viewer/package.json +21 -0
- package/templates/product-viewer/playwright.config.ts +14 -0
- package/templates/product-viewer/public/aura-assets/product-fixture.glb +0 -0
- package/templates/product-viewer/public/aura-assets/product.thumb.svg +1 -0
- package/templates/product-viewer/src/aura-assets.ts +17 -0
- package/templates/product-viewer/src/main.ts +27 -0
- package/templates/product-viewer/tests/route-health.spec.ts +16 -0
- package/templates/product-viewer/tests/screenshot.spec.ts +60 -0
- package/templates/product-viewer/tsconfig.json +15 -0
- package/templates/prompt-cartoon-channel/README.md +42 -0
- package/templates/prompt-cartoon-channel/index.html +13 -0
- package/templates/prompt-cartoon-channel/package.json +21 -0
- package/templates/prompt-cartoon-channel/playwright.config.ts +13 -0
- package/templates/prompt-cartoon-channel/src/aura-assets.ts +14 -0
- package/templates/prompt-cartoon-channel/src/characters.ts +28 -0
- package/templates/prompt-cartoon-channel/src/contract.ts +1 -0
- package/templates/prompt-cartoon-channel/src/episode.ts +300 -0
- package/templates/prompt-cartoon-channel/src/main.ts +314 -0
- package/templates/prompt-cartoon-channel/src/render-plan.ts +405 -0
- package/templates/prompt-cartoon-channel/src/sets.ts +14 -0
- package/templates/prompt-cartoon-channel/tests/route-health.spec.ts +7 -0
- package/templates/prompt-cartoon-channel/tests/storyboard-playback.spec.ts +74 -0
- package/templates/prompt-cartoon-channel/tsconfig.json +12 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { CREATE_AURA3D_TEMPLATES, createA3DProject } from "./index.js";
|
|
3
|
+
const args = process.argv.slice(2);
|
|
4
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
5
|
+
console.log(`create-aura3d
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
create-aura3d demo --template product-viewer
|
|
9
|
+
|
|
10
|
+
Templates:
|
|
11
|
+
${CREATE_AURA3D_TEMPLATES.join("\n ")}
|
|
12
|
+
`);
|
|
13
|
+
process.exit(0);
|
|
14
|
+
}
|
|
15
|
+
const targetDir = args.find((arg) => !arg.startsWith("-")) ?? "aura3d-app";
|
|
16
|
+
const template = readOption("--template") ?? "product-viewer";
|
|
17
|
+
if (!CREATE_AURA3D_TEMPLATES.includes(template)) {
|
|
18
|
+
console.error(`Unknown template "${template}". Available templates: ${CREATE_AURA3D_TEMPLATES.join(", ")}`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
const result = createA3DProject({ targetDir, template: template });
|
|
22
|
+
console.log(JSON.stringify(result, null, 2));
|
|
23
|
+
function readOption(name) {
|
|
24
|
+
const index = args.indexOf(name);
|
|
25
|
+
return index >= 0 ? args[index + 1] : undefined;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAA0B,MAAM,YAAY,CAAC;AAE/F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC;;;;;;IAMV,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;CACvC,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,YAAY,CAAC;AAC3E,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,gBAAgB,CAAC;AAC9D,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,QAA6B,CAAC,EAAE,CAAC;IACrE,OAAO,CAAC,KAAK,CAAC,qBAAqB,QAAQ,2BAA2B,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAA6B,EAAE,CAAC,CAAC;AACxF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAE7C,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const CREATE_AURA3D_TEMPLATES: readonly ["product-viewer", "cinematic-scene", "mini-game", "fighting-game", "cartoon-channel", "prompt-cartoon-channel"];
|
|
2
|
+
export type CreateA3DTemplate = (typeof CREATE_AURA3D_TEMPLATES)[number];
|
|
3
|
+
export interface CreateA3DProjectOptions {
|
|
4
|
+
readonly targetDir: string;
|
|
5
|
+
readonly template?: CreateA3DTemplate;
|
|
6
|
+
readonly packageVersion?: string;
|
|
7
|
+
readonly rootDir?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CreateA3DProjectResult {
|
|
10
|
+
readonly targetDir: string;
|
|
11
|
+
readonly template: CreateA3DTemplate;
|
|
12
|
+
readonly files: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
export declare function createA3DProject(options: CreateA3DProjectOptions): CreateA3DProjectResult;
|
|
15
|
+
export declare function writeCreateA3DReport(path: string, result: CreateA3DProjectResult): void;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,2HAO1B,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CA6BzF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAGvF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, relative, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
export const CREATE_AURA3D_TEMPLATES = [
|
|
5
|
+
"product-viewer",
|
|
6
|
+
"cinematic-scene",
|
|
7
|
+
"mini-game",
|
|
8
|
+
"fighting-game",
|
|
9
|
+
"cartoon-channel",
|
|
10
|
+
"prompt-cartoon-channel"
|
|
11
|
+
];
|
|
12
|
+
export function createA3DProject(options) {
|
|
13
|
+
const template = options.template ?? "product-viewer";
|
|
14
|
+
if (!CREATE_AURA3D_TEMPLATES.includes(template)) {
|
|
15
|
+
throw new Error(`Unknown create-aura3d template: ${template}. Available templates: ${CREATE_AURA3D_TEMPLATES.join(", ")}`);
|
|
16
|
+
}
|
|
17
|
+
const rootDir = options.rootDir ?? findDefaultTemplateRoot();
|
|
18
|
+
const templateDir = resolve(rootDir, "templates", template);
|
|
19
|
+
if (!existsSync(templateDir))
|
|
20
|
+
throw new Error(`Unknown create-aura3d template: ${template}`);
|
|
21
|
+
const targetDir = resolve(options.targetDir);
|
|
22
|
+
mkdirSync(targetDir, { recursive: true });
|
|
23
|
+
cpSync(templateDir, targetDir, {
|
|
24
|
+
recursive: true,
|
|
25
|
+
filter: (source) => !relative(templateDir, source).split(/[\\/]/).some((part) => part === "node_modules" || part === "dist" || part === "test-results")
|
|
26
|
+
});
|
|
27
|
+
const packagePath = resolve(targetDir, "package.json");
|
|
28
|
+
const packageJson = JSON.parse(readFileSync(packagePath, "utf8"));
|
|
29
|
+
packageJson.dependencies = {
|
|
30
|
+
...(packageJson.dependencies ?? {}),
|
|
31
|
+
"@aura3d/engine": options.packageVersion ?? "1.0.5"
|
|
32
|
+
};
|
|
33
|
+
writeFileSync(packagePath, `${JSON.stringify(packageJson, null, 2)}\n`);
|
|
34
|
+
return {
|
|
35
|
+
targetDir,
|
|
36
|
+
template,
|
|
37
|
+
files: listTemplateFiles(targetDir)
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function writeCreateA3DReport(path, result) {
|
|
41
|
+
mkdirSync(dirname(resolve(path)), { recursive: true });
|
|
42
|
+
writeFileSync(resolve(path), `${JSON.stringify(result, null, 2)}\n`);
|
|
43
|
+
}
|
|
44
|
+
function listTemplateFiles(targetDir) {
|
|
45
|
+
const files = [];
|
|
46
|
+
const visit = (directory) => {
|
|
47
|
+
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
48
|
+
const path = resolve(directory, entry.name);
|
|
49
|
+
if (entry.isDirectory())
|
|
50
|
+
visit(path);
|
|
51
|
+
else
|
|
52
|
+
files.push(path.replace(`${targetDir}/`, ""));
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
visit(targetDir);
|
|
56
|
+
return files.sort();
|
|
57
|
+
}
|
|
58
|
+
function findDefaultTemplateRoot() {
|
|
59
|
+
let current = dirname(fileURLToPath(import.meta.url));
|
|
60
|
+
for (let depth = 0; depth < 8; depth += 1) {
|
|
61
|
+
if (CREATE_AURA3D_TEMPLATES.every((template) => existsSync(resolve(current, "templates", template))))
|
|
62
|
+
return current;
|
|
63
|
+
const next = dirname(current);
|
|
64
|
+
if (next === current)
|
|
65
|
+
break;
|
|
66
|
+
current = next;
|
|
67
|
+
}
|
|
68
|
+
return process.cwd();
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-aura3d",
|
|
3
|
+
"version": "1.0.5",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"create-aura3d": "dist/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"templates/product-viewer",
|
|
11
|
+
"templates/cinematic-scene",
|
|
12
|
+
"templates/mini-game",
|
|
13
|
+
"templates/fighting-game",
|
|
14
|
+
"templates/cartoon-channel",
|
|
15
|
+
"templates/prompt-cartoon-channel"
|
|
16
|
+
],
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"import": "./dist/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"main": "./dist/index.js",
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"description": "Scaffold Aura3D browser 3D apps for product viewers, cinematic scenes, mini-games, fighting-game runtimes, and prompt-driven cartoon channels.",
|
|
29
|
+
"keywords": [
|
|
30
|
+
"create-aura3d",
|
|
31
|
+
"vite",
|
|
32
|
+
"3d-template",
|
|
33
|
+
"browser-3d",
|
|
34
|
+
"product-viewer",
|
|
35
|
+
"fighting-game",
|
|
36
|
+
"prompt-cartoon-channel",
|
|
37
|
+
"cartoon-animation",
|
|
38
|
+
"prompt-to-video",
|
|
39
|
+
"game-runtime",
|
|
40
|
+
"gltf",
|
|
41
|
+
"glb",
|
|
42
|
+
"typescript",
|
|
43
|
+
"ai-agents"
|
|
44
|
+
],
|
|
45
|
+
"homepage": "https://github.com/auraoneai/aura3d#readme",
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "git+https://github.com/auraoneai/aura3d.git",
|
|
49
|
+
"directory": "packages/create-aura3d"
|
|
50
|
+
},
|
|
51
|
+
"bugs": {
|
|
52
|
+
"url": "https://github.com/auraoneai/aura3d/issues"
|
|
53
|
+
},
|
|
54
|
+
"license": "MIT"
|
|
55
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Aura3D Cartoon Channel Template
|
|
2
|
+
|
|
3
|
+
This template demonstrates the AuraVoice-to-Aura3D prompt-animation contract.
|
|
4
|
+
|
|
5
|
+
It uses:
|
|
6
|
+
|
|
7
|
+
- `compilePromptEpisodePlan(...)` for prompt-to-episode planning.
|
|
8
|
+
- Optional typed GLB characters from `./src/aura-assets` with primitive runtime fallbacks until assets are added.
|
|
9
|
+
- `createShotPlaybackPlan(...)` plus `installShotPlayback(...)` so `app.onFrame` updates nodes without recreating the app.
|
|
10
|
+
- `createAuraVoiceBridgePackage(...)`, `validateAuraVoiceBridgePackage(...)`, `collectPromptAnimationEvidence(...)`, and `evaluatePromptAnimationPublishReadiness(...)` for source-level AuraVoice/Aura3D handoff declarations.
|
|
11
|
+
- Caption HUD and caption timing proof metadata.
|
|
12
|
+
- Render queue metadata and three deterministic screenshot fixture records.
|
|
13
|
+
- Child-safe, reduced-motion, and high-contrast accessibility proof defaults.
|
|
14
|
+
- Primitive-mouth and typed-GLB viseme examples.
|
|
15
|
+
- Phoneme/viseme/dub source proof metadata for stable shot, storyboard, caption, line, and word timing ids.
|
|
16
|
+
|
|
17
|
+
Replace primitive characters with typed GLB assets by running:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npx @aura3d/cli@latest assets add ./assets/miko.glb --name miko
|
|
21
|
+
npx @aura3d/cli@latest assets add ./assets/luma.glb --name luma
|
|
22
|
+
npx @aura3d/cli@latest assets validate-cartoon
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Then import `assets.miko` and `assets.luma` from `src/aura-assets.ts` and pass them to `model(assets.miko)` and `model(assets.luma)`.
|
|
26
|
+
|
|
27
|
+
The GLB path must keep typed assets:
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { model } from "@aura3d/engine";
|
|
31
|
+
import { assets } from "./aura-assets";
|
|
32
|
+
|
|
33
|
+
model(assets.miko);
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Do not replace this with a string asset id or a raw loader.
|
|
37
|
+
|
|
38
|
+
This scaffold intentionally does not claim publish readiness from source alone.
|
|
39
|
+
Before closing build, route, asset, screenshot, render, or visual-quality gates,
|
|
40
|
+
archive the matching `npm run build`, `assets validate-cartoon`, browser
|
|
41
|
+
evidence, screenshot hashes, render outputs, and human or automated review
|
|
42
|
+
artifacts.
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "aura3d-cartoon-channel",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite --host 0.0.0.0",
|
|
8
|
+
"typecheck": "tsc --noEmit",
|
|
9
|
+
"build": "npm run typecheck && vite build",
|
|
10
|
+
"preview": "vite preview --host 0.0.0.0",
|
|
11
|
+
"test": "playwright test tests/route-health.spec.ts tests/storyboard-playback.spec.ts --workers=1"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@aura3d/engine": "1.0.5"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@playwright/test": "^1.52.0",
|
|
18
|
+
"typescript": "^5.9.3",
|
|
19
|
+
"vite": "^7.2.4"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineConfig } from "@playwright/test";
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
webServer: {
|
|
5
|
+
command: "npm run dev -- --port 4178",
|
|
6
|
+
url: "http://127.0.0.1:4178",
|
|
7
|
+
reuseExistingServer: !process.env.CI
|
|
8
|
+
},
|
|
9
|
+
use: {
|
|
10
|
+
baseURL: "http://127.0.0.1:4178"
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineAuraAssets } from "@aura3d/engine";
|
|
2
|
+
import { AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID } from "./contract";
|
|
3
|
+
|
|
4
|
+
export const assetContractId = AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID;
|
|
5
|
+
|
|
6
|
+
export const assets = defineAuraAssets({
|
|
7
|
+
/*
|
|
8
|
+
* Add character GLBs with the Aura3D CLI, then keep these generated keys:
|
|
9
|
+
*
|
|
10
|
+
* npx @aura3d/cli@latest assets add ./assets/miko.glb --name miko
|
|
11
|
+
* npx @aura3d/cli@latest assets add ./assets/luma.glb --name luma
|
|
12
|
+
* npx @aura3d/cli@latest assets validate-cartoon
|
|
13
|
+
*/
|
|
14
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID } from "./contract";
|
|
2
|
+
|
|
3
|
+
export const characterContractId = AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID;
|
|
4
|
+
|
|
5
|
+
export const characters = [
|
|
6
|
+
{
|
|
7
|
+
id: "miko",
|
|
8
|
+
name: "Miko",
|
|
9
|
+
palette: ["#7de2ff", "#f7ffe8"],
|
|
10
|
+
primitiveFallback: "round robot with antenna",
|
|
11
|
+
typedAssetKey: "miko",
|
|
12
|
+
runtimeNodeId: "miko",
|
|
13
|
+
primitiveMouthNodeId: "miko:mouth",
|
|
14
|
+
performanceChannels: ["body", "facial", "gesture", "blocking", "gaze"],
|
|
15
|
+
glbUpgrade: "After assets add, use model(assets.miko) and keep viseme blendshape metadata."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "luma",
|
|
19
|
+
name: "Luma",
|
|
20
|
+
palette: ["#ffe18e", "#40ffbf"],
|
|
21
|
+
primitiveFallback: "small moon-garden helper",
|
|
22
|
+
typedAssetKey: "luma",
|
|
23
|
+
runtimeNodeId: "luma",
|
|
24
|
+
primitiveMouthNodeId: "luma:mouth",
|
|
25
|
+
performanceChannels: ["body", "facial", "gesture", "blocking", "gaze"],
|
|
26
|
+
glbUpgrade: "After assets add, use model(assets.luma) and keep viseme blendshape metadata."
|
|
27
|
+
}
|
|
28
|
+
];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID = "auravoice-aura3d-prompt-animation/v1" as const;
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { compilePromptEpisodePlan, type AuraAssetRef } from "@aura3d/engine";
|
|
2
|
+
import { assets } from "./aura-assets";
|
|
3
|
+
import { AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID } from "./contract";
|
|
4
|
+
|
|
5
|
+
export const episodeContractId = AURAVOICE_AURA3D_PROMPT_ANIMATION_CONTRACT_ID;
|
|
6
|
+
|
|
7
|
+
export type CartoonAssetKey = "miko" | "luma" | "glowBroom" | "glowStones" | "moonLilies";
|
|
8
|
+
|
|
9
|
+
type TypedCartoonAssets = Partial<Record<CartoonAssetKey, AuraAssetRef<"model">>>;
|
|
10
|
+
|
|
11
|
+
const typedCartoonAssets = assets as TypedCartoonAssets;
|
|
12
|
+
|
|
13
|
+
export const requiredCartoonCharacterAssets = ["miko", "luma"] as const;
|
|
14
|
+
export const optionalCartoonPropAssets = ["glowBroom", "glowStones", "moonLilies"] as const;
|
|
15
|
+
export const publicCartoonAssetInstructions = [
|
|
16
|
+
"npx @aura3d/cli@latest assets add ./assets/miko.glb --name miko",
|
|
17
|
+
"npx @aura3d/cli@latest assets add ./assets/luma.glb --name luma",
|
|
18
|
+
"npx @aura3d/cli@latest assets validate-cartoon"
|
|
19
|
+
] as const;
|
|
20
|
+
|
|
21
|
+
export const missingCartoonCharacterAssets = requiredCartoonCharacterAssets.filter((key) => !typedCartoonAssets[key]);
|
|
22
|
+
export const typedCartoonAssetSummary = {
|
|
23
|
+
requiredCharacterAssets: requiredCartoonCharacterAssets,
|
|
24
|
+
optionalPropAssets: optionalCartoonPropAssets,
|
|
25
|
+
typedCharacterAssetCount: requiredCartoonCharacterAssets.length - missingCartoonCharacterAssets.length,
|
|
26
|
+
missingCharacterAssets: missingCartoonCharacterAssets
|
|
27
|
+
} as const;
|
|
28
|
+
|
|
29
|
+
function typedAsset(key: CartoonAssetKey): AuraAssetRef<"model"> | undefined {
|
|
30
|
+
return typedCartoonAssets[key];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const youtubeDraftMetadata = {
|
|
34
|
+
contractId: episodeContractId,
|
|
35
|
+
title: "Moon Garden Cleanup | Aura3D Cartoon Channel",
|
|
36
|
+
description: "Two tiny robots clean a glowing moon garden with soft captions and reduced-flash visuals.",
|
|
37
|
+
tags: ["Aura3D", "kids cartoon", "moon garden", "robots"],
|
|
38
|
+
madeForKids: true,
|
|
39
|
+
thumbnailCaptureTime: 10,
|
|
40
|
+
defaultLanguage: "en",
|
|
41
|
+
privacyStatus: "private"
|
|
42
|
+
} as const;
|
|
43
|
+
|
|
44
|
+
export const episodeAudioCues = [
|
|
45
|
+
{
|
|
46
|
+
id: "music:moon-garden-lullaby",
|
|
47
|
+
role: "music",
|
|
48
|
+
path: "assets/audio/music/moon-garden-lullaby-loop.wav",
|
|
49
|
+
startTime: 0,
|
|
50
|
+
duration: 60,
|
|
51
|
+
gainDb: -18,
|
|
52
|
+
ducking: "under-dialogue"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "ambience:moon-garden-night",
|
|
56
|
+
role: "ambience",
|
|
57
|
+
path: "assets/audio/ambience/moon-garden-night.wav",
|
|
58
|
+
startTime: 0,
|
|
59
|
+
duration: 60,
|
|
60
|
+
gainDb: -22,
|
|
61
|
+
ducking: "none"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "sfx:glow-stone-chime",
|
|
65
|
+
role: "sfx",
|
|
66
|
+
path: "assets/audio/sfx/glow-stone-chime.wav",
|
|
67
|
+
startTime: 38.5,
|
|
68
|
+
duration: 1.25,
|
|
69
|
+
gainDb: -9,
|
|
70
|
+
ducking: "none"
|
|
71
|
+
}
|
|
72
|
+
] as const;
|
|
73
|
+
|
|
74
|
+
export const episodeSampleDescription = {
|
|
75
|
+
contractId: episodeContractId,
|
|
76
|
+
runtimeSeconds: 60,
|
|
77
|
+
shotCount: 3,
|
|
78
|
+
speakingCharacters: ["miko", "luma"],
|
|
79
|
+
captionSource: "captions are derived one-to-one from the AuraVoice dialogue track",
|
|
80
|
+
performanceSource: "body, facial, gesture, blocking, and gaze cues are generated from the cartoon director",
|
|
81
|
+
musicAmbience: ["music:moon-garden-lullaby", "ambience:moon-garden-night"],
|
|
82
|
+
sfxCue: "sfx:glow-stone-chime",
|
|
83
|
+
thumbnailCaptureTime: youtubeDraftMetadata.thumbnailCaptureTime,
|
|
84
|
+
thumbnailSource: "same Aura3D scene state and AuraVoice timestamp as the render queue capture",
|
|
85
|
+
typedAssetSource: "./src/aura-assets",
|
|
86
|
+
requiredTypedAssets: requiredCartoonCharacterAssets,
|
|
87
|
+
missingTypedAssets: missingCartoonCharacterAssets,
|
|
88
|
+
assetCommands: publicCartoonAssetInstructions,
|
|
89
|
+
reviewPackageRequiredPaths: ["video", "captions", "thumbnail", "timeline", "audio-stems", "evidence-json", "youtube-draft-metadata"],
|
|
90
|
+
accessibilityProof: ["captions", "reduced motion", "high contrast"]
|
|
91
|
+
} as const;
|
|
92
|
+
|
|
93
|
+
export const episode = compilePromptEpisodePlan({
|
|
94
|
+
episodeId: "moon-garden-cleanup-001",
|
|
95
|
+
title: "Moon Garden Cleanup",
|
|
96
|
+
prompt: "Two tiny robots clean a glowing moon garden.",
|
|
97
|
+
language: "en",
|
|
98
|
+
runtime: {
|
|
99
|
+
duration: 60,
|
|
100
|
+
frameRate: 30,
|
|
101
|
+
resolution: { width: 1920, height: 1080 },
|
|
102
|
+
aspectRatio: "16:9",
|
|
103
|
+
reducedMotion: true,
|
|
104
|
+
highContrast: true,
|
|
105
|
+
maxTimingDriftFrames: 1
|
|
106
|
+
},
|
|
107
|
+
route: "/",
|
|
108
|
+
characters: [
|
|
109
|
+
{
|
|
110
|
+
id: "miko",
|
|
111
|
+
name: "Miko",
|
|
112
|
+
role: "hero",
|
|
113
|
+
voiceId: "auravoice-miko-soft",
|
|
114
|
+
style: "round cyan robot",
|
|
115
|
+
...(typedAsset("miko") ? { asset: typedAsset("miko") } : {})
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "luma",
|
|
119
|
+
name: "Luma",
|
|
120
|
+
role: "sidekick",
|
|
121
|
+
voiceId: "auravoice-luma-bright",
|
|
122
|
+
style: "small gold garden helper",
|
|
123
|
+
...(typedAsset("luma") ? { asset: typedAsset("luma") } : {})
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
locations: [
|
|
127
|
+
{
|
|
128
|
+
id: "moon-garden",
|
|
129
|
+
name: "Moon Garden",
|
|
130
|
+
description: "A tiny crater garden with glowing pebbles, sleepy flowers, and a blue planet skyline.",
|
|
131
|
+
mood: "soft neon bedtime"
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
props: [
|
|
135
|
+
{
|
|
136
|
+
id: "glow-broom",
|
|
137
|
+
name: "Glow Broom",
|
|
138
|
+
role: "hero-prop",
|
|
139
|
+
description: "A soft crescent broom that sweeps moon dust without sharp motion.",
|
|
140
|
+
ownerCharacterId: "miko",
|
|
141
|
+
locationId: "moon-garden",
|
|
142
|
+
...(typedAsset("glowBroom") ? { asset: typedAsset("glowBroom") } : {}),
|
|
143
|
+
primitiveFallback: "thin rounded cylinder handle with a crescent brush head",
|
|
144
|
+
styleNotes: ["cyan rim light", "oversized safe silhouette"],
|
|
145
|
+
safetyNotes: ["not a weapon", "slow sweeping arcs only"]
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: "glow-stones",
|
|
149
|
+
name: "Glow Stones",
|
|
150
|
+
role: "interactive",
|
|
151
|
+
description: "Small moon pebbles that pulse gently after cleanup.",
|
|
152
|
+
locationId: "moon-garden",
|
|
153
|
+
...(typedAsset("glowStones") ? { asset: typedAsset("glowStones") } : {}),
|
|
154
|
+
primitiveFallback: "small low-poly spheres with bloom",
|
|
155
|
+
styleNotes: ["warm yellow glow", "reduced-flash pulse"],
|
|
156
|
+
safetyNotes: ["no rapid flashing"]
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
id: "moon-lilies",
|
|
160
|
+
name: "Moon Lilies",
|
|
161
|
+
role: "set-dressing",
|
|
162
|
+
description: "Sleepy flowers that brighten when the garden is clean.",
|
|
163
|
+
locationId: "moon-garden",
|
|
164
|
+
...(typedAsset("moonLilies") ? { asset: typedAsset("moonLilies") } : {}),
|
|
165
|
+
primitiveFallback: "rounded petal cards around tiny stems",
|
|
166
|
+
styleNotes: ["soft white petals", "blue shadow edges"]
|
|
167
|
+
}
|
|
168
|
+
],
|
|
169
|
+
styleGuide: {
|
|
170
|
+
visualStyle: "rounded bedtime sci-fi cartoon with toy-like robot silhouettes",
|
|
171
|
+
palette: ["#081b2a", "#7de2ff", "#ffe18e", "#40ffbf", "#f8fff2"],
|
|
172
|
+
shapeLanguage: "circles, capsules, crescent props, and chunky moon-garden forms",
|
|
173
|
+
lighting: "soft blue night key, warm prop glows, no hard flashes",
|
|
174
|
+
cameraLanguage: "wide establishing shot, medium teamwork shot, gentle final push-in, cuts only at shot boundaries",
|
|
175
|
+
motionRules: [
|
|
176
|
+
"Keep brooms, waves, and glow pulses reduced-motion safe.",
|
|
177
|
+
"Mouth cards and GLB blendshapes sample AuraVoice visemes at the same frame rate as captions.",
|
|
178
|
+
"Do not change storyboard, shot, line, caption, or character ids during dubbing."
|
|
179
|
+
],
|
|
180
|
+
captionStyle: "bottom-center high-contrast rounded plate with line-safe captions",
|
|
181
|
+
continuityRules: [
|
|
182
|
+
"Miko stays cyan on screen-left unless shot blocking explicitly moves them.",
|
|
183
|
+
"Luma stays warm gold on screen-right unless shot blocking explicitly moves them.",
|
|
184
|
+
"Glow stones brighten only after the teamwork shot begins."
|
|
185
|
+
]
|
|
186
|
+
},
|
|
187
|
+
continuityRules: [
|
|
188
|
+
"Story bible ids, shot ids, caption ids, and AuraVoice line ids stay stable across language dubs.",
|
|
189
|
+
"Props can upgrade to typed GLBs only through generated ./aura-assets imports."
|
|
190
|
+
],
|
|
191
|
+
safety: {
|
|
192
|
+
childSafe: true,
|
|
193
|
+
captionRequired: true,
|
|
194
|
+
reducedMotionDefault: true,
|
|
195
|
+
highContrastDefault: true,
|
|
196
|
+
flashing: "reduced"
|
|
197
|
+
},
|
|
198
|
+
beats: [
|
|
199
|
+
{
|
|
200
|
+
id: "beat-open",
|
|
201
|
+
sceneId: "storyboard-moon-garden",
|
|
202
|
+
shotId: "shot-moon-garden-open",
|
|
203
|
+
locationId: "moon-garden",
|
|
204
|
+
summary: "Miko notices moon dust dimming the garden lights.",
|
|
205
|
+
visualIntent: "Wide moon-garden reveal with two robot silhouettes and readable bottom captions.",
|
|
206
|
+
duration: 20,
|
|
207
|
+
characters: ["miko", "luma"],
|
|
208
|
+
props: ["moon-lilies", "glow-stones"],
|
|
209
|
+
gestureByCharacterId: { miko: "gentle-point", luma: "soft-nod" },
|
|
210
|
+
blockingByCharacterId: {
|
|
211
|
+
miko: { position: [-0.8, 0.75, 0], layer: "midground" },
|
|
212
|
+
luma: { position: [0.8, 0.72, 0], layer: "midground" }
|
|
213
|
+
},
|
|
214
|
+
dialogue: [
|
|
215
|
+
{
|
|
216
|
+
speakerId: "miko",
|
|
217
|
+
text: "Luma, the moon lilies are losing their sparkle.",
|
|
218
|
+
emotion: "concerned",
|
|
219
|
+
delivery: "natural",
|
|
220
|
+
audioFile: "assets/audio/en/shot-moon-garden-open-line-1.wav"
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
speakerId: "luma",
|
|
224
|
+
text: "Then we sweep softly and wake the glow stones.",
|
|
225
|
+
emotion: "happy",
|
|
226
|
+
delivery: "slow",
|
|
227
|
+
audioFile: "assets/audio/en/shot-moon-garden-open-line-2.wav"
|
|
228
|
+
}
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: "beat-teamwork",
|
|
233
|
+
sceneId: "storyboard-moon-garden",
|
|
234
|
+
shotId: "shot-glow-stone-teamwork",
|
|
235
|
+
locationId: "moon-garden",
|
|
236
|
+
summary: "The robots clean in rhythm while the glow stones pulse back on.",
|
|
237
|
+
visualIntent: "Medium two-shot with gentle broom arcs, stable character ids, and no flashing.",
|
|
238
|
+
duration: 22,
|
|
239
|
+
characters: ["miko", "luma"],
|
|
240
|
+
props: ["glow-broom", "glow-stones"],
|
|
241
|
+
gestureByCharacterId: { miko: "curious-lean", luma: "small-wave" },
|
|
242
|
+
blockingByCharacterId: {
|
|
243
|
+
miko: { position: [-0.55, 0.75, 0.05], layer: "foreground" },
|
|
244
|
+
luma: { position: [0.62, 0.72, -0.02], layer: "foreground" }
|
|
245
|
+
},
|
|
246
|
+
dialogue: [
|
|
247
|
+
{
|
|
248
|
+
speakerId: "miko",
|
|
249
|
+
text: "I will polish the blue stones one tiny circle at a time.",
|
|
250
|
+
emotion: "curious",
|
|
251
|
+
delivery: "natural",
|
|
252
|
+
audioFile: "assets/audio/en/shot-glow-stone-teamwork-line-1.wav"
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
speakerId: "luma",
|
|
256
|
+
text: "And I will hum the garden's sleepy cleanup song.",
|
|
257
|
+
emotion: "happy",
|
|
258
|
+
delivery: "sing-song",
|
|
259
|
+
audioFile: "assets/audio/en/shot-glow-stone-teamwork-line-2.wav"
|
|
260
|
+
}
|
|
261
|
+
]
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
id: "beat-finish",
|
|
265
|
+
sceneId: "storyboard-moon-garden",
|
|
266
|
+
shotId: "shot-moon-garden-finish",
|
|
267
|
+
locationId: "moon-garden",
|
|
268
|
+
summary: "The moon garden glows again and the robots wave goodnight.",
|
|
269
|
+
visualIntent: "Soft push-in to a finished garden, thumbnail-safe framing, and final caption hold.",
|
|
270
|
+
duration: 18,
|
|
271
|
+
characters: ["miko", "luma"],
|
|
272
|
+
props: ["moon-lilies", "glow-stones"],
|
|
273
|
+
gestureByCharacterId: { miko: "small-wave", luma: "two-hand-wave" },
|
|
274
|
+
blockingByCharacterId: {
|
|
275
|
+
miko: { position: [-0.65, 0.75, 0], layer: "midground" },
|
|
276
|
+
luma: { position: [0.68, 0.72, 0], layer: "midground" }
|
|
277
|
+
},
|
|
278
|
+
dialogue: [
|
|
279
|
+
{
|
|
280
|
+
speakerId: "luma",
|
|
281
|
+
text: "The moon lilies are twinkling again.",
|
|
282
|
+
emotion: "excited",
|
|
283
|
+
delivery: "natural",
|
|
284
|
+
audioFile: "assets/audio/en/shot-moon-garden-finish-line-1.wav"
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
speakerId: "miko",
|
|
288
|
+
text: "Goodnight, little garden. Keep glowing.",
|
|
289
|
+
emotion: "happy",
|
|
290
|
+
delivery: "slow",
|
|
291
|
+
audioFile: "assets/audio/en/shot-moon-garden-finish-line-2.wav"
|
|
292
|
+
}
|
|
293
|
+
]
|
|
294
|
+
}
|
|
295
|
+
],
|
|
296
|
+
generatedAt: "2026-06-03T00:00:00.000Z"
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
export const storyBible = episode.storyBible;
|
|
300
|
+
export const shotList = storyBible.shotList;
|