@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 @@
|
|
|
1
|
+
{"version":3,"file":"perf-report.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd09/perf-report.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,UAAU,aAAa;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,UAAU,SAAS;IACjB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,SAAS,MAAM,EAAE,CAAC;IAClD,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,6EAA6E;QAC7E,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,CAAA;SAAE,CAAC;QACzC,gFAAgF;QAChF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACvC,yEAAyE;QACzE,kBAAkB,CAAC,EAAE,WAAW,CAAC;QACjC,qDAAqD;QACrD,YAAY,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QACnD,2EAA2E;QAC3E,QAAQ,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,CAAA;SAAE,CAAC;KAC9D,CAAC;CACH;AAgCD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CA8CrG;AAED,eAAO,MAAM,iBAAiB,EAAE,cAkC/B,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C-39 `aura3d perf-report` (PRD-09): replaces the per-route
|
|
3
|
+
* `write-performance-report.ts` scripts. Consumes the telemetry JSON emitted
|
|
4
|
+
* by a migrated route's `perf` evidence section (rAF frame intervals —
|
|
5
|
+
* never an engine fps counter), then writes/prints the report.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
8
|
+
import { resolve, dirname } from "node:path";
|
|
9
|
+
const P95_BUDGET_MS = 16.7; // 60 fps frame budget
|
|
10
|
+
function summarizeSpan(raw) {
|
|
11
|
+
const v = raw.filter((x) => typeof x === "number" && Number.isFinite(x) && x >= 0);
|
|
12
|
+
if (!v.length)
|
|
13
|
+
return undefined;
|
|
14
|
+
const s = [...v].sort((a, b) => a - b);
|
|
15
|
+
return {
|
|
16
|
+
samples: s.length,
|
|
17
|
+
p50Ms: +percentile(s, 0.5).toFixed(3),
|
|
18
|
+
p95Ms: +percentile(s, 0.95).toFixed(3),
|
|
19
|
+
meanMs: +(s.reduce((a, b) => a + b, 0) / s.length).toFixed(3)
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const CPU_SPAN_KEYS = ["session", "tween", "juice", "hud", "sound"];
|
|
23
|
+
function intervalsOf(perf) {
|
|
24
|
+
const obj = perf && !Array.isArray(perf) ? perf : undefined;
|
|
25
|
+
const raw = Array.isArray(perf)
|
|
26
|
+
? perf
|
|
27
|
+
: obj?.frameIntervals ?? obj?.samples ?? [];
|
|
28
|
+
return raw.filter((v) => typeof v === "number" && Number.isFinite(v) && v > 0);
|
|
29
|
+
}
|
|
30
|
+
function percentile(sorted, q) {
|
|
31
|
+
if (!sorted.length)
|
|
32
|
+
return 0;
|
|
33
|
+
const i = Math.min(sorted.length - 1, Math.ceil(q * sorted.length) - 1);
|
|
34
|
+
return sorted[i];
|
|
35
|
+
}
|
|
36
|
+
export function buildPerfReport(route, telemetry, baselineP50) {
|
|
37
|
+
const intervals = intervalsOf(telemetry.perf).sort((a, b) => a - b);
|
|
38
|
+
const p50 = percentile(intervals, 0.5);
|
|
39
|
+
const p95 = percentile(intervals, 0.95);
|
|
40
|
+
const p99 = percentile(intervals, 0.99);
|
|
41
|
+
const mean = intervals.reduce((a, b) => a + b, 0) / (intervals.length || 1);
|
|
42
|
+
const obj = telemetry.perf && !Array.isArray(telemetry.perf) ? telemetry.perf : undefined;
|
|
43
|
+
const cpuSpans = {};
|
|
44
|
+
const rawSpans = obj && typeof obj === "object" ? obj.cpuSpans : undefined;
|
|
45
|
+
if (rawSpans && typeof rawSpans === "object") {
|
|
46
|
+
for (const key of CPU_SPAN_KEYS) {
|
|
47
|
+
const v = rawSpans[key];
|
|
48
|
+
const sum = Array.isArray(v) ? summarizeSpan(v) : undefined;
|
|
49
|
+
if (sum)
|
|
50
|
+
cpuSpans[key] = sum;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const instRaw = obj ? obj.instanceTransforms : undefined;
|
|
54
|
+
const instanceTransforms = Array.isArray(instRaw) ? summarizeSpan(instRaw) : undefined;
|
|
55
|
+
const flRaw = obj ? obj.forcedLayout : undefined;
|
|
56
|
+
const forcedLayout = flRaw && typeof flRaw === "object" && typeof flRaw.events === "number"
|
|
57
|
+
? { events: flRaw.events, totalMs: +(Number(flRaw.totalMs ?? 0)).toFixed(3) }
|
|
58
|
+
: undefined;
|
|
59
|
+
const baseline = baselineP50 !== undefined
|
|
60
|
+
? { p50Ms: baselineP50, deltaMs: +(p50 - baselineP50).toFixed(3), pass: p50 <= baselineP50 + 0.5 }
|
|
61
|
+
: undefined;
|
|
62
|
+
return {
|
|
63
|
+
route,
|
|
64
|
+
generatedAt: new Date().toISOString(),
|
|
65
|
+
producer: "aura3d perf-report",
|
|
66
|
+
perf: {
|
|
67
|
+
samples: intervals.length,
|
|
68
|
+
p50Ms: +p50.toFixed(3),
|
|
69
|
+
p95Ms: +p95.toFixed(3),
|
|
70
|
+
p99Ms: +p99.toFixed(3),
|
|
71
|
+
meanMs: +mean.toFixed(3),
|
|
72
|
+
estFps: p50 > 0 ? +(1000 / p50).toFixed(1) : 0,
|
|
73
|
+
jankFrames: intervals.filter((v) => v > p50 * 2).length,
|
|
74
|
+
budget: { p95Ms: P95_BUDGET_MS, pass: p95 <= P95_BUDGET_MS },
|
|
75
|
+
...(Object.keys(cpuSpans).length ? { cpuSpans } : {}),
|
|
76
|
+
...(instanceTransforms ? { instanceTransforms } : {}),
|
|
77
|
+
...(forcedLayout ? { forcedLayout } : {}),
|
|
78
|
+
...(baseline ? { baseline } : {})
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export const perfReportCommand = {
|
|
83
|
+
name: "perf-report",
|
|
84
|
+
owner: "prd09",
|
|
85
|
+
summary: "Build a route performance report from a perf-evidence telemetry JSON (rAF intervals).",
|
|
86
|
+
usage: "aura3d perf-report --route <id> --telemetry <telemetry.json> [--out performance-report.json]",
|
|
87
|
+
async run(argv, io) {
|
|
88
|
+
const arg = (flag) => {
|
|
89
|
+
const i = argv.indexOf(flag);
|
|
90
|
+
return i >= 0 ? argv[i + 1] : undefined;
|
|
91
|
+
};
|
|
92
|
+
const route = arg("--route");
|
|
93
|
+
const telemetryPath = arg("--telemetry");
|
|
94
|
+
const baselineRaw = arg("--baseline");
|
|
95
|
+
const baselineP50 = baselineRaw !== undefined ? Number(baselineRaw) : undefined;
|
|
96
|
+
if (!route || !telemetryPath || (baselineRaw !== undefined && !Number.isFinite(baselineP50))) {
|
|
97
|
+
io.stderr(`usage: ${perfReportCommand.usage}`);
|
|
98
|
+
return 2;
|
|
99
|
+
}
|
|
100
|
+
let telemetry;
|
|
101
|
+
try {
|
|
102
|
+
telemetry = JSON.parse(readFileSync(resolve(io.cwd, telemetryPath), "utf8"));
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
io.stderr(`perf-report: cannot read ${telemetryPath}: ${String(error)}`);
|
|
106
|
+
return 2;
|
|
107
|
+
}
|
|
108
|
+
const report = buildPerfReport(route, telemetry, baselineP50);
|
|
109
|
+
const out = arg("--out") ?? `apps/${route}/performance-report.json`;
|
|
110
|
+
const target = resolve(io.cwd, out);
|
|
111
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
112
|
+
writeFileSync(target, `${JSON.stringify(report, null, 2)}\n`);
|
|
113
|
+
io.stdout(`perf-report ${route}: samples=${report.perf.samples} p50=${report.perf.p50Ms}ms p95=${report.perf.p95Ms}ms estFps=${report.perf.estFps} jank=${report.perf.jankFrames} budget=${report.perf.budget.pass ? "pass" : "FAIL"}`);
|
|
114
|
+
io.stdout(`wrote ${out}`);
|
|
115
|
+
return report.perf.budget.pass ? 0 : 1;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=perf-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-report.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd09/perf-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aura3d sfx admit <dir> --pack game-sfx-core` — PRD-09 §6.9 (C-39).
|
|
3
|
+
*
|
|
4
|
+
* Admits a directory of source audio into `assets/packs/<pack>/`:
|
|
5
|
+
* <dir>/sources.json — { "<file>": { "license", "sourceUrl", "author",
|
|
6
|
+
* "id"?, "class"?: "one-shot"|"loop"|"ambience"|"music" } }
|
|
7
|
+
* <dir>/*.ogg|wav|... — the source files referenced by sources.json
|
|
8
|
+
*
|
|
9
|
+
* Per file: requires license + sourceUrl + author, measures integrated LUFS and
|
|
10
|
+
* true peak with `packages/audio/src/game-sound/loudness.ts` on decoded PCM,
|
|
11
|
+
* masters to the §6.9 target for its class (volume gain), transcodes to
|
|
12
|
+
* Opus-in-WebM 96k + AAC-LC-in-M4A 128k with ffmpeg, and appends a C-17-named
|
|
13
|
+
* entry (`id`, `role: "audio"`, `source`, `license`, `hash`) plus the PRD-09
|
|
14
|
+
* provenance fields (`sourceUrl`, `author`, `lufs`, `truePeak`, `encodings`)
|
|
15
|
+
* into `assets/packs/<pack>/manifest.json`.
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=sfx-admit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sfx-admit.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd09/sfx-admit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aura3d sfx admit <dir> --pack game-sfx-core` — PRD-09 §6.9 (C-39).
|
|
3
|
+
*
|
|
4
|
+
* Admits a directory of source audio into `assets/packs/<pack>/`:
|
|
5
|
+
* <dir>/sources.json — { "<file>": { "license", "sourceUrl", "author",
|
|
6
|
+
* "id"?, "class"?: "one-shot"|"loop"|"ambience"|"music" } }
|
|
7
|
+
* <dir>/*.ogg|wav|... — the source files referenced by sources.json
|
|
8
|
+
*
|
|
9
|
+
* Per file: requires license + sourceUrl + author, measures integrated LUFS and
|
|
10
|
+
* true peak with `packages/audio/src/game-sound/loudness.ts` on decoded PCM,
|
|
11
|
+
* masters to the §6.9 target for its class (volume gain), transcodes to
|
|
12
|
+
* Opus-in-WebM 96k + AAC-LC-in-M4A 128k with ffmpeg, and appends a C-17-named
|
|
13
|
+
* entry (`id`, `role: "audio"`, `source`, `license`, `hash`) plus the PRD-09
|
|
14
|
+
* provenance fields (`sourceUrl`, `author`, `lufs`, `truePeak`, `encodings`)
|
|
15
|
+
* into `assets/packs/<pack>/manifest.json`.
|
|
16
|
+
*/
|
|
17
|
+
import { createHash } from "node:crypto";
|
|
18
|
+
import { execFileSync } from "node:child_process";
|
|
19
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
20
|
+
import { join, resolve } from "node:path";
|
|
21
|
+
import { gainForTarget, measureLoudness } from "@aura3d/audio";
|
|
22
|
+
import { registerCliCommand } from "../../contracts/commands.js";
|
|
23
|
+
const AUDIO_EXT = /\.(wav|ogg|mp3|flac|aiff?|webm|m4a|opus)$/i;
|
|
24
|
+
const die = (io, msg) => {
|
|
25
|
+
io.stderr(`sfx admit: ${msg}`);
|
|
26
|
+
return 1;
|
|
27
|
+
};
|
|
28
|
+
const ffmpeg = (...args) => execFileSync("ffmpeg", ["-hide_banner", "-loglevel", "error", "-y", ...args], { maxBuffer: 1 << 28 });
|
|
29
|
+
const ffprobe = (...args) => execFileSync("ffprobe", ["-v", "error", ...args], { maxBuffer: 1 << 24 }).toString("utf8").trim();
|
|
30
|
+
registerCliCommand({
|
|
31
|
+
name: "sfx admit",
|
|
32
|
+
owner: "prd09",
|
|
33
|
+
summary: "Admit source audio into an sfx pack (license + loudness + transcode)",
|
|
34
|
+
usage: "aura3d sfx admit <dir> --pack <name> [--dry-run]",
|
|
35
|
+
async run(argv, io) {
|
|
36
|
+
const dir = argv[0] && !argv[0].startsWith("-") ? resolve(io.cwd, argv[0]) : undefined;
|
|
37
|
+
const packFlag = argv.findIndex((a) => a === "--pack");
|
|
38
|
+
const pack = packFlag >= 0 ? argv[packFlag + 1] : undefined;
|
|
39
|
+
const dryRun = argv.includes("--dry-run");
|
|
40
|
+
if (!dir || !pack)
|
|
41
|
+
return die(io, "usage: aura3d sfx admit <dir> --pack <name>");
|
|
42
|
+
if (!existsSync(dir))
|
|
43
|
+
return die(io, `directory not found: ${dir}`);
|
|
44
|
+
const metaPath = join(dir, "sources.json");
|
|
45
|
+
if (!existsSync(metaPath))
|
|
46
|
+
return die(io, `missing ${metaPath} — every file needs license, sourceUrl and author`);
|
|
47
|
+
const sources = JSON.parse(readFileSync(metaPath, "utf8"));
|
|
48
|
+
try {
|
|
49
|
+
execFileSync("ffmpeg", ["-version"], { stdio: "pipe" });
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return die(io, "ffmpeg not found on PATH (required for decode + transcode)");
|
|
53
|
+
}
|
|
54
|
+
const files = readdirSync(dir).filter((f) => AUDIO_EXT.test(f)).sort();
|
|
55
|
+
if (files.length === 0)
|
|
56
|
+
return die(io, `no audio files in ${dir}`);
|
|
57
|
+
const outDir = resolve(io.cwd, "assets/packs", pack);
|
|
58
|
+
const manifestPath = join(outDir, "manifest.json");
|
|
59
|
+
const manifest = existsSync(manifestPath)
|
|
60
|
+
? JSON.parse(readFileSync(manifestPath, "utf8"))
|
|
61
|
+
: { schema: "aura3d.assets/1.1", pack, entries: [] };
|
|
62
|
+
const problems = [];
|
|
63
|
+
let admitted = 0;
|
|
64
|
+
for (const file of files) {
|
|
65
|
+
const meta = sources[file];
|
|
66
|
+
if (!meta?.license || !meta.sourceUrl || !meta.author) {
|
|
67
|
+
problems.push(`${file}: requires license, sourceUrl and author in sources.json`);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const id = meta.id ?? file.replace(AUDIO_EXT, "");
|
|
71
|
+
const src = join(dir, file);
|
|
72
|
+
const cls = meta.class ?? "one-shot";
|
|
73
|
+
// Decode to 48 kHz PCM (channels preserved) for BS.1770 measurement.
|
|
74
|
+
const channelCount = Number(ffprobe("-select_streams", "a:0", "-show_entries", "stream=channels", "-of", "csv=p=0", src)) || 1;
|
|
75
|
+
const pcm = ffmpeg("-i", src, "-f", "f32le", "-ac", String(channelCount), "-ar", "48000", "-");
|
|
76
|
+
const channels = Array.from({ length: channelCount }, (_, c) => {
|
|
77
|
+
const out = new Float32Array(pcm.length / 4 / channelCount);
|
|
78
|
+
for (let i = 0; i < out.length; i++)
|
|
79
|
+
out[i] = pcm.readFloatLE((i * channelCount + c) * 4);
|
|
80
|
+
return out;
|
|
81
|
+
});
|
|
82
|
+
const measured = measureLoudness({ channels, sampleRate: 48_000 });
|
|
83
|
+
const gainDb = gainForTarget(measured, cls);
|
|
84
|
+
const hash = createHash("sha256").update(readFileSync(src)).digest("hex").slice(0, 16);
|
|
85
|
+
const opus = `${id}.opus.webm`;
|
|
86
|
+
const aac = `${id}.m4a`;
|
|
87
|
+
if (!dryRun) {
|
|
88
|
+
mkdirSync(outDir, { recursive: true });
|
|
89
|
+
const gainFilter = gainDb === 0 ? [] : ["-af", `volume=${gainDb}dB`];
|
|
90
|
+
ffmpeg("-i", src, ...gainFilter, "-c:a", "libopus", "-b:a", "96k", join(outDir, opus));
|
|
91
|
+
ffmpeg("-i", src, ...gainFilter, "-c:a", "aac", "-b:a", "128k", join(outDir, aac));
|
|
92
|
+
}
|
|
93
|
+
manifest.entries = manifest.entries.filter((e) => e.id !== id);
|
|
94
|
+
manifest.entries.push({
|
|
95
|
+
id,
|
|
96
|
+
role: "audio",
|
|
97
|
+
source: meta.sourceUrl,
|
|
98
|
+
license: meta.license,
|
|
99
|
+
sourceUrl: meta.sourceUrl,
|
|
100
|
+
author: meta.author,
|
|
101
|
+
hash,
|
|
102
|
+
class: cls,
|
|
103
|
+
lufs: Number.isFinite(measured.lufs) ? measured.lufs : null,
|
|
104
|
+
truePeak: measured.truePeakDb,
|
|
105
|
+
gainAppliedDb: gainDb,
|
|
106
|
+
encodings: { opus: `${opus}`, aac: `${aac}` }
|
|
107
|
+
});
|
|
108
|
+
admitted += 1;
|
|
109
|
+
const lufsText = Number.isFinite(measured.lufs) ? measured.lufs.toFixed(2) : "n/a(sub-block)";
|
|
110
|
+
io.stdout(`${id}: ${cls} lufs=${lufsText} dbtp=${measured.truePeakDb.toFixed(2)} gain=${gainDb}dB${dryRun ? " (dry-run)" : ""}`);
|
|
111
|
+
}
|
|
112
|
+
if (!dryRun && admitted > 0)
|
|
113
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n");
|
|
114
|
+
for (const p of problems)
|
|
115
|
+
io.stderr(`sfx admit: ${p}`);
|
|
116
|
+
io.stdout(`sfx admit: ${admitted} admitted${dryRun ? " (dry-run)" : ""}, ${problems.length} rejected`);
|
|
117
|
+
return problems.length > 0 ? 1 : 0;
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=sfx-admit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sfx-admit.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd09/sfx-admit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd10/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C-39 lane command registrations — prd10 (CONTRACTS.md).
|
|
3
|
+
*
|
|
4
|
+
* T1.15 — `prd10-world-migrate` codemod (§10.1). Report mode is the default;
|
|
5
|
+
* `--write` rewrites only the two mechanical patterns (`water.surface`,
|
|
6
|
+
* `water.buoyancy`). Rows use the C-39 shape
|
|
7
|
+
* `{ file, line, construct, mapping, target, note }`.
|
|
8
|
+
*/
|
|
9
|
+
import { registerCodemod } from "../../contracts/commands.js";
|
|
10
|
+
const PATTERNS = [
|
|
11
|
+
{
|
|
12
|
+
re: /\bwater\.surface\s*\(/,
|
|
13
|
+
construct: "water.surface",
|
|
14
|
+
mapping: "approximate",
|
|
15
|
+
target: "world.water",
|
|
16
|
+
note: "preset maps to { kind: 'lake' | 'ocean', shape, height }; waves preset differs",
|
|
17
|
+
rewrite: { find: /\bwater\.surface\s*\(/g, replace: "world.water(" }
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
re: /\bwater\.buoyancy\s*\(/,
|
|
21
|
+
construct: "water.buoyancy",
|
|
22
|
+
mapping: "approximate",
|
|
23
|
+
target: "app.world.water(id).heightAt",
|
|
24
|
+
note: "pick the water body id; heightAt(x, z, t) returns the live surface height",
|
|
25
|
+
rewrite: { find: /\bwater\.buoyancy\s*\(/g, replace: "app.world.water(/* water body id */).heightAt(" }
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
re: /\bprefabs\.cityBlock\b|\bcity\.block\s*\(/,
|
|
29
|
+
construct: "prefabs.cityBlock / city.block",
|
|
30
|
+
mapping: "none",
|
|
31
|
+
target: "world.street + world.kits.city",
|
|
32
|
+
note: "layout differs — manual migration"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
re: /\benvironments\.studio\s*\(/,
|
|
36
|
+
construct: "environments.studio",
|
|
37
|
+
mapping: "approximate",
|
|
38
|
+
target: 'world.biome("outdoor-day")',
|
|
39
|
+
note: "when the route is an outdoor category (city-day, racing, golf)"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
re: /\blights\.ambient\s*\(/,
|
|
43
|
+
construct: "lights.ambient",
|
|
44
|
+
mapping: "none",
|
|
45
|
+
note: "no environment node — a biome is recommended (the C-09 fix is PRD 02's)"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
re: /(?:water|ocean)[\w$]*\b[^;\n]*\bmaterial\.pbr\s*\(|material\.pbr\s*\([^)]*metal(?:lic|ness)/i,
|
|
49
|
+
construct: "material.pbr metallic on water/ocean",
|
|
50
|
+
mapping: "none",
|
|
51
|
+
note: "water is a dielectric — drop metallic/metalness"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
re: /\b(?:generateTerrain|buildTerrain|createTerrain\w*)\s*\(/,
|
|
55
|
+
construct: "route-local terrain builder",
|
|
56
|
+
mapping: "none",
|
|
57
|
+
target: "world.terrain",
|
|
58
|
+
note: "route-local terrain construction — port to world.terrain (heightmap/procedural source)"
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
registerCodemod({
|
|
62
|
+
name: "prd10-world-migrate",
|
|
63
|
+
owner: "prd10",
|
|
64
|
+
description: "PRD-10 §10 migration report/rewrites: water.surface/buoyancy → world.water; " +
|
|
65
|
+
"cityBlock/city.block → world.street+kits.city; environments.studio → world.biome; " +
|
|
66
|
+
"ambient-without-env, metallic-water and route-local terrain builders (report-only).",
|
|
67
|
+
transform(source, fileName) {
|
|
68
|
+
const rows = [];
|
|
69
|
+
const lines = source.split("\n");
|
|
70
|
+
for (const pattern of PATTERNS) {
|
|
71
|
+
lines.forEach((line, i) => {
|
|
72
|
+
pattern.re.lastIndex = 0;
|
|
73
|
+
if (pattern.re.test(line)) {
|
|
74
|
+
rows.push({
|
|
75
|
+
file: fileName,
|
|
76
|
+
line: i + 1,
|
|
77
|
+
construct: pattern.construct,
|
|
78
|
+
mapping: pattern.mapping,
|
|
79
|
+
...(pattern.target ? { target: pattern.target } : {}),
|
|
80
|
+
...(pattern.note ? { note: pattern.note } : {})
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
let code = source;
|
|
86
|
+
for (const pattern of PATTERNS) {
|
|
87
|
+
if (pattern.rewrite)
|
|
88
|
+
code = code.replace(pattern.rewrite.find, pattern.rewrite.replace);
|
|
89
|
+
}
|
|
90
|
+
return { code, rows };
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
/**
|
|
94
|
+
* T3.6 §9.6 — `aura3d assets bake-impostor` (C-39). Plan + manifest modes are
|
|
95
|
+
* pure; `--execute` renders the atlas in a WebGL2 bake page on the remote
|
|
96
|
+
* macos-14 runner (Playwright + ANGLE Metal, tools/impostor-bake/bake-page.mjs).
|
|
97
|
+
*/
|
|
98
|
+
import { registerCliCommand } from "../../contracts/commands.js";
|
|
99
|
+
registerCliCommand({
|
|
100
|
+
name: "assets bake-impostor",
|
|
101
|
+
owner: "prd10",
|
|
102
|
+
summary: "Bake octahedral impostor atlases (albedo+alpha, normal+depth) for a model asset",
|
|
103
|
+
usage: "aura3d assets bake-impostor --asset <id> [--views 8] [--size 256] [--out <dir>] [--execute]",
|
|
104
|
+
async run(argv, io) {
|
|
105
|
+
const { runImpostorBake } = await import("../../../../../tools/impostor-bake/index.js");
|
|
106
|
+
return runImpostorBake(argv, io);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd10/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { AuraCodemod } from "../../contracts/commands.js";
|
|
2
|
+
export type BatchOptoutKind = "setMaterial" | "material.roughness";
|
|
3
|
+
export interface BatchOptoutRow {
|
|
4
|
+
readonly file: string;
|
|
5
|
+
readonly line: number;
|
|
6
|
+
readonly construct: string;
|
|
7
|
+
readonly mapping: "none";
|
|
8
|
+
readonly target: "batch: false";
|
|
9
|
+
readonly note: string;
|
|
10
|
+
/** Mutation kind that triggered the row. */
|
|
11
|
+
readonly kind: BatchOptoutKind;
|
|
12
|
+
/** Receiver expression before `.setMaterial(` / `.material.roughness`, when one is present. */
|
|
13
|
+
readonly node: string | null;
|
|
14
|
+
}
|
|
15
|
+
/** Scans one source file; rows are ordered by line then column. */
|
|
16
|
+
export declare function scanBatchOptout(source: string, fileName: string): BatchOptoutRow[];
|
|
17
|
+
export declare const batchOptoutCodemod: AuraCodemod;
|
|
18
|
+
/** Recursively lists scannable source files under `root`, sorted for a stable report. */
|
|
19
|
+
export declare function listSourceFiles(root: string): string[];
|
|
20
|
+
export interface BatchOptoutReport {
|
|
21
|
+
readonly schema: "prd11-batch-optout/1.0";
|
|
22
|
+
readonly codemod: "prd11-batch-optout";
|
|
23
|
+
readonly mode: "report";
|
|
24
|
+
readonly roots: readonly string[];
|
|
25
|
+
readonly filesScanned: number;
|
|
26
|
+
readonly rows: readonly BatchOptoutRow[];
|
|
27
|
+
readonly summary: {
|
|
28
|
+
readonly sites: number;
|
|
29
|
+
readonly files: number;
|
|
30
|
+
readonly apps: Readonly<Record<string, number>>;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Scans `roots` (paths relative to `cwd`) and builds the report; file paths are cwd-relative with `/`. */
|
|
34
|
+
export declare function buildBatchOptoutReport(roots: readonly string[], cwd: string): BatchOptoutReport;
|
|
35
|
+
//# sourceMappingURL=batchOptout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchOptout.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd11/batchOptout.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,oBAAoB,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,+FAA+F;IAC/F,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AA6CD,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CA8BlF;AAED,eAAO,MAAM,kBAAkB,EAAE,WAOhC,CAAC;AAKF,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBtD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;KAAE,CAAC;CACvH;AAED,2GAA2G;AAC3G,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAwB/F"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C-39 codemod `prd11-batch-optout` (PRD-11 §12.3, Q-14-11 / #121). Report mode only.
|
|
3
|
+
*
|
|
4
|
+
* Static batching (`planBatches`) merges render items whose material is stable.
|
|
5
|
+
* A node whose material is swapped (`setMaterial(`) or whose non-colour
|
|
6
|
+
* material state is mutated at runtime (`material.roughness =`) breaks that
|
|
7
|
+
* assumption: such nodes should opt out with `batch: false`. This codemod never
|
|
8
|
+
* rewrites source — `transform` returns the input unchanged and one row per
|
|
9
|
+
* mutation site, so lane 14 can review the list and add `batch: false` by hand.
|
|
10
|
+
*
|
|
11
|
+
* Runnable without the CLI codemod verb via
|
|
12
|
+
* `node scripts/migrations/prd11-batch-optout.mjs [apps] [--json <out>] [--md <out>]`
|
|
13
|
+
* (Node ≥22.18 type stripping, same pattern as tools/camera-cast-codemod).
|
|
14
|
+
* Keep this module free of runtime imports other than `node:` built-ins.
|
|
15
|
+
*/
|
|
16
|
+
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
17
|
+
import { extname, join, relative, sep } from "node:path";
|
|
18
|
+
const SET_MATERIAL = /(?:([A-Za-z_$][\w$]*(?:\??\.[A-Za-z_$][\w$]*|\[[^\]\n]*\]|\([^()\n]*\)|!)*)\??\.)?setMaterial\s*\(/g;
|
|
19
|
+
const ROUGHNESS = /(?:([A-Za-z_$][\w$]*(?:\??\.[A-Za-z_$][\w$]*|\[[^\]\n]*\]|\([^()\n]*\)|!)*)\??\.)?material\??\.roughness\s*(?:[-+*/]?=)(?!=)/g;
|
|
20
|
+
const NOTE = {
|
|
21
|
+
setMaterial: "runtime material swap: add `batch: false` to this node (PRD-11 §12.3)",
|
|
22
|
+
"material.roughness": "runtime non-colour material mutation: add `batch: false` to this node (PRD-11 §12.3)"
|
|
23
|
+
};
|
|
24
|
+
/** Removes `//` line comments and the bodies of string literals so neither can match. */
|
|
25
|
+
function codeOnly(line, state) {
|
|
26
|
+
let out = "";
|
|
27
|
+
let i = 0;
|
|
28
|
+
while (i < line.length) {
|
|
29
|
+
if (state.inBlock) {
|
|
30
|
+
const end = line.indexOf("*/", i);
|
|
31
|
+
if (end < 0)
|
|
32
|
+
return out;
|
|
33
|
+
state.inBlock = false;
|
|
34
|
+
i = end + 2;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const ch = line[i];
|
|
38
|
+
if (ch === "/" && line[i + 1] === "*") {
|
|
39
|
+
state.inBlock = true;
|
|
40
|
+
i += 2;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (ch === "/" && line[i + 1] === "/")
|
|
44
|
+
return out;
|
|
45
|
+
if (ch === "\"" || ch === "'" || ch === "`") {
|
|
46
|
+
let j = i + 1;
|
|
47
|
+
while (j < line.length && line[j] !== ch)
|
|
48
|
+
j += line[j] === "\\" ? 2 : 1;
|
|
49
|
+
out += ch + " ".repeat(Math.max(0, Math.min(j, line.length) - i - 1)) + (j < line.length ? ch : "");
|
|
50
|
+
i = j + 1;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
out += ch;
|
|
54
|
+
i++;
|
|
55
|
+
}
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
/** `function setMaterial(…) {`, a method `setMaterial(…): T {` or a signature `setMaterial(…): T;` — a definition, not a mutation site. */
|
|
59
|
+
function isDeclaration(before, from) {
|
|
60
|
+
const declarationPrefix = /(?:\bfunction\s*\*?\s*|^\s*(?:(?:public|private|protected|static|async|override)\s+)*)$/;
|
|
61
|
+
// Body (`{`) or an interface / abstract signature (`: T;`).
|
|
62
|
+
return declarationPrefix.test(before) && /^setMaterial\s*\([^)]*\)\s*(?:(?::[^={;]*)?\{|:[^={;]*;)/.test(from);
|
|
63
|
+
}
|
|
64
|
+
/** Scans one source file; rows are ordered by line then column. */
|
|
65
|
+
export function scanBatchOptout(source, fileName) {
|
|
66
|
+
const rows = [];
|
|
67
|
+
const state = { inBlock: false };
|
|
68
|
+
const lines = source.split("\n");
|
|
69
|
+
for (let index = 0; index < lines.length; index++) {
|
|
70
|
+
const code = codeOnly(lines[index], state);
|
|
71
|
+
const hits = [];
|
|
72
|
+
for (const [pattern, kind] of [[SET_MATERIAL, "setMaterial"], [ROUGHNESS, "material.roughness"]]) {
|
|
73
|
+
pattern.lastIndex = 0;
|
|
74
|
+
for (let m = pattern.exec(code); m; m = pattern.exec(code)) {
|
|
75
|
+
// `function setMaterial(` / `setMaterial(...) {` method declarations are not mutations.
|
|
76
|
+
if (kind === "setMaterial" && !m[1] && isDeclaration(code.slice(0, m.index), code.slice(m.index)))
|
|
77
|
+
continue;
|
|
78
|
+
hits.push({ col: m.index, kind, node: m[1] ?? null });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
hits.sort((a, b) => a.col - b.col);
|
|
82
|
+
for (const hit of hits) {
|
|
83
|
+
rows.push({
|
|
84
|
+
file: fileName,
|
|
85
|
+
line: index + 1,
|
|
86
|
+
construct: lines[index].trim(),
|
|
87
|
+
mapping: "none",
|
|
88
|
+
target: "batch: false",
|
|
89
|
+
note: NOTE[hit.kind],
|
|
90
|
+
kind: hit.kind,
|
|
91
|
+
node: hit.node
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return rows;
|
|
96
|
+
}
|
|
97
|
+
export const batchOptoutCodemod = {
|
|
98
|
+
name: "prd11-batch-optout",
|
|
99
|
+
owner: "prd11",
|
|
100
|
+
description: "Report-only: list nodes with runtime setMaterial( / material.roughness = mutations that need `batch: false` (PRD-11 §12.3).",
|
|
101
|
+
transform(source, fileName) {
|
|
102
|
+
return { code: source, rows: scanBatchOptout(source, fileName) };
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const SOURCE_EXTENSIONS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".mts"]);
|
|
106
|
+
const SKIP_DIRS = new Set(["node_modules", "dist", "build", ".git", "out", "coverage", ".turbo", ".vite"]);
|
|
107
|
+
/** Recursively lists scannable source files under `root`, sorted for a stable report. */
|
|
108
|
+
export function listSourceFiles(root) {
|
|
109
|
+
const files = [];
|
|
110
|
+
const walk = (dir) => {
|
|
111
|
+
for (const entry of readdirSync(dir).sort()) {
|
|
112
|
+
const path = join(dir, entry);
|
|
113
|
+
const stat = statSync(path);
|
|
114
|
+
if (stat.isDirectory()) {
|
|
115
|
+
if (!SKIP_DIRS.has(entry))
|
|
116
|
+
walk(path);
|
|
117
|
+
}
|
|
118
|
+
else if (SOURCE_EXTENSIONS.has(extname(entry)) && !/\.d\.[cm]?ts$/.test(entry)) {
|
|
119
|
+
files.push(path);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
if (statSync(root).isDirectory())
|
|
124
|
+
walk(root);
|
|
125
|
+
else
|
|
126
|
+
files.push(root);
|
|
127
|
+
return files;
|
|
128
|
+
}
|
|
129
|
+
/** Scans `roots` (paths relative to `cwd`) and builds the report; file paths are cwd-relative with `/`. */
|
|
130
|
+
export function buildBatchOptoutReport(roots, cwd) {
|
|
131
|
+
const rows = [];
|
|
132
|
+
let filesScanned = 0;
|
|
133
|
+
for (const root of roots) {
|
|
134
|
+
for (const file of listSourceFiles(join(cwd, root))) {
|
|
135
|
+
filesScanned++;
|
|
136
|
+
const name = relative(cwd, file).split(sep).join("/");
|
|
137
|
+
rows.push(...scanBatchOptout(readFileSync(file, "utf8"), name));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const apps = {};
|
|
141
|
+
for (const row of rows) {
|
|
142
|
+
const key = /^apps\/([^/]+)\//.exec(row.file)?.[1] ?? row.file.split("/")[0];
|
|
143
|
+
apps[key] = (apps[key] ?? 0) + 1;
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
schema: "prd11-batch-optout/1.0",
|
|
147
|
+
codemod: "prd11-batch-optout",
|
|
148
|
+
mode: "report",
|
|
149
|
+
roots: [...roots],
|
|
150
|
+
filesScanned,
|
|
151
|
+
rows,
|
|
152
|
+
summary: { sites: rows.length, files: new Set(rows.map((row) => row.file)).size, apps }
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=batchOptout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchOptout.js","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd11/batchOptout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/aura3d-cli/src/commands/prd11/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,CAAC"}
|