@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,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aura3d assets optimize` (PRD-05 §6.3, Phase 2).
|
|
3
|
+
*
|
|
4
|
+
* Shells to the lane-owned `tools/asset-optimize` pipeline (gltf-transform +
|
|
5
|
+
* ktx) so the CLI keeps zero new dependencies. The tool's pinned deps live in
|
|
6
|
+
* `tools/asset-optimize/` (CONTRACTS §4.4); on CI `asset-optimize.yml` runs
|
|
7
|
+
* `npm ci` there first.
|
|
8
|
+
*/
|
|
9
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
10
|
+
import { existsSync } from "node:fs";
|
|
11
|
+
import { join, resolve } from "node:path";
|
|
12
|
+
function readFlag(argv, name) {
|
|
13
|
+
const i = argv.indexOf(name);
|
|
14
|
+
const v = i >= 0 ? argv[i + 1] : undefined;
|
|
15
|
+
return v && !v.startsWith("--") ? v : undefined;
|
|
16
|
+
}
|
|
17
|
+
export function optimizeAssetsVerb(opts) {
|
|
18
|
+
const { argv, stdout, stderr } = opts;
|
|
19
|
+
const repoRoot = resolve(opts.projectDir);
|
|
20
|
+
const toolEntry = join(repoRoot, "tools", "asset-optimize", "index.ts");
|
|
21
|
+
if (!existsSync(toolEntry)) {
|
|
22
|
+
stderr("tools/asset-optimize/index.ts missing — Phase 2 not installed in this checkout.");
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
const positional = argv.filter((a) => !a.startsWith("--") && !["--profile", "--geometry", "--ktx", "--report", "--remote", "--blender"].includes(argv[argv.indexOf(a) - 1] ?? ""));
|
|
26
|
+
const ids = readFlag(argv, "--ids")?.split(",").filter(Boolean) ?? positional;
|
|
27
|
+
const dryRun = argv.includes("--dry-run");
|
|
28
|
+
const args = [
|
|
29
|
+
"--tsconfig", join(repoRoot, "tsconfig.base.json"),
|
|
30
|
+
toolEntry,
|
|
31
|
+
...(ids.length ? ["--ids", ids.join(",")] : []),
|
|
32
|
+
...(dryRun ? ["--dry-run"] : []),
|
|
33
|
+
...(argv.includes("--allow-local-small") ? ["--allow-local-small"] : []),
|
|
34
|
+
...(argv.includes("--from-generated") ? ["--from-generated"] : []),
|
|
35
|
+
...["--profile", "--geometry", "--ktx", "--report", "--remote", "--blender"].flatMap((f) => {
|
|
36
|
+
const v = readFlag(argv, f);
|
|
37
|
+
return v ? [f, v] : [];
|
|
38
|
+
})
|
|
39
|
+
];
|
|
40
|
+
const tsx = join(repoRoot, "node_modules", ".bin", process.platform === "win32" ? "tsx.cmd" : "tsx");
|
|
41
|
+
const toolDeps = join(repoRoot, "tools", "asset-optimize", "node_modules", "@gltf-transform");
|
|
42
|
+
if (!existsSync(toolDeps)) {
|
|
43
|
+
stderr("tools/asset-optimize deps not installed — run `npm ci --prefix tools/asset-optimize` (asset-optimize.yml does this on CI).");
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
const cmd = existsSync(tsx) ? tsx : "npx";
|
|
47
|
+
const cmdArgs = existsSync(tsx) ? args : ["-y", "tsx", ...args];
|
|
48
|
+
const r = spawnSync(cmd, cmdArgs, { cwd: repoRoot, stdio: "inherit" });
|
|
49
|
+
if (r.error) {
|
|
50
|
+
stderr(`optimize failed to start: ${String(r.error)}`);
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
return r.status ?? 1;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=optimize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd05/optimize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-05 Phase 6 — `assets prune`: removes files under the manifest
|
|
3
|
+
* `outputDir` (default `public/aura-assets`) that no manifest entry
|
|
4
|
+
* references via `outputPath`/`derived.*` URLs. `--dry-run` (the default)
|
|
5
|
+
* only reports; `--apply` deletes.
|
|
6
|
+
*/
|
|
7
|
+
export interface AssetPruneRow {
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly bytes: number;
|
|
10
|
+
readonly lfsPointer: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface AssetPruneResult {
|
|
13
|
+
readonly ok: boolean;
|
|
14
|
+
readonly applied: boolean;
|
|
15
|
+
readonly removed: readonly AssetPruneRow[];
|
|
16
|
+
readonly bytesFreed: number;
|
|
17
|
+
readonly referencedCount: number;
|
|
18
|
+
readonly scannedCount: number;
|
|
19
|
+
readonly outputDir: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function assetsPrune(options?: {
|
|
22
|
+
readonly projectDir?: string;
|
|
23
|
+
readonly apply?: boolean;
|
|
24
|
+
readonly stdout?: (line: string) => void;
|
|
25
|
+
}): AssetPruneResult;
|
|
26
|
+
//# sourceMappingURL=prune.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd05/prune.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,GAAG,gBAAgB,CAuCxB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync, unlinkSync } from "node:fs";
|
|
2
|
+
import { join, resolve, sep } from "node:path";
|
|
3
|
+
import { readAssetManifest } from "../../asset-manifest.js";
|
|
4
|
+
export function assetsPrune(options = {}) {
|
|
5
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
6
|
+
const manifest = readAssetManifest(projectDir);
|
|
7
|
+
const outputDir = resolve(projectDir, manifest.outputDir);
|
|
8
|
+
const referenced = collectReferencedPaths(projectDir, manifest);
|
|
9
|
+
const rows = [];
|
|
10
|
+
let scanned = 0;
|
|
11
|
+
for (const file of walkFiles(outputDir)) {
|
|
12
|
+
scanned++;
|
|
13
|
+
const relativePath = relativeKey(projectDir, file);
|
|
14
|
+
if (referenced.has(relativePath))
|
|
15
|
+
continue;
|
|
16
|
+
const stat = statSync(file);
|
|
17
|
+
rows.push({ path: relativePath, bytes: stat.size, lfsPointer: isLfsPointer(file, stat.size) });
|
|
18
|
+
}
|
|
19
|
+
rows.sort((a, b) => a.path.localeCompare(b.path));
|
|
20
|
+
if (options.apply) {
|
|
21
|
+
for (const row of rows)
|
|
22
|
+
unlinkSync(resolve(projectDir, row.path));
|
|
23
|
+
}
|
|
24
|
+
const result = {
|
|
25
|
+
ok: true,
|
|
26
|
+
applied: options.apply === true,
|
|
27
|
+
removed: rows,
|
|
28
|
+
bytesFreed: rows.reduce((total, row) => total + row.bytes, 0),
|
|
29
|
+
referencedCount: referenced.size,
|
|
30
|
+
scannedCount: scanned,
|
|
31
|
+
outputDir: manifest.outputDir,
|
|
32
|
+
};
|
|
33
|
+
options.stdout?.(`${result.applied ? "Removed" : "Would remove"} ${rows.length} file(s) (${formatBytes(result.bytesFreed)}) ` +
|
|
34
|
+
`from ${manifest.outputDir}; ${scanned} scanned, ${referenced.size} manifest-referenced.` +
|
|
35
|
+
(result.applied ? "" : " Re-run with --apply to delete."));
|
|
36
|
+
const lfs = rows.filter((row) => row.lfsPointer);
|
|
37
|
+
if (lfs.length > 0) {
|
|
38
|
+
options.stdout?.(`${lfs.length} removed entr${lfs.length === 1 ? "y was" : "ies were"} LFS pointer files; git will stage the deletions.`);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
/** Every project-relative path a manifest entry may still serve. */
|
|
43
|
+
function collectReferencedPaths(projectDir, manifest) {
|
|
44
|
+
const referenced = new Set();
|
|
45
|
+
const push = (value) => {
|
|
46
|
+
if (!value)
|
|
47
|
+
return;
|
|
48
|
+
const normalized = value.startsWith("/")
|
|
49
|
+
? join("public", value) // url → public/<url>
|
|
50
|
+
: value;
|
|
51
|
+
referenced.add(relativeKey(projectDir, resolve(projectDir, normalized)));
|
|
52
|
+
};
|
|
53
|
+
const pushEntry = (asset) => {
|
|
54
|
+
push(asset.outputPath);
|
|
55
|
+
push(asset.url); // covers served path when outputPath unset
|
|
56
|
+
push(asset.thumbnailUrl);
|
|
57
|
+
const derived = asset.derived;
|
|
58
|
+
if (!derived)
|
|
59
|
+
return;
|
|
60
|
+
push(derived.outputPath);
|
|
61
|
+
push(derived.url);
|
|
62
|
+
push(derived.mobileUrl);
|
|
63
|
+
push(derived.collisionUrl);
|
|
64
|
+
};
|
|
65
|
+
for (const asset of manifest.assets)
|
|
66
|
+
pushEntry(asset);
|
|
67
|
+
return referenced;
|
|
68
|
+
}
|
|
69
|
+
function* walkFiles(dir) {
|
|
70
|
+
if (!existsSync(dir))
|
|
71
|
+
return;
|
|
72
|
+
const stack = [dir];
|
|
73
|
+
while (stack.length > 0) {
|
|
74
|
+
const current = stack.pop();
|
|
75
|
+
for (const entry of readdirSync(current, { withFileTypes: true })) {
|
|
76
|
+
const path = join(current, entry.name);
|
|
77
|
+
if (entry.isDirectory())
|
|
78
|
+
stack.push(path);
|
|
79
|
+
else if (entry.isFile())
|
|
80
|
+
yield path;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function relativeKey(projectDir, path) {
|
|
85
|
+
return path.slice(projectDir.length + (projectDir.endsWith(sep) ? 0 : 1)).split(sep).join("/");
|
|
86
|
+
}
|
|
87
|
+
function isLfsPointer(path, size) {
|
|
88
|
+
if (size > 1024)
|
|
89
|
+
return false;
|
|
90
|
+
try {
|
|
91
|
+
return readFileSync(path, "utf8").startsWith("version https://git-lfs.github.com/spec/v1");
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function formatBytes(bytes) {
|
|
98
|
+
if (bytes >= 1_048_576)
|
|
99
|
+
return `${(bytes / 1_048_576).toFixed(1)} MB`;
|
|
100
|
+
if (bytes >= 1024)
|
|
101
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
102
|
+
return `${bytes} B`;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=prune.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd05/prune.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aura3d assets review <id> --judge human|vision-model --judge-id <id>
|
|
3
|
+
* --score N --axes k=v,... --notes "..." [--verdict accept|reject]`
|
|
4
|
+
*
|
|
5
|
+
* Appends a C-32-shaped review to the entry's `lookDev.reviews` bound to the
|
|
6
|
+
* derived (or source) hash (PRD-05 §6.4 G9 record; §7.1).
|
|
7
|
+
*/
|
|
8
|
+
export interface ReviewOptions {
|
|
9
|
+
readonly projectDir: string;
|
|
10
|
+
readonly assetId: string;
|
|
11
|
+
readonly judge: "human" | "vision-model";
|
|
12
|
+
readonly judgeId: string;
|
|
13
|
+
readonly reviewer: string;
|
|
14
|
+
readonly score?: number;
|
|
15
|
+
readonly axes?: Readonly<Record<string, number>>;
|
|
16
|
+
readonly notes: string;
|
|
17
|
+
readonly verdict?: "accept" | "reject";
|
|
18
|
+
}
|
|
19
|
+
export declare function reviewAsset(options: ReviewOptions): {
|
|
20
|
+
readonly ok: boolean;
|
|
21
|
+
readonly wroteManifest: boolean;
|
|
22
|
+
readonly message: string;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd05/review.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACxC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA4BvI"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aura3d assets review <id> --judge human|vision-model --judge-id <id>
|
|
3
|
+
* --score N --axes k=v,... --notes "..." [--verdict accept|reject]`
|
|
4
|
+
*
|
|
5
|
+
* Appends a C-32-shaped review to the entry's `lookDev.reviews` bound to the
|
|
6
|
+
* derived (or source) hash (PRD-05 §6.4 G9 record; §7.1).
|
|
7
|
+
*/
|
|
8
|
+
import { resolve } from "node:path";
|
|
9
|
+
import { readAssetManifest, writeAssetManifest, writeTypedAssets } from "../../asset-manifest.js";
|
|
10
|
+
export function reviewAsset(options) {
|
|
11
|
+
const projectDir = resolve(options.projectDir);
|
|
12
|
+
const manifest = readAssetManifest(projectDir);
|
|
13
|
+
const entry = manifest.assets.find((asset) => asset.id === options.assetId);
|
|
14
|
+
if (!entry)
|
|
15
|
+
return { ok: false, wroteManifest: false, message: `Asset "${options.assetId}" is not in the manifest.` };
|
|
16
|
+
const boundHash = entry.derived?.hash ?? entry.hash;
|
|
17
|
+
const verdict = options.verdict ?? ((options.score ?? 0) >= 6.5 ? "accept" : "reject");
|
|
18
|
+
const previous = entry.lookDev ?? { runUrl: "", reviews: [] };
|
|
19
|
+
const lookDev = {
|
|
20
|
+
...previous,
|
|
21
|
+
derivedHash: boundHash,
|
|
22
|
+
reviews: [
|
|
23
|
+
...previous.reviews,
|
|
24
|
+
{
|
|
25
|
+
reviewer: options.reviewer,
|
|
26
|
+
verdict,
|
|
27
|
+
notes: options.notes,
|
|
28
|
+
at: new Date().toISOString(),
|
|
29
|
+
judge: { kind: options.judge, id: options.judgeId },
|
|
30
|
+
...(options.score !== undefined ? { score: options.score } : {}),
|
|
31
|
+
...(options.axes !== undefined ? { axes: options.axes } : {}),
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
};
|
|
35
|
+
const next = { ...manifest, assets: manifest.assets.map((asset) => (asset.id === entry.id ? { ...asset, lookDev } : asset)) };
|
|
36
|
+
writeAssetManifest(projectDir, next);
|
|
37
|
+
writeTypedAssets(projectDir, next);
|
|
38
|
+
return { ok: true, wroteManifest: true, message: `${entry.id}: recorded ${verdict} review by ${options.reviewer} bound to ${boundHash.slice(0, 15)}.` };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd05/review.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAelG,MAAM,UAAU,WAAW,CAAC,OAAsB;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,OAAO,CAAC,OAAO,2BAA2B,EAAE,CAAC;IACtH,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvF,MAAM,QAAQ,GAA+B,KAAK,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1F,MAAM,OAAO,GAA+B;QAC1C,GAAG,QAAQ;QACX,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE;YACP,GAAG,QAAQ,CAAC,OAAO;YACnB;gBACE,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,OAAO;gBACP,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE;gBACnD,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9D;SACF;KACF,CAAC;IACF,MAAM,IAAI,GAAG,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAC9H,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACnC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,EAAE,cAAc,OAAO,cAAc,OAAO,CAAC,QAAQ,aAAa,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;AAC1J,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd06/index.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C-39 lane command registrations — prd06 registers its `aura3d` commands
|
|
3
|
+
* here via registerCliCommand (CONTRACTS.md).
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync } from "node:fs";
|
|
6
|
+
import { createRequire } from "node:module";
|
|
7
|
+
import { registerCliCommand, registerCodemod } from "../../contracts/commands.js";
|
|
8
|
+
import { inspectAnimationClips, readGlbDocument } from "./inspectAnimationClips.js";
|
|
9
|
+
import { validateHeroGlb } from "./validateHero.js";
|
|
10
|
+
import { parseAnimationClipMap } from "../../animation-asset-validator.js";
|
|
11
|
+
/**
|
|
12
|
+
* T0.7 — `aura3d animation inspect-clips <model.glb>` prints the resolved
|
|
13
|
+
* `{ name, duration, channelCount, hasRootMotionCandidate, frameRate? }[]`
|
|
14
|
+
* an agent feeds to `model({ animationClips })` / `animation.resolveAnimationClips`.
|
|
15
|
+
*/
|
|
16
|
+
registerCliCommand({
|
|
17
|
+
name: "animation inspect-clips",
|
|
18
|
+
owner: "prd06",
|
|
19
|
+
summary: "Print resolved GLB animation clip infos (duration, channels, root-motion) as JSON.",
|
|
20
|
+
usage: "aura3d animation inspect-clips <model.glb>",
|
|
21
|
+
run: async (argv, io) => {
|
|
22
|
+
const file = argv.find((arg) => !arg.startsWith("--"));
|
|
23
|
+
if (!file) {
|
|
24
|
+
io.stderr("Usage: aura3d animation inspect-clips <model.glb>");
|
|
25
|
+
return 1;
|
|
26
|
+
}
|
|
27
|
+
const { json, bin } = readGlbDocument(new Uint8Array(readFileSync(file)));
|
|
28
|
+
io.stdout(JSON.stringify(inspectAnimationClips(json, bin), null, 2));
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
/**
|
|
33
|
+
* T4.6 — `aura3d animation validate-hero <model.glb> [--profile
|
|
34
|
+
* hero-character|template-hero] [--map action=clip,...]` runs the §6.9 hero
|
|
35
|
+
* bar: geometry (triangles/skins/joints), texture, and the profile's required
|
|
36
|
+
* clip set with durations. Prints the report as JSON; exit 1 on any failure.
|
|
37
|
+
*/
|
|
38
|
+
registerCliCommand({
|
|
39
|
+
name: "animation validate-hero",
|
|
40
|
+
owner: "prd06",
|
|
41
|
+
summary: "Validate a character GLB against the hero-character / template-hero bar (§6.9).",
|
|
42
|
+
usage: "aura3d animation validate-hero <model.glb> [--profile hero-character|template-hero] [--map idle=Idle,run=Run]",
|
|
43
|
+
run: async (argv, io) => {
|
|
44
|
+
const file = argv.find((arg) => !arg.startsWith("--"));
|
|
45
|
+
if (!file) {
|
|
46
|
+
io.stderr("Usage: aura3d animation validate-hero <model.glb> [--profile hero-character|template-hero] [--map action=clip,...]");
|
|
47
|
+
return 1;
|
|
48
|
+
}
|
|
49
|
+
const profileArg = argv.find((arg) => arg.startsWith("--profile="))?.slice("--profile=".length)
|
|
50
|
+
?? (argv.includes("--profile") ? argv[argv.indexOf("--profile") + 1] : undefined);
|
|
51
|
+
const profile = profileArg === "template-hero" ? "template-hero" : "hero-character";
|
|
52
|
+
const mapArg = argv.find((arg) => arg.startsWith("--map="))?.slice("--map=".length)
|
|
53
|
+
?? (argv.includes("--map") ? argv[argv.indexOf("--map") + 1] : undefined);
|
|
54
|
+
const clipMap = mapArg !== undefined ? parseAnimationClipMap(mapArg) : undefined;
|
|
55
|
+
const report = validateHeroGlb(new Uint8Array(readFileSync(file)), {
|
|
56
|
+
profile,
|
|
57
|
+
...(clipMap !== undefined ? { clipMap } : {})
|
|
58
|
+
});
|
|
59
|
+
io.stdout(JSON.stringify({ profile, ok: report.ok, reasonCodes: report.reasonCodes, failures: report.failures, messages: report.messages }, null, 2));
|
|
60
|
+
return report.ok ? 0 : 1;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const requireFromHere = createRequire(import.meta.url);
|
|
64
|
+
let codemodImpl;
|
|
65
|
+
function loadCodemodTransform() {
|
|
66
|
+
if (codemodImpl === undefined) {
|
|
67
|
+
try {
|
|
68
|
+
codemodImpl = requireFromHere("../../../../../tools/codemods/animation-3.1.mjs").transform;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
throw new Error("aura3d codemod animation-3.1: implementation module " +
|
|
72
|
+
`tools/codemods/animation-3.1.mjs is not reachable (${error.message}). ` +
|
|
73
|
+
"This codemod is only available from the monorepo source tree.");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return codemodImpl;
|
|
77
|
+
}
|
|
78
|
+
registerCodemod({
|
|
79
|
+
name: "animation-3.1",
|
|
80
|
+
owner: "prd06",
|
|
81
|
+
description: "3.0 → 3.1 animation API drift: non-exact clip names at .animate/.play/resolveGLTFClipName call sites " +
|
|
82
|
+
"(vs the app's aura-assets clip universe), every `speed:` property (now applied), and " +
|
|
83
|
+
"bindRuntimeNode({applyPose}) bindings.",
|
|
84
|
+
transform: (source, fileName) => loadCodemodTransform()(source, fileName)
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd06/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-06 T0.7 — pure GLB animation-clip inspection for the
|
|
3
|
+
* `aura3d animation inspect-clips <glb>` C-39 command. Same extraction
|
|
4
|
+
* `GLTFSceneAnimationRuntime.resolvedClipInfos()` performs at load:
|
|
5
|
+
*
|
|
6
|
+
* - `duration` — the max over the clip's samplers of the input accessor's
|
|
7
|
+
* `max[0]`; when `max` is absent the accessor data is read instead.
|
|
8
|
+
* - `channelCount` — the clip's glTF channel count.
|
|
9
|
+
* - `hasRootMotionCandidate` — a hips/root/pelvis translation track whose
|
|
10
|
+
* first↔last XZ displacement exceeds 5 cm (mirrors
|
|
11
|
+
* `clipHasRootMotionCandidate` in `GLTFAnimationRuntime.ts`).
|
|
12
|
+
* - `frameRate?` — the median input-time delta, inverted (omitted when the
|
|
13
|
+
* accessor data is unavailable or degenerate).
|
|
14
|
+
*
|
|
15
|
+
* Q-05-1 asks lane 05 to call this from `inspectGltfAnimations` and emit C-17
|
|
16
|
+
* `animationClips` objects in `asset-manifest.ts`; until then this module is
|
|
17
|
+
* reached through the registered command and lane tests.
|
|
18
|
+
*/
|
|
19
|
+
export interface GltfAnimationDocument {
|
|
20
|
+
readonly accessors?: readonly {
|
|
21
|
+
readonly min?: readonly number[];
|
|
22
|
+
readonly max?: readonly number[];
|
|
23
|
+
readonly bufferView?: number;
|
|
24
|
+
readonly byteOffset?: number;
|
|
25
|
+
readonly componentType?: number;
|
|
26
|
+
readonly count?: number;
|
|
27
|
+
readonly type?: string;
|
|
28
|
+
}[];
|
|
29
|
+
readonly bufferViews?: readonly {
|
|
30
|
+
readonly buffer?: number;
|
|
31
|
+
readonly byteOffset?: number;
|
|
32
|
+
readonly byteLength?: number;
|
|
33
|
+
readonly byteStride?: number;
|
|
34
|
+
}[];
|
|
35
|
+
readonly animations?: readonly {
|
|
36
|
+
readonly name?: string;
|
|
37
|
+
readonly channels?: readonly {
|
|
38
|
+
readonly sampler?: number;
|
|
39
|
+
readonly target?: {
|
|
40
|
+
readonly node?: number;
|
|
41
|
+
readonly path?: string;
|
|
42
|
+
};
|
|
43
|
+
}[];
|
|
44
|
+
readonly samplers?: readonly {
|
|
45
|
+
readonly input?: number;
|
|
46
|
+
readonly output?: number;
|
|
47
|
+
readonly interpolation?: string;
|
|
48
|
+
}[];
|
|
49
|
+
}[];
|
|
50
|
+
readonly nodes?: readonly {
|
|
51
|
+
readonly name?: string;
|
|
52
|
+
}[];
|
|
53
|
+
/** T4.6 — hero validation needs geometry fields (meshes/skins/materials). */
|
|
54
|
+
readonly meshes?: readonly {
|
|
55
|
+
readonly primitives?: readonly {
|
|
56
|
+
readonly mode?: number;
|
|
57
|
+
readonly indices?: number;
|
|
58
|
+
readonly attributes?: {
|
|
59
|
+
readonly POSITION?: number;
|
|
60
|
+
};
|
|
61
|
+
}[];
|
|
62
|
+
}[];
|
|
63
|
+
readonly skins?: readonly {
|
|
64
|
+
readonly joints?: readonly number[];
|
|
65
|
+
}[];
|
|
66
|
+
readonly materials?: readonly {
|
|
67
|
+
readonly pbrMetallicRoughness?: {
|
|
68
|
+
readonly baseColorTexture?: unknown;
|
|
69
|
+
};
|
|
70
|
+
}[];
|
|
71
|
+
}
|
|
72
|
+
export interface AuraCliInspectedAnimationClip {
|
|
73
|
+
readonly index: number;
|
|
74
|
+
readonly name: string;
|
|
75
|
+
readonly duration: number;
|
|
76
|
+
readonly channelCount: number;
|
|
77
|
+
readonly hasRootMotionCandidate: boolean;
|
|
78
|
+
readonly frameRate?: number;
|
|
79
|
+
}
|
|
80
|
+
/** Decode a GLB buffer into its JSON document and BIN chunk. */
|
|
81
|
+
export declare function readGlbDocument(buffer: Uint8Array): {
|
|
82
|
+
readonly json: GltfAnimationDocument;
|
|
83
|
+
readonly bin?: Uint8Array;
|
|
84
|
+
};
|
|
85
|
+
export declare function inspectAnimationClips(json: GltfAnimationDocument, bin?: Uint8Array): readonly AuraCliInspectedAnimationClip[];
|
|
86
|
+
//# sourceMappingURL=inspectAnimationClips.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectAnimationClips.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd06/inspectAnimationClips.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-06 T0.7 — pure GLB animation-clip inspection for the
|
|
3
|
+
* `aura3d animation inspect-clips <glb>` C-39 command. Same extraction
|
|
4
|
+
* `GLTFSceneAnimationRuntime.resolvedClipInfos()` performs at load:
|
|
5
|
+
*
|
|
6
|
+
* - `duration` — the max over the clip's samplers of the input accessor's
|
|
7
|
+
* `max[0]`; when `max` is absent the accessor data is read instead.
|
|
8
|
+
* - `channelCount` — the clip's glTF channel count.
|
|
9
|
+
* - `hasRootMotionCandidate` — a hips/root/pelvis translation track whose
|
|
10
|
+
* first↔last XZ displacement exceeds 5 cm (mirrors
|
|
11
|
+
* `clipHasRootMotionCandidate` in `GLTFAnimationRuntime.ts`).
|
|
12
|
+
* - `frameRate?` — the median input-time delta, inverted (omitted when the
|
|
13
|
+
* accessor data is unavailable or degenerate).
|
|
14
|
+
*
|
|
15
|
+
* Q-05-1 asks lane 05 to call this from `inspectGltfAnimations` and emit C-17
|
|
16
|
+
* `animationClips` objects in `asset-manifest.ts`; until then this module is
|
|
17
|
+
* reached through the registered command and lane tests.
|
|
18
|
+
*/
|
|
19
|
+
const GLB_MAGIC = 0x46546c67;
|
|
20
|
+
const CHUNK_JSON = 0x4e4f534a;
|
|
21
|
+
const CHUNK_BIN = 0x004e4942;
|
|
22
|
+
const COMPONENT_FLOAT32 = 5126;
|
|
23
|
+
/** Decode a GLB buffer into its JSON document and BIN chunk. */
|
|
24
|
+
export function readGlbDocument(buffer) {
|
|
25
|
+
const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
26
|
+
if (buffer.byteLength < 20 || view.getUint32(0, true) !== GLB_MAGIC) {
|
|
27
|
+
throw new Error("Invalid GLB header. Suggested fix: re-export the asset as binary glTF (.glb).");
|
|
28
|
+
}
|
|
29
|
+
const total = view.getUint32(8, true);
|
|
30
|
+
if (total > buffer.byteLength) {
|
|
31
|
+
throw new Error("Invalid GLB length. Suggested fix: run assets validate on the original export.");
|
|
32
|
+
}
|
|
33
|
+
const jsonLength = view.getUint32(12, true);
|
|
34
|
+
if (view.getUint32(16, true) !== CHUNK_JSON) {
|
|
35
|
+
throw new Error("Invalid GLB JSON chunk. Suggested fix: re-export the GLB.");
|
|
36
|
+
}
|
|
37
|
+
const json = JSON.parse(new TextDecoder().decode(buffer.subarray(20, 20 + jsonLength)));
|
|
38
|
+
let bin;
|
|
39
|
+
const binHeader = 20 + jsonLength;
|
|
40
|
+
if (binHeader + 8 <= buffer.byteLength && view.getUint32(binHeader + 4, true) === CHUNK_BIN) {
|
|
41
|
+
const binLength = view.getUint32(binHeader, true);
|
|
42
|
+
bin = buffer.subarray(binHeader + 8, binHeader + 8 + Math.min(binLength, buffer.byteLength - binHeader - 8));
|
|
43
|
+
}
|
|
44
|
+
return { json, bin };
|
|
45
|
+
}
|
|
46
|
+
export function inspectAnimationClips(json, bin) {
|
|
47
|
+
const accessors = json.accessors ?? [];
|
|
48
|
+
const nodes = json.nodes ?? [];
|
|
49
|
+
return (json.animations ?? []).map((animation, index) => {
|
|
50
|
+
const channels = animation.channels ?? [];
|
|
51
|
+
const samplers = animation.samplers ?? [];
|
|
52
|
+
let duration = 0;
|
|
53
|
+
for (const channel of channels) {
|
|
54
|
+
const input = samplers[channel.sampler ?? -1]?.input;
|
|
55
|
+
if (input === undefined)
|
|
56
|
+
continue;
|
|
57
|
+
const accessorMax = accessors[input]?.max?.[0];
|
|
58
|
+
if (typeof accessorMax === "number" && Number.isFinite(accessorMax)) {
|
|
59
|
+
duration = Math.max(duration, accessorMax);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// `max` absent (legal per spec): read the last input time from accessor data.
|
|
63
|
+
const count = accessors[input]?.count ?? 0;
|
|
64
|
+
const last = count > 0 ? readScalar(json, bin, input, count - 1) : undefined;
|
|
65
|
+
if (last !== undefined)
|
|
66
|
+
duration = Math.max(duration, last);
|
|
67
|
+
}
|
|
68
|
+
const hasRootMotionCandidate = channels.some((channel) => isRootMotionCandidate(json, bin, nodes, samplers, channel));
|
|
69
|
+
const frameRate = medianFrameRate(json, bin, samplers);
|
|
70
|
+
return {
|
|
71
|
+
index,
|
|
72
|
+
name: animation.name ?? `clip-${index}`,
|
|
73
|
+
duration,
|
|
74
|
+
channelCount: channels.length,
|
|
75
|
+
hasRootMotionCandidate,
|
|
76
|
+
...(frameRate !== undefined ? { frameRate } : {})
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function isRootMotionCandidate(json, bin, nodes, samplers, channel) {
|
|
81
|
+
if (channel.target?.path !== "translation")
|
|
82
|
+
return false;
|
|
83
|
+
const nodeName = nodes[channel.target.node ?? -1]?.name ?? "";
|
|
84
|
+
if (!/hips|root|pelvis/i.test(nodeName))
|
|
85
|
+
return false;
|
|
86
|
+
const output = samplers[channel.sampler ?? -1]?.output;
|
|
87
|
+
const count = output === undefined ? 0 : json.accessors?.[output]?.count ?? 0;
|
|
88
|
+
if (count < 2)
|
|
89
|
+
return false;
|
|
90
|
+
const first = readVec3(json, bin, output, 0);
|
|
91
|
+
const last = readVec3(json, bin, output, count - 1);
|
|
92
|
+
if (!first || !last)
|
|
93
|
+
return false;
|
|
94
|
+
return Math.hypot(last[0] - first[0], last[2] - first[2]) > 0.05;
|
|
95
|
+
}
|
|
96
|
+
function medianFrameRate(json, bin, samplers) {
|
|
97
|
+
const deltas = [];
|
|
98
|
+
for (const sampler of samplers) {
|
|
99
|
+
const times = readFloatAccessor(json, bin, sampler?.input);
|
|
100
|
+
if (!times || times.length < 2)
|
|
101
|
+
continue;
|
|
102
|
+
for (let i = 1; i < times.length; i += 1) {
|
|
103
|
+
const delta = times[i] - times[i - 1];
|
|
104
|
+
if (delta > 0)
|
|
105
|
+
deltas.push(delta);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (deltas.length === 0)
|
|
109
|
+
return undefined;
|
|
110
|
+
deltas.sort((a, b) => a - b);
|
|
111
|
+
const median = deltas[Math.floor(deltas.length / 2)];
|
|
112
|
+
if (median <= 0)
|
|
113
|
+
return undefined;
|
|
114
|
+
return 1 / median;
|
|
115
|
+
}
|
|
116
|
+
function readVec3(json, bin, accessorIndex, elementIndex) {
|
|
117
|
+
if (accessorIndex === undefined)
|
|
118
|
+
return undefined;
|
|
119
|
+
const accessor = json.accessors?.[accessorIndex];
|
|
120
|
+
if (!accessor || accessor.componentType !== COMPONENT_FLOAT32 || accessor.type !== "VEC3")
|
|
121
|
+
return undefined;
|
|
122
|
+
const values = readFloatAccessor(json, bin, accessorIndex, 3);
|
|
123
|
+
if (!values)
|
|
124
|
+
return undefined;
|
|
125
|
+
const base = elementIndex * 3;
|
|
126
|
+
if (base + 2 >= values.length)
|
|
127
|
+
return undefined;
|
|
128
|
+
return [values[base], values[base + 1], values[base + 2]];
|
|
129
|
+
}
|
|
130
|
+
function readScalar(json, bin, accessorIndex, elementIndex) {
|
|
131
|
+
const values = readFloatAccessor(json, bin, accessorIndex, 1);
|
|
132
|
+
return values && elementIndex < values.length ? values[elementIndex] : undefined;
|
|
133
|
+
}
|
|
134
|
+
const floatAccessorCache = new WeakMap();
|
|
135
|
+
function readFloatAccessor(json, bin, accessorIndex, componentsPerElement = 1) {
|
|
136
|
+
if (accessorIndex === undefined || !bin)
|
|
137
|
+
return undefined;
|
|
138
|
+
const accessor = json.accessors?.[accessorIndex];
|
|
139
|
+
if (!accessor || accessor.componentType !== COMPONENT_FLOAT32)
|
|
140
|
+
return undefined;
|
|
141
|
+
const view = accessor.bufferView === undefined ? undefined : json.bufferViews?.[accessor.bufferView];
|
|
142
|
+
if (!view)
|
|
143
|
+
return undefined;
|
|
144
|
+
const cacheKey = accessorIndex * 16 + componentsPerElement;
|
|
145
|
+
let perBin = floatAccessorCache.get(bin);
|
|
146
|
+
if (perBin?.has(cacheKey))
|
|
147
|
+
return perBin.get(cacheKey);
|
|
148
|
+
const count = accessor.count ?? 0;
|
|
149
|
+
const strideBytes = view.byteStride && view.byteStride >= componentsPerElement * 4 ? view.byteStride : componentsPerElement * 4;
|
|
150
|
+
const base = (view.byteOffset ?? 0) + (accessor.byteOffset ?? 0);
|
|
151
|
+
const end = base + (count > 0 ? (count - 1) * strideBytes + componentsPerElement * 4 : 0);
|
|
152
|
+
if (end > bin.byteLength)
|
|
153
|
+
return undefined;
|
|
154
|
+
const out = new Float32Array(count * componentsPerElement);
|
|
155
|
+
for (let i = 0; i < count; i += 1) {
|
|
156
|
+
const elementBase = base + i * strideBytes;
|
|
157
|
+
for (let c = 0; c < componentsPerElement; c += 1) {
|
|
158
|
+
out[i * componentsPerElement + c] = new DataView(bin.buffer, bin.byteOffset + elementBase + c * 4, 4).getFloat32(0, true);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (!perBin) {
|
|
162
|
+
perBin = new Map();
|
|
163
|
+
floatAccessorCache.set(bin, perBin);
|
|
164
|
+
}
|
|
165
|
+
perBin.set(cacheKey, out);
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=inspectAnimationClips.js.map
|