@aura3d/cli 3.0.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/admission/artDirection.d.ts +28 -0
- package/dist/admission/artDirection.d.ts.map +1 -0
- package/dist/admission/artDirection.js +47 -0
- package/dist/admission/artDirection.js.map +1 -0
- package/dist/admission/audio.d.ts +19 -0
- package/dist/admission/audio.d.ts.map +1 -0
- package/dist/admission/audio.js +31 -0
- package/dist/admission/audio.js.map +1 -0
- package/dist/admission/builder-patterns.d.ts +25 -0
- package/dist/admission/builder-patterns.d.ts.map +1 -0
- package/dist/admission/builder-patterns.js +40 -0
- package/dist/admission/builder-patterns.js.map +1 -0
- package/dist/admission/gates.d.ts +136 -0
- package/dist/admission/gates.d.ts.map +1 -0
- package/dist/admission/gates.js +335 -0
- package/dist/admission/gates.js.map +1 -0
- package/dist/admission/glb.d.ts +64 -0
- package/dist/admission/glb.d.ts.map +1 -0
- package/dist/admission/glb.js +128 -0
- package/dist/admission/glb.js.map +1 -0
- package/dist/admission/index.d.ts +8 -0
- package/dist/admission/index.d.ts.map +1 -0
- package/dist/admission/index.js +8 -0
- package/dist/admission/index.js.map +1 -0
- package/dist/admission/profiles.d.ts +52 -0
- package/dist/admission/profiles.d.ts.map +1 -0
- package/dist/admission/profiles.js +91 -0
- package/dist/admission/profiles.js.map +1 -0
- package/dist/admission/qrFlags.d.ts +12 -0
- package/dist/admission/qrFlags.d.ts.map +1 -0
- package/dist/admission/qrFlags.js +48 -0
- package/dist/admission/qrFlags.js.map +1 -0
- package/dist/admission/routeGates.d.ts +36 -0
- package/dist/admission/routeGates.d.ts.map +1 -0
- package/dist/admission/routeGates.js +144 -0
- package/dist/admission/routeGates.js.map +1 -0
- package/dist/admission/texel.d.ts +50 -0
- package/dist/admission/texel.d.ts.map +1 -0
- package/dist/admission/texel.js +177 -0
- package/dist/admission/texel.js.map +1 -0
- package/dist/admission/textureStats.d.ts +45 -0
- package/dist/admission/textureStats.d.ts.map +1 -0
- package/dist/admission/textureStats.js +201 -0
- package/dist/admission/textureStats.js.map +1 -0
- package/dist/animation-asset-validator.d.ts +44 -0
- package/dist/animation-asset-validator.d.ts.map +1 -1
- package/dist/animation-asset-validator.js +80 -1
- package/dist/animation-asset-validator.js.map +1 -1
- package/dist/asset-core-types.d.ts +99 -4
- package/dist/asset-core-types.d.ts.map +1 -1
- package/dist/asset-inspection-types.d.ts +8 -0
- package/dist/asset-inspection-types.d.ts.map +1 -1
- package/dist/asset-manifest.d.ts +1 -0
- package/dist/asset-manifest.d.ts.map +1 -1
- package/dist/asset-manifest.js +13 -4
- package/dist/asset-manifest.js.map +1 -1
- package/dist/asset-route-typegen.d.ts +37 -0
- package/dist/asset-route-typegen.d.ts.map +1 -0
- package/dist/asset-route-typegen.js +179 -0
- package/dist/asset-route-typegen.js.map +1 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +9 -4
- package/dist/cli-help.js.map +1 -1
- package/dist/cli-options.d.ts +7 -0
- package/dist/cli-options.d.ts.map +1 -1
- package/dist/cli-options.js +33 -2
- package/dist/cli-options.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +126 -11
- package/dist/cli.js.map +1 -1
- package/dist/codemods/engine-entry-imports.d.ts +22 -0
- package/dist/codemods/engine-entry-imports.d.ts.map +1 -0
- package/dist/codemods/engine-entry-imports.js +159 -0
- package/dist/codemods/engine-entry-imports.js.map +1 -0
- package/dist/codemods/lean-imports.d.ts +40 -0
- package/dist/codemods/lean-imports.d.ts.map +1 -0
- package/dist/codemods/lean-imports.js +175 -0
- package/dist/codemods/lean-imports.js.map +1 -0
- package/dist/codemods/renderer-imports.d.ts +36 -0
- package/dist/codemods/renderer-imports.d.ts.map +1 -0
- package/dist/codemods/renderer-imports.js +364 -0
- package/dist/codemods/renderer-imports.js.map +1 -0
- package/dist/codemods/renderer-mode.d.ts +38 -0
- package/dist/codemods/renderer-mode.d.ts.map +1 -0
- package/dist/codemods/renderer-mode.js +130 -0
- package/dist/codemods/renderer-mode.js.map +1 -0
- package/dist/commands/prd01/index.d.ts +8 -0
- package/dist/commands/prd01/index.d.ts.map +1 -0
- package/dist/commands/prd01/index.js +39 -0
- package/dist/commands/prd01/index.js.map +1 -0
- package/dist/commands/prd02/environmentsBake.d.ts +6 -0
- package/dist/commands/prd02/environmentsBake.d.ts.map +1 -0
- package/dist/commands/prd02/environmentsBake.js +174 -0
- package/dist/commands/prd02/environmentsBake.js.map +1 -0
- package/dist/commands/prd02/index.d.ts +2 -0
- package/dist/commands/prd02/index.d.ts.map +1 -0
- package/dist/commands/prd02/index.js +26 -0
- package/dist/commands/prd02/index.js.map +1 -0
- package/dist/commands/prd02/migrateLighting.d.ts +17 -0
- package/dist/commands/prd02/migrateLighting.d.ts.map +1 -0
- package/dist/commands/prd02/migrateLighting.js +86 -0
- package/dist/commands/prd02/migrateLighting.js.map +1 -0
- package/dist/commands/prd02/migrateLightingSweep.d.ts +20 -0
- package/dist/commands/prd02/migrateLightingSweep.d.ts.map +1 -0
- package/dist/commands/prd02/migrateLightingSweep.js +105 -0
- package/dist/commands/prd02/migrateLightingSweep.js.map +1 -0
- package/dist/commands/prd03/index.d.ts +7 -0
- package/dist/commands/prd03/index.d.ts.map +1 -0
- package/dist/commands/prd03/index.js +9 -0
- package/dist/commands/prd03/index.js.map +1 -0
- package/dist/commands/prd04/index.d.ts +10 -0
- package/dist/commands/prd04/index.d.ts.map +1 -0
- package/dist/commands/prd04/index.js +10 -0
- package/dist/commands/prd04/index.js.map +1 -0
- package/dist/commands/prd04/modelTintReport.d.ts +16 -0
- package/dist/commands/prd04/modelTintReport.d.ts.map +1 -0
- package/dist/commands/prd04/modelTintReport.js +114 -0
- package/dist/commands/prd04/modelTintReport.js.map +1 -0
- package/dist/commands/prd04/pinEmissiveDefaults.d.ts +3 -0
- package/dist/commands/prd04/pinEmissiveDefaults.d.ts.map +1 -0
- package/dist/commands/prd04/pinEmissiveDefaults.js +36 -0
- package/dist/commands/prd04/pinEmissiveDefaults.js.map +1 -0
- package/dist/commands/prd05/admit.d.ts +54 -0
- package/dist/commands/prd05/admit.d.ts.map +1 -0
- package/dist/commands/prd05/admit.js +153 -0
- package/dist/commands/prd05/admit.js.map +1 -0
- package/dist/commands/prd05/codemods/assetsRouteModules.d.ts +3 -0
- package/dist/commands/prd05/codemods/assetsRouteModules.d.ts.map +1 -0
- package/dist/commands/prd05/codemods/assetsRouteModules.js +92 -0
- package/dist/commands/prd05/codemods/assetsRouteModules.js.map +1 -0
- package/dist/commands/prd05/index.d.ts +9 -0
- package/dist/commands/prd05/index.d.ts.map +1 -0
- package/dist/commands/prd05/index.js +171 -0
- package/dist/commands/prd05/index.js.map +1 -0
- package/dist/commands/prd05/library.d.ts +23 -0
- package/dist/commands/prd05/library.d.ts.map +1 -0
- package/dist/commands/prd05/library.js +245 -0
- package/dist/commands/prd05/library.js.map +1 -0
- package/dist/commands/prd05/lookdev.d.ts +14 -0
- package/dist/commands/prd05/lookdev.d.ts.map +1 -0
- package/dist/commands/prd05/lookdev.js +68 -0
- package/dist/commands/prd05/lookdev.js.map +1 -0
- package/dist/commands/prd05/optimize.d.ts +16 -0
- package/dist/commands/prd05/optimize.d.ts.map +1 -0
- package/dist/commands/prd05/optimize.js +55 -0
- package/dist/commands/prd05/optimize.js.map +1 -0
- package/dist/commands/prd05/prune.d.ts +26 -0
- package/dist/commands/prd05/prune.d.ts.map +1 -0
- package/dist/commands/prd05/prune.js +104 -0
- package/dist/commands/prd05/prune.js.map +1 -0
- package/dist/commands/prd05/review.d.ts +24 -0
- package/dist/commands/prd05/review.d.ts.map +1 -0
- package/dist/commands/prd05/review.js +40 -0
- package/dist/commands/prd05/review.js.map +1 -0
- package/dist/commands/prd06/index.d.ts +6 -0
- package/dist/commands/prd06/index.d.ts.map +1 -0
- package/dist/commands/prd06/index.js +86 -0
- package/dist/commands/prd06/index.js.map +1 -0
- package/dist/commands/prd06/inspectAnimationClips.d.ts +86 -0
- package/dist/commands/prd06/inspectAnimationClips.d.ts.map +1 -0
- package/dist/commands/prd06/inspectAnimationClips.js +168 -0
- package/dist/commands/prd06/inspectAnimationClips.js.map +1 -0
- package/dist/commands/prd06/validateHero.d.ts +18 -0
- package/dist/commands/prd06/validateHero.d.ts.map +1 -0
- package/dist/commands/prd06/validateHero.js +91 -0
- package/dist/commands/prd06/validateHero.js.map +1 -0
- package/dist/commands/prd07/codemods.d.ts +28 -0
- package/dist/commands/prd07/codemods.d.ts.map +1 -0
- package/dist/commands/prd07/codemods.js +155 -0
- package/dist/commands/prd07/codemods.js.map +1 -0
- package/dist/commands/prd07/index.d.ts +2 -0
- package/dist/commands/prd07/index.d.ts.map +1 -0
- package/dist/commands/prd07/index.js +151 -0
- package/dist/commands/prd07/index.js.map +1 -0
- package/dist/commands/prd08/feelLint.d.ts +13 -0
- package/dist/commands/prd08/feelLint.d.ts.map +1 -0
- package/dist/commands/prd08/feelLint.js +32 -0
- package/dist/commands/prd08/feelLint.js.map +1 -0
- package/dist/commands/prd08/index.d.ts +2 -0
- package/dist/commands/prd08/index.d.ts.map +1 -0
- package/dist/commands/prd08/index.js +16 -0
- package/dist/commands/prd08/index.js.map +1 -0
- package/dist/commands/prd08/motionReport.d.ts +94 -0
- package/dist/commands/prd08/motionReport.d.ts.map +1 -0
- package/dist/commands/prd08/motionReport.js +197 -0
- package/dist/commands/prd08/motionReport.js.map +1 -0
- package/dist/commands/prd09/codemods/audio-wrapper.d.ts +9 -0
- package/dist/commands/prd09/codemods/audio-wrapper.d.ts.map +1 -0
- package/dist/commands/prd09/codemods/audio-wrapper.js +30 -0
- package/dist/commands/prd09/codemods/audio-wrapper.js.map +1 -0
- package/dist/commands/prd09/codemods/capture-branches.d.ts +10 -0
- package/dist/commands/prd09/codemods/capture-branches.d.ts.map +1 -0
- package/dist/commands/prd09/codemods/capture-branches.js +54 -0
- package/dist/commands/prd09/codemods/capture-branches.js.map +1 -0
- package/dist/commands/prd09/codemods/evidence-globals.d.ts +8 -0
- package/dist/commands/prd09/codemods/evidence-globals.d.ts.map +1 -0
- package/dist/commands/prd09/codemods/evidence-globals.js +19 -0
- package/dist/commands/prd09/codemods/evidence-globals.js.map +1 -0
- package/dist/commands/prd09/codemods/perf-script.d.ts +8 -0
- package/dist/commands/prd09/codemods/perf-script.d.ts.map +1 -0
- package/dist/commands/prd09/codemods/perf-script.js +24 -0
- package/dist/commands/prd09/codemods/perf-script.js.map +1 -0
- package/dist/commands/prd09/index.d.ts +8 -0
- package/dist/commands/prd09/index.d.ts.map +1 -0
- package/dist/commands/prd09/index.js +19 -0
- package/dist/commands/prd09/index.js.map +1 -0
- package/dist/commands/prd09/perf-report.d.ts +56 -0
- package/dist/commands/prd09/perf-report.d.ts.map +1 -0
- package/dist/commands/prd09/perf-report.js +118 -0
- package/dist/commands/prd09/perf-report.js.map +1 -0
- package/dist/commands/prd09/sfx-admit.d.ts +18 -0
- package/dist/commands/prd09/sfx-admit.d.ts.map +1 -0
- package/dist/commands/prd09/sfx-admit.js +120 -0
- package/dist/commands/prd09/sfx-admit.js.map +1 -0
- package/dist/commands/prd10/index.d.ts +2 -0
- package/dist/commands/prd10/index.d.ts.map +1 -0
- package/dist/commands/prd10/index.js +109 -0
- package/dist/commands/prd10/index.js.map +1 -0
- package/dist/commands/prd11/batchOptout.d.ts +35 -0
- package/dist/commands/prd11/batchOptout.d.ts.map +1 -0
- package/dist/commands/prd11/batchOptout.js +155 -0
- package/dist/commands/prd11/batchOptout.js.map +1 -0
- package/dist/commands/prd11/index.d.ts +2 -0
- package/dist/commands/prd11/index.d.ts.map +1 -0
- package/dist/commands/prd11/index.js +13 -0
- package/dist/commands/prd11/index.js.map +1 -0
- package/dist/commands/prd11/perfGate.d.ts +15 -0
- package/dist/commands/prd11/perfGate.d.ts.map +1 -0
- package/dist/commands/prd11/perfGate.js +98 -0
- package/dist/commands/prd11/perfGate.js.map +1 -0
- package/dist/commands/prd13/index.d.ts +15 -0
- package/dist/commands/prd13/index.d.ts.map +1 -0
- package/dist/commands/prd13/index.js +26 -0
- package/dist/commands/prd13/index.js.map +1 -0
- package/dist/commands/prd13/run.d.ts +10 -0
- package/dist/commands/prd13/run.d.ts.map +1 -0
- package/dist/commands/prd13/run.js +29 -0
- package/dist/commands/prd13/run.js.map +1 -0
- package/dist/commands/prd14/index.d.ts +6 -0
- package/dist/commands/prd14/index.d.ts.map +1 -0
- package/dist/commands/prd14/index.js +6 -0
- package/dist/commands/prd14/index.js.map +1 -0
- package/dist/commands/prd15/index.d.ts +8 -0
- package/dist/commands/prd15/index.d.ts.map +1 -0
- package/dist/commands/prd15/index.js +152 -0
- package/dist/commands/prd15/index.js.map +1 -0
- package/dist/commands/registry.d.ts +19 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +19 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/contracts/assetManifest.d.ts +80 -0
- package/dist/contracts/assetManifest.d.ts.map +1 -0
- package/dist/contracts/assetManifest.js +9 -0
- package/dist/contracts/assetManifest.js.map +1 -0
- package/dist/contracts/commands.d.ts +53 -0
- package/dist/contracts/commands.d.ts.map +1 -0
- package/dist/contracts/commands.js +37 -0
- package/dist/contracts/commands.js.map +1 -0
- package/dist/index.d.ts +17 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +271 -71
- package/dist/index.js.map +1 -1
- package/dist/library-manifest.d.ts +86 -0
- package/dist/library-manifest.d.ts.map +1 -0
- package/dist/library-manifest.js +95 -0
- package/dist/library-manifest.js.map +1 -0
- package/dist/look/capture.d.ts +51 -0
- package/dist/look/capture.d.ts.map +1 -0
- package/dist/look/capture.js +229 -0
- package/dist/look/capture.js.map +1 -0
- package/dist/look/judge.d.ts +24 -0
- package/dist/look/judge.d.ts.map +1 -0
- package/dist/look/judge.js +151 -0
- package/dist/look/judge.js.map +1 -0
- package/dist/look/lint-static.d.ts +45 -0
- package/dist/look/lint-static.d.ts.map +1 -0
- package/dist/look/lint-static.js +241 -0
- package/dist/look/lint-static.js.map +1 -0
- package/dist/look/rubric.d.ts +70 -0
- package/dist/look/rubric.d.ts.map +1 -0
- package/dist/look/rubric.js +169 -0
- package/dist/look/rubric.js.map +1 -0
- package/dist/meshy/import.d.ts +7 -1
- package/dist/meshy/import.d.ts.map +1 -1
- package/dist/meshy/import.js +80 -6
- package/dist/meshy/import.js.map +1 -1
- package/dist/migrate-three/CompatibilityWarnings.d.ts +6 -0
- package/dist/migrate-three/CompatibilityWarnings.d.ts.map +1 -0
- package/dist/migrate-three/CompatibilityWarnings.js +24 -0
- package/dist/migrate-three/CompatibilityWarnings.js.map +1 -0
- package/dist/migrate-three/ImportMap.d.ts +19 -0
- package/dist/migrate-three/ImportMap.d.ts.map +1 -0
- package/dist/migrate-three/ImportMap.js +35 -0
- package/dist/migrate-three/ImportMap.js.map +1 -0
- package/dist/migrate-three/R3fMigration.d.ts +32 -0
- package/dist/migrate-three/R3fMigration.d.ts.map +1 -0
- package/dist/migrate-three/R3fMigration.js +70 -0
- package/dist/migrate-three/R3fMigration.js.map +1 -0
- package/dist/migrate-three/ThreeToA3DAdapter.d.ts +8 -0
- package/dist/migrate-three/ThreeToA3DAdapter.d.ts.map +1 -0
- package/dist/migrate-three/ThreeToA3DAdapter.js +20 -0
- package/dist/migrate-three/ThreeToA3DAdapter.js.map +1 -0
- package/dist/migrate-three/emit.d.ts +21 -0
- package/dist/migrate-three/emit.d.ts.map +1 -0
- package/dist/migrate-three/emit.js +117 -0
- package/dist/migrate-three/emit.js.map +1 -0
- package/dist/migrate-three/mappings.d.ts +21 -0
- package/dist/migrate-three/mappings.d.ts.map +1 -0
- package/dist/migrate-three/mappings.js +42 -0
- package/dist/migrate-three/mappings.js.map +1 -0
- package/dist/migrate-three/parse.d.ts +20 -0
- package/dist/migrate-three/parse.d.ts.map +1 -0
- package/dist/migrate-three/parse.js +56 -0
- package/dist/migrate-three/parse.js.map +1 -0
- package/dist/migrate-three/report.d.ts +18 -0
- package/dist/migrate-three/report.d.ts.map +1 -0
- package/dist/migrate-three/report.js +16 -0
- package/dist/migrate-three/report.js.map +1 -0
- package/dist/pull-bridge/adapters.d.ts +1 -1
- package/dist/pull-bridge/adapters.d.ts.map +1 -1
- package/dist/pull-bridge/adapters.js +17 -4
- package/dist/pull-bridge/adapters.js.map +1 -1
- package/dist/pull-bridge/provenance.d.ts.map +1 -1
- package/dist/pull-bridge/provenance.js +3 -2
- package/dist/pull-bridge/provenance.js.map +1 -1
- package/dist/pull-bridge/pullable.d.ts.map +1 -1
- package/dist/pull-bridge/pullable.js +14 -3
- package/dist/pull-bridge/pullable.js.map +1 -1
- package/dist/pull-bridge/scoring.d.ts +36 -8
- package/dist/pull-bridge/scoring.d.ts.map +1 -1
- package/dist/pull-bridge/scoring.js +143 -47
- package/dist/pull-bridge/scoring.js.map +1 -1
- package/dist/pull-bridge/search.d.ts +2 -0
- package/dist/pull-bridge/search.d.ts.map +1 -1
- package/dist/pull-bridge/search.js +17 -10
- package/dist/pull-bridge/search.js.map +1 -1
- package/dist/pull-bridge.d.ts +2 -2
- package/dist/pull-bridge.d.ts.map +1 -1
- package/dist/pull-bridge.js +24 -8
- package/dist/pull-bridge.js.map +1 -1
- package/package.json +6 -3
- package/skills/agent-files/AGENTS.md +3 -0
- package/skills/aura3d-animation-studio/SKILL.md +153 -0
- package/skills/aura3d-animation-studio/references/shot-looks.md +26 -0
- package/skills/aura3d-art-direction/SKILL.md +84 -0
- package/skills/aura3d-art-direction/references/failure-gallery.md +64 -0
- package/skills/aura3d-art-direction/references/framing-and-shots.md +45 -0
- package/skills/aura3d-art-direction/references/look-recipes.md +32 -0
- package/skills/aura3d-art-direction/references/quality-bar.md +103 -0
- package/skills/aura3d-art-direction/references/reference-frames.md +82 -0
- package/skills/aura3d-assets/SKILL.md +132 -0
- package/skills/aura3d-assets/references/preview-under-look.md +26 -0
- package/skills/aura3d-browser-game/SKILL.md +127 -0
- package/skills/aura3d-browser-game/references/genre-looks.md +52 -0
- package/skills/aura3d-character-animation/SKILL.md +129 -0
- package/skills/aura3d-character-animation/references/stage-and-lighting.md +31 -0
- package/skills/aura3d-core/SKILL.md +121 -0
- package/skills/aura3d-core/references/boundaries.md +91 -0
- package/skills/aura3d-evidence-review/SKILL.md +106 -0
- package/skills/aura3d-game-art/SKILL.md +118 -0
- package/skills/aura3d-game-art/references/sheet-check.mjs +58 -0
- package/skills/aura3d-game-art/references/sprite-palettes.md +25 -0
- package/skills/aura3d-materials-environments/SKILL.md +139 -0
- package/skills/aura3d-performance/SKILL.md +97 -0
- package/skills/aura3d-retexture/SKILL.md +115 -0
- package/skills/aura3d-retexture/references/geometry-hash.mjs +89 -0
- package/skills/aura3d-scene-authoring/SKILL.md +132 -0
- package/skills/aura3d-scene-authoring/references/look-by-family.md +28 -0
- package/skills/aura3d-threejs-migration/SKILL.md +125 -0
- package/skills/aura3d-threejs-migration/references/look-mapping.md +27 -0
- package/skills/llms.txt +117 -0
- package/skills/manifest.json +163 -0
- package/skills/meshy-cli/SKILL.md +133 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aura3d-core
|
|
3
|
+
description: Orients an agent in Aura3D, maps three.js habits to `@aura3d/engine` APIs, routes visual work to art direction first, and sets claim labels. Use when starting any Aura3D task, scaffolding with `create-aura3d`, writing `createAuraApp` code, or before writing public examples, README text, or release claims.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Aura3D core
|
|
7
|
+
|
|
8
|
+
Aura3D is a TypeScript engine API, an asset CLI, templates, diagnostics, and a
|
|
9
|
+
deploy checker. You are not writing three.js; `createAuraApp(...)` owns the
|
|
10
|
+
renderer, scene graph, camera, and frame loop. Every scene gets a look — a
|
|
11
|
+
preset that owns environment light, key shadow, fog, background and grade.
|
|
12
|
+
Shared rules (claim labels, forbidden patterns, catalog-first, typed assets,
|
|
13
|
+
paid generation, benchmark mode) live once in
|
|
14
|
+
[references/boundaries.md](references/boundaries.md).
|
|
15
|
+
|
|
16
|
+
## Look target
|
|
17
|
+
|
|
18
|
+
Before any code, pick the look: read `aura3d-art-direction`'s recipe row for
|
|
19
|
+
the genre, note the look id, the post preset and the palette accent. A scene
|
|
20
|
+
without a look ships flat shading, void background and floating props.
|
|
21
|
+
|
|
22
|
+
## Establish the contract
|
|
23
|
+
|
|
24
|
+
1. Run `npx @aura3d/cli@latest --help` (or `pnpm exec aura3d --help` inside the
|
|
25
|
+
monorepo) and use only the commands and flags it prints.
|
|
26
|
+
2. Check the installed engine version in `package.json`. Do not name an export
|
|
27
|
+
you have not seen in the installed package's type declarations.
|
|
28
|
+
3. Read `src/aura-assets.ts` and `aura.assets.json` before writing scene code.
|
|
29
|
+
Asset keys come from that generated file, never from memory.
|
|
30
|
+
4. Decide the mode. Benchmark mode means `npm install && npm run build`, then
|
|
31
|
+
stop (run the look-dev loop instead when `aura3d look capture` exists).
|
|
32
|
+
|
|
33
|
+
## Procedure
|
|
34
|
+
|
|
35
|
+
1. Pick the starting point in this order: a template (`npx create-aura3d@latest
|
|
36
|
+
<dir> --template <name>`), then `sceneKits.*`, then `prefabs.*`, and use
|
|
37
|
+
`primitives.*` last, for set dressing only.
|
|
38
|
+
2. Add the look first — it supplies the sky/environment light, the key shadow,
|
|
39
|
+
fog, background and the post grade as one unit:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { createAuraApp, looks, model, scene } from "@aura3d/engine";
|
|
43
|
+
import { assets } from "./aura-assets";
|
|
44
|
+
|
|
45
|
+
createAuraApp("#app", {
|
|
46
|
+
scene: scene().add(looks.preset("product-studio")).add(model(assets.robot)),
|
|
47
|
+
...looks.appOptions("product-studio")
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
3. Translate any three.js instinct with this table:
|
|
52
|
+
|
|
53
|
+
| three.js habit | Aura3D |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| `Mesh` plus a glTF loader | `model(assets.x)` (typed asset) |
|
|
56
|
+
| `new Scene()` | `scene()` |
|
|
57
|
+
| `PerspectiveCamera` | `camera.perspective(...)`, `camera.rigs.*` |
|
|
58
|
+
| `AmbientLight` | `lights.hemisphere(...)` or the look fill |
|
|
59
|
+
| `DirectionalLight`/`PointLight` | the look's key/rim slots, `lights.*` |
|
|
60
|
+
| `scene.environment` + PMREM | `environments.studio`/`hdri`, `world.biome` |
|
|
61
|
+
| `toneMapping`, exposure | `output.preset`, the look's grade |
|
|
62
|
+
| `setPixelRatio` | `quality: "auto"` via `looks.appOptions` |
|
|
63
|
+
| `castShadow` | `shadow: true` |
|
|
64
|
+
| `EffectComposer` passes | `output.preset` + `effects.*` |
|
|
65
|
+
| `AnimationMixer` | `AnimationController` |
|
|
66
|
+
| OrbitControls | `interactions.orbit(...)` |
|
|
67
|
+
|
|
68
|
+
4. If the prompt names a real object, resolve it through the catalog before
|
|
69
|
+
writing model code (load `aura3d-assets`).
|
|
70
|
+
5. Load the next skill from the routing table below. Load more than one when
|
|
71
|
+
the task spans them.
|
|
72
|
+
|
|
73
|
+
## Routing table
|
|
74
|
+
|
|
75
|
+
| Task signal | Load |
|
|
76
|
+
| --- | --- |
|
|
77
|
+
| Any visual task, screenshot looks flat/dark/empty, starting or finishing a scene | `aura3d-art-direction` (first) |
|
|
78
|
+
| Prompt to scene or route, scene kits, `definePromptPlan` | `aura3d-scene-authoring` |
|
|
79
|
+
| Named real object, user GLB, `assets search/resolve/add` | `aura3d-assets` |
|
|
80
|
+
| Done, public, shippable, screenshots, claims, `check-deploy` | `aura3d-evidence-review` |
|
|
81
|
+
| `mini-game`, `racing-starter`, `falling-blocks-starter`, `fighting-game`, `character-controller` | `aura3d-browser-game` |
|
|
82
|
+
| Rigged humanoids, clips, locomotion, morphs, visemes | `aura3d-character-animation` |
|
|
83
|
+
| `animation-studio` template, `aura3d animation scene`, episodes | `aura3d-animation-studio` |
|
|
84
|
+
| Porting three.js code, migration templates (formerly `three-compat-*`) | `aura3d-threejs-migration` |
|
|
85
|
+
| Materials, textures, HDRI, skies, water, weather | `aura3d-materials-environments` |
|
|
86
|
+
| Flipbook VFX sheets, HUD icons, UI sprites | `aura3d-game-art` |
|
|
87
|
+
| Restyling a finished mesh without touching geometry | `aura3d-retexture` |
|
|
88
|
+
| Frame time, bundle size, KTX2, LOD, instancing | `aura3d-performance` |
|
|
89
|
+
| No clean catalog candidate, Meshy generation or import | `meshy-cli` |
|
|
90
|
+
|
|
91
|
+
A listed skill that is not installed in this project is a gap to report, not
|
|
92
|
+
permission to improvise its procedure.
|
|
93
|
+
|
|
94
|
+
## Look-dev loop
|
|
95
|
+
|
|
96
|
+
Capture the route with `aura3d look capture`, judge each frame against the
|
|
97
|
+
quality-bar rubric, fix the single highest-leverage issue (lint codes first),
|
|
98
|
+
and repeat until every category reads 7+ or the loop exits flat. The full loop
|
|
99
|
+
spec lives in `aura3d-art-direction`.
|
|
100
|
+
|
|
101
|
+
## Stop and report
|
|
102
|
+
|
|
103
|
+
- The CLI help does not list a command you need: stop, name the missing
|
|
104
|
+
command, and label the work `blocked`.
|
|
105
|
+
- A required asset key is missing from `src/aura-assets.ts`: stop and fix the
|
|
106
|
+
import. Do not substitute a string id, URL, or primitive.
|
|
107
|
+
- The claim you are about to write has no matching browser evidence: lower it
|
|
108
|
+
to `prototype` or `roadmap` per boundaries.md — claim labels are a one-line
|
|
109
|
+
link, not a restatement.
|
|
110
|
+
- The task needs paid generation and no approval exists: stop at the dry run.
|
|
111
|
+
- Benchmark mode: after `npm install && npm run build`, stop and report the
|
|
112
|
+
runner-owned launch and capture command.
|
|
113
|
+
|
|
114
|
+
## References
|
|
115
|
+
|
|
116
|
+
- [Shared boundaries](references/boundaries.md)
|
|
117
|
+
- [Agent guide llms.txt](https://github.com/auraoneai/aura3d/blob/main/llms.txt)
|
|
118
|
+
- [Claims and boundaries](https://github.com/auraoneai/aura3d/blob/main/docs/agents/claims-and-boundaries.md)
|
|
119
|
+
- [No hackjob rules](https://github.com/auraoneai/aura3d/blob/main/docs/agents/no-hackjob-rules.md)
|
|
120
|
+
- [Anti-hallucination rules](https://github.com/auraoneai/aura3d/blob/main/docs/agents/anti-hallucination-rules.md)
|
|
121
|
+
- [Agent quickstart](https://aura3d.auraone.ai/docs/agent-quickstart.html)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Aura3D shared boundaries
|
|
2
|
+
|
|
3
|
+
Every Aura3D skill links here instead of restating these rules. The full
|
|
4
|
+
policy is in [claims and boundaries](https://github.com/auraoneai/aura3d/blob/main/docs/agents/claims-and-boundaries.md)
|
|
5
|
+
and the [agent guide](https://github.com/auraoneai/aura3d/blob/main/llms.txt).
|
|
6
|
+
|
|
7
|
+
## Claim labels
|
|
8
|
+
|
|
9
|
+
Label every capability with exactly one of these:
|
|
10
|
+
|
|
11
|
+
| Label | Meaning | Minimum evidence |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| `createAuraApp` root safe API | A browser route imports only `@aura3d/engine` and mounts through `createAuraApp(...)`. | Build, route-health or equivalent diagnostics, typed asset manifest, browser screenshot, claim-specific pixel or runtime assertion. |
|
|
14
|
+
| `production-runtime` | Exists in production-runtime packages or adapters, not necessarily root APIs. | Package or browser tests for that package, worded without implying root support. |
|
|
15
|
+
| `rendering` package | Exists in the lower-level `@aura3d/rendering` package. | Package exports plus renderer unit or browser evidence, worded at package level. |
|
|
16
|
+
| CLI asset pipeline | Asset search, add, resolve, validation, provenance, typegen, thumbnails, deploy checks. | CLI output, `aura.assets.json`, `src/aura-assets.ts`, license metadata, validation reports. |
|
|
17
|
+
| Template-only scaffold | A template starts a project; it does not prove production capability. | Template generation smoke test and honest scaffold wording. |
|
|
18
|
+
| `prototype` | Illustrates direction without release-quality evidence. | Prototype label and no flagship or production wording. |
|
|
19
|
+
| `roadmap` | Planned, not implemented or not public. | Future tense and a linked issue or PRD item. |
|
|
20
|
+
|
|
21
|
+
When evidence is missing, use `prototype` or `roadmap`. A route that loads,
|
|
22
|
+
compiles, or produces a large screenshot is not proof.
|
|
23
|
+
|
|
24
|
+
## Forbidden patterns
|
|
25
|
+
|
|
26
|
+
- no raw string asset IDs, raw GLB/glTF URLs, `unsafeModelUrl(...)`, `three` imports, or `GLTFLoader` in public examples;
|
|
27
|
+
- no primary character, vehicle, product, weapon, creature, world, or hero environment made only from primitives unless the route is explicitly abstract visualization;
|
|
28
|
+
- no CSS/DOM particle implementation for examples claiming Aura3D particle rendering;
|
|
29
|
+
- no WebGPU, PBR, postprocess, skinned animation, morph, or game-runtime claim without matching browser evidence;
|
|
30
|
+
- no public showcase or README claim that exceeds detected capability, route-health evidence, or screenshots.
|
|
31
|
+
|
|
32
|
+
Related prohibitions from the same sources: no hand-wired renderer, scene, or
|
|
33
|
+
camera loop; no memorized or guessed model URLs (they are hallucinated
|
|
34
|
+
provenance); no `createAuraApp()` call per frame; no CSS, DOM, or canvas
|
|
35
|
+
overlay standing in for 3D effects, labels on models, or renderer output.
|
|
36
|
+
|
|
37
|
+
## Catalog-first rule
|
|
38
|
+
|
|
39
|
+
A prompt that names a real object resolves through the asset catalog before
|
|
40
|
+
any model code: `npx @aura3d/cli@latest assets search "<descriptive phrase>"`,
|
|
41
|
+
then `assets resolve "<phrase>" --name <key>` for an auto-pullable candidate.
|
|
42
|
+
Auto-pullable means verified, redistributable (CC0 or CC-BY), and
|
|
43
|
+
direct-download. Marketplace and deep-link results are user-handled: the user
|
|
44
|
+
downloads and licenses them, then admits the file with `assets add`.
|
|
45
|
+
Primitives are set dressing around a resolved asset, never the named subject.
|
|
46
|
+
|
|
47
|
+
## Typed-asset rule
|
|
48
|
+
|
|
49
|
+
1. Admit every file through the CLI (`assets add`, `assets resolve`, or
|
|
50
|
+
`assets import-meshy`) so it is hashed, inspected, and recorded in
|
|
51
|
+
`aura.assets.json`.
|
|
52
|
+
2. Read the generated `src/aura-assets.ts` and import `assets` from
|
|
53
|
+
`./aura-assets`.
|
|
54
|
+
3. Render with `model(assets.<key>)` or a kit such as
|
|
55
|
+
`sceneKits.productViewer(assets.<key>)`, using the exact generated key.
|
|
56
|
+
4. Place with render-normalized helpers such as
|
|
57
|
+
`groundedRenderedAssetPlacement(...)`, not raw bounds math.
|
|
58
|
+
|
|
59
|
+
If the key you need is missing, fix the import. Never fall back to a string
|
|
60
|
+
id, a URL, a copied GLB, or a draft artifact path.
|
|
61
|
+
|
|
62
|
+
## Paid generation controls (Meshy)
|
|
63
|
+
|
|
64
|
+
- Catalog first. Generation is a fallback after a reported catalog rejection.
|
|
65
|
+
- Run `meshy make ... --dry-run` and show the plan before any paid call.
|
|
66
|
+
- Get explicit user approval for the displayed maximum, then pass
|
|
67
|
+
`--max-credits <approved>` on the paid command. Prices are never assumed.
|
|
68
|
+
- Resume recorded task IDs. Do not repeat paid work that already succeeded.
|
|
69
|
+
- Download immediately with `-o artifacts/meshy/<asset>/`. Provider retention
|
|
70
|
+
is short and signed URLs expire.
|
|
71
|
+
- Keep credentials out of arguments, prompts, logs, commits, and output.
|
|
72
|
+
- Admit through `assets import-meshy` with rights evidence. Import defaults to
|
|
73
|
+
`candidate` quality and never certifies release quality.
|
|
74
|
+
|
|
75
|
+
## Benchmark mode versus normal mode
|
|
76
|
+
|
|
77
|
+
| | Benchmark mode | Normal mode |
|
|
78
|
+
| --- | --- | --- |
|
|
79
|
+
| Starting point | `sceneKits.<name>()` first, `prefabs.*` if needed, primitives only for small additions | Template, kit, prefab, primitives last |
|
|
80
|
+
| Commands | `npm install && npm run build`, then stop | `npm run build`, `npm run test`, asset validation, `check-deploy` |
|
|
81
|
+
| Forbidden in the agent process | `npm run dev`, `npm run preview`, Playwright, screenshot capture, manual visual review | Nothing extra; heavy browser suites still run in CI or a remote runner |
|
|
82
|
+
| Report | Build output and the runner-owned capture command | Evidence bundle and a claim label |
|
|
83
|
+
|
|
84
|
+
A nonblank screenshot is not enough in either mode. The image must visibly
|
|
85
|
+
match the prompt.
|
|
86
|
+
|
|
87
|
+
## Evidence language
|
|
88
|
+
|
|
89
|
+
Say `reported` for another agent's claim, `recorded` for a manifest or board
|
|
90
|
+
entry, `verified` only for something you opened or ran (and state the scope),
|
|
91
|
+
and `unknown` when you cannot establish current state.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aura3d-evidence-review
|
|
3
|
+
description: Reviews Aura3D work before it is called done, public, or shippable by collecting route-health, screenshots, visual QA, asset release checks, and `check-deploy` output, then choosing a claim label through a capped critique loop. Use when finishing a route or template, writing README or showcase claims, comparing catalog versus Meshy candidates, capturing thumbnails or posters with `assets thumbnail`, or running `assets validate --release` and `check-deploy`.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Aura3D evidence review
|
|
7
|
+
|
|
8
|
+
A compiling route is not proof. This skill turns a finished change into an
|
|
9
|
+
evidence bundle and one claim label — claim labels live here only; other
|
|
10
|
+
skills link to them, never restate or reinterpret them. Label meanings and the
|
|
11
|
+
benchmark exception are in [boundaries](../aura3d-core/references/boundaries.md).
|
|
12
|
+
|
|
13
|
+
## Establish the contract
|
|
14
|
+
|
|
15
|
+
1. Run `npx @aura3d/cli@latest --help` and confirm `assets validate`,
|
|
16
|
+
`assets thumbnail`, and `check-deploy` are listed.
|
|
17
|
+
2. Read `package.json` scripts. Templates gate on `npm run build` and
|
|
18
|
+
`npm run test` (route-health and screenshot specs under `tests/`).
|
|
19
|
+
3. Read `aura.assets.json` and `src/aura-assets.ts` so you know which typed
|
|
20
|
+
assets the route claims.
|
|
21
|
+
4. Decide the mode. Benchmark mode: run `npm install && npm run build`, report
|
|
22
|
+
the output and the runner-owned capture command, then stop. Skip every
|
|
23
|
+
step below.
|
|
24
|
+
|
|
25
|
+
## Procedure
|
|
26
|
+
|
|
27
|
+
1. Pre-register the rubric before looking at output. Write 3 to 6 checks
|
|
28
|
+
taken from the prompt and the claim you intend to make, for example
|
|
29
|
+
"product centered and seated", "studio lighting visible", "metal and rubber
|
|
30
|
+
read differently". Add the role evidence from `aura3d-assets`.
|
|
31
|
+
2. Run the local finite gates.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm run build
|
|
35
|
+
npx @aura3d/cli@latest assets validate --source --no-placeholders --require-license
|
|
36
|
+
npx @aura3d/cli@latest assets validate --release
|
|
37
|
+
npx @aura3d/cli@latest check-deploy --dist dist --release
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Read `failures` in the JSON, not only the exit code. Keep the reports.
|
|
41
|
+
3. Run the browser gate (`npm run test`) in CI or a remote runner, not in the
|
|
42
|
+
local agent process. It writes route-health output and
|
|
43
|
+
`tests/reports/screenshot.png` plus pixel metrics. Capture desktop and
|
|
44
|
+
mobile viewports and retain the PNGs with hashes.
|
|
45
|
+
4. For kit-based or prompt-plan scenes, collect structured evidence:
|
|
46
|
+
`collectAuraSceneEvidence(scene)` for bodies, cameras, clips, and asset
|
|
47
|
+
provenance; `app.diagnostics().look` (resolved look, expansion, lint
|
|
48
|
+
findings); and `compilePromptPlan(plan).report.repairHints`. Structural
|
|
49
|
+
name heuristics exist under `structuralQA.*` — they are diagnostics, never
|
|
50
|
+
acceptance evidence.
|
|
51
|
+
5. Open the screenshots yourself and grade each rubric item `pass`, `warn`,
|
|
52
|
+
or `fail` in one batch. Every verdict cites a file: a PNG, a report field,
|
|
53
|
+
or a validation failure line.
|
|
54
|
+
6. Critique loop, at most 6 rounds for visual findings (the look-dev loop).
|
|
55
|
+
For each `fail`, apply the highest-leverage fix — lint codes first, then
|
|
56
|
+
the lowest rubric category (a repair hint, the matching scene kit, a better
|
|
57
|
+
typed asset), rerun only the affected gates, and regrade. Do not change
|
|
58
|
+
labels, rubric items, or thresholds to make a round pass.
|
|
59
|
+
7. Grade cinematic scenes on the ladder: L0 text only, L1 primitive sketch,
|
|
60
|
+
L2 asset-backed draft, L3 realtime cinematic scene, L4 production handoff.
|
|
61
|
+
Only L3 or better is public product proof.
|
|
62
|
+
8. Bake-offs: when comparing a catalog candidate against a Meshy candidate,
|
|
63
|
+
use one brief, one rubric, one camera and lighting setup, and the same
|
|
64
|
+
gates for both. Report both verdict sets and pick on evidence, not source.
|
|
65
|
+
9. Thumbnails and posters: run `npx @aura3d/cli@latest assets thumbnail` for
|
|
66
|
+
manifest thumbnails, and use the screenshot spec output as the poster.
|
|
67
|
+
Marketing previews use a static approved poster unless the live embed
|
|
68
|
+
passes the same gates as the route.
|
|
69
|
+
10. Choose the label and write the claim at exactly that strength. Record
|
|
70
|
+
the prompt, typed asset keys, screenshot paths, route-health report,
|
|
71
|
+
verdicts, label, and next action.
|
|
72
|
+
|
|
73
|
+
## What does not count
|
|
74
|
+
|
|
75
|
+
- blank, cropped, tiny, or unreadable screenshots, or PNG size alone;
|
|
76
|
+
- renderer-internal imports offered as root API proof;
|
|
77
|
+
- CSS, DOM, or canvas stand-ins for particles, bloom, lighting, or labels;
|
|
78
|
+
- stale route-health that names assets the source no longer uses;
|
|
79
|
+
- `structuralQA`/`visualQA` name-heuristic output as acceptance evidence — it
|
|
80
|
+
diagnoses, it does not prove pixels;
|
|
81
|
+
- an in-repo scorer as release proof (use a neutral human or opposite-vendor
|
|
82
|
+
model reviewer);
|
|
83
|
+
- a report generated with missing evidence inputs, even when it exits 0.
|
|
84
|
+
|
|
85
|
+
## Stop and report
|
|
86
|
+
|
|
87
|
+
- A gate command is missing from the installed CLI or scripts: label the
|
|
88
|
+
work `blocked`, name the missing gate, and do not substitute a weaker check.
|
|
89
|
+
- `assets validate --release` lists provenance failures: label `prototype`
|
|
90
|
+
until durable evidence exists.
|
|
91
|
+
- After 6 critique rounds any rubric item still fails: stop, report the
|
|
92
|
+
failing items with their evidence, and label `prototype`.
|
|
93
|
+
- Browser evidence could not be captured (no capture runner available): the
|
|
94
|
+
claim stays `prototype` AND the report names which look-dev loop step
|
|
95
|
+
failed (capture, judge, or lint); do not describe visual results you did
|
|
96
|
+
not see.
|
|
97
|
+
- The claim needs WebGPU, PBR, postprocess, skinned animation, morph, or game
|
|
98
|
+
runtime proof and the pixels do not show it: remove the claim.
|
|
99
|
+
|
|
100
|
+
## References
|
|
101
|
+
|
|
102
|
+
- [Boundaries](../aura3d-core/references/boundaries.md)
|
|
103
|
+
- [Verification](https://github.com/auraoneai/aura3d/blob/main/docs/agents/verification.md)
|
|
104
|
+
- [Rendering proof required](https://github.com/auraoneai/aura3d/blob/main/docs/agents/rendering-proof-required.md)
|
|
105
|
+
- [Cinematic scene quality](https://github.com/auraoneai/aura3d/blob/main/docs/agents/cinematic-scene-quality.md)
|
|
106
|
+
- [Deployment](https://aura3d.auraone.ai/docs/deployment.html)
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aura3d-game-art
|
|
3
|
+
description: Produces 2D game art that a real Aura3D consumer uses: flipbook VFX sprite sheets for `effects.flipbook` (the `flipbook-sprite` effect with `spriteColumns` / `spriteRows`) and HUD icons or UI sprites for DOM overlays, each admitted as a typed texture asset. Use when a game template (`mini-game`, `racing-starter`, `falling-blocks-starter`, `fighting-game`) needs explosion, muzzle-flash, or hit VFX sheets, HUD icons, score or health sprites, or a style-consistent batch of UI art.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Aura3D game art (flipbook VFX and HUD sprites)
|
|
7
|
+
|
|
8
|
+
Only two consumers exist, so only two kinds of art are produced: flipbook
|
|
9
|
+
sheets for the `flipbook-sprite` effect and icons for the DOM HUD. Tilesets
|
|
10
|
+
are out of scope: no 2D tile runtime consumes them, so 3D levels come from
|
|
11
|
+
`aura3d-browser-game` and `aura3d-assets`. Shared rules (claim labels, typed
|
|
12
|
+
assets, CSS/DOM is UI only, benchmark mode) are in
|
|
13
|
+
[../aura3d-core/references/boundaries.md](../aura3d-core/references/boundaries.md).
|
|
14
|
+
|
|
15
|
+
## Look target
|
|
16
|
+
|
|
17
|
+
Sprites live or die by the route's look: a flipbook explosion pops against a
|
|
18
|
+
night-city grade and washes out under `product-studio` key light. Design the
|
|
19
|
+
sheet against the genre recipe palette (see
|
|
20
|
+
`aura3d-art-direction/references/look-recipes.md`) — emissive colors 3–5×
|
|
21
|
+
background luminance read as glow through bloom; flat fills read as UI, not
|
|
22
|
+
VFX. Keep alpha edges clean: the frame's fog and grade will expose halos the
|
|
23
|
+
texture viewer hides.
|
|
24
|
+
|
|
25
|
+
## Establish the contract
|
|
26
|
+
|
|
27
|
+
1. Run `npx @aura3d/cli@latest --help` and read the `assets add` line.
|
|
28
|
+
2. Read `src/aura-assets.ts` and `aura.assets.json`, and find the consumer
|
|
29
|
+
first: the `effects.flipbook(...)` call, or the HUD element in `src/main.ts`
|
|
30
|
+
(the `mini-game` HUD is a DOM `aside`). No consumer means no art.
|
|
31
|
+
3. Know the flipbook state. `effects.flipbook` records validated sheet
|
|
32
|
+
geometry (`spriteColumns`, `spriteRows`, `frameRate`) but the root renderer
|
|
33
|
+
has no sprite-sheet sampler yet and submits no flipbook pass.
|
|
34
|
+
`renderer.diagnostics(scene)` reports the warning "flipbook-sprite is
|
|
35
|
+
recorded but withheld". Any route relying on it is `prototype` for that
|
|
36
|
+
effect.
|
|
37
|
+
4. Benchmark mode: `npm install && npm run build`, then stop.
|
|
38
|
+
|
|
39
|
+
## Procedure
|
|
40
|
+
|
|
41
|
+
Flipbook VFX sheets:
|
|
42
|
+
|
|
43
|
+
1. Fix the grid before producing art: columns, rows, frame count, and cell
|
|
44
|
+
size (for example 8 x 4 at 64 px per cell makes a 512 x 256 sheet with up
|
|
45
|
+
to 32 frames). Frames run left to right, top row first; that is the order
|
|
46
|
+
`resolveFlipbookUv(frame, columns, rows)` in `@aura3d/rendering` maps to
|
|
47
|
+
UVs.
|
|
48
|
+
2. Author every frame in its own cell with the effect centered, a
|
|
49
|
+
transparent background, and no bleed across cell edges. Keep a frame
|
|
50
|
+
inventory (index to description) next to the file.
|
|
51
|
+
3. Pre-flight the file with the bundled checker:
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
node .agents/skills/aura3d-game-art/references/sheet-check.mjs ./art/explosion.png --columns 8 --rows 4 --frames 30
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
(Adjust the path to wherever your agent client installed this skill.) It
|
|
58
|
+
fails when the width or height does not divide by the grid, when the frame
|
|
59
|
+
count exceeds the grid, or when the PNG has no alpha channel. It does not
|
|
60
|
+
inspect pixels, so review the transparent background and edges visually.
|
|
61
|
+
4. Admit it as a typed texture with provenance:
|
|
62
|
+
|
|
63
|
+
```sh
|
|
64
|
+
npx @aura3d/cli@latest assets add ./art/explosion.png --name explosionSheet --type texture --license CC0-1.0 --author "<author>" --quality candidate
|
|
65
|
+
npx @aura3d/cli@latest assets typegen
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
5. Declare the effect with the same grid:
|
|
69
|
+
`effects.flipbook({ spriteColumns: 8, spriteRows: 4, frameRate: 24 })`.
|
|
70
|
+
Mismatched or non-integer values throw a `RangeError` (fail loud); never
|
|
71
|
+
catch and ignore it. The effect has no texture slot today, so the sheet is
|
|
72
|
+
ready for the sampler but not yet drawn.
|
|
73
|
+
|
|
74
|
+
HUD icons and UI sprites:
|
|
75
|
+
|
|
76
|
+
6. Produce PNG or WebP icons (SVG is not an accepted asset format) at 1x and
|
|
77
|
+
2x, on a transparent background, sized to the HUD slot.
|
|
78
|
+
7. Admit each with `assets add ... --type texture`, then reference the
|
|
79
|
+
typed URL in DOM markup, for example an `<img>` whose `src` is
|
|
80
|
+
`assets.hudHeart.url`, mounted with `ui.html(...)` or the template's HUD
|
|
81
|
+
element. Give every icon a text alternative (`alt`, or `aria-label` on the
|
|
82
|
+
control).
|
|
83
|
+
8. DOM and CSS are allowed for UI only. Never use them for particles,
|
|
84
|
+
explosions, hit sparks, or anything claimed as rendered 3D VFX.
|
|
85
|
+
|
|
86
|
+
Style-consistent batches:
|
|
87
|
+
|
|
88
|
+
9. Write one style sheet before the batch: palette (hex values), outline
|
|
89
|
+
weight, light direction, and cell or icon size. Produce every item against
|
|
90
|
+
it, then review the batch side by side and redo outliers instead of
|
|
91
|
+
shipping a mixed set.
|
|
92
|
+
10. Generated images (from an image skill outside Aura3D) are candidates:
|
|
93
|
+
keep them under `artifacts/`, admit them with `--quality candidate`, and
|
|
94
|
+
run the same checks.
|
|
95
|
+
11. Normal mode: capture the HUD on desktop and mobile through `npm run test`
|
|
96
|
+
on CI or a remote worker, then hand claim wording to
|
|
97
|
+
`aura3d-evidence-review`.
|
|
98
|
+
|
|
99
|
+
## Stop and report
|
|
100
|
+
|
|
101
|
+
- The sheet fails `sheet-check.mjs`, or frames bleed across cells: fix the
|
|
102
|
+
sheet; do not change the grid in code to paper over it.
|
|
103
|
+
- The route's VFX depends on flipbook pixels: label that effect `prototype`
|
|
104
|
+
and quote the withheld warning. Do not fake it with CSS, a DOM overlay, or
|
|
105
|
+
an animated `<img>` on top of the canvas.
|
|
106
|
+
- Someone asks for a tileset: decline it and route level work to
|
|
107
|
+
`aura3d-browser-game`.
|
|
108
|
+
- A file has no license or author: do not admit it.
|
|
109
|
+
|
|
110
|
+
## References
|
|
111
|
+
|
|
112
|
+
- [Flipbook UV math (`@aura3d/rendering`)](https://github.com/auraoneai/aura3d/blob/main/packages/rendering/src/SpriteFlipbook.ts)
|
|
113
|
+
- [Flipbook and beam root builder test](https://github.com/auraoneai/aura3d/blob/main/tests/unit/engine/phase2-root-bridge.test.ts)
|
|
114
|
+
- [Flipbook browser harness](https://github.com/auraoneai/aura3d/blob/main/tests/browser/d4-flipbook-beam-harness.ts)
|
|
115
|
+
- [Mini-game template HUD](https://github.com/auraoneai/aura3d/blob/main/packages/create-aura3d/templates/mini-game/src/main.ts)
|
|
116
|
+
- [Build a browser game guide](https://github.com/auraoneai/aura3d/blob/main/docs/guides/build-a-browser-game.md)
|
|
117
|
+
- [Sheet checker](references/sheet-check.mjs)
|
|
118
|
+
- [Sprite and flipbook palettes](references/sprite-palettes.md)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Flipbook sprite-sheet pre-flight for Aura3D `effects.flipbook`.
|
|
3
|
+
// Reads a PNG header (no dependencies) and checks that the sheet divides evenly
|
|
4
|
+
// into columns x rows, that the declared frame count fits the grid, and that the
|
|
5
|
+
// PNG carries an alpha channel. It does not look at pixels; a transparent
|
|
6
|
+
// background and clean frame edges still need a visual check.
|
|
7
|
+
//
|
|
8
|
+
// Usage: node sheet-check.mjs sheet.png --columns 8 --rows 4 [--frames 30]
|
|
9
|
+
import { readFileSync } from "node:fs";
|
|
10
|
+
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const file = args[0];
|
|
13
|
+
const opt = (name) => {
|
|
14
|
+
const i = args.indexOf(`--${name}`);
|
|
15
|
+
return i >= 0 ? Number(args[i + 1]) : undefined;
|
|
16
|
+
};
|
|
17
|
+
const columns = opt("columns");
|
|
18
|
+
const rows = opt("rows");
|
|
19
|
+
if (!file || !columns || !rows) {
|
|
20
|
+
console.error("usage: node sheet-check.mjs sheet.png --columns N --rows N [--frames N]");
|
|
21
|
+
process.exit(2);
|
|
22
|
+
}
|
|
23
|
+
const frames = opt("frames") ?? columns * rows;
|
|
24
|
+
|
|
25
|
+
const buf = readFileSync(file);
|
|
26
|
+
const PNG_SIGNATURE = "89504e470d0a1a0a";
|
|
27
|
+
const failures = [];
|
|
28
|
+
if (buf.subarray(0, 8).toString("hex") !== PNG_SIGNATURE || buf.toString("ascii", 12, 16) !== "IHDR") {
|
|
29
|
+
console.log(JSON.stringify({ ok: false, file, failures: ["not a PNG (flipbook sheets must be PNG with alpha)"] }, null, 2));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const width = buf.readUInt32BE(16);
|
|
33
|
+
const height = buf.readUInt32BE(20);
|
|
34
|
+
const colorType = buf[25];
|
|
35
|
+
// PNG color types 4 (gray+alpha) and 6 (RGBA) carry alpha; a tRNS chunk adds it to palette images.
|
|
36
|
+
const hasAlpha = colorType === 4 || colorType === 6 || buf.includes(Buffer.from("tRNS"));
|
|
37
|
+
|
|
38
|
+
for (const [name, value] of [["columns", columns], ["rows", rows], ["frames", frames]]) {
|
|
39
|
+
if (!Number.isInteger(value) || value <= 0) failures.push(`${name} must be a positive integer`);
|
|
40
|
+
}
|
|
41
|
+
if (width % columns !== 0) failures.push(`width ${width} is not divisible by ${columns} columns`);
|
|
42
|
+
if (height % rows !== 0) failures.push(`height ${height} is not divisible by ${rows} rows`);
|
|
43
|
+
if (frames > columns * rows) failures.push(`frames ${frames} exceed sheet capacity ${columns * rows}`);
|
|
44
|
+
if (!hasAlpha) failures.push("PNG has no alpha channel; the background cannot be transparent");
|
|
45
|
+
|
|
46
|
+
const cell = [width / columns, height / rows];
|
|
47
|
+
console.log(JSON.stringify({
|
|
48
|
+
ok: failures.length === 0,
|
|
49
|
+
file,
|
|
50
|
+
size: [width, height],
|
|
51
|
+
grid: [columns, rows],
|
|
52
|
+
cell,
|
|
53
|
+
frames,
|
|
54
|
+
emptyCells: columns * rows - frames,
|
|
55
|
+
hasAlpha,
|
|
56
|
+
failures
|
|
57
|
+
}, null, 2));
|
|
58
|
+
process.exitCode = failures.length === 0 ? 0 : 1;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Sprite and flipbook palettes per genre
|
|
2
|
+
|
|
3
|
+
Hue and luminance targets so hand-drawn or generated sprites land inside the
|
|
4
|
+
route's look instead of reading as pasted stickers.
|
|
5
|
+
|
|
6
|
+
| Genre look | Sprite family | Hues (sRGB) | Emissive target |
|
|
7
|
+
| --- | --- | --- | --- |
|
|
8
|
+
| `outdoor-day` | pickups, coins, springs | gold #FFC53D, leaf green #5DBB63, sky blue #56B4F0 | 3× ground luminance |
|
|
9
|
+
| `golden-hour` | brake glow, exhaust, UI accents | amber #FF9E3D, burnt orange #D96C2C, charcoal #2B2623 | 4× asphalt |
|
|
10
|
+
| `arena-fight` | hit sparks, meter fills, KO flash | impact orange #FF7A2B, meter cyan #46E8FF, KO white #FFFFFF | 5× arena floor |
|
|
11
|
+
| `neon-arcade` | pieces, line-clear flash, grid glow | cyan #2EE6FF, magenta #FF3DE8, lime #B8FF2E, violet #8A5BFF | 4× board |
|
|
12
|
+
| `night-city` | signs, window glow, puddle decals | sodium #FFB84D, neon red #FF2E6E, cool cyan #4DD8FF | 3× wet street |
|
|
13
|
+
| `space` | lasers, shields, engine trails | laser magenta #FF4DFF, shield teal #3DFFE8, trail white | 6× starfield |
|
|
14
|
+
| `underwater` | bubbles, biolume, fauna glints | deep teal #1FA8A0, biolume #7DFFD4, coral #FF8A6B | 3× water |
|
|
15
|
+
| `product-studio` | callouts, tag glyphs, swatches | brand accent + neutral greys | none — flat read |
|
|
16
|
+
|
|
17
|
+
## Drawing rules
|
|
18
|
+
|
|
19
|
+
- Desaturate sprite fills slightly vs. the accent — the grade re-saturates and
|
|
20
|
+
pure-primary fills clip to flat color.
|
|
21
|
+
- Keep alpha edges dark-tolerant: a white halo invisible in the texture viewer
|
|
22
|
+
blooms against `night-city` fog.
|
|
23
|
+
- Flipbook frames must carry their own lighting direction matching the look's
|
|
24
|
+
key (a spark sheet lit from below fights a `golden-hour` key).
|
|
25
|
+
- UI glyphs in DOM HUD use the look's foreground color, not the world palette.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aura3d-materials-environments
|
|
3
|
+
description: Chooses and verifies surface looks and lighting environments: built-in `material.*`, `environments.*`, `sky.dayNight`, `weather`, and `water` first, then licensed local textures or HDRIs admitted with `assets add --type texture`, with seam, PBR-channel, and visual-QA checks. Use when a route needs a material, texture set, PBR maps, HDRI or IBL, skybox, night or daytime sky, rain, snow, water, KTX2 textures, or `@aura3d/materials` / `@aura3d/environments` validation.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Aura3D materials and environments
|
|
7
|
+
|
|
8
|
+
Order is fixed: looks/biomes/env presets first, then built-ins, then a
|
|
9
|
+
licensed local file, then a generated plate as a candidate. There is no
|
|
10
|
+
catalog search for textures or HDRIs today (the asset index has no texture or
|
|
11
|
+
HDRI adapter), so `assets search` will not find them. Shared rules (claim
|
|
12
|
+
labels, typed assets, catalog-first for models, benchmark mode) are in
|
|
13
|
+
[../aura3d-core/references/boundaries.md](../aura3d-core/references/boundaries.md).
|
|
14
|
+
|
|
15
|
+
## Look target
|
|
16
|
+
|
|
17
|
+
Most scenes need no per-file HDRI at all: `looks.preset(<genre>)` already
|
|
18
|
+
supplies environment light, sky/background, fog and grade — pick it from the
|
|
19
|
+
recipe row in `../aura3d-art-direction/references/look-recipes.md` and only
|
|
20
|
+
descend into manual environments when the look cannot express the mood.
|
|
21
|
+
|
|
22
|
+
## Establish the contract
|
|
23
|
+
|
|
24
|
+
1. Run `npx @aura3d/cli@latest --help` and read the `assets add` line and its
|
|
25
|
+
`--type texture|environment` option.
|
|
26
|
+
2. Read `src/aura-assets.ts` and `aura.assets.json`. Map slots take typed
|
|
27
|
+
`assets.<key>` refs only, never a URL string.
|
|
28
|
+
3. Check the installed `@aura3d/engine`, `@aura3d/materials`, and
|
|
29
|
+
`@aura3d/environments` versions. The validators below come from the
|
|
30
|
+
`/node` subpaths (`@aura3d/materials/node`, `@aura3d/environments/node`)
|
|
31
|
+
and run in Node scripts, not in browser routes.
|
|
32
|
+
4. Benchmark mode: `npm install && npm run build`, then stop.
|
|
33
|
+
|
|
34
|
+
## Procedure
|
|
35
|
+
|
|
36
|
+
Step 1, presets (always try first):
|
|
37
|
+
|
|
38
|
+
0. Looks and biomes: `looks.preset("outdoor-day" | "night-city" | "product-studio" ...)`
|
|
39
|
+
and `world.biome(<id>)` supply IBL + background + fog + key as one unit;
|
|
40
|
+
`environments.<named>`/`environments.hdri` cover the remaining cases before
|
|
41
|
+
any file admission.
|
|
42
|
+
1. Materials: `material.pbr(...)`, `material.physical(...)`, `material.metal`,
|
|
43
|
+
`material.glass`, `material.rubber`, `material.fabric`,
|
|
44
|
+
`material.brushedMetal`, `material.ceramic`, `material.matteClay`,
|
|
45
|
+
`material.clearcoatPaint`, and `material.emissive`, plus
|
|
46
|
+
`material.proceduralTextures` (fabric, rubber, brushedMetal, plastic) for
|
|
47
|
+
maps without files. `material.presets()` lists the named specs.
|
|
48
|
+
2. Environments: `environments.studio`, `environments.materialLab`,
|
|
49
|
+
`environments.productHero`, `environments.nightCinematic`,
|
|
50
|
+
`environments.metalStudio`, `environments.glassStudio`, or
|
|
51
|
+
`environments.forMaterial("metal" | "glass" | "product" | "studio")`.
|
|
52
|
+
3. Outdoor: `sky.dayNight({ hour })` returns `nodes`, `background`, and
|
|
53
|
+
`dayFactor`; `weather.precipitation({ type: "rain" | "snow" })` and
|
|
54
|
+
`weather.wetGround(...)`; `water.surface({ preset: "calm" | "moderate" |
|
|
55
|
+
"rough" | "storm" })`. Add their `nodes` with `scene().addMany(...)` and use
|
|
56
|
+
the returned `background`.
|
|
57
|
+
4. Library references for choosing values: `GAME_READY_MATERIAL_PRESETS` (car
|
|
58
|
+
paint, thin glass, brushed metal, skin approximation, and more),
|
|
59
|
+
`listThreeCompatPbrMaterials()`, and `THREE_COMPAT_TEXTURE_SETS`. Check a
|
|
60
|
+
preset in Node with `validateGameReadyMaterialPreset(preset)` or the whole
|
|
61
|
+
library with `validateGameReadyMaterialLibrary()`.
|
|
62
|
+
|
|
63
|
+
Step 2, a licensed local file (Poly Haven or another CC0 / CC-BY source you
|
|
64
|
+
downloaded yourself):
|
|
65
|
+
|
|
66
|
+
5. Admit each map and each HDRI as a texture:
|
|
67
|
+
|
|
68
|
+
```sh
|
|
69
|
+
npx @aura3d/cli@latest assets add ./textures/oak_diff_2k.jpg --name oakBase --type texture --license CC0-1.0 --source-page <page> --author "<author>"
|
|
70
|
+
npx @aura3d/cli@latest assets add ./hdri/night_1k.hdr --name nightSky --type texture --license CC0-1.0 --source-page <page> --author "<author>"
|
|
71
|
+
npx @aura3d/cli@latest assets typegen
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Use `--type texture` for HDRIs too: `environments.hdri({ texture })` only
|
|
75
|
+
accepts a texture-typed ref, and an `--type environment` ref fails to
|
|
76
|
+
type-check there. Use Radiance `.hdr`, not `.exr`, for IBL.
|
|
77
|
+
6. Wire maps into one material: `texture` (base color), `normal`,
|
|
78
|
+
`roughnessMap`, `metalnessMap`, `occlusionMap`, `emissiveMap`, with
|
|
79
|
+
`texTransforms` for tiling. Wire the sky with
|
|
80
|
+
`environments.hdri({ texture: assets.nightSky, intensity, rotation })` and an
|
|
81
|
+
optional sharper `reflectionTexture`.
|
|
82
|
+
7. Reject a PBR set that is missing roughness or metalness data where the
|
|
83
|
+
role expects PBR (metal, painted, or product surfaces). Do not invent the
|
|
84
|
+
missing map with a flat color and call it PBR.
|
|
85
|
+
|
|
86
|
+
Step 3, a generated plate (optional, from an image skill outside Aura3D): keep
|
|
87
|
+
it under `artifacts/`, admit it with `--quality candidate`, and label the
|
|
88
|
+
route `prototype` until the checks below pass.
|
|
89
|
+
|
|
90
|
+
Checks (all steps):
|
|
91
|
+
|
|
92
|
+
8. HDRI file: in Node, `inspectProductionHDR(path, [width, height])` must
|
|
93
|
+
report a Radiance header and a 2:1 `declaredResolution`. For a manifest
|
|
94
|
+
preset, `verifyThreeCompatHdriFile(preset)` checks the file hash and
|
|
95
|
+
`createThreeCompatEnvironmentDiagnostics(preset)` reports memory and PMREM
|
|
96
|
+
warnings.
|
|
97
|
+
9. Equirect seam: capture the sky at a yaw that puts the left and right edge
|
|
98
|
+
in frame and confirm no visible seam. `environments.hdri` renders a
|
|
99
|
+
procedural studio fallback first and swaps in the HDRI after load, so
|
|
100
|
+
judge only frames where diagnostics report `iblPixelBacked` true.
|
|
101
|
+
10. Tiling: capture a surface at a texture scale that repeats the map at least
|
|
102
|
+
3 times and confirm no visible seam or mirrored repeat.
|
|
103
|
+
11. On material showcase scenes, `structuralQA.material(nodes)` reports
|
|
104
|
+
`ok` plus per-class structural-name checks (nodes named like
|
|
105
|
+
chrome/glass/rubber actually present). These are diagnostics only —
|
|
106
|
+
acceptance comes from the captured frames.
|
|
107
|
+
12. KTX2: `.ktx2` files are accepted by `assets add --type texture`, and
|
|
108
|
+
renderer coverage exists only for selected tested cases. Keep a
|
|
109
|
+
PNG/JPG fallback, and make no compression or memory claim without a
|
|
110
|
+
route-level capture.
|
|
111
|
+
13. Screenshots (normal mode only) run through `npm run test` on CI or a remote
|
|
112
|
+
worker. Hand the claim label to `aura3d-evidence-review`.
|
|
113
|
+
|
|
114
|
+
## Look-dev loop
|
|
115
|
+
|
|
116
|
+
`aura3d look capture` → judge against the quality-bar rubric → `aura3d look
|
|
117
|
+
lint`. Judge only frames where the HDRI actually loaded (`iblPixelBacked`
|
|
118
|
+
true); a seam visible in one capture re-checks at a different yaw. One change
|
|
119
|
+
per round.
|
|
120
|
+
|
|
121
|
+
## Stop and report
|
|
122
|
+
|
|
123
|
+
- No built-in matches and no licensed file is available: stop, label the look
|
|
124
|
+
`prototype`, and say a texture or HDRI source is needed. Do not fetch a URL
|
|
125
|
+
you have not verified, and do not claim a catalog texture exists.
|
|
126
|
+
- License or source page is unknown: do not admit the file.
|
|
127
|
+
- The HDRI is not 2:1, has a seam, or never reaches `iblPixelBacked`: report
|
|
128
|
+
it and keep the built-in environment.
|
|
129
|
+
- A PBR role is missing roughness or metalness: reject the set.
|
|
130
|
+
- Any check above was not run: the route is `prototype`, not release.
|
|
131
|
+
|
|
132
|
+
## References
|
|
133
|
+
|
|
134
|
+
- [Environment lighting](https://github.com/auraoneai/aura3d/blob/main/docs/rendering/environment-lighting.md)
|
|
135
|
+
- [HDR, IBL, tone mapping, and color](https://github.com/auraoneai/aura3d/blob/main/docs/rendering/lighting-environment-color.md)
|
|
136
|
+
- [Texture compression (KTX2/Basis)](https://github.com/auraoneai/aura3d/blob/main/docs/rendering/texture-compression.md)
|
|
137
|
+
- [Material validation source](https://github.com/auraoneai/aura3d/blob/main/packages/engine/src/devtools/materials/MaterialValidation.ts)
|
|
138
|
+
- [HDRI environment source](https://github.com/auraoneai/aura3d/blob/main/packages/engine/src/devtools/environments/HDRIEnvironment.ts)
|
|
139
|
+
- [Sky, weather, and water browser harness](https://github.com/auraoneai/aura3d/blob/main/tests/browser/d3-atmosphere-water-harness.ts)
|