@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,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-05 §6.2 — optimize profile table (Phase 0 slice).
|
|
3
|
+
*
|
|
4
|
+
* The admission gates (G1 triangle band, G3 PBR completeness) need the profile
|
|
5
|
+
* triangle floors/ceilings and role→profile resolution inside the CLI, so the
|
|
6
|
+
* §6.2 table lives here as the single source of truth. Phase 2 adds the full
|
|
7
|
+
* `AssetOptimizeProfile` (LOD chains, texture encodings, KTX flags) in
|
|
8
|
+
* `tools/asset-optimize/profiles.ts` re-using these records.
|
|
9
|
+
*/
|
|
10
|
+
import type { AuraCliAssetRole } from "../asset-core-types.js";
|
|
11
|
+
export type AssetOptimizeProfileName = "hero-character" | "npc-character" | "hero-vehicle" | "traffic-vehicle" | "product" | "weapon" | "prop-large" | "prop-small" | "world-chunk" | "track" | "backdrop" | "hdri";
|
|
12
|
+
export interface AdmissionProfile {
|
|
13
|
+
readonly id: AssetOptimizeProfileName;
|
|
14
|
+
/** Roles from the §6.2 table that resolve to this profile. */
|
|
15
|
+
readonly roles: readonly string[];
|
|
16
|
+
/** G1 admission minimum on LOD0 triangles (undefined = no floor). */
|
|
17
|
+
readonly trianglesFloor?: number;
|
|
18
|
+
/** LOD0 optimization target. */
|
|
19
|
+
readonly trianglesTarget?: number;
|
|
20
|
+
/** G1 admission maximum on LOD0 triangles. */
|
|
21
|
+
readonly trianglesCeiling?: number;
|
|
22
|
+
/** §6.4 default gameplay camera for G2 (entry `gameplayCamera` overrides). */
|
|
23
|
+
readonly gameplayCamera?: {
|
|
24
|
+
readonly distance: number;
|
|
25
|
+
readonly fovDegrees: number;
|
|
26
|
+
};
|
|
27
|
+
/** §17.2 derived-file budget (High tier). */
|
|
28
|
+
readonly fileBytesHigh?: number;
|
|
29
|
+
/** §17.2 mobile derived-file budget. */
|
|
30
|
+
readonly fileBytesMobile?: number;
|
|
31
|
+
/** §17.2 GPU bytes budget (High tier). */
|
|
32
|
+
readonly gpuBytesHigh?: number;
|
|
33
|
+
/** §6.4 absolute texel-density floor (px/m effective). */
|
|
34
|
+
readonly texelFloorPxPerMeter?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare const ADMISSION_PROFILES: Readonly<Record<AssetOptimizeProfileName, AdmissionProfile>>;
|
|
37
|
+
/**
|
|
38
|
+
* §6.2 role→profile resolution. `bounds` disambiguates `prop` into
|
|
39
|
+
* `prop-large` (≥ 1 m gameplay-relevant) vs `prop-small` (< 1 m). Roles that
|
|
40
|
+
* carry no geometry profile (proxy, debug, abstract, unknown, audio,
|
|
41
|
+
* texture-set, vfx-atlas) return undefined — geometry gates record
|
|
42
|
+
* `waived-by-role` for them.
|
|
43
|
+
*/
|
|
44
|
+
export declare function profileForRole(role: AuraCliAssetRole | string | undefined, bounds?: readonly number[]): AdmissionProfile | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* G3 role coverage (PRD-05 §6.4): character/vehicle/product/weapon/world/
|
|
47
|
+
* track/environment, plus `prop` only when it resolves to `prop-large`
|
|
48
|
+
* (hero/enemy map onto the character profiles). Takes no free text — the
|
|
49
|
+
* deleted `requiresTextureEvidence` regex waiver is gone for good.
|
|
50
|
+
*/
|
|
51
|
+
export declare function requiresPbrTextures(role: AuraCliAssetRole | string | undefined, profile: AdmissionProfile | undefined): boolean;
|
|
52
|
+
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/admission/profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,MAAM,wBAAwB,GAChC,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,iBAAiB,GACjB,SAAS,GACT,QAAQ,GACR,YAAY,GACZ,YAAY,GACZ,aAAa,GACb,OAAO,GACP,UAAU,GACV,MAAM,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,wBAAwB,CAAC;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,qEAAqE;IACrE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,gCAAgC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,8EAA8E;IAC9E,QAAQ,CAAC,cAAc,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF,6CAA6C;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,wCAAwC;IACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAID,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CAa3F,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,EAC3C,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GACzB,gBAAgB,GAAG,SAAS,CA+B9B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,GAAG,OAAO,CAQ/H"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-05 §6.2 — optimize profile table (Phase 0 slice).
|
|
3
|
+
*
|
|
4
|
+
* The admission gates (G1 triangle band, G3 PBR completeness) need the profile
|
|
5
|
+
* triangle floors/ceilings and role→profile resolution inside the CLI, so the
|
|
6
|
+
* §6.2 table lives here as the single source of truth. Phase 2 adds the full
|
|
7
|
+
* `AssetOptimizeProfile` (LOD chains, texture encodings, KTX flags) in
|
|
8
|
+
* `tools/asset-optimize/profiles.ts` re-using these records.
|
|
9
|
+
*/
|
|
10
|
+
const MB = 1_000_000;
|
|
11
|
+
export const ADMISSION_PROFILES = {
|
|
12
|
+
"hero-character": { id: "hero-character", roles: ["character", "hero"], trianglesFloor: 5_000, trianglesTarget: 25_000, trianglesCeiling: 60_000, gameplayCamera: { distance: 4, fovDegrees: 50 }, fileBytesHigh: 6 * MB, fileBytesMobile: 2.5 * MB, gpuBytesHigh: 20 * MB, texelFloorPxPerMeter: 256 },
|
|
13
|
+
"npc-character": { id: "npc-character", roles: ["enemy"], trianglesFloor: 2_000, trianglesTarget: 10_000, trianglesCeiling: 25_000, gameplayCamera: { distance: 4, fovDegrees: 50 }, fileBytesHigh: 2 * MB, fileBytesMobile: 1 * MB, gpuBytesHigh: 6 * MB, texelFloorPxPerMeter: 256 },
|
|
14
|
+
"hero-vehicle": { id: "hero-vehicle", roles: ["vehicle"], trianglesFloor: 8_000, trianglesTarget: 40_000, trianglesCeiling: 80_000, gameplayCamera: { distance: 7, fovDegrees: 55 }, fileBytesHigh: 5 * MB, fileBytesMobile: 2 * MB, gpuBytesHigh: 20 * MB, texelFloorPxPerMeter: 128 },
|
|
15
|
+
"traffic-vehicle": { id: "traffic-vehicle", roles: [], trianglesFloor: 3_000, trianglesTarget: 12_000, trianglesCeiling: 25_000, gameplayCamera: { distance: 7, fovDegrees: 55 }, fileBytesHigh: 1.5 * MB, fileBytesMobile: 0.8 * MB, gpuBytesHigh: 5 * MB, texelFloorPxPerMeter: 128 },
|
|
16
|
+
"product": { id: "product", roles: ["product"], trianglesFloor: 10_000, trianglesTarget: 60_000, trianglesCeiling: 150_000, gameplayCamera: { distance: 1.5, fovDegrees: 30 }, fileBytesHigh: 8 * MB, fileBytesMobile: 3 * MB, gpuBytesHigh: 32 * MB, texelFloorPxPerMeter: 128 },
|
|
17
|
+
"weapon": { id: "weapon", roles: ["weapon"], trianglesFloor: 1_500, trianglesTarget: 6_000, trianglesCeiling: 15_000, gameplayCamera: { distance: 1.2, fovDegrees: 60 }, fileBytesHigh: 1 * MB, fileBytesMobile: 0.5 * MB, gpuBytesHigh: 4 * MB, texelFloorPxPerMeter: 96 },
|
|
18
|
+
"prop-large": { id: "prop-large", roles: ["prop"], trianglesFloor: 500, trianglesTarget: 4_000, trianglesCeiling: 15_000, gameplayCamera: { distance: 6, fovDegrees: 50 }, fileBytesHigh: 1 * MB, fileBytesMobile: 0.5 * MB, gpuBytesHigh: 4 * MB, texelFloorPxPerMeter: 96 },
|
|
19
|
+
"prop-small": { id: "prop-small", roles: ["prop", "set-dressing"], trianglesFloor: 100, trianglesTarget: 1_000, trianglesCeiling: 5_000, gameplayCamera: { distance: 3, fovDegrees: 50 }, fileBytesHigh: 0.3 * MB, fileBytesMobile: 0.15 * MB, gpuBytesHigh: 1.5 * MB, texelFloorPxPerMeter: 96 },
|
|
20
|
+
"world-chunk": { id: "world-chunk", roles: ["world", "environment"], trianglesTarget: 120_000, trianglesCeiling: 250_000, gameplayCamera: { distance: 15, fovDegrees: 55 }, fileBytesHigh: 8 * MB, fileBytesMobile: 4 * MB, gpuBytesHigh: 32 * MB, texelFloorPxPerMeter: 64 },
|
|
21
|
+
"track": { id: "track", roles: ["track"], trianglesTarget: 60_000, trianglesCeiling: 150_000, gameplayCamera: { distance: 15, fovDegrees: 55 }, fileBytesHigh: 6 * MB, fileBytesMobile: 3 * MB, gpuBytesHigh: 24 * MB, texelFloorPxPerMeter: 64 },
|
|
22
|
+
"backdrop": { id: "backdrop", roles: ["backdrop"], trianglesFloor: 4, trianglesCeiling: 2_000, gameplayCamera: { distance: 30, fovDegrees: 55 }, fileBytesHigh: 1.5 * MB, fileBytesMobile: 0.6 * MB, gpuBytesHigh: 6 * MB },
|
|
23
|
+
"hdri": { id: "hdri", roles: ["hdri", "environment"], fileBytesHigh: 7 * MB, fileBytesMobile: 1.7 * MB },
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* §6.2 role→profile resolution. `bounds` disambiguates `prop` into
|
|
27
|
+
* `prop-large` (≥ 1 m gameplay-relevant) vs `prop-small` (< 1 m). Roles that
|
|
28
|
+
* carry no geometry profile (proxy, debug, abstract, unknown, audio,
|
|
29
|
+
* texture-set, vfx-atlas) return undefined — geometry gates record
|
|
30
|
+
* `waived-by-role` for them.
|
|
31
|
+
*/
|
|
32
|
+
export function profileForRole(role, bounds) {
|
|
33
|
+
switch (role) {
|
|
34
|
+
case "character":
|
|
35
|
+
case "hero":
|
|
36
|
+
return ADMISSION_PROFILES["hero-character"];
|
|
37
|
+
case "enemy":
|
|
38
|
+
return ADMISSION_PROFILES["npc-character"];
|
|
39
|
+
case "vehicle":
|
|
40
|
+
return ADMISSION_PROFILES["hero-vehicle"];
|
|
41
|
+
case "product":
|
|
42
|
+
return ADMISSION_PROFILES["product"];
|
|
43
|
+
case "weapon":
|
|
44
|
+
return ADMISSION_PROFILES["weapon"];
|
|
45
|
+
case "prop": {
|
|
46
|
+
const maxDimension = bounds !== undefined && bounds.length > 0 ? Math.max(...bounds) : 0;
|
|
47
|
+
return maxDimension >= 1 ? ADMISSION_PROFILES["prop-large"] : ADMISSION_PROFILES["prop-small"];
|
|
48
|
+
}
|
|
49
|
+
case "set-dressing":
|
|
50
|
+
return ADMISSION_PROFILES["prop-small"];
|
|
51
|
+
case "world":
|
|
52
|
+
case "environment":
|
|
53
|
+
return ADMISSION_PROFILES["world-chunk"];
|
|
54
|
+
case "track":
|
|
55
|
+
return ADMISSION_PROFILES["track"];
|
|
56
|
+
case "backdrop":
|
|
57
|
+
return ADMISSION_PROFILES["backdrop"];
|
|
58
|
+
case "hdri":
|
|
59
|
+
return ADMISSION_PROFILES["hdri"];
|
|
60
|
+
default:
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* G3 role coverage (PRD-05 §6.4): character/vehicle/product/weapon/world/
|
|
66
|
+
* track/environment, plus `prop` only when it resolves to `prop-large`
|
|
67
|
+
* (hero/enemy map onto the character profiles). Takes no free text — the
|
|
68
|
+
* deleted `requiresTextureEvidence` regex waiver is gone for good.
|
|
69
|
+
*/
|
|
70
|
+
export function requiresPbrTextures(role, profile) {
|
|
71
|
+
// Fail-safe: an undeclared/unknown role can claim no exemption — release
|
|
72
|
+
// admission treats it as texture-required. Roles that resolve to a real
|
|
73
|
+
// non-PBR profile (prop-small via prop/set-dressing, backdrop, hdri) or no
|
|
74
|
+
// profile at all (proxy, debug, abstract, texture-set, vfx-atlas, audio)
|
|
75
|
+
// are legitimately waived.
|
|
76
|
+
if (role === undefined || role === "unknown")
|
|
77
|
+
return true;
|
|
78
|
+
return profile !== undefined && PBR_REQUIRED_PROFILES.has(profile.id);
|
|
79
|
+
}
|
|
80
|
+
const PBR_REQUIRED_PROFILES = new Set([
|
|
81
|
+
"hero-character",
|
|
82
|
+
"npc-character",
|
|
83
|
+
"hero-vehicle",
|
|
84
|
+
"traffic-vehicle",
|
|
85
|
+
"product",
|
|
86
|
+
"weapon",
|
|
87
|
+
"prop-large",
|
|
88
|
+
"world-chunk",
|
|
89
|
+
"track",
|
|
90
|
+
]);
|
|
91
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/admission/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `A3D_QR_ASSETS` env resolution for CLI write paths (CONTRACTS §5.2).
|
|
3
|
+
*
|
|
4
|
+
* The engine's `resolveQrFlags` lives in `@aura3d/engine` which `@aura3d/cli`
|
|
5
|
+
* does not depend on, so this mirrors its env-source semantics exactly:
|
|
6
|
+
* `A3D_QR` list (`all`, `none`, comma tokens with `-name` negations and
|
|
7
|
+
* `name=value`) applies first, then per-flag `A3D_QR_ASSETS`, with first-set
|
|
8
|
+
* winning — identical to `applyList`/`applyPerFlagEnv`/`setEntry` in
|
|
9
|
+
* `packages/engine/src/contracts/flags.ts`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function qrAssetsFlagEnabled(env?: Readonly<Record<string, string | undefined>>): boolean;
|
|
12
|
+
//# sourceMappingURL=qrFlags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrFlags.d.ts","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/admission/qrFlags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GAAG,OAAO,CAsB5G"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `A3D_QR_ASSETS` env resolution for CLI write paths (CONTRACTS §5.2).
|
|
3
|
+
*
|
|
4
|
+
* The engine's `resolveQrFlags` lives in `@aura3d/engine` which `@aura3d/cli`
|
|
5
|
+
* does not depend on, so this mirrors its env-source semantics exactly:
|
|
6
|
+
* `A3D_QR` list (`all`, `none`, comma tokens with `-name` negations and
|
|
7
|
+
* `name=value`) applies first, then per-flag `A3D_QR_ASSETS`, with first-set
|
|
8
|
+
* winning — identical to `applyList`/`applyPerFlagEnv`/`setEntry` in
|
|
9
|
+
* `packages/engine/src/contracts/flags.ts`.
|
|
10
|
+
*/
|
|
11
|
+
const LANE_FLAG = "A3D_QR_ASSETS";
|
|
12
|
+
function truthy(value) {
|
|
13
|
+
if (value === undefined)
|
|
14
|
+
return undefined;
|
|
15
|
+
if (value === "0" || value === "off" || value === "false" || value === "")
|
|
16
|
+
return false;
|
|
17
|
+
if (value === "1" || value === "on" || value === "true")
|
|
18
|
+
return true;
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
export function qrAssetsFlagEnabled(env = process.env) {
|
|
22
|
+
let resolved;
|
|
23
|
+
const list = env.A3D_QR ?? env.VITE_A3D_QR;
|
|
24
|
+
if (list !== undefined) {
|
|
25
|
+
const trimmed = list.trim();
|
|
26
|
+
if (trimmed === "all")
|
|
27
|
+
resolved = true;
|
|
28
|
+
else if (trimmed === "none" || trimmed === "")
|
|
29
|
+
resolved = false;
|
|
30
|
+
else {
|
|
31
|
+
for (const token of trimmed.split(",")) {
|
|
32
|
+
const t = token.trim();
|
|
33
|
+
if (!t)
|
|
34
|
+
continue;
|
|
35
|
+
const negated = t.startsWith("-");
|
|
36
|
+
const body = negated ? t.slice(1) : t;
|
|
37
|
+
const eq = body.indexOf("=");
|
|
38
|
+
const name = eq >= 0 ? body.slice(0, eq) : body;
|
|
39
|
+
if (name.toLowerCase() !== "assets")
|
|
40
|
+
continue;
|
|
41
|
+
resolved ??= negated ? false : truthy(eq >= 0 ? body.slice(eq + 1) : "1");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
resolved ??= truthy(env[LANE_FLAG]);
|
|
46
|
+
return resolved === true;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=qrFlags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrFlags.js","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/admission/qrFlags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,SAAS,GAAG,eAAe,CAAC;AAElC,SAAS,MAAM,CAAC,KAAyB;IACvC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACxF,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAoD,OAAO,CAAC,GAAG;IACjG,IAAI,QAA6B,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC;IAC3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK;YAAE,QAAQ,GAAG,IAAI,CAAC;aAClC,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,EAAE;YAAE,QAAQ,GAAG,KAAK,CAAC;aAC3D,CAAC;YACJ,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,CAAC;oBAAE,SAAS;gBACjB,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAClC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC7B,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChD,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ;oBAAE,SAAS;gBAC9C,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;IACD,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACpC,OAAO,QAAQ,KAAK,IAAI,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AssetQualityCheck } from "../contracts/assetManifest.js";
|
|
2
|
+
export interface RouteAssetResult {
|
|
3
|
+
readonly assetId: string;
|
|
4
|
+
readonly files: readonly string[];
|
|
5
|
+
readonly quality?: string;
|
|
6
|
+
readonly role?: string;
|
|
7
|
+
readonly checks: readonly AssetQualityCheck[];
|
|
8
|
+
readonly failures: readonly string[];
|
|
9
|
+
readonly rendererIssues: readonly string[];
|
|
10
|
+
}
|
|
11
|
+
export interface RouteValidationReport {
|
|
12
|
+
readonly ok: boolean;
|
|
13
|
+
/** CLI print contract: failures, else a summary line. */
|
|
14
|
+
readonly messages: readonly string[];
|
|
15
|
+
readonly route: string;
|
|
16
|
+
readonly release: boolean;
|
|
17
|
+
readonly assets: readonly RouteAssetResult[];
|
|
18
|
+
/** Route-level failures (missing assets, quality bar, proxy roles, G10 mix). */
|
|
19
|
+
readonly failures: readonly string[];
|
|
20
|
+
readonly warnings: readonly string[];
|
|
21
|
+
/** Distinct art-direction ids seen; >1 without `mix` groups fails G10 route coherence. */
|
|
22
|
+
readonly artDirectionIds: readonly string[];
|
|
23
|
+
readonly needsGroupSheet: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validates every `assets.<id>` referenced under `route` against the full
|
|
27
|
+
* §6.4 gate set. `release=true` requires `quality === "release"` AND all
|
|
28
|
+
* gates green; without `--release` the same table is reported as warnings.
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateRouteAssets(options: {
|
|
31
|
+
readonly projectDir: string;
|
|
32
|
+
readonly route: string;
|
|
33
|
+
readonly release?: boolean;
|
|
34
|
+
readonly repoRoot?: string;
|
|
35
|
+
}): Promise<RouteValidationReport>;
|
|
36
|
+
//# sourceMappingURL=routeGates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeGates.d.ts","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/admission/routeGates.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AASvE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC7C,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,0FAA0F;IAC1F,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AA+BD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAqFjC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-05 §6.4 route admission — `assets validate --release --route apps/<app>`.
|
|
3
|
+
*
|
|
4
|
+
* AST-scans the route's sources for `assets.<id>` usages (the same scan
|
|
5
|
+
* `assets validate` already runs) and applies every admission gate G1–G11
|
|
6
|
+
* per referenced asset. The route fails when a referenced asset:
|
|
7
|
+
* - holds `quality` below the requested bar (`release` here),
|
|
8
|
+
* - holds role `proxy` (builder-provenance stand-in), or
|
|
9
|
+
* - fails any gate that could be measured now.
|
|
10
|
+
*
|
|
11
|
+
* G10 route coherence: more than one distinct `artDirection` id across the
|
|
12
|
+
* route's assets requires each doc to declare a `mix` group (and the route
|
|
13
|
+
* needs a group contact sheet ≥ 6 frames — recorded as `needsGroupSheet`).
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync } from "node:fs";
|
|
16
|
+
import { dirname, resolve } from "node:path";
|
|
17
|
+
import { readAssetManifest } from "../asset-manifest.js";
|
|
18
|
+
import { validateAssetSource } from "../asset-source-validation.js";
|
|
19
|
+
import { hasStylizedFlatApproval, readArtDirectionDocument } from "./artDirection.js";
|
|
20
|
+
import { admissionModelFromGltf, readAdmissionGltf } from "./glb.js";
|
|
21
|
+
import { runAdmissionGates } from "./gates.js";
|
|
22
|
+
import { measureTexelDensity } from "./texel.js";
|
|
23
|
+
import { measureTextureSanity } from "./textureStats.js";
|
|
24
|
+
import { profileForRole } from "./profiles.js";
|
|
25
|
+
function entryContext(entry, projectDir) {
|
|
26
|
+
return {
|
|
27
|
+
id: entry.id,
|
|
28
|
+
role: entry.role,
|
|
29
|
+
quality: entry.quality,
|
|
30
|
+
sourcePath: entry.provenance?.sourcePath ?? entry.source,
|
|
31
|
+
generationProvider: entry.provenance?.generation?.provider,
|
|
32
|
+
derivedPresent: entry.derived !== undefined,
|
|
33
|
+
stylizedFlatApproved: hasStylizedFlatApproval(projectDir, entry),
|
|
34
|
+
artDirection: entry.artDirection,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function measuredFor(projectDir, entry, model, file, bin, json, repoRoot) {
|
|
38
|
+
const profile = profileForRole(entry.role, model.boundsSize);
|
|
39
|
+
const camera = entry.gameplayCamera ?? profile?.gameplayCamera;
|
|
40
|
+
return {
|
|
41
|
+
texelDensity: camera ? measureTexelDensity(json, bin, { distance: camera.distance, fovDegrees: camera.fovDegrees, viewportWidth: 1920, viewportHeight: 1080 }) : undefined,
|
|
42
|
+
texelDensityMobile: camera ? measureTexelDensity(json, bin, { distance: camera.distance, fovDegrees: camera.fovDegrees, viewportWidth: 390, viewportHeight: 844 }) : undefined,
|
|
43
|
+
textureSanity: await measureTextureSanity(json, bin, dirname(file), repoRoot),
|
|
44
|
+
derivedFileBytes: entry.derived?.measurements?.after?.fileBytes ?? entry.derived?.measurements?.after?.downloadBytes,
|
|
45
|
+
gpuBytesHigh: entry.derived?.measurements?.after?.gpuBytesByTier?.high,
|
|
46
|
+
drawCalls: entry.derived?.measurements?.after?.drawCalls,
|
|
47
|
+
lookDev: entry.lookDev,
|
|
48
|
+
auraScore: typeof entry.lookDev?.metrics?.["auraScore"] === "number" ? entry.lookDev.metrics["auraScore"] : undefined,
|
|
49
|
+
artDirectionDoc: entry.artDirection ? readArtDirectionDocument(projectDir, entry.artDirection) ?? undefined : undefined,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Validates every `assets.<id>` referenced under `route` against the full
|
|
54
|
+
* §6.4 gate set. `release=true` requires `quality === "release"` AND all
|
|
55
|
+
* gates green; without `--release` the same table is reported as warnings.
|
|
56
|
+
*/
|
|
57
|
+
export async function validateRouteAssets(options) {
|
|
58
|
+
const projectDir = resolve(options.projectDir);
|
|
59
|
+
const routeDir = resolve(projectDir, options.route);
|
|
60
|
+
const release = options.release === true;
|
|
61
|
+
const manifest = readAssetManifest(projectDir);
|
|
62
|
+
const failures = [];
|
|
63
|
+
const warnings = [];
|
|
64
|
+
if (!existsSync(routeDir)) {
|
|
65
|
+
const missing = `Route directory does not exist: ${options.route}`;
|
|
66
|
+
return { ok: false, messages: [missing], route: options.route, release, assets: [], failures: [missing], warnings, artDirectionIds: [], needsGroupSheet: false };
|
|
67
|
+
}
|
|
68
|
+
const source = validateAssetSource(projectDir, options.route, manifest);
|
|
69
|
+
failures.push(...source.failures);
|
|
70
|
+
warnings.push(...source.warnings);
|
|
71
|
+
const assetIds = Object.keys(source.filesByAsset).sort();
|
|
72
|
+
const results = [];
|
|
73
|
+
const repoRoot = options.repoRoot ?? projectDir;
|
|
74
|
+
for (const assetId of assetIds) {
|
|
75
|
+
const files = source.filesByAsset[assetId] ?? [];
|
|
76
|
+
const entry = manifest.assets.find((asset) => asset.id === assetId);
|
|
77
|
+
if (!entry) {
|
|
78
|
+
results.push({ assetId, files, checks: [], failures: [`${assetId}: referenced by ${files.join(", ")} but absent from the manifest.`], rendererIssues: [] });
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const entryFailures = [];
|
|
82
|
+
if (release && entry.quality !== "release") {
|
|
83
|
+
entryFailures.push(`${assetId}: quality "${entry.quality ?? "unknown"}" is below release — run \`assets admit ${assetId} --quality release\`.`);
|
|
84
|
+
}
|
|
85
|
+
if (release && entry.role === "proxy") {
|
|
86
|
+
entryFailures.push(`${assetId}: role "proxy" (builder provenance) cannot ship on a release route.`);
|
|
87
|
+
}
|
|
88
|
+
const file = resolve(projectDir, entry.derived?.outputPath ?? entry.outputPath);
|
|
89
|
+
let checks = [];
|
|
90
|
+
let rendererIssues = [];
|
|
91
|
+
if ((entry.format === "glb" || entry.format === "gltf") && existsSync(file)) {
|
|
92
|
+
const glb = readAdmissionGltf(file);
|
|
93
|
+
const model = admissionModelFromGltf(glb.json);
|
|
94
|
+
const measured = await measuredFor(projectDir, entry, model, file, glb.bin, glb.json, repoRoot);
|
|
95
|
+
checks = runAdmissionGates(model, entryContext(entry, projectDir), measured);
|
|
96
|
+
entryFailures.push(...checks.filter((c) => c.verdict === "fail").map((c) => `${assetId}: ${c.message}`));
|
|
97
|
+
rendererIssues = checks.filter((c) => c.rendererIssue === true).map((c) => `${assetId}: ${c.message}`);
|
|
98
|
+
}
|
|
99
|
+
else if (!existsSync(file)) {
|
|
100
|
+
entryFailures.push(`${assetId}: missing file ${entry.outputPath}`);
|
|
101
|
+
}
|
|
102
|
+
results.push({
|
|
103
|
+
assetId,
|
|
104
|
+
files,
|
|
105
|
+
quality: entry.quality,
|
|
106
|
+
role: entry.role,
|
|
107
|
+
checks,
|
|
108
|
+
failures: entryFailures,
|
|
109
|
+
rendererIssues,
|
|
110
|
+
});
|
|
111
|
+
failures.push(...entryFailures);
|
|
112
|
+
}
|
|
113
|
+
// G10 route coherence: multiple art-direction ids need mix grouping.
|
|
114
|
+
const artDirectionIds = [...new Set(results.flatMap((r) => {
|
|
115
|
+
const entry = manifest.assets.find((a) => a.id === r.assetId);
|
|
116
|
+
return entry?.artDirection ? [entry.artDirection] : [];
|
|
117
|
+
}))].sort();
|
|
118
|
+
let needsGroupSheet = false;
|
|
119
|
+
if (artDirectionIds.length > 1) {
|
|
120
|
+
needsGroupSheet = true;
|
|
121
|
+
const missing = artDirectionIds.filter((id) => {
|
|
122
|
+
const doc = readArtDirectionDocument(projectDir, id);
|
|
123
|
+
return !doc?.mix;
|
|
124
|
+
});
|
|
125
|
+
if (missing.length > 0) {
|
|
126
|
+
failures.push(`G10 route coherence: ${missing.join(", ")} lack a "mix" group entry — routes mixing >1 art directions need mix groups + a group contact sheet (≥6 frames).`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const report = {
|
|
130
|
+
ok: failures.length === 0,
|
|
131
|
+
messages: failures.length === 0
|
|
132
|
+
? [`Route ${options.route}: ${results.length} referenced asset(s) passed the §6.4 admission table.`]
|
|
133
|
+
: failures,
|
|
134
|
+
route: options.route,
|
|
135
|
+
release,
|
|
136
|
+
assets: results,
|
|
137
|
+
failures,
|
|
138
|
+
warnings,
|
|
139
|
+
artDirectionIds,
|
|
140
|
+
needsGroupSheet,
|
|
141
|
+
};
|
|
142
|
+
return report;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=routeGates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeGates.js","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/admission/routeGates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-05 §6.4 G2 — texel-density measurement over real accessor data.
|
|
3
|
+
*
|
|
4
|
+
* For every TRIANGLES primitive with POSITION + TEXCOORD_0 (+ indices), the
|
|
5
|
+
* per-triangle density is:
|
|
6
|
+
*
|
|
7
|
+
* texelsPerMeter(tri) = sqrt(uvArea × textureW × textureH) / sqrt(worldArea)
|
|
8
|
+
* texelsPerPixel(tri) = texelsPerMeter × metersPerPixel(camera, viewport)
|
|
9
|
+
* metersPerPixel = 2 × distance × tan(fovY / 2) / viewportHeightPx
|
|
10
|
+
*
|
|
11
|
+
* Quantiles (p10/p50/p90) are area-weighted across triangles sharing a
|
|
12
|
+
* material's base-colour texture, per §6.4 "the ratio of texels per screen
|
|
13
|
+
* pixel on the asset's median-area triangles ... reported as p10/p50/p90".
|
|
14
|
+
*
|
|
15
|
+
* Texture dimensions are sniffed from image headers inside the GLB binary
|
|
16
|
+
* chunk (PNG IHDR / JPEG SOF / KTX2 header) — no image decode, no deps.
|
|
17
|
+
* Untextured materials contribute no triangles to the report (G3/G5 already
|
|
18
|
+
* cover missing textures).
|
|
19
|
+
*/
|
|
20
|
+
import type { AdmissionGltfJson } from "./glb.js";
|
|
21
|
+
export interface TexelCamera {
|
|
22
|
+
/** Camera-to-bounds-centre distance (m). */
|
|
23
|
+
readonly distance: number;
|
|
24
|
+
readonly fovDegrees: number;
|
|
25
|
+
readonly viewportWidth: number;
|
|
26
|
+
readonly viewportHeight: number;
|
|
27
|
+
}
|
|
28
|
+
export interface TexelDensityReport {
|
|
29
|
+
readonly trianglesMeasured: number;
|
|
30
|
+
/** Triangles skipped (no UVs, non-triangle mode, or untextured material). */
|
|
31
|
+
readonly trianglesSkipped: number;
|
|
32
|
+
/** texels/screen-pixel quantiles at the evaluated camera+viewport. */
|
|
33
|
+
readonly p10?: number;
|
|
34
|
+
readonly p50?: number;
|
|
35
|
+
readonly p90?: number;
|
|
36
|
+
/** Median texels/metre (camera-independent density of the mesh). */
|
|
37
|
+
readonly texelsPerMeterP50?: number;
|
|
38
|
+
readonly camera: TexelCamera;
|
|
39
|
+
/** Texture resolution the median was measured against. */
|
|
40
|
+
readonly textureSize?: readonly [number, number];
|
|
41
|
+
}
|
|
42
|
+
/** Image header sniff: PNG IHDR (BE u32 @16,20), JPEG SOF (BE u16 height/width), KTX2 (LE u32 @20,24). */
|
|
43
|
+
export declare function sniffImageSize(bytes: Buffer, mime?: string): readonly [number, number] | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Measures the texel-density report for a GLB against `camera`. Returns a
|
|
46
|
+
* report with `trianglesMeasured: 0` when no primitive can be measured —
|
|
47
|
+
* the gate treats that as "no evidence" rather than a pass.
|
|
48
|
+
*/
|
|
49
|
+
export declare function measureTexelDensity(json: AdmissionGltfJson, bin: Buffer | undefined, camera: TexelCamera): TexelDensityReport;
|
|
50
|
+
//# sourceMappingURL=texel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texel.d.ts","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/admission/texel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,6EAA6E;IAC7E,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,sEAAsE;IACtE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClD;AA0DD,0GAA0G;AAC1G,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAyBlG;AAwBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,kBAAkB,CAgF7H"}
|