@aura3d/cli 5.0.3 → 5.1.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/data/aura.exports.json +20 -0
- package/dist/commands/registry.d.ts +1 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +1 -0
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/verify/index.d.ts +2 -0
- package/dist/commands/verify/index.d.ts.map +1 -0
- package/dist/commands/verify/index.js +11 -0
- package/dist/commands/verify/index.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/look-hdri-check.d.ts +7 -0
- package/dist/look-hdri-check.d.ts.map +1 -0
- package/dist/look-hdri-check.js +88 -0
- package/dist/look-hdri-check.js.map +1 -0
- package/dist/verify/cdp.d.ts +69 -0
- package/dist/verify/cdp.d.ts.map +1 -0
- package/dist/verify/cdp.js +223 -0
- package/dist/verify/cdp.js.map +1 -0
- package/dist/verify/codes.d.ts +17 -0
- package/dist/verify/codes.d.ts.map +1 -0
- package/dist/verify/codes.js +64 -0
- package/dist/verify/codes.js.map +1 -0
- package/dist/verify/command.d.ts +12 -0
- package/dist/verify/command.d.ts.map +1 -0
- package/dist/verify/command.js +101 -0
- package/dist/verify/command.js.map +1 -0
- package/dist/verify/frame.d.ts +46 -0
- package/dist/verify/frame.d.ts.map +1 -0
- package/dist/verify/frame.js +190 -0
- package/dist/verify/frame.js.map +1 -0
- package/dist/verify/index.d.ts +7 -0
- package/dist/verify/index.d.ts.map +1 -0
- package/dist/verify/index.js +7 -0
- package/dist/verify/index.js.map +1 -0
- package/dist/verify/lint.d.ts +43 -0
- package/dist/verify/lint.d.ts.map +1 -0
- package/dist/verify/lint.js +548 -0
- package/dist/verify/lint.js.map +1 -0
- package/dist/verify/run.d.ts +90 -0
- package/dist/verify/run.d.ts.map +1 -0
- package/dist/verify/run.js +317 -0
- package/dist/verify/run.js.map +1 -0
- package/package.json +6 -6
- package/skills/agent-docs/api-signatures.md +27 -4
- package/skills/agent-docs/recipes.md +1 -0
- package/skills/agent-files/AGENTS.md +1 -1
- package/skills/aura3d-materials-environments/SKILL.md +1 -1
- package/skills/aura3d-materials-environments/references/visual-helpers.md +20 -0
- package/skills/llms.txt +158 -29
package/skills/llms.txt
CHANGED
|
@@ -1,39 +1,170 @@
|
|
|
1
1
|
# Aura3D
|
|
2
2
|
|
|
3
|
-
> Aura3D 5.0
|
|
3
|
+
> Aura3D 5.1.0: a TypeScript SDK for browser 3D apps and games. You write a typed, declarative scene with `@aura3d/engine`; the `@aura3d/cli` toolchain handles typed GLB/glTF assets, checks and deploy gates. Built to be driven by AI coding agents. Site: https://aura3d.auraone.ai
|
|
4
|
+
|
|
5
|
+
## First screen: Aura3D patterns (copy the shape, change the subject)
|
|
6
|
+
|
|
7
|
+
`@aura3d/engine` is installed; never open `node_modules` or `dist`. Blocks are typechecked, GPU-rendered patterns, not finished scenes: change subject and numbers; typecheck once. `createAuraApp(selector, { scene })` owns renderer, resize and loop. Vectors `[x, y, z]`, colours CSS strings, primitives are unit shapes scaled by `size`. Per frame `app.onFrame((f) => ...)` gives `f.dt`, `f.time` in seconds. To change a node later give it `.runtime({ id, mutable: true })`, then `app.nodes.require(id).setPosition(x, y, z)`.
|
|
8
|
+
|
|
9
|
+
### Scene skeleton: look, subject, camera, per-frame update
|
|
10
|
+
```ts render=animated
|
|
11
|
+
import { camera, createAuraApp, looks, material, primitives, scene } from "@aura3d/engine";
|
|
12
|
+
const app = createAuraApp("#app", {
|
|
13
|
+
scene: scene().add(looks.preset("product-studio", { exposureEv: -1.2 }))
|
|
14
|
+
.add(primitives.sphere({ name: "orb", size: 1.6, material: material.pbr({ color: "#d9534f", roughness: 0.4 }) }).position(0, 0.8, 0).runtime({ id: "orb", mutable: true }))
|
|
15
|
+
.camera(camera.orbit({ position: [3, 2.5, 5], target: [0, 1, 0], fov: 40 })),
|
|
16
|
+
...looks.appOptions("product-studio")
|
|
17
|
+
});
|
|
18
|
+
app.onFrame((f) => app.nodes.require("orb").setPosition(0, 0.8 + 0.9 * Math.abs(Math.sin(f.time * 1.7)), 0));
|
|
19
|
+
await app.ready();
|
|
20
|
+
```
|
|
21
|
+
Gotchas: a look brings light, shadow, fog, sky and grade; spread `looks.appOptions(id)` with it (`outdoor-day`, `night-city`, `golden-hour`, `overcast`, `space`). `camera.perspective` is fixed, `camera.orbit` adds drag. Bright looks wash out: `looks.preset(id, { exposureEv: -1 })`. Colours are `#rrggbb`, `rgb()` or names: `hsl()` strings are not parsed. Hand-built light needs `environments.neutral({ intensity: 0.6, background: false })` beside `lights.directional({ position, target, intensity: 3, shadow: true })`, else the frame is flat and dark and metals reflect nothing; `primitives.plane` size is `[w, 1, d]`. Glow: `effects.bloom({ intensity: 0.5, threshold: 0.8, radius: 0.5 })`.
|
|
22
|
+
|
|
23
|
+
### Instancing: many copies, one draw, updated live
|
|
24
|
+
```ts render=animated
|
|
25
|
+
import { camera, createAuraApp, looks, material, instances, scene, type AuraTransformSpec } from "@aura3d/engine";
|
|
26
|
+
const PAL = ["#e4572e", "#f3a712", "#a8c686", "#29a0b1", "#669bbc", "#9a5fb4"];
|
|
27
|
+
const N = 12, at = (i: number, t: number): AuraTransformSpec => {
|
|
28
|
+
const x = (i % N) - 6, z = Math.floor(i / N) - 6, h = 0.7 + 0.5 * Math.sin(t + Math.hypot(x, z));
|
|
29
|
+
return { position: [x, h / 2, z], scale: [0.8, h, 0.8] };
|
|
30
|
+
};
|
|
31
|
+
const cells = Array.from({ length: N * N }, (_, i) => at(i, 0));
|
|
32
|
+
const colors = cells.map((_, i) => PAL[(i % N + Math.floor(i / N)) % 6]!);
|
|
33
|
+
const app = createAuraApp("#app", {
|
|
34
|
+
scene: scene().add(looks.preset("outdoor-day", { exposureEv: -1 }))
|
|
35
|
+
.add(instances.box({ name: "tiles", transforms: cells, colors, material: material.pbr({ color: "#ffffff" }) }).runtime({ id: "tiles", mutable: true }))
|
|
36
|
+
.camera(camera.orbit({ position: [10, 9, 12], target: [0, 0, 0], fov: 40 })),
|
|
37
|
+
...looks.appOptions("outdoor-day")
|
|
38
|
+
});
|
|
39
|
+
app.onFrame((f) => app.nodes.require("tiles").setInstances(cells.map((_, i) => at(i, f.time * 1.3)), colors));
|
|
40
|
+
```
|
|
41
|
+
Gotchas: `instances.box|sphere|cylinder|cone|model`; `setInstances(transforms, colors)` animates, thousands are fine; pass the colours every call or they reset to the base colour.
|
|
42
|
+
|
|
43
|
+
### Custom shader: your own time uniform
|
|
44
|
+
```ts render=animated
|
|
45
|
+
import { camera, createAuraApp, material, primitives, scene } from "@aura3d/engine";
|
|
46
|
+
const plasma = material.custom({
|
|
47
|
+
glsl: {
|
|
48
|
+
vertex: `out vec3 vP; void main() { vP = position; gl_Position = modelViewProjectionMatrix * vec4(position, 1.0); }`,
|
|
49
|
+
fragment: `in vec3 vP; out vec4 outColor;
|
|
50
|
+
void main() {
|
|
51
|
+
float w = sin(vP.x * 9.0 + clk) + sin(vP.y * 11.0 - clk * 1.3);
|
|
52
|
+
outColor = vec4(0.5 + 0.5 * cos(w + vec3(0.0, 2.1, 4.2)), 1.0);
|
|
53
|
+
}`
|
|
54
|
+
},
|
|
55
|
+
uniforms: { clk: { type: "f32", value: 0 } }
|
|
56
|
+
});
|
|
57
|
+
const app = createAuraApp("#app", {
|
|
58
|
+
scene: scene({ background: "#0b0d14" }).add(primitives.sphere({ name: "blob", size: 2, material: plasma }).runtime({ id: "blob", mutable: true }))
|
|
59
|
+
.camera(camera.perspective({ position: [0, 0.4, 4], target: [0, 0, 0], fov: 40 }))
|
|
60
|
+
});
|
|
61
|
+
app.onFrame((f) => app.nodes.require("blob").setUniform?.("clk", f.time));
|
|
62
|
+
```
|
|
63
|
+
Gotchas: GLSL 3.00 (`in`/`out`, declare your own `out vec4 outColor`). Prelude, never declare: `position normal uv modelViewProjectionMatrix modelMatrix cameraPosition`. On 5.0.x `uTime` does not advance by itself: declare a uniform and push it with `setUniform` every frame on a `.runtime({ id, mutable: true })` node, or the shader is frozen. A compile error logs `CUSTOM_SHADER_COMPILE_FAILED` and skips the draw.
|
|
64
|
+
|
|
65
|
+
### Procedural geometry: revolve a profile
|
|
66
|
+
```ts render=static
|
|
67
|
+
import { camera, createAuraApp, geometry, looks, material, scene } from "@aura3d/engine";
|
|
68
|
+
const R = 32, S = 20, positions = new Float32Array((R + 1) * (S + 1) * 3), indices: number[] = [];
|
|
69
|
+
for (let j = 0; j <= S; j += 1) for (let i = 0; i <= R; i += 1) {
|
|
70
|
+
const y = j / S, r = 0.35 + 0.25 * Math.sin(y * Math.PI) , a = (i / R) * Math.PI * 2;
|
|
71
|
+
positions.set([Math.cos(a) * r, y * 1.6, Math.sin(a) * r], (j * (R + 1) + i) * 3);
|
|
72
|
+
if (i < R && j < S) { const v = j * (R + 1) + i; indices.push(v, v + 1, v + R + 1, v + 1, v + R + 2, v + R + 1); }
|
|
73
|
+
}
|
|
74
|
+
const geo = geometry.define({ positions, normals: geometry.computeNormals({ positions, indices }), indices, bounds: { min: [-0.7, 0, -0.7], max: [0.7, 1.6, 0.7] } });
|
|
75
|
+
createAuraApp("#app", {
|
|
76
|
+
scene: scene().add(looks.preset("product-studio", { exposureEv: -1.2 }))
|
|
77
|
+
.add(geometry.custom(geo, { name: "vase", material: material.pbr({ color: "#c58b5a", roughness: 0.5 }) }))
|
|
78
|
+
.camera(camera.orbit({ position: [2.4, 1.6, 2.8], target: [0, 0.8, 0], fov: 38 })),
|
|
79
|
+
...looks.appOptions("product-studio")
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
Gotchas: `geometry.define({ positions, normals, indices, bounds, colors?, uvs? })` takes typed arrays, `indices: number[]` and `bounds`. Counter-clockwise triangles face out.
|
|
83
|
+
|
|
84
|
+
### Rigged model: clips and crossfade
|
|
85
|
+
```ts render=asset:animated
|
|
86
|
+
import { camera, createAuraApp, defineModelAssets, looks, scene } from "@aura3d/engine";
|
|
87
|
+
const assets = defineModelAssets(
|
|
88
|
+
{ hero: { url: "/assets/hero.glb", sha256: "<64 hex of the file>", animations: ["Idle", "Walking"], license: "fixture" } },
|
|
89
|
+
{ queryParam: null }
|
|
90
|
+
);
|
|
91
|
+
const app = createAuraApp("#app", {
|
|
92
|
+
scene: scene().add(looks.preset("character-showcase"))
|
|
93
|
+
.add(assets.node("hero", { name: "hero", targetHeight: 1.8 }).animate({ clip: "Idle", loop: true }).runtime({ id: "hero" }))
|
|
94
|
+
.camera(camera.perspective({ position: [0, 1.3, 4.5], target: [0, 0.9, 0], fov: 40 })),
|
|
95
|
+
...looks.appOptions("character-showcase")
|
|
96
|
+
});
|
|
97
|
+
window.addEventListener("keydown", () => app.nodes.require("hero").play("Walking", { loop: true, crossFade: 0.4 }));
|
|
98
|
+
await app.ready();
|
|
99
|
+
```
|
|
100
|
+
Gotchas: clip names come from the file (`npx @aura3d/cli@latest assets inspect <file> --animation`). In a CLI project use `model(assets.hero)` after `assets resolve`. One skinned body per character: never animate primitives beside it.
|
|
101
|
+
|
|
102
|
+
### Game loop and input: fixed step, actions
|
|
103
|
+
```ts render=animated
|
|
104
|
+
import { camera, createAuraApp, createFixedStepLoop, looks, material, primitives, scene } from "@aura3d/engine";
|
|
105
|
+
const app = createAuraApp("#app", {
|
|
106
|
+
scene: scene().add(looks.preset("arena-fight"))
|
|
107
|
+
.add(primitives.box({ name: "player", size: 1.4, material: material.pbr({ color: "#4aa3ff" }) }).position(0, 0.7, 0).runtime({ id: "player", mutable: true }))
|
|
108
|
+
.add(primitives.plane({ name: "floor", size: [14, 1, 14], material: material.pbr({ color: "#3b4350" }) }))
|
|
109
|
+
.camera(camera.perspective({ position: [0, 4, 6], target: [0, 0.5, 0], fov: 45 })),
|
|
110
|
+
...looks.appOptions("arena-fight")
|
|
111
|
+
});
|
|
112
|
+
const input = app.input({ actions: { left: ["ArrowLeft", "KeyA"], right: ["ArrowRight", "KeyD"] } });
|
|
113
|
+
const state = { x: 0, t: 0 };
|
|
114
|
+
createFixedStepLoop({ stepSeconds: 1 / 60, step: (dt) => {
|
|
115
|
+
input.update(dt); state.t += dt;
|
|
116
|
+
state.x += ((input.held("right") ? 1 : 0) - (input.held("left") ? 1 : 0)) * 4 * dt;
|
|
117
|
+
}, render: () => app.nodes.require("player").setPosition(state.x, 0.7, 0).setRotation(0, state.t * 3, 0) }).start();
|
|
118
|
+
await app.ready();
|
|
119
|
+
```
|
|
120
|
+
Gotchas: simulate in `step` (no `Date.now`, no `Math.random`), copy state to nodes in `render`. Restart by resetting state and nodes, not `app.setScene`. Full games (`createGame`: pause, touch, results): `docs/agents/build-a-game.md`.
|
|
121
|
+
|
|
122
|
+
### Physics: bound bodies stepped in onFrame
|
|
123
|
+
```ts render=animated
|
|
124
|
+
import { camera, createAuraApp, looks, material, primitives, scene } from "@aura3d/engine";
|
|
125
|
+
const balls = Array.from({ length: 4 }, (_, i) => primitives.sphere({ name: `b${i}`, size: 0.5, material: material.pbr({ color: ["#e4572e", "#f3a712", "#29a0b1", "#9a5fb4"][i]! }) })
|
|
126
|
+
.position((i % 3) * 0.3 - 0.3, 2 + i * 1.2, (i % 2) * 0.2).runtime({ id: `b${i}`, mutable: true })
|
|
127
|
+
.physics({ type: "dynamic", shape: "sphere", radius: 0.25, mass: 1, restitution: 0.5 }));
|
|
128
|
+
const app = createAuraApp("#app", {
|
|
129
|
+
scene: balls.reduce((s, b) => s.add(b), scene().add(looks.preset("outdoor-day", { exposureEv: -1 }))
|
|
130
|
+
.add(primitives.box({ name: "floor", size: [6, 0.2, 6], material: material.pbr({ color: "#7a8470" }) }).runtime({ id: "floor" }).physics({ type: "static", shape: "box", halfExtents: [3, 0.1, 3] })))
|
|
131
|
+
.camera(camera.perspective({ position: [4, 3, 6], target: [0, 1.5, 0], fov: 40 })),
|
|
132
|
+
physics: { bindNodes: true }, ...looks.appOptions("outdoor-day")
|
|
133
|
+
});
|
|
134
|
+
app.onFrame((f) => { app.physics.step(f.dt); });
|
|
135
|
+
await app.ready();
|
|
136
|
+
```
|
|
137
|
+
Gotchas: needs the optional peer `@dimforge/rapier3d-compat` installed (scaffolds have it), else the page throws. Pass `physics: { bindNodes: true }`, give each body `.runtime({ id })`, call `app.physics.step(dt)` once per frame. Colliders take radius or half extents, not the primitive `size`.
|
|
138
|
+
|
|
139
|
+
### Particles: built-in sprites, no art needed
|
|
140
|
+
```ts render=animated
|
|
141
|
+
import { camera, createAuraApp, effects, environments, material, primitives, scene } from "@aura3d/engine";
|
|
142
|
+
createAuraApp("#app", {
|
|
143
|
+
scene: scene({ background: "#080b14" }).add(environments.neutral({ intensity: 0.2, background: false }))
|
|
144
|
+
.add(primitives.plane({ name: "ground", size: [12, 1, 12], material: material.pbr({ color: "#242a36", roughness: 1 }) }))
|
|
145
|
+
.add(effects.particles({ name: "fountain", position: [0, 0.2, 0], rate: 90, maxParticles: 400, lifetime: [1.2, 1.8], speed: [3, 4.5], size: [0.12, 0.22], gravity: 6, drag: 0.1, blend: "additive", seed: 7, color: "#6fc8ff" }))
|
|
146
|
+
.camera(camera.perspective({ position: [0, 2.5, 6], target: [0, 1.5, 0], fov: 42 }))
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
Gotchas: `blend: "additive"` for glow, `"alpha"` for smoke; also `sprite`. Weather: `effects.rain()`, `effects.snow()`.
|
|
150
|
+
|
|
151
|
+
### Assets and find more
|
|
152
|
+
A real object named in the task: `npx @aura3d/cli@latest assets resolve "<object>" --name robot`, then `model(assets.robot)` from `./src/aura-assets`. Never invent paths or ids; a route-local `new URL(..., import.meta.url)` model URL draws black (use `/aura-assets/<file>`). No match: build it procedurally from the patterns above. Exact signatures for `lights`, `material`, `environments`, `sky`, `effects`: `docs/agents/api-signatures.md`. Complete scenes (forest, water, terrain, robot, props, sky, fire, night street): `docs/agents/recipes.md`. Setters `setUniform`, `setLight`, `app.atmosphere` are optional: use `?.`.
|
|
4
153
|
|
|
5
154
|
## Read first
|
|
6
155
|
|
|
7
|
-
1. Coming from three.js? `docs/agents/threejs-to-aura3d.md` maps each three.js idiom to the Aura3D line (every line type-checked)
|
|
8
|
-
2. No model admitted yet? Build it procedurally from `primitives.*`, `geometry.define`, `instances.*`, `material.*` and `environments.neutral`. Eight complete scenes
|
|
9
|
-
3. Do not open `node_modules` or `dist` to find an API: signatures are in `docs/agents/api-signatures.md`.
|
|
156
|
+
1. Coming from three.js? `docs/agents/threejs-to-aura3d.md` maps each three.js idiom to the Aura3D line (every line type-checked). Do not port renderer, resize, loop or disposal code: `createAuraApp` owns them.
|
|
157
|
+
2. No model admitted yet? Build it procedurally from `primitives.*`, `geometry.define`, `instances.*`, `material.*` and `environments.neutral`. Eight complete scenes are `docs/agents/recipes.md` recipes 8 to 15 (sources in `docs/agents/recipes-src/`).
|
|
10
158
|
|
|
11
|
-
##
|
|
159
|
+
## More pitfalls
|
|
12
160
|
|
|
13
|
-
-
|
|
14
|
-
- Colour applied twice: instance `colors` multiply the material colour. Use a `#ffffff` base material when you pass `colors`.
|
|
15
|
-
- Moving a node: give it `.runtime({ id, mutable: true })` at build time, then `app.nodes.require(id).setPosition(...)`. Without the runtime id `require` throws.
|
|
16
|
-
- Do not invent asset paths or ids: `npx @aura3d/cli@latest assets resolve "<object>" --name <name>`, then `model(assets.<name>)`.
|
|
17
|
-
- Black frame with an admitted model: a route-local URL built with `new URL(..., import.meta.url)` is absolute and blocked as unsafe-url. Use `/aura-assets/<file>`, the file under the app's `public/aura-assets/`, and list it in `aura.assets.json`.
|
|
18
|
-
- Custom shader: the prelude names are `position`, `normal`, `uv`, `modelViewProjectionMatrix`, `modelMatrix`, `cameraPosition`, `uTime` (wall-clock seconds; it only advances while the app redraws every frame, so give the shader node `.runtime({ id, mutable: true })` or register an `app.onFrame(...)`, otherwise a static scene draws one frame and the shader looks frozen). A compile error logs `CUSTOM_SHADER_COMPILE_FAILED` and that draw is skipped silently.
|
|
19
|
-
- One skinned body per character: never animate primitives beside a skinned mesh (double-framed skeleton, a ghosted limb).
|
|
161
|
+
- `looks.preset(id)` loads `/hdri/<file>.hdr` from `public/hdri/` (scaffolds ship it); if the file is missing the scene gets a procedural probe and `LOOK_HDRI_MISSING` in `app.diagnostics().warnings`. Colours accept any CSS form (`hsl()`, `rgb()`, names, `#rgb`); an invalid one throws `COLOR_INVALID`.
|
|
20
162
|
- Pools (bullets, traffic, particles) must be sized from the simulation's measured peak, or objects pop in and out.
|
|
21
163
|
- Judge steady state: the first frame is lit differently from the baked probe seconds later. Capture at 3, 25 and 60 s; animated scenes flip between captures, so compare static bands before reverting anything.
|
|
22
164
|
|
|
23
165
|
## Fast path (read this first)
|
|
24
166
|
|
|
25
|
-
Why pick it over three.js:
|
|
26
|
-
|
|
27
|
-
- A lit, shadowed, framed product with orbit controls is 10 lines of Aura3D; the matched three.js app is 38 lines before orbit controls (`evidence/vs-threejs/tagline-check/`). In a benchmark of five small scenes written by one author, counted in lines of scene code, Aura3D scene code is up to 51% shorter in 4 of 5 scenes, and a PBR viewer is 24 lines instead of 49 with 1 import instead of 8 (`evidence/vs-threejs/RESULTS.md`).
|
|
28
|
-
- Every model is typed, hashed and licensed, and in production an unverified model does not draw. The HUD, touch, audio cues, fixed-step loop, seeded replay and safety net ship in the box. `aura3d migrate three` maps 245 three.js constructs.
|
|
29
|
-
|
|
30
|
-
What it is, in five lines:
|
|
31
|
-
|
|
32
|
-
- `@aura3d/engine` exports `createAuraApp(selector, { scene, ...looks.appOptions(id) })` and typed nodes (`scene`, `model`, `looks`, `lights`, `camera`, `effects`, `interactions`, `primitives`, `instances`, `game`).
|
|
33
|
-
- Every scene starts from a `looks.preset(...)`, which supplies light, shadow, fog, background and grade together.
|
|
34
|
-
- Models come from generated typed assets (`model(assets.robot)`), never raw URLs.
|
|
35
|
-
- A game kit, QA/replay hooks, a runtime safety net and an audio synth ship as published subpaths (see Kits).
|
|
36
|
-
- `@aura3d/cli` searches and admits assets (including Meshy generation), checks routes and deploys.
|
|
167
|
+
Why pick it over three.js: Aura3D is a standalone TypeScript engine with its own renderer, so lighting, asset pipeline, game kit and deploy checks are built in, and every model is typed, hashed and licensed. Comparison numbers: `evidence/vs-threejs/RESULTS.md` only.
|
|
37
168
|
|
|
38
169
|
Five commands to a running scene:
|
|
39
170
|
|
|
@@ -45,9 +176,9 @@ npx @aura3d/cli@latest assets resolve "robot" --name robot # then use model(as
|
|
|
45
176
|
npm run build && npx @aura3d/cli@latest check-deploy --dist dist
|
|
46
177
|
```
|
|
47
178
|
|
|
48
|
-
Other templates: `product-viewer` (default), `cinematic-scene`, `racing-starter`, `falling-blocks-starter`, `fighting-game`, `character-controller`, `arena-shooter
|
|
179
|
+
Other templates: `product-viewer` (default), `cinematic-scene`, `racing-starter`, `falling-blocks-starter`, `fighting-game`, `character-controller`, `arena-shooter` (`npx create-aura3d@latest --help`).
|
|
49
180
|
|
|
50
|
-
Read next, in this order: `docs/agents/README.md` (index), `docs/agents/agent-quickstart.md` (first scene, step by step), `docs/agents/recipes.md` (copy-and-adapt scenes: PBR cube with orbit, forest of instances, skinned character with crossfade, fixed-step game loop, custom shader on a grid), `docs/agents/claims-and-boundaries.md` (what you may claim).
|
|
181
|
+
Read next, in this order: `docs/agents/README.md` (index), `docs/agents/agent-quickstart.md` (first scene, step by step), `docs/agents/recipes.md` (copy-and-adapt scenes: PBR cube with orbit, forest of instances, skinned character with crossfade, fixed-step game loop, custom shader on a grid), `docs/agents/claims-and-boundaries.md` (what you may claim). Building a game: read `docs/agents/new-game-checklist.md` and `docs/agents/lessons-learned.md` first, then run `node tools/game-checks/run.mjs <game-slug>`.
|
|
51
182
|
|
|
52
183
|
Working inside the Aura3D monorepo itself: run browsers, Playwright and heavy builds on the remote runner (`tools/remote-acr/run.sh`), never local Docker or local Playwright.
|
|
53
184
|
|
|
@@ -92,9 +223,7 @@ Pick the look first, then tune. Palette and atmosphere cues per genre:
|
|
|
92
223
|
| night city | `night-city` | tele, fov 35 | sodium, neon + cyan; fog 15 to 90 m |
|
|
93
224
|
| cinematic | `polar-night` | dolly, fov 35 | aurora, snow + lantern; sky glow |
|
|
94
225
|
|
|
95
|
-
## three.js
|
|
96
|
-
|
|
97
|
-
See `docs/agents/threejs-to-aura3d.md` (first stop above).
|
|
226
|
+
## Porting three.js
|
|
98
227
|
|
|
99
228
|
Porting existing three.js code: `aura3d migrate three` and the `aura3d-threejs-migration` skill record every approximation; the codemod is not a drop-in claim.
|
|
100
229
|
|