@volter/game-editor 0.5.68 → 0.5.70
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/BUNDLED_NOTICES +10941 -5080
- package/LICENSE +9 -10
- package/LICENSE-BLENDER +2 -2
- package/NOTICE +2 -2
- package/additions/canvas/package.json +8 -0
- package/additions/canvas/src/canvas-mount.ts +46 -0
- package/additions/canvas/src/scene2d.tsx +18 -0
- package/catalog/entries/bake.json +1 -1
- package/catalog/entries/blender.json +3 -3
- package/catalog/entries/music.json +5 -5
- package/catalog/project-source/LICENSE +6 -6
- package/catalog/project-source/src/contributions/bake.kind.ts +2 -2
- package/catalog/project-source/src/contributions/builder-document.tsx +1 -1
- package/catalog/project-source/src/contributions/builder-ui.tsx +3 -3
- package/catalog/project-source/src/contributions/module-source.ts +4 -4
- package/catalog/project-source/src/lib/reflections/volume-reflection-material.ts +59 -59
- package/catalog/project-source/src/lib/static-batch/Frozen.tsx +1 -1
- package/catalog/project-source/src/lib/static-batch/mutation-watch.ts +1 -1
- package/catalog/project-source/src/tools/bake-preview.tool.ts +9 -9
- package/dist/.vite/manifest.json +4026 -4026
- package/dist/assets/{AssetBudgetPanel-P2PeL_X5.js → AssetBudgetPanel-DpXsaQ6w.js} +4 -4
- package/dist/assets/AudioViewer-BdTHfNhD.js +1 -0
- package/dist/assets/{CanvasBoardDocument-BFJdTVGp.js → CanvasBoardDocument-DY-7zohc.js} +1 -1
- package/dist/assets/CanvasSceneViewport-57CEFqSM.js +1 -0
- package/dist/assets/ColorInput-Co6tCY9p.js +1 -0
- package/dist/assets/{EntityModelDocument-Du8wIbyK.js → EntityModelDocument-C-lhKrxv.js} +1 -1
- package/dist/assets/{EnvironmentAssetDocument-_SttfMY_.js → EnvironmentAssetDocument-BNe6ANTN.js} +1 -1
- package/dist/assets/{GameplaySessionTimeline-CWudWnfd.js → GameplaySessionTimeline-CryFYfYN.js} +1 -1
- package/dist/assets/ImageViewer-DiD2yIG4.js +1 -0
- package/dist/assets/{InspectorCanvasPreview-CEr_Kxna.js → InspectorCanvasPreview-BrFjhoiD.js} +1 -1
- package/dist/assets/InspectorObjectPreview-BBVO8bDT.js +1 -0
- package/dist/assets/JsonAssetDocument-xyXetSbl.js +2 -0
- package/dist/assets/{LiveModuleDocument-BWjOzO_6.js → LiveModuleDocument-BiAunjHS.js} +1 -1
- package/dist/assets/{LutAssetDocument-DIc6nsht.js → LutAssetDocument-5sW-5rb0.js} +1 -1
- package/dist/assets/{ModelAssetDocument-_CqTsX_A.js → ModelAssetDocument-Bdy7x47a.js} +1 -1
- package/dist/assets/{NonThreeAuthoringBootstrap-C-V23E1e.js → NonThreeAuthoringBootstrap-BP-1bVEr.js} +1 -1
- package/dist/assets/Object3DDocumentToolbar-CvnSLDPI.js +1 -0
- package/dist/assets/Object3DDocumentViewport-BE_OPc8T.js +2 -0
- package/dist/assets/{Object3DPreview-BPHEr3vI.js → Object3DPreview-D3w_dKrX.js} +1 -1
- package/dist/assets/OnlineAssetDetail-BnT8_p1W.js +1 -0
- package/dist/assets/PlayBar-C8Mn-EI0.js +1 -0
- package/dist/assets/{QuarksAssetDocument-4Dne3EHx.js → QuarksAssetDocument-DLMH5Csk.js} +1 -1
- package/dist/assets/ReactCanvasControls-rNz8syVB.js +1 -0
- package/dist/assets/RootSelectionOverlay-Cn2Rbr1N.js +1 -0
- package/dist/assets/{ShaderAssetDocument-W3ZjLCkt.js → ShaderAssetDocument-CsJCsNfA.js} +4 -4
- package/dist/assets/ShadowEditor-jB05hr1W.js +1 -0
- package/dist/assets/{SourceAssetViewer-BGUeDAEv.js → SourceAssetViewer-D0NgGrER.js} +1 -1
- package/dist/assets/StageHost-B3Yt4I7r.js +2 -0
- package/dist/assets/{StoryPreviewMount-Di8uMovM.js → StoryPreviewMount-CzzRn24c.js} +1 -1
- package/dist/assets/ThreeBoardDocument-BoHTN4Vl.js +2 -0
- package/dist/assets/{ThreeIsolationSceneContent-BAKurKW5.js → ThreeIsolationSceneContent-BM-0S6J5.js} +1 -1
- package/dist/assets/{ToolObject3DPreview-CffvGJ1h.js → ToolObject3DPreview-BeM_kx_u.js} +1 -1
- package/dist/assets/Toolbar-BZyog9MR.js +1 -0
- package/dist/assets/{TransientHint-CgmkrmKF.js → TransientHint-RJEkOJoy.js} +1 -1
- package/dist/assets/VideoViewer-CxajgKrf.js +1 -0
- package/dist/assets/ViewportShadingMenu-S2lADFJg.js +1 -0
- package/dist/assets/active-ingest-CjZtqL7Q.js +3 -0
- package/dist/assets/{animation-clock-fLmY_3--.js → animation-clock-CWVW-mqY.js} +1 -1
- package/dist/assets/animation-mixers.service-CpoYw8cs.js +1 -0
- package/dist/assets/animation-timeline.utility-CEerojaB.js +1 -0
- package/dist/assets/{asset-budget-asset.menu-BDRDWrvx.js → asset-budget-asset.menu-Bk6scVWQ.js} +1 -1
- package/dist/assets/{asset-budget.action-tQmNGQHC.js → asset-budget.action-DtBDSfDj.js} +1 -1
- package/dist/assets/{asset-budget.document-BthgX37Z.js → asset-budget.document-R2zyoJ8E.js} +1 -1
- package/dist/assets/{asset-budget.menu-DfyWVH6p.js → asset-budget.menu-D6jza5Bc.js} +1 -1
- package/dist/assets/asset-editor-persistence-DrgwOZIW.js +1 -0
- package/dist/assets/asset-loaders-CUeYIjeH.js +2 -0
- package/dist/assets/{asset-preview-Cv7tfD98.js → asset-preview-CQfnI2cX.js} +1 -1
- package/dist/assets/{audio-unlock.service-BvHvZjzx.js → audio-unlock.service-W3UBKsw9.js} +1 -1
- package/dist/assets/audio.utility-qrXBdGXg.js +1 -0
- package/dist/assets/autoplay.service-DQD3Swo9.js +1 -0
- package/dist/assets/{babylon-authoring-adapter-Cg5ALSpr.js → babylon-authoring-adapter-CS9LZNmz.js} +1 -1
- package/dist/assets/binding-resolver-B9VI52zt.js +2 -0
- package/dist/assets/blender-emscripten-engine-Cd6az4pU.js +2 -0
- package/dist/assets/{blender-node-editor.document-B92MO51u.js → blender-node-editor.document-BWLFvA2g.js} +1 -1
- package/dist/assets/{blender-properties-tab-CDVyDAbf.js → blender-properties-tab-BSmWG9d0.js} +1 -1
- package/dist/assets/{blender-runtime-host-CuniE0sy.js → blender-runtime-host-Cbkie7m4.js} +2 -2
- package/dist/assets/{blender-runtime-skin-B_tOz5j5.js → blender-runtime-skin-C_ATCb-z.js} +7 -7
- package/dist/assets/{blender-runtime.document-DxUwLiEW.js → blender-runtime.document-P9zdgwMt.js} +7 -7
- package/dist/assets/{blender-timeline.document-BdEEoQbK.js → blender-timeline.document-DRwySEJO.js} +1 -1
- package/dist/assets/{blender-uv-editor.document-EMSUlRh4.js → blender-uv-editor.document-CmLoL2Vo.js} +1 -1
- package/dist/assets/blender-version.status-CP4Jqkry.js +1 -0
- package/dist/assets/blender-wali-engine-CZcS3eAd.js +2 -0
- package/dist/assets/{blender.command-BkBML2SY.js → blender.command-BYGm0Q_s.js} +1 -1
- package/dist/assets/blender.status-BMETIbb2.js +1 -0
- package/dist/assets/board-guides-BG-MHK2G.js +1 -0
- package/dist/assets/body-marks-C1LxJtQb.js +1 -0
- package/dist/assets/{bridge.command-VnplZ81v.js → bridge.command-DpUNErKN.js} +3 -3
- package/dist/assets/{browserAll-BCmkqg8n.js → browserAll-DES3i79H.js} +1 -1
- package/dist/assets/{build-player.document-DV7YcJQt.js → build-player.document-B42HrdSU.js} +1 -1
- package/dist/assets/build-profiles.document-Di5CQoH9.js +2 -0
- package/dist/assets/build-progress.status-B4te7-3j.js +1 -0
- package/dist/assets/{build-session-BGe0eGrQ.js → build-session-Yw4JoE8T.js} +2 -2
- package/dist/assets/{build.action-Bdj4ZEL_.js → build.action-B-DBpUj6.js} +1 -1
- package/dist/assets/{build.command-DAWiYvPa.js → build.command-CfWoHNp0.js} +1 -1
- package/dist/assets/build.header-BaURztYD.js +1 -0
- package/dist/assets/{build.menu-BiRNC_xc.js → build.menu-BFBn-dPJ.js} +1 -1
- package/dist/assets/{build.service-Dw9K6VSF.js → build.service-D8gYWB3n.js} +1 -1
- package/dist/assets/{camera-C-qXzXFf.js → camera-C-uR_xQp.js} +1 -1
- package/dist/assets/{camera-runtime.inspector-BDrwWRlU.js → camera-runtime.inspector-BOGGEqVq.js} +1 -1
- package/dist/assets/{canvas-design-mount-DLn49Zle.js → canvas-design-mount-DamLAaWn.js} +4 -4
- package/dist/assets/canvas-entry-runtime-a6N7Rsrj.js +2 -0
- package/dist/assets/{canvas-preview-frames-B5xFRjhQ.js → canvas-preview-frames-XbrKuyJu.js} +1 -1
- package/dist/assets/{canvas-story-capture.service-DQ_leYyi.js → canvas-story-capture.service-DYRdEzkG.js} +2 -2
- package/dist/assets/capability-coverage-7wKVA3PF.js +7 -0
- package/dist/assets/{collaboration-presence-BOS1t8wI.js → collaboration-presence-DaVKEfxs.js} +1 -1
- package/dist/assets/{collider-Bf4Uk6LW.js → collider-BEwlgkG5.js} +1 -1
- package/dist/assets/component-board.service-BWSBM2Bb.js +2 -0
- package/dist/assets/{component-board.service-DFSSCaCf.js → component-board.service-C9ZouakC.js} +2 -2
- package/dist/assets/{component-board.service-CpVXGhz5.js → component-board.service-D2eGKqHf.js} +2 -2
- package/dist/assets/component-contracts.service-D0uElctD.js +1 -0
- package/dist/assets/component-instance-root-C1Xf4SwR.js +1 -0
- package/dist/assets/{component-verbs.command-DGzZAV_Z.js → component-verbs.command-N-Tj8KOS.js} +1 -1
- package/dist/assets/{component-verbs.service-D1rVRogp.js → component-verbs.service-CWh4mQ7X.js} +1 -1
- package/dist/assets/{config-D-EAAhqP.js → config-hmmj-QHZ.js} +4 -4
- package/dist/assets/{configurations-_HZOWZPy.js → configurations-B9Pi_eRN.js} +1 -1
- package/dist/assets/connection.status-C2HPxoww.js +1 -0
- package/dist/assets/{constraint-5KLYpGm7.js → constraint-Bp1l8hY-.js} +1 -1
- package/dist/assets/constraints.inspector-D-h1f3K2.js +1 -0
- package/dist/assets/{content-bounds-DKBD7nsv.js → content-bounds-7UyI42Vj.js} +1 -1
- package/dist/assets/{contract-system-adapters-h6OUBRYA.js → contract-system-adapters-Bq1LGdjs.js} +1 -1
- package/dist/assets/coverage.service-BiBikIsV.js +3 -0
- package/dist/assets/{create-runtime-Bg2uYMfh.js → create-runtime-Cx-q5z2y.js} +2 -2
- package/dist/assets/curve-Co_mro-I.js +1 -0
- package/dist/assets/{data-asset-7Nfmx-28.js → data-asset-Ckx4D_U_.js} +1 -1
- package/dist/assets/data-check-core-CHqar_E8.js +1 -0
- package/dist/assets/data-ref-70PUrMuT.js +1 -0
- package/dist/assets/debug-bridge-CarsgKpm.js +1 -0
- package/dist/assets/debug-registry-DgYNlhH_.js +1 -0
- package/dist/assets/{deferred-ingest-play-Bej67_y9.js → deferred-ingest-play-Bpdhu2i-.js} +2 -2
- package/dist/assets/{design-time-canvas-mount-CFW9ZWuk.js → design-time-canvas-mount-Ca9Q75Ui.js} +2 -2
- package/dist/assets/design-time-layers-BIb71snu.js +1 -0
- package/dist/assets/{design-time-mount.service-DJeAPUB_.js → design-time-mount.service-DL6ZK2TQ.js} +2 -2
- package/dist/assets/{design-time-mount.service-_R1UDCw3.js → design-time-mount.service-zKUVjKAu.js} +2 -2
- package/dist/assets/design-time-react-mount-NrWimSxY.js +1 -0
- package/dist/assets/{document-preview-three-5cbuuJMH.js → document-preview-three-DoDs6q1q.js} +1 -1
- package/dist/assets/{dom-authoring-adapter-CoESNvrM.js → dom-authoring-adapter-adLQog9l.js} +1 -1
- package/dist/assets/{draco3d-Sk9K4AUT.js → draco3d-aUvQF1Zx.js} +1 -1
- package/dist/assets/{edit-mode-audio.service-CH6J-8N7.js → edit-mode-audio.service-CHZ1ultu.js} +1 -1
- package/dist/assets/edit-mode-authoring-ZQuUwc6e.js +1 -0
- package/dist/assets/{edit-mode-networking.service-C4o2pGHX.js → edit-mode-networking.service-C7fk2fL1.js} +1 -1
- package/dist/assets/editor-api-C8MUOrwt.js +1 -0
- package/dist/assets/{editor-layers-B4oYfpj8.js → editor-layers-CGX7iCSP.js} +1 -1
- package/dist/assets/editor-presentation-activity-CqJH4G9t.js +1 -0
- package/dist/assets/{editor-shell-store-Bh1S7M54.js → editor-shell-store-BRqB1JZO.js} +1 -1
- package/dist/assets/{entity-object-B_5Gc0Ky.js → entity-object--ZpqIat7.js} +1 -1
- package/dist/assets/{extend-DcEyE5jI.js → extend-BZQIQ18F.js} +1 -1
- package/dist/assets/{fork-menu-CKjNh3MO.js → fork-menu-CziehkPx.js} +1 -1
- package/dist/assets/{frame-debugger-store-D5YViF_8.js → frame-debugger-store-BOQjrPsh.js} +1 -1
- package/dist/assets/game-audio-BeCyd0Ha.js +1 -0
- package/dist/assets/{game-contract-seams-C0AVYwvO.js → game-contract-seams-Dgqv6S8X.js} +1 -1
- package/dist/assets/{game-css-scope-transform-8GOvVu1s.js → game-css-scope-transform-anfk8vP_.js} +2 -2
- package/dist/assets/game-document.service-CqmgrRUA.js +1 -0
- package/dist/assets/game-eval.command-CoetFm6_.js +2 -0
- package/dist/assets/game-module-access-Cg1EB8Mx.js +1 -0
- package/dist/assets/game-network-BqI-Ehz0.js +22 -0
- package/dist/assets/{gameplay-export-K5AcStVC.js → gameplay-export-D0hZoeSg.js} +1 -1
- package/dist/assets/gameplay-replay-BHz6VAVa.js +1 -0
- package/dist/assets/{gameplay.command-DoWqBWhH.js → gameplay.command-CPc9GKuW.js} +1 -1
- package/dist/assets/generation-CdOATubd.css +1 -0
- package/dist/assets/{generation-jobs-CiabIfR0.js → generation-jobs-D-zXQNZI.js} +1 -1
- package/dist/assets/generation.service-Bwt9lQEG.js +1 -0
- package/dist/assets/{generations-DU9rCeQR.js → generations-d-U9lCVo.js} +1 -1
- package/dist/assets/generations.status-BQ8xhaLN.js +1 -0
- package/dist/assets/hierarchy-marks-CndAXtie.js +1 -0
- package/dist/assets/hierarchy-marks-CsTaTkc7.js +1 -0
- package/dist/assets/hosted-asset-materialization-r2vKfJGY.js +2 -0
- package/dist/assets/{ibl-override-material-CiKkaOTW.js → ibl-override-material-CMo_a49U.js} +1 -1
- package/dist/assets/index-BMxv2MNV.js +1 -0
- package/dist/assets/index-BPVnvJfX.js +1 -0
- package/dist/assets/{index-C4AUQbmq.js → index-BqzpzjSB.js} +1 -1
- package/dist/assets/{index-CC1puVjo.js → index-CMU7lnXk.js} +1 -1
- package/dist/assets/index-CPiRKiDC.css +1 -0
- package/dist/assets/{index-CaG87ZF-.js → index-Cr9NTnJp.js} +271 -270
- package/dist/assets/index-DSMLYme2.js +1 -0
- package/dist/assets/index-DoGlzvsX.js +1 -0
- package/dist/assets/{index-BsYc2Oyj.js → index-dlvCCB72.js} +1 -1
- package/dist/assets/{index-Kb9_s5aP.js → index-xjc_62Ha.js} +1 -1
- package/dist/assets/{index-C20Flc1s.js → index-z0_InXxO.js} +2 -2
- package/dist/assets/{inference-diagnostics-MGcIHEX6.js → inference-diagnostics-D5jfxI5p.js} +1 -1
- package/dist/assets/{ingest-boot-viewport-D2okO6JI.js → ingest-boot-viewport-Be0v44yf.js} +1 -1
- package/dist/assets/ingest-siblings-BowXSozE.js +1 -0
- package/dist/assets/ingest-source-persistence-BGIvThcv.js +1 -0
- package/dist/assets/ingest.service-wVm-ZcTI.js +1 -0
- package/dist/assets/{inspect-C8RP8G5F.js → inspect-CN92MgRT.js} +1 -1
- package/dist/assets/inspection-D8fZOHCM.js +1 -0
- package/dist/assets/instances.command-B6gJuL1Z.js +1 -0
- package/dist/assets/{json-history-resource-CTXRV4GD.js → json-history-resource-C9G_vCX9.js} +1 -1
- package/dist/assets/{layered-pick-B_-BRrRD.js → layered-pick-D9tIz_m7.js} +1 -1
- package/dist/assets/{light-CskDQ8gF.js → light-BGbl1a8K.js} +1 -1
- package/dist/assets/{live-project-verbs-BOAQN3ME.js → live-project-verbs-p1sdTwhF.js} +1 -1
- package/dist/assets/{machine.document-BxOoCOo9.js → machine.document-C1acXU7l.js} +1 -1
- package/dist/assets/{machines.finder-CqEceWzS.js → machines.finder-sOxNTYPx.js} +1 -1
- package/dist/assets/material-D7289cYI.js +1 -0
- package/dist/assets/{material-factory-qB9pzcQf.js → material-factory-D0T-DH8c.js} +1 -1
- package/dist/assets/{mesh-5--4qA-C.js → mesh-1A-HHxD6.js} +1 -1
- package/dist/assets/model-asset-sections-D1uxOu2v.css +1 -0
- package/dist/assets/model-asset-sections.service-DF-mllTL.js +1 -0
- package/dist/assets/{model-inspection-MrJY0U_-.js → model-inspection-CuVwNVvv.js} +1 -1
- package/dist/assets/{model-thumbnail-uk-2sblh.js → model-thumbnail-xm1Fabi2.js} +1 -1
- package/dist/assets/{models.finder-rk8dhgO8.js → models.finder-DrvU1qGk.js} +1 -1
- package/dist/assets/module-mode-BHOAAbgO.js +2 -0
- package/dist/assets/mount-canvas-ingest-root-aVZkVNh4.js +2 -0
- package/dist/assets/mount-dom-ingest-root-eOOGPaxi.js +2 -0
- package/dist/assets/{mount-ingest-root-BC3-1Cw1.js → mount-ingest-root-BsWbEvr_.js} +2 -2
- package/dist/assets/{mount-manifest-QJOB11Kv.js → mount-manifest-t6ipNsoF.js} +1 -1
- package/dist/assets/mount-readiness-DyAd17pe.js +4 -0
- package/dist/assets/mount-three-ingest-root-DIR0wKrN.js +1 -0
- package/dist/assets/{mounted-authoring-B7RL_V28.js → mounted-authoring-DX3DC9PJ.js} +1 -1
- package/dist/assets/{mounted-story-viewport-source-CnYhX3vW.js → mounted-story-viewport-source-D8FqGpci.js} +1 -1
- package/dist/assets/{native-debug-module-B-rWJfWE.js → native-debug-module-CB738yQu.js} +1 -1
- package/dist/assets/{navigation-BVu-aVmF.js → navigation-B9ihB0qU.js} +1 -1
- package/dist/assets/{navmesh.menu-C3M63eR4.js → navmesh.menu-CPxr9LPT.js} +1 -1
- package/dist/assets/{navmesh.service-B0H1fUfn.js → navmesh.service-BAtili_Y.js} +1 -1
- package/dist/assets/network-observer.service-CqTuZNtI.js +1 -0
- package/dist/assets/network.utility-CclYEmfV.js +1 -0
- package/dist/assets/object-marks-BnvSuCTt.js +1 -0
- package/dist/assets/{object3d-authoring-subject-BDrxd1GA.js → object3d-authoring-subject-XccsO0xG.js} +1 -1
- package/dist/assets/{object3d-document-session-registry-OjqzJ86S.js → object3d-document-session-registry-BWeuL0nf.js} +2 -2
- package/dist/assets/{oid-transform-Bzc2ZJSH.js → oid-transform-BYeAsBKI.js} +1 -1
- package/dist/assets/{particles-Be7AvO4c.js → particles-BXiQDiB-.js} +1 -1
- package/dist/assets/{performance-profiler-OwnXQX0M.js → performance-profiler-CMbwGBuk.js} +1 -1
- package/dist/assets/pixi-authoring-adapter-CPsN0Yk7.js +1 -0
- package/dist/assets/pixi-live-write-target-BUbt5ixX.js +1 -0
- package/dist/assets/{play.command-CIGRq8ow.js → play.command-Bz5Ra6Uj.js} +2 -2
- package/dist/assets/pose-guard-CLabLSzf.js +1 -0
- package/dist/assets/presentation-C7ZHYsKF.js +1 -0
- package/dist/assets/{product-BN31wSnB.js → product-MSpbAqgo.js} +1 -1
- package/dist/assets/{profiler.action-D57Kj9ym.js → profiler.action-1Jbc-7Q4.js} +1 -1
- package/dist/assets/{profiler.menu-Dh9Q5DDx.js → profiler.menu-C544DxWZ.js} +1 -1
- package/dist/assets/profiler.utility-QnzedS3X.js +1 -0
- package/dist/assets/{project-authoring-session-LCJAwGrD.js → project-authoring-session-BhNfg7TY.js} +2 -2
- package/dist/assets/project-provenance-BGnJXJwa.js +1 -0
- package/dist/assets/{properties-bone-constraints.inspector-CaIDq5nN.js → properties-bone-constraints.inspector-DRCPfugt.js} +1 -1
- package/dist/assets/{properties-bone.inspector-D2fcQGMF.js → properties-bone.inspector-CYHeZX0p.js} +1 -1
- package/dist/assets/{properties-collection.inspector-CF5AtTAd.js → properties-collection.inspector-DtGhPkiU.js} +1 -1
- package/dist/assets/{properties-constraints.inspector-Bj2itDrS.js → properties-constraints.inspector-TIyIV777.js} +1 -1
- package/dist/assets/{properties-data.inspector-BfRqk0Xo.js → properties-data.inspector-vA0MTaup.js} +1 -1
- package/dist/assets/{properties-material.inspector-Bf8H0mvu.js → properties-material.inspector-C73spBQh.js} +1 -1
- package/dist/assets/{properties-modifiers.inspector-BKShc1TH.js → properties-modifiers.inspector-9oyLBBE0.js} +1 -1
- package/dist/assets/{properties-object.inspector-YBh8ABnN.js → properties-object.inspector-7BuiUgbd.js} +1 -1
- package/dist/assets/{properties-output.inspector-CVkzfs-l.js → properties-output.inspector-CjYAggz2.js} +1 -1
- package/dist/assets/{properties-particles.inspector-ChDpAq-2.js → properties-particles.inspector-DpSfjykX.js} +1 -1
- package/dist/assets/{properties-physics.inspector-BLEM7aMj.js → properties-physics.inspector-BUTvmfU9.js} +1 -1
- package/dist/assets/{properties-render.inspector-vU4D9xLL.js → properties-render.inspector-CEdsDqbI.js} +1 -1
- package/dist/assets/{properties-scene.inspector-C-DoN-kL.js → properties-scene.inspector-4kp0sLNw.js} +1 -1
- package/dist/assets/{properties-texture.inspector-DySxy1oU.js → properties-texture.inspector-Ckpqy9eo.js} +1 -1
- package/dist/assets/{properties-view-layer.inspector-DEKxMahJ.js → properties-view-layer.inspector-CQIFbY8-.js} +1 -1
- package/dist/assets/{properties-world.inspector-m5qL_TQV.js → properties-world.inspector-xZgNV6rI.js} +1 -1
- package/dist/assets/r3f-design-session-D8VF-hty.js +2 -0
- package/dist/assets/{r3f-physics-binding-Bgzzd4ol.js → r3f-physics-binding-oippu1v_.js} +1 -1
- package/dist/assets/{r3f-source-authoring-adapter-C8oMjdTL.js → r3f-source-authoring-adapter-CZJX6VLM.js} +1 -1
- package/dist/assets/react-canvas-navigation-DuzvnFoN.js +1 -0
- package/dist/assets/react-inspector.service-CV4p6nrb.js +1 -0
- package/dist/assets/react-story-board-mhldts6w.js +1 -0
- package/dist/assets/{react-three-rapier.esm-BR2ttgLS.js → react-three-rapier.esm-Bo9LjrZe.js} +1 -1
- package/dist/assets/react-world-authoring-adapter-CuyruDfq.js +1 -0
- package/dist/assets/{realm-services-DefTrXnY.js → realm-services-BtiLE3a-.js} +1 -1
- package/dist/assets/reflection-probe-capture.inspector-mrrOHs-9.js +1 -0
- package/dist/assets/{reflection-probe-BHNGwVyz.js → reflection-probe-sIto9mh0.js} +1 -1
- package/dist/assets/registry-DpUr2YIM.js +1 -0
- package/dist/assets/{relative-import-specifier-DQzkawgj.js → relative-import-specifier-CyT6yU4l.js} +1 -1
- package/dist/assets/{render-env-BZ7LsGfk.js → render-env-C63BGT5v.js} +1 -1
- package/dist/assets/{render-features-C7QwmhCo.js → render-features-CBl6rom9.js} +1 -1
- package/dist/assets/{render-settings-BBvkacR3.js → render-settings-DjarlnjI.js} +1 -1
- package/dist/assets/resolve-three-OiswFiIS.js +702 -0
- package/dist/assets/root-seam-contract-BYLQx4CQ.js +1 -0
- package/dist/assets/{run-selection-BUeubtHj.js → run-selection-BMu0v3qC.js} +1 -1
- package/dist/assets/scene-capture-BLf3lJ44.js +1 -0
- package/dist/assets/scene-document.service-CjPDph5k.js +2 -0
- package/dist/assets/{scene-framing-PVMqGU8h.js → scene-framing-BhNk0WhI.js} +1 -1
- package/dist/assets/{scene-index--lRWLEmW.js → scene-index-DHeKmalD.js} +1 -1
- package/dist/assets/{scene-query-s1y04OVB.js → scene-query-ByZtXA2m.js} +1 -1
- package/dist/assets/seeded-random-DmdE0u-C.js +1 -0
- package/dist/assets/{session-CTXsU1lK.js → session-CeyQA0Dv.js} +35 -35
- package/dist/assets/{setup-renderer-OOw1SykJ.js → setup-renderer-Bf8g2S0f.js} +1 -1
- package/dist/assets/{source-object3d-authoring-adapter-RmutT5Dt.js → source-object3d-authoring-adapter-IDRws2Nk.js} +1 -1
- package/dist/assets/{source-persistence-backend-HviqjKZ2.js → source-persistence-backend-Dzc6MsmN.js} +1 -1
- package/dist/assets/{spark-renderer-lifecycle-DfYpvEJa.js → spark-renderer-lifecycle-B6Axb6jm.js} +1 -1
- package/dist/assets/{stage-keyboard-DDi7S27C.js → stage-keyboard-CpnIYiph.js} +1 -1
- package/dist/assets/stage-overlay-set-BrJzOTCe.js +1 -0
- package/dist/assets/stage-presence-markers-BFTl9Djp.js +1 -0
- package/dist/assets/stage-transform-tools-QaenmSrC.js +1 -0
- package/dist/assets/standard-viewport-dressing-DuKH01r4.js +24 -0
- package/dist/assets/{state-watch.action-DEdb1mNa.js → state-watch.action-BaRZ6YII.js} +1 -1
- package/dist/assets/{state-watch.menu-jWbUM3kw.js → state-watch.menu-DR2AtQ6r.js} +1 -1
- package/dist/assets/state-watch.utility-VW8H9Fgi.js +1 -0
- package/dist/assets/{story-capture-Dj1xkeKH.js → story-capture-BEVV48wm.js} +1 -1
- package/dist/assets/story-documents-DndjqJ7Y.js +3 -0
- package/dist/assets/{story-documents.service-BzQCuNBu.js → story-documents.service-CPrZ7gRM.js} +1 -1
- package/dist/assets/{story-documents.service-iNP-ORNr.js → story-documents.service-wCVmBPhh.js} +1 -1
- package/dist/assets/{story-media-presence-zTPlU9HR.js → story-media-presence-BSX78yVJ.js} +1 -1
- package/dist/assets/{story-pixi-preview-B7THvSl7.js → story-pixi-preview-D4FuH7lJ.js} +1 -1
- package/dist/assets/{story-presentation-BLXYPadR.js → story-presentation-2AxtnKGb.js} +1 -1
- package/dist/assets/story-three-preview-DjObHSAF.js +2 -0
- package/dist/assets/{structural-ids-Br2zjINh.js → structural-ids-BOo2BRoY.js} +1 -1
- package/dist/assets/studio-environment-B--4k2mN.js +2 -0
- package/dist/assets/{surface-state-D9j6qNu8.js → surface-state-CQHVfsma.js} +1 -1
- package/dist/assets/{syntactic-prop-specs-BTnsMOvH.js → syntactic-prop-specs-CewRyC4c.js} +1 -1
- package/dist/assets/team-playtest.service-B9m6CNk7.js +1 -0
- package/dist/assets/{three-oYrcK5SQ.js → three-B86IzdNg.js} +1 -1
- package/dist/assets/three-authoring-adapter-BD8_MtYK.js +1 -0
- package/dist/assets/three-authoring.service-BjJ9wetk.js +2 -0
- package/dist/assets/{three-ingest-runtime-CXKjNysA.js → three-ingest-runtime-CXySzulx.js} +1 -1
- package/dist/assets/{three-integration-CuAnYaTW.js → three-integration-nl5TC6EF.js} +2 -2
- package/dist/assets/three-integration.service-BEk5QkKM.js +1 -0
- package/dist/assets/three-projection-core-D4m8lsPU.js +1 -0
- package/dist/assets/{three-state-wXRU3rLr.js → three-state-C36FeFK4.js} +1 -1
- package/dist/assets/{three-story-capture.service-DMJRcqjr.js → three-story-capture.service-C0icETyL.js} +2 -2
- package/dist/assets/{three-story-model-DgiAP-oQ.js → three-story-model-CqWu9S2a.js} +1 -1
- package/dist/assets/three-viewport-presentation-CCMgGLI2.js +141 -0
- package/dist/assets/tools-BnE3UWVA.js +1 -0
- package/dist/assets/transform-mode-request-CIgYj1Qb.js +1 -0
- package/dist/assets/transport-strip-B1AJKpn-.js +1 -0
- package/dist/assets/transport.header-D-n6dQ5n.js +1 -0
- package/dist/assets/{trigger-volume-DP0G1VBe.js → trigger-volume-BLkHmfm9.js} +1 -1
- package/dist/assets/tuples-uyiMYXrv.js +1 -0
- package/dist/assets/ui-board-document-6e4w4a8B.js +2 -0
- package/dist/assets/{user-data-CqOoAowZ.js → user-data-BXFD1jg-.js} +1 -1
- package/dist/assets/user-data-CODoGZqA.js +1 -0
- package/dist/assets/{utility-view-state-Db97zwDz.js → utility-view-state-I_o0WThv.js} +1 -1
- package/dist/assets/viewport-door-AsLxGhLN.js +1 -0
- package/dist/assets/{viewport-root-presentation-B35t51xX.js → viewport-root-presentation-B1qtThOB.js} +1 -1
- package/dist/assets/{viewport-surface-status-D5kZtFW5.js → viewport-surface-status-CWmQeKTO.js} +1 -1
- package/dist/assets/{webworkerAll-CfKEb4Ao.js → webworkerAll-DC445ANd.js} +1 -1
- package/dist/assets/worker-jepHAPPr.js +2 -0
- package/dist/assets/workspace-arrangement-dkubzCff.js +1 -0
- package/dist/assets/world-documents-psBK5u_2.js +1 -0
- package/dist/assets/world-root-stage-binding-BrvO8VMz.js +1 -0
- package/dist/assets/{xstate-animation-binding-aQEmNSpm.js → xstate-animation-binding-ChVFHSlM.js} +1 -1
- package/dist/assets/{xstate-animation-meta-CnMX1Sc1.js → xstate-animation-meta-D7xnhyCE.js} +1 -1
- package/dist/volter-shared-react.json +10 -0
- package/dist/volter-shared-three.json +3 -0
- package/dist-node/cli.js +247 -209
- package/dist-node/create.js +90 -74
- package/package.json +20 -19
- package/src/contributions.d.ts +1 -1
- package/src/index.ts +10 -10
- package/starter/cube.py +1 -1
- package/template/.agents/references/project-manual.md +17 -18
- package/template/.agents/skills/editor/SKILL.md +6 -6
- package/template/.agents/skills/editor/agents/openai.yaml +3 -3
- package/template/.agents/skills/editor/references/editor-control.md +62 -62
- package/template/.agents/skills/{vgai-3d-models → volter-3d-models}/SKILL.md +3 -3
- package/template/.agents/skills/{vgai-ingest-existing-game → volter-ingest-existing-game}/SKILL.md +3 -3
- package/template/.agents/skills/{vgai-music → volter-music}/SKILL.md +7 -7
- package/template/{.github/skills/vgai-threejs-authoring → .agents/skills/volter-threejs-authoring}/SKILL.md +9 -9
- package/template/.agents/skills/volter-threejs-authoring/agents/openai.yaml +4 -0
- package/template/{.claude/skills/vgai-threejs-authoring → .agents/skills/volter-threejs-authoring}/references/helper-catalog.md +1 -1
- package/template/.claude/skills/editor/SKILL.md +6 -6
- package/template/.claude/skills/editor/agents/openai.yaml +3 -3
- package/template/.claude/skills/editor/references/editor-control.md +62 -62
- package/template/{.github/skills/vgai-3d-models → .claude/skills/volter-3d-models}/SKILL.md +3 -3
- package/template/{.github/skills/vgai-ingest-existing-game → .claude/skills/volter-ingest-existing-game}/SKILL.md +3 -3
- package/template/.claude/skills/{vgai-threejs-authoring → volter-threejs-authoring}/SKILL.md +9 -9
- package/template/.claude/skills/volter-threejs-authoring/agents/openai.yaml +4 -0
- package/template/{.agents/skills/vgai-threejs-authoring → .claude/skills/volter-threejs-authoring}/references/helper-catalog.md +1 -1
- package/template/.github/copilot-instructions.md +1 -1
- package/template/.github/skills/editor/SKILL.md +6 -6
- package/template/.github/skills/editor/agents/openai.yaml +3 -3
- package/template/.github/skills/editor/references/editor-control.md +62 -62
- package/template/{.claude/skills/vgai-3d-models → .github/skills/volter-3d-models}/SKILL.md +3 -3
- package/template/{.claude/skills/vgai-ingest-existing-game → .github/skills/volter-ingest-existing-game}/SKILL.md +3 -3
- package/template/{.agents/skills/vgai-threejs-authoring → .github/skills/volter-threejs-authoring}/SKILL.md +9 -9
- package/template/.github/skills/volter-threejs-authoring/agents/openai.yaml +4 -0
- package/template/.github/skills/{vgai-threejs-authoring → volter-threejs-authoring}/references/helper-catalog.md +1 -1
- package/template/.mcp.json +3 -3
- package/template/AGENTS.md +25 -25
- package/template/DEVLOG.md +1 -1
- package/template/IDIOMS.md +3 -3
- package/template/LICENSE +3 -3
- package/template/README.md +12 -13
- package/template/check-idioms.ts +71 -95
- package/template/manifest-entry-modules-plugin.ts +17 -4
- package/template/package.json +13 -15
- package/template/server/colyseus-setup.ts +1 -9
- package/template/server/main.ts +4 -9
- package/template/server/rooms/arena-room.ts +10 -10
- package/template/server/rooms/game-room.ts +10 -10
- package/template/server/rooms.ts +3 -5
- package/template/src/bot/QaTester.tsx +1 -1
- package/template/src/bot/bot-station.ts +2 -2
- package/template/src/bot/tester-station.ts +1 -1
- package/template/src/contributions/README.md +1 -1
- package/template/src/contributions/analytics.analytics.tsx +1 -1
- package/template/src/contributions/data.document.tsx +2 -2
- package/template/src/contributions/pages.finder.ts +1 -1
- package/template/src/contributions/tester.inspector.tsx +2 -2
- package/template/src/contributions/use-game-modules.ts +1 -1
- package/template/src/input.ts +1 -1
- package/template/src/lib/reflections/volume-reflection-material.ts +59 -59
- package/template/src/lib/static-batch/Frozen.tsx +1 -1
- package/template/src/lib/static-batch/mutation-watch.ts +1 -1
- package/template/src/main.ts +19 -38
- package/template/src/manifest-entry-modules.d.ts +12 -1
- package/template/src/net/NetworkedPlayers.tsx +3 -3
- package/template/src/prefabs/HeroBox.stories.tsx +1 -1
- package/template/src/world.tsx +1 -1
- package/template/tsconfig.json +1 -1
- package/template/validate-manifest.ts +3 -3
- package/template/vite.config.ts +12 -12
- package/template/{vgai.adapter.ts → volter.adapter.ts} +1 -1
- package/template/{vgai.project.json → volter.project.json} +2 -2
- package/template-dotfiles/gitignore +27 -27
- package/workbench/src/media/game-cover.css +11 -11
- package/workbench/src/product.contribution.ts +28 -28
- package/workbench/src/{vgaiGameSkew.ts → volterGameSkew.ts} +16 -16
- package/dist/assets/AudioViewer-xFb5Wv7A.js +0 -1
- package/dist/assets/CanvasSceneViewport-vqBlOz8P.js +0 -1
- package/dist/assets/ColorInput-CX1UZjYO.js +0 -1
- package/dist/assets/ImageViewer-shZzMd91.js +0 -1
- package/dist/assets/InspectorObjectPreview-BMOvJaOw.js +0 -1
- package/dist/assets/JsonAssetDocument-D_HXneWE.js +0 -2
- package/dist/assets/Object3DDocumentToolbar-BfPH9jz5.js +0 -1
- package/dist/assets/Object3DDocumentViewport-BaXWtATg.js +0 -2
- package/dist/assets/OnlineAssetDetail-BxibUH6K.js +0 -1
- package/dist/assets/PlayBar-DRANyO01.js +0 -1
- package/dist/assets/ReactCanvasControls-K98jOX9b.js +0 -1
- package/dist/assets/RootSelectionOverlay-BQC12Gdd.js +0 -1
- package/dist/assets/ShadowEditor-DP1LWynl.js +0 -1
- package/dist/assets/StageHost-V_0opXFt.js +0 -2
- package/dist/assets/ThreeBoardDocument-tgcaZDqQ.js +0 -2
- package/dist/assets/Toolbar-uLgsrB2z.js +0 -1
- package/dist/assets/VideoViewer-ClUJ6_uy.js +0 -1
- package/dist/assets/ViewportShadingMenu-Bdkc6jcd.js +0 -1
- package/dist/assets/active-ingest-CnAeQcuQ.js +0 -3
- package/dist/assets/animation-mixers.service-DiecMX_A.js +0 -1
- package/dist/assets/animation-timeline.utility-C71vPJgs.js +0 -1
- package/dist/assets/asset-editor-persistence-BQgjOCrm.js +0 -1
- package/dist/assets/asset-loaders-5PIUVvmH.js +0 -2
- package/dist/assets/audio.utility-D9Vk_WYS.js +0 -1
- package/dist/assets/autoplay.service-CFJoLPLw.js +0 -1
- package/dist/assets/binding-resolver-C_9MBSMa.js +0 -2
- package/dist/assets/blender-emscripten-engine-BeWFjMn-.js +0 -2
- package/dist/assets/blender-version.status-DtfwUahB.js +0 -1
- package/dist/assets/blender-wali-engine-da698rDf.js +0 -2
- package/dist/assets/blender.status-ujwGU6dU.js +0 -1
- package/dist/assets/board-guides-_3R1t_-2.js +0 -1
- package/dist/assets/body-marks-RKb_LTwL.js +0 -1
- package/dist/assets/build-profiles.document-CZxDuhzz.js +0 -2
- package/dist/assets/build-progress.status-Dk5u3C67.js +0 -1
- package/dist/assets/build.header--xqH6uTP.js +0 -1
- package/dist/assets/canvas-entry-runtime-DVeh71nC.js +0 -2
- package/dist/assets/capability-coverage-DQgg6UJe.js +0 -7
- package/dist/assets/component-board.service-DgujG90T.js +0 -2
- package/dist/assets/component-contracts.service-Bc_2Xxh_.js +0 -1
- package/dist/assets/component-instance-root-df4ofoOR.js +0 -1
- package/dist/assets/connection.status-CCX-mgmr.js +0 -1
- package/dist/assets/constraints.inspector-CwEEREsf.js +0 -1
- package/dist/assets/coverage.service-CV7b5Sqn.js +0 -3
- package/dist/assets/curve-BKuiAPpj.js +0 -1
- package/dist/assets/data-check-core-CQEjuFyt.js +0 -1
- package/dist/assets/data-ref-DyFQqqX6.js +0 -1
- package/dist/assets/debug-bridge-CESAxmlz.js +0 -1
- package/dist/assets/debug-registry-l7k5Hjc8.js +0 -1
- package/dist/assets/design-time-layers-CQgnmqc8.js +0 -1
- package/dist/assets/design-time-react-mount-CFvIk_rV.js +0 -1
- package/dist/assets/edit-mode-authoring-DBjaBTxM.js +0 -1
- package/dist/assets/editor-api-D2azVray.js +0 -1
- package/dist/assets/editor-presentation-activity-C7SNSmTd.js +0 -1
- package/dist/assets/game-audio-CaGKzia4.js +0 -1
- package/dist/assets/game-document.service-FdG_gFPU.js +0 -1
- package/dist/assets/game-eval.command-4wa9vqWE.js +0 -2
- package/dist/assets/game-module-access-DulnT3NH.js +0 -1
- package/dist/assets/game-network-Bo_nlDR5.js +0 -22
- package/dist/assets/gameplay-replay-CnWnlogY.js +0 -1
- package/dist/assets/generation-DhwCUHPf.css +0 -1
- package/dist/assets/generation.service-D2yeZaJu.js +0 -1
- package/dist/assets/generations.status-3CrPw_n5.js +0 -1
- package/dist/assets/hierarchy-marks-BLPfSIym.js +0 -1
- package/dist/assets/hierarchy-marks-C25dY2fR.js +0 -1
- package/dist/assets/hosted-asset-materialization-DYdcFlDf.js +0 -2
- package/dist/assets/index-B5WjeCHm.css +0 -1
- package/dist/assets/index-BcH5GC3b.js +0 -1
- package/dist/assets/index-CwCDkEl1.js +0 -1
- package/dist/assets/index-n3QdTv-T.js +0 -1
- package/dist/assets/index.module-Ycad3DJq.js +0 -1
- package/dist/assets/ingest-siblings-CkxW__go.js +0 -1
- package/dist/assets/ingest-source-persistence-6peGfPAS.js +0 -1
- package/dist/assets/ingest.service-Cc73WMIW.js +0 -1
- package/dist/assets/inspection-CObLhnrs.js +0 -1
- package/dist/assets/instances.command-CxKGnrNl.js +0 -1
- package/dist/assets/material-BwFzKPi0.js +0 -1
- package/dist/assets/model-asset-sections-CFvvihfx.css +0 -1
- package/dist/assets/model-asset-sections.service-TZ2SaBmH.js +0 -1
- package/dist/assets/module-mode-B79jV5tQ.js +0 -2
- package/dist/assets/mount-canvas-ingest-root-BhaYNuhY.js +0 -2
- package/dist/assets/mount-dom-ingest-root-BQb1u0LX.js +0 -2
- package/dist/assets/mount-readiness-Ds0HvvLH.js +0 -4
- package/dist/assets/mount-three-ingest-root-DIDBfvIH.js +0 -1
- package/dist/assets/network-observer.service-CiR4Q9Q0.js +0 -1
- package/dist/assets/network.utility-CNG3eJ0E.js +0 -1
- package/dist/assets/object-marks-DwvIEBOK.js +0 -1
- package/dist/assets/pixi-authoring-adapter-B42K4md-.js +0 -1
- package/dist/assets/pixi-live-write-target-D56tQEe_.js +0 -1
- package/dist/assets/pose-guard-DILO6gGq.js +0 -1
- package/dist/assets/presentation-DGBuGP6i.js +0 -1
- package/dist/assets/profiler.utility-DLNySW3w.js +0 -1
- package/dist/assets/project-provenance-4ldz-EOG.js +0 -1
- package/dist/assets/r3f-design-session-C0DPEChS.js +0 -2
- package/dist/assets/react-canvas-navigation-Jowa_lJq.js +0 -1
- package/dist/assets/react-inspector.service-TfTdj_Qk.js +0 -1
- package/dist/assets/react-story-board-Bx7qYytV.js +0 -1
- package/dist/assets/react-world-authoring-adapter-C1jPW_cN.js +0 -1
- package/dist/assets/reflection-probe-capture.inspector-C-6zrzZb.js +0 -1
- package/dist/assets/registry-Z28XSZHF.js +0 -1
- package/dist/assets/resolve-three-C7zDbK29.js +0 -702
- package/dist/assets/root-seam-contract-rGNbiX6q.js +0 -1
- package/dist/assets/scene-capture-BTWgUzhI.js +0 -1
- package/dist/assets/scene-document.service-DJJp-la1.js +0 -2
- package/dist/assets/seeded-random-38To73fI.js +0 -1
- package/dist/assets/stage-overlay-set-olkNSZmq.js +0 -1
- package/dist/assets/stage-presence-markers-cznMN_qq.js +0 -1
- package/dist/assets/stage-transform-tools-BDUZqRIR.js +0 -1
- package/dist/assets/standard-viewport-dressing-BZyuxyVl.js +0 -24
- package/dist/assets/state-watch.utility-DDmn3G25.js +0 -1
- package/dist/assets/story-documents-8ehMyYHo.js +0 -3
- package/dist/assets/story-three-preview-B1nNiPwP.js +0 -2
- package/dist/assets/studio-environment-yaKaHPxH.js +0 -2
- package/dist/assets/team-playtest.service-Ds9tkO4q.js +0 -1
- package/dist/assets/three-authoring-adapter-BrkGH4cd.js +0 -1
- package/dist/assets/three-authoring.service-DoamZDMx.js +0 -2
- package/dist/assets/three-integration.service-Db-VabIm.js +0 -1
- package/dist/assets/three-projection-core-jBJVt6O0.js +0 -1
- package/dist/assets/three-viewport-presentation-CgO3eWJ-.js +0 -141
- package/dist/assets/tools-B_NJsk05.js +0 -1
- package/dist/assets/transform-mode-request-BnKpgRUW.js +0 -1
- package/dist/assets/transport-strip-a9yLoPsI.js +0 -1
- package/dist/assets/transport.header-CpfoppXc.js +0 -1
- package/dist/assets/tuples-CKsHOV9T.js +0 -1
- package/dist/assets/ui-board-document-DtTR_mBr.js +0 -2
- package/dist/assets/user-data-dHvLdpwM.js +0 -1
- package/dist/assets/viewport-door-DVkMQazS.js +0 -1
- package/dist/assets/worker-CC9Ug5Ei.js +0 -2
- package/dist/assets/workspace-arrangement-DIMM7ska.js +0 -1
- package/dist/assets/world-documents-C4t3iOD-.js +0 -1
- package/dist/assets/world-root-stage-binding-ydl3JN1a.js +0 -1
- package/dist/vgai-shared-react.json +0 -10
- package/dist/vgai-shared-three.json +0 -3
- package/template/.agents/skills/vgai-threejs-authoring/agents/openai.yaml +0 -4
- package/template/.claude/skills/vgai-threejs-authoring/agents/openai.yaml +0 -4
- package/template/.github/skills/vgai-threejs-authoring/agents/openai.yaml +0 -4
- package/template/server/loopback.ts +0 -76
- /package/dist/assets/{vgai-shared-fontawesome-CU65D4Ij.js → volter-shared-fontawesome-CU65D4Ij.js} +0 -0
- /package/dist/assets/{vgai-shared-jsx-dev-runtime-DFDKL7fx.js → volter-shared-jsx-dev-runtime-DFDKL7fx.js} +0 -0
- /package/dist/assets/{vgai-shared-jsx-runtime-DIqBpTut.js → volter-shared-jsx-runtime-DIqBpTut.js} +0 -0
- /package/dist/assets/{vgai-shared-react-BT7rMc2H.js → volter-shared-react-BT7rMc2H.js} +0 -0
- /package/dist/assets/{vgai-shared-react-dom-DFajMqMT.js → volter-shared-react-dom-DFajMqMT.js} +0 -0
- /package/dist/assets/{vgai-shared-react-dom-client-S0ozfl6_.js → volter-shared-react-dom-client-S0ozfl6_.js} +0 -0
- /package/dist/assets/{vgai-shared-three-DH4yxKwt.js → volter-shared-three-DH4yxKwt.js} +0 -0
- /package/template/{.vgai → .volter}/assets.json +0 -0
- /package/template/{.vgai → .volter}/provenance.json +0 -0
package/template/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Volter game project
|
|
2
2
|
|
|
3
|
-
This is a standalone game project created by
|
|
3
|
+
This is a standalone game project created by Volter. Describe the game you want
|
|
4
4
|
to a coding agent, or open the shared visual editor directly:
|
|
5
5
|
|
|
6
6
|
```bash
|
|
@@ -17,8 +17,7 @@ exported builds only.
|
|
|
17
17
|
npm run dev # open/reuse this project's editor
|
|
18
18
|
npm run check-idioms # project architecture and completion diagnostics
|
|
19
19
|
npm run typecheck # game, editor contributions, Node config, and server
|
|
20
|
-
npm run validate
|
|
21
|
-
npm run validate-manifest # vgai.project.json
|
|
20
|
+
npm run validate-manifest # volter.project.json
|
|
22
21
|
npm run build # production game bundle
|
|
23
22
|
```
|
|
24
23
|
|
|
@@ -26,7 +25,7 @@ The `studio` addition (`game-editor create <name> --with studio`, or `--template
|
|
|
26
25
|
brings three development contributions; no other preset does. The files are:
|
|
27
26
|
`src/contributions/tester.inspector.tsx`, `src/contributions/data.document.tsx` and
|
|
28
27
|
`src/contributions/analytics.analytics.tsx`. They emit
|
|
29
|
-
`
|
|
28
|
+
`VOLTER_STUB_UNIMPLEMENTED`, so the editor console and `check-idioms` remain red
|
|
30
29
|
until the game supplies its own Tester, Data and Analytics surfaces (or deletes
|
|
31
30
|
Data because it genuinely has no authored content tables). Analytics must provide
|
|
32
31
|
game-specific analysis. The editor already provides session selection, playback
|
|
@@ -50,23 +49,23 @@ example must not silently erase the architecture it demonstrates.
|
|
|
50
49
|
Drive/read the running game through its own exported modules:
|
|
51
50
|
|
|
52
51
|
```bash
|
|
53
|
-
npm run
|
|
52
|
+
npm run volter -- eval 'return game.run(async ({ modules }) => { const bot = await modules("src/bot/tester-station.ts"); return bot.describeTester(); })'
|
|
54
53
|
```
|
|
55
54
|
|
|
56
55
|
Record through the same eval door while Play is running:
|
|
57
56
|
|
|
58
57
|
```bash
|
|
59
|
-
npm run
|
|
58
|
+
npm run volter -- eval 'return editor.recording.start({ fps: 30 })'
|
|
60
59
|
# direct the resident tester and advance simulation time
|
|
61
|
-
npm run
|
|
60
|
+
npm run volter -- eval 'return editor.recording.stop()'
|
|
62
61
|
```
|
|
63
62
|
|
|
64
|
-
Recordings are standard WebM files under `.
|
|
63
|
+
Recordings are standard WebM files under `.volter/recordings/`. Inspect and trim
|
|
65
64
|
them with ordinary `ffmpeg`/`ffprobe`; promote only reviewed evidence into
|
|
66
65
|
`media/`. Structured Gameplay Session logs live under `logs/play-*.jsonl` and
|
|
67
66
|
remain the durable Analytics source after Stop or reload.
|
|
68
67
|
|
|
69
|
-
The project manifest is `
|
|
68
|
+
The project manifest is `volter.project.json`. `ROADMAP.md` owns major feature
|
|
70
69
|
arcs; `DEVLOG.md` is the development journal. Coding agents begin with
|
|
71
70
|
`AGENTS.md`, which routes task-specific details to `.agents/` skills and the
|
|
72
71
|
project manual.
|
|
@@ -76,8 +75,8 @@ Editor runtime image for its engine version (`~/.volter/images/`), which
|
|
|
76
75
|
carries every package the template and the catalog's capabilities use; the
|
|
77
76
|
game is its own code. `package.json` still declares what the game uses, so
|
|
78
77
|
replacing the link with `npm install` gives a standalone installation.
|
|
79
|
-
`npm run
|
|
78
|
+
`npm run volter -- status` reports the product serving the active session.
|
|
80
79
|
|
|
81
|
-
Learn and manual: https://
|
|
80
|
+
Learn and manual: https://volter-learn.pages.dev
|
|
82
81
|
|
|
83
|
-
Hosted editor: https://
|
|
82
|
+
Hosted editor: https://volter-editor.pages.dev
|
package/template/check-idioms.ts
CHANGED
|
@@ -21,7 +21,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
21
21
|
// ERROR (exit 1 always) — unambiguous drift, one canonical fix each:
|
|
22
22
|
// E1. `playwright`/`@playwright/test` imported anywhere in the project —
|
|
23
23
|
// the resident tester (directed through its running game module via
|
|
24
|
-
// `
|
|
24
|
+
// `volter-game-editor eval`) is the ONE bot harness, and a
|
|
25
25
|
// hand-rolled browser boot is banned.
|
|
26
26
|
// VALUE imports only: a type-only import (`import type {Page}`, or
|
|
27
27
|
// an inline `{ type Page }` with no value specifier) binds nothing
|
|
@@ -30,18 +30,18 @@ import { fileURLToPath } from 'node:url';
|
|
|
30
30
|
// step normally needs, so the direct import is usually avoidable
|
|
31
31
|
// anyway.
|
|
32
32
|
// E2. package.json scripts invoking `playwright` directly.
|
|
33
|
-
// E3. `window.
|
|
33
|
+
// E3. `window.__volter` accessed in src/** (the bot/CLI consumer
|
|
34
34
|
// surface, not the authoring surface — export the state from a module).
|
|
35
35
|
// E4. `?bot=`-style query-param bot plumbing in src/** — the project's
|
|
36
36
|
// resident tester owns bot entry.
|
|
37
37
|
// E5. raw `Math.random()`/`Date.now()`/`performance.now()` in
|
|
38
38
|
// src/scripts/** gameplay code — ONLY when this project's OWN
|
|
39
|
-
//
|
|
39
|
+
// volter.project.json declares `determinism.seededRandom: true`; silent
|
|
40
40
|
// when undeclared (D15, T-D15.3's third enforcer leg — the other
|
|
41
41
|
// two, the engine-src permanent scan and the examples/ burn-down
|
|
42
42
|
// scan, live in the engine repo's own test suite; see
|
|
43
43
|
// packages/engine/test/gameplay-rng-ban.test.ts).
|
|
44
|
-
// E6. `
|
|
44
|
+
// E6. `VOLTER_STUB_UNIMPLEMENTED` remains in src/tools/** or src/contributions/** — this
|
|
45
45
|
// is the starter's explicit unfinished-work sentinel, so a completion
|
|
46
46
|
// check containing it cannot be green. Replace the Tester/Data/Analytics stub
|
|
47
47
|
// whole in the game's vocabulary; a game with no content tables may
|
|
@@ -104,12 +104,11 @@ import { fileURLToPath } from 'node:url';
|
|
|
104
104
|
//
|
|
105
105
|
// E9 is the one rule that does NOT answer its question from the file tree
|
|
106
106
|
// alone: the R3F00x codes come from the editor's own source analyzer
|
|
107
|
-
// (`
|
|
108
|
-
// `
|
|
107
|
+
// (`@volter/editor-react`'s `src/source/r3f-project-contracts.ts`), the same pass validate-on-save and
|
|
108
|
+
// `volter-game-editor status` report from. It is loaded OFFLINE — the analyzer is a pure
|
|
109
109
|
// `(code, file) => diagnostics` function over `typescript`, with no dev
|
|
110
|
-
// server, browser or editor session anywhere in it —
|
|
111
|
-
//
|
|
112
|
-
// editor. See `loadR3fAnalyzer`.
|
|
110
|
+
// server, browser or editor session anywhere in it — from the installed
|
|
111
|
+
// package, so check-idioms never requires a running editor. See `loadR3fAnalyzer`.
|
|
113
112
|
//
|
|
114
113
|
// Suppression: put `// idioms-ignore <rule-id> <reason>` on the flagged
|
|
115
114
|
// line. The reason is REQUIRED — an empty/missing reason does not suppress
|
|
@@ -117,7 +116,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
117
116
|
// incomplete). This is intentionally a dumb line/regex scanner, not an AST
|
|
118
117
|
// pass — it comment-strips PURE comment lines (lines whose trimmed text
|
|
119
118
|
// starts with `//`, `/*`, `*`, or is exactly `*/`) before matching rule
|
|
120
|
-
// patterns, so doc-comment prose that merely MENTIONS e.g. `window.
|
|
119
|
+
// patterns, so doc-comment prose that merely MENTIONS e.g. `window.__volter`
|
|
121
120
|
// doesn't trip a finding, but it does not understand string literals,
|
|
122
121
|
// template strings, or multi-statement lines. False positives are expected
|
|
123
122
|
// occasionally; suppress them with a reason rather than fighting the regex.
|
|
@@ -147,7 +146,7 @@ if (!existsSync(rootDir)) {
|
|
|
147
146
|
|
|
148
147
|
// This script's own resolved path — excluded from every scan so its rule
|
|
149
148
|
// regexes (which literally contain the strings they look for, e.g.
|
|
150
|
-
// 'colyseus.js', 'window.
|
|
149
|
+
// 'colyseus.js', 'window.__volter', '@playwright/test') never self-flag.
|
|
151
150
|
const SELF_PATH = resolve(fileURLToPath(import.meta.url));
|
|
152
151
|
|
|
153
152
|
// ---------------------------------------------------------------------------
|
|
@@ -166,7 +165,7 @@ const SKIP_DIRS = new Set([
|
|
|
166
165
|
'.github',
|
|
167
166
|
'dist',
|
|
168
167
|
'build',
|
|
169
|
-
'.
|
|
168
|
+
'.volter',
|
|
170
169
|
'coverage',
|
|
171
170
|
'.turbo',
|
|
172
171
|
]);
|
|
@@ -347,7 +346,7 @@ function checkPlaywrightImports(): void {
|
|
|
347
346
|
'error',
|
|
348
347
|
'bot-canonical',
|
|
349
348
|
`"${pkg}" imported — the resident tester, directed through the running game's own module, is the ONE bot harness; hand-rolled Playwright boots are banned.`,
|
|
350
|
-
"Drive the game through the live session (
|
|
349
|
+
"Drive the game through the live session (volter-game-editor eval + the running tester module), or take the Playwright types from '@volter/game-live' as a type-only import.",
|
|
351
350
|
);
|
|
352
351
|
}
|
|
353
352
|
}
|
|
@@ -380,7 +379,7 @@ function checkPackageJsonScripts(): void {
|
|
|
380
379
|
'error',
|
|
381
380
|
'bot-canonical',
|
|
382
381
|
`script "${name}" invokes playwright directly ("${cmd}") — this project has no Playwright lane to own a browser binary or config.`,
|
|
383
|
-
`Delete the "${name}" script — playtesting is the live session (
|
|
382
|
+
`Delete the "${name}" script — playtesting is the live session (volter-game-editor eval + the running tester module), not a script.`,
|
|
384
383
|
);
|
|
385
384
|
}
|
|
386
385
|
}
|
|
@@ -393,7 +392,7 @@ function checkPackageJsonScripts(): void {
|
|
|
393
392
|
* file enters an endless cycle of rewriting assertions and actions (owner
|
|
394
393
|
* ruling, 2026-08-21 — measured live: three assertion renegotiations in
|
|
395
394
|
* twenty minutes on one balance suite). The playtest loop is INTERACTIVE:
|
|
396
|
-
* `
|
|
395
|
+
* `volter-game-editor eval` + cheats set the situation, bot policy runs behavior, event
|
|
397
396
|
* logs are read on an interval, and the run is redirected live until the
|
|
398
397
|
* operator is satisfied. The play log (logs/play-*.jsonl) is the receipt. This
|
|
399
398
|
* rule keeps the furniture out so the cheapest path stays the sanctioned
|
|
@@ -403,7 +402,7 @@ function checkNoTestFurniture(): void {
|
|
|
403
402
|
'Delete it and playtest LIVE: eval + cheats set the situation, bot goals run behavior, the ' +
|
|
404
403
|
'event log is read on an interval, the run is redirected until satisfied; the play log ' +
|
|
405
404
|
'(logs/play-*.jsonl) is the receipt.';
|
|
406
|
-
const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', '.
|
|
405
|
+
const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', '.volter', 'logs', 'media', 'public']);
|
|
407
406
|
const testFile = /\.(test|spec)\.[cm]?[jt]sx?$/;
|
|
408
407
|
const walk = (dir: string): void => {
|
|
409
408
|
for (const entry of readdirSync(dir)) {
|
|
@@ -477,31 +476,31 @@ function checkNoTestFurniture(): void {
|
|
|
477
476
|
}
|
|
478
477
|
|
|
479
478
|
// ---------------------------------------------------------------------------
|
|
480
|
-
// E3 — window.
|
|
479
|
+
// E3 — window.__volter accessed in src/**
|
|
481
480
|
// ---------------------------------------------------------------------------
|
|
482
481
|
|
|
483
|
-
function
|
|
484
|
-
// Two-part, same-line heuristic rather than a single `window\.
|
|
482
|
+
function checkWindowVolter(): void {
|
|
483
|
+
// Two-part, same-line heuristic rather than a single `window\.__volter`
|
|
485
484
|
// regex: this codebase's OWN canonical way to reach the bridge (see
|
|
486
485
|
// @volter/game-live's game-client/client.ts) is a cast in between —
|
|
487
|
-
// `(window as unknown as {
|
|
488
|
-
// `.
|
|
489
|
-
// mentions the `window` token AND a bare `.
|
|
486
|
+
// `(window as unknown as { __volter?: ... }).__volter` — so `window` and
|
|
487
|
+
// `.__volter` are literal-adjacent only coincidentally. Flag any line that
|
|
488
|
+
// mentions the `window` token AND a bare `.__volter`/`['__volter']` property
|
|
490
489
|
// access. The negative lookahead on the dotted form keeps this off
|
|
491
|
-
// `
|
|
492
|
-
// are different, unrelated dev-only globals, not the frozen `window.
|
|
490
|
+
// `__volterScene`/`__volterCamera`/`__volterRender`/`__volterBatch` etc. — those
|
|
491
|
+
// are different, unrelated dev-only globals, not the frozen `window.__volter`
|
|
493
492
|
// debug-bridge shape (D18). A file-scoped `window` ALIAS on its own line
|
|
494
|
-
// (`const w = window as …; w['
|
|
493
|
+
// (`const w = window as …; w['__volter']`) is a known miss — this is a
|
|
495
494
|
// line-scan, not an AST pass.
|
|
496
495
|
const windowRe = /\bwindow\b/;
|
|
497
|
-
const
|
|
496
|
+
const volterAccessRe = /\.__volter(?![A-Za-z0-9_])|\[\s*['"]__volter['"]\s*\]/g;
|
|
498
497
|
for (const file of srcFiles) {
|
|
499
498
|
const { rawLines, blanked } = readFileText(file);
|
|
500
499
|
const blankedLines = blanked.split('\n');
|
|
501
500
|
blankedLines.forEach((line, i) => {
|
|
502
501
|
if (!windowRe.test(line)) return;
|
|
503
|
-
|
|
504
|
-
if (!
|
|
502
|
+
volterAccessRe.lastIndex = 0;
|
|
503
|
+
if (!volterAccessRe.test(line)) return;
|
|
505
504
|
addFinding(
|
|
506
505
|
file,
|
|
507
506
|
rawLines,
|
|
@@ -509,7 +508,7 @@ function checkWindowVgai(): void {
|
|
|
509
508
|
'E3',
|
|
510
509
|
'error',
|
|
511
510
|
'bot-canonical',
|
|
512
|
-
'window.
|
|
511
|
+
'window.__volter accessed directly in src/** — this is the bot/CLI consumer surface, not the authoring surface.',
|
|
513
512
|
'Read and drive the game through its own exported modules instead (game.run(({ modules }) => …)).',
|
|
514
513
|
);
|
|
515
514
|
});
|
|
@@ -550,7 +549,7 @@ function checkBotParam(): void {
|
|
|
550
549
|
* reads as "none" — validating its shape is validate-manifest.ts's job. */
|
|
551
550
|
function manifestDomRootEntries(): Set<string> {
|
|
552
551
|
const entries = new Set<string>();
|
|
553
|
-
const manifestPath = join(rootDir, '
|
|
552
|
+
const manifestPath = join(rootDir, 'volter.project.json');
|
|
554
553
|
if (!existsSync(manifestPath)) return entries;
|
|
555
554
|
try {
|
|
556
555
|
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8')) as {
|
|
@@ -710,11 +709,6 @@ function checkTriggerNameIdentity(): void {
|
|
|
710
709
|
// ---------------------------------------------------------------------------
|
|
711
710
|
// git-history plumbing shared by slice-proxy rules (W9)
|
|
712
711
|
// ---------------------------------------------------------------------------
|
|
713
|
-
// The vgai CLI mirrors this exact measurement (source path, gameplay
|
|
714
|
-
// pathspecs, threshold, silent-on-unaskable) as `vgai status`'s ambient
|
|
715
|
-
// bot-drift line — engine repo, packages/vgai-cli/src/instrumentation-signal.ts.
|
|
716
|
-
// If you change any of the three constants below, change them there too, or
|
|
717
|
-
// the ambient signal and this rule will disagree about whether a bot drifted.
|
|
718
712
|
|
|
719
713
|
/** The files that ARE the game, for slice-proxy measurements (W9). Deliberately
|
|
720
714
|
* NOT all of src/ — churn in src/ui/, src/tools/ or src/data/ is not by
|
|
@@ -833,7 +827,7 @@ function checkUseFramePriority(): void {
|
|
|
833
827
|
|
|
834
828
|
/** The one way a project shows that Play has actually run: `logs/play-*.jsonl`
|
|
835
829
|
* — the editor server opens one per Play session
|
|
836
|
-
* (packages/editor/server/editor-server.ts, POST /__editor/log-session).
|
|
830
|
+
* (packages/editor-core/server/editor-server.ts, POST /__editor/log-session).
|
|
837
831
|
* A working-tree fact, not a git fact (`logs/` is gitignored), written by
|
|
838
832
|
* the tool itself, so it cannot be produced by intending to play. This
|
|
839
833
|
* receipt is also the playtest's proof (owner ruling 2026-08-21). */
|
|
@@ -848,7 +842,7 @@ function hasPlayEvidence(): boolean {
|
|
|
848
842
|
}
|
|
849
843
|
|
|
850
844
|
/** The scaffolder's own record of where this project came from
|
|
851
|
-
* (packages/
|
|
845
|
+
* (packages/game-editor/node/scaffold/baseline.ts). W9's history ANCHOR.
|
|
852
846
|
*
|
|
853
847
|
* W7 anchors its window on a file's last commit; W9 does the same, and this
|
|
854
848
|
* is the file that means "this project began here". Anchoring matters: an
|
|
@@ -859,7 +853,7 @@ function hasPlayEvidence(): boolean {
|
|
|
859
853
|
* maintenance history, and a rule that shouts at our own reference material
|
|
860
854
|
* on every run is noise, not a tripwire. A project with no committed
|
|
861
855
|
* baseline cannot be asked when it started, so W9 stays silent there. */
|
|
862
|
-
const SCAFFOLD_BASELINE_SOURCE = '.
|
|
856
|
+
const SCAFFOLD_BASELINE_SOURCE = '.volter/scaffold-baseline.json';
|
|
863
857
|
|
|
864
858
|
/** Gameplay commits since the scaffold anchor, at or above which a project
|
|
865
859
|
* that has never been played is reported.
|
|
@@ -900,23 +894,23 @@ function checkPlayedBeforeAuthoring(): void {
|
|
|
900
894
|
'typecheck and unit tests cannot see: a blank canvas, an invisible mesh, a camera inside ' +
|
|
901
895
|
'the geometry.',
|
|
902
896
|
'Author in playable slices (AGENTS.md) — enter Play before writing the next slice: run ' +
|
|
903
|
-
'`npm run
|
|
897
|
+
'`npm run volter -- play`, look at the game, playtest live, then continue; reading the ' +
|
|
904
898
|
'code again does not count.',
|
|
905
899
|
);
|
|
906
900
|
}
|
|
907
901
|
|
|
908
902
|
// ---------------------------------------------------------------------------
|
|
909
903
|
// E5 — raw Math.random()/Date.now()/performance.now() in src/scripts/**,
|
|
910
|
-
// only when THIS project's own
|
|
904
|
+
// only when THIS project's own volter.project.json declares
|
|
911
905
|
// determinism.seededRandom (D15, T-D15.3's third enforcer leg).
|
|
912
906
|
// ---------------------------------------------------------------------------
|
|
913
907
|
|
|
914
|
-
/** Reads rootDir/
|
|
908
|
+
/** Reads rootDir/volter.project.json and reports whether it declares
|
|
915
909
|
* `determinism.seededRandom: true`. Missing/malformed manifests read as
|
|
916
910
|
* "not declared" (silent) — validating the manifest's own shape is
|
|
917
911
|
* validate-manifest.ts's job, not this scanner's. */
|
|
918
912
|
function projectDeclaresSeededRandom(): boolean {
|
|
919
|
-
const manifestPath = join(rootDir, '
|
|
913
|
+
const manifestPath = join(rootDir, 'volter.project.json');
|
|
920
914
|
if (!existsSync(manifestPath)) return false;
|
|
921
915
|
try {
|
|
922
916
|
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8')) as {
|
|
@@ -943,7 +937,7 @@ function checkDeterminismRng(): void {
|
|
|
943
937
|
'E5',
|
|
944
938
|
'error',
|
|
945
939
|
'gameplay-rng-ctx-random',
|
|
946
|
-
`raw "${m[1]}(" in src/scripts/** — this project's
|
|
940
|
+
`raw "${m[1]}(" in src/scripts/** — this project's volter.project.json declares ` +
|
|
947
941
|
'determinism.seededRandom, so ALL gameplay RNG/wall-clock reads must flow through ' +
|
|
948
942
|
'ctx.random, not raw Math.random()/Date.now()/performance.now().',
|
|
949
943
|
'Use ctx.random() (or ctx.random.stream(name) for an independent named stream) instead.',
|
|
@@ -957,7 +951,7 @@ function checkDeterminismRng(): void {
|
|
|
957
951
|
// ---------------------------------------------------------------------------
|
|
958
952
|
|
|
959
953
|
function checkUnconfiguredProjectTools(): void {
|
|
960
|
-
const sentinel = /\
|
|
954
|
+
const sentinel = /\bVOLTER_STUB_UNIMPLEMENTED\b/g;
|
|
961
955
|
const toolFiles = srcFiles.filter((file) => /^(src\/tools|src\/contributions)\//.test(relPath(file)));
|
|
962
956
|
for (const file of toolFiles) {
|
|
963
957
|
const { rawLines, blanked } = readFileText(file);
|
|
@@ -969,7 +963,7 @@ function checkUnconfiguredProjectTools(): void {
|
|
|
969
963
|
'E6',
|
|
970
964
|
'error',
|
|
971
965
|
'studio-surfaces-complete',
|
|
972
|
-
'
|
|
966
|
+
'VOLTER_STUB_UNIMPLEMENTED remains in an editor contribution — this is an explicit starter obligation, not a usable game-specific surface.',
|
|
973
967
|
"Rewrite the stub whole in this game's vocabulary and remove its warning. If this is the Data stub and the game genuinely has no authored content tables, delete the file.",
|
|
974
968
|
);
|
|
975
969
|
}
|
|
@@ -1007,8 +1001,8 @@ type R3fAnalyzer = (
|
|
|
1007
1001
|
) => R3fDiagnostic[];
|
|
1008
1002
|
|
|
1009
1003
|
/**
|
|
1010
|
-
* The editor's OWN R3F source analyzer, resolved from
|
|
1011
|
-
* `@editor
|
|
1004
|
+
* The editor's OWN R3F source analyzer, resolved from the installed
|
|
1005
|
+
* `@volter/editor-react` package and loaded synchronously.
|
|
1012
1006
|
*
|
|
1013
1007
|
* Why not re-implement the codes here: they are a real TypeScript AST pass
|
|
1014
1008
|
* over the project's import graph (relative imports, re-exports, shared prop
|
|
@@ -1018,49 +1012,28 @@ type R3fAnalyzer = (
|
|
|
1018
1012
|
* pure (`(code, file) => diagnostics`, `typescript` + `node:fs` and nothing
|
|
1019
1013
|
* else), so nothing about reusing it needs a server or a session.
|
|
1020
1014
|
*
|
|
1021
|
-
* The
|
|
1022
|
-
*
|
|
1023
|
-
*
|
|
1024
|
-
* `packages/editor/src`, an installed one at
|
|
1025
|
-
* `node_modules/@volter/editor-core/src` (the published package ships `src/`).
|
|
1026
|
-
* Reading the alias means one code path serves both without knowing which.
|
|
1027
|
-
* A node_modules target uses Node's package resolution as a fallback so the
|
|
1028
|
-
* same mapping also works when a workspace manager hoists the package.
|
|
1015
|
+
* The published packages ship `src/`, so a module is found as
|
|
1016
|
+
* `node_modules/<package>/<file>` in the project or any directory above it
|
|
1017
|
+
* (a workspace manager may hoist the package).
|
|
1029
1018
|
*
|
|
1030
1019
|
* Returns null when the analyzer genuinely cannot be reached. E9 reports that
|
|
1031
1020
|
* as a finding of its own rather than passing silently — a floor rule that
|
|
1032
1021
|
* disappears when its instrument is missing reads as a clean bill of health,
|
|
1033
1022
|
* which is the one thing an analyzer must never produce.
|
|
1034
1023
|
*/
|
|
1035
|
-
function
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
const
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
const alias = raw.match(/"@editor\/\*"\s*:\s*\[\s*"([^"]+)"/);
|
|
1044
|
-
if (!alias) return null;
|
|
1045
|
-
const baseUrl = raw.match(/"baseUrl"\s*:\s*"([^"]+)"/)?.[1] ?? '.';
|
|
1046
|
-
const aliasTarget = alias[1]!.replace('*', relative);
|
|
1047
|
-
mapped = resolve(rootDir, baseUrl, aliasTarget);
|
|
1048
|
-
if (!existsSync(mapped)) {
|
|
1049
|
-
const nodeModulesMarker = 'node_modules/';
|
|
1050
|
-
const normalizedTarget = aliasTarget.replaceAll('\\', '/');
|
|
1051
|
-
const markerIndex = normalizedTarget.lastIndexOf(nodeModulesMarker);
|
|
1052
|
-
if (markerIndex < 0) return null;
|
|
1053
|
-
const packageTarget = normalizedTarget.slice(markerIndex + nodeModulesMarker.length);
|
|
1054
|
-
mapped = createRequire(join(rootDir, 'package.json')).resolve(packageTarget);
|
|
1055
|
-
}
|
|
1056
|
-
} catch {
|
|
1057
|
-
return null;
|
|
1024
|
+
function resolvePackageModule(packageName: string, relative: string): string | null {
|
|
1025
|
+
let dir = rootDir;
|
|
1026
|
+
for (;;) {
|
|
1027
|
+
const candidate = join(dir, 'node_modules', packageName, relative);
|
|
1028
|
+
if (existsSync(candidate)) return candidate;
|
|
1029
|
+
const parent = dirname(dir);
|
|
1030
|
+
if (parent === dir) return null;
|
|
1031
|
+
dir = parent;
|
|
1058
1032
|
}
|
|
1059
|
-
return existsSync(mapped) ? mapped : null;
|
|
1060
1033
|
}
|
|
1061
1034
|
|
|
1062
1035
|
function loadR3fAnalyzer(): R3fAnalyzer | null {
|
|
1063
|
-
const mapped =
|
|
1036
|
+
const mapped = resolvePackageModule('@volter/editor-react', 'src/source/r3f-project-contracts.ts');
|
|
1064
1037
|
if (!mapped) return null;
|
|
1065
1038
|
try {
|
|
1066
1039
|
const loaded = createRequire(import.meta.url)(mapped) as {
|
|
@@ -1087,7 +1060,7 @@ function loadR3fAnalyzer(): R3fAnalyzer | null {
|
|
|
1087
1060
|
*/
|
|
1088
1061
|
interface RegionSurfaces {
|
|
1089
1062
|
surfaces: ReadonlyMap<string, string>;
|
|
1090
|
-
/** This project's `
|
|
1063
|
+
/** This project's `volter.adapter.ts` declares a `regions` binding the static
|
|
1091
1064
|
* reader could not evaluate, so its `include` globs were not consulted.
|
|
1092
1065
|
* Carried rather than dropped: the editor's own loader EVALUATES that module
|
|
1093
1066
|
* and would honor those globs, so silence here means the two readers
|
|
@@ -1096,7 +1069,10 @@ interface RegionSurfaces {
|
|
|
1096
1069
|
}
|
|
1097
1070
|
|
|
1098
1071
|
function loadRegionSurfaces(): RegionSurfaces | null {
|
|
1099
|
-
const mapped =
|
|
1072
|
+
const mapped = resolvePackageModule(
|
|
1073
|
+
'@volter/editor-sdk',
|
|
1074
|
+
'src/kit/asset-workflow/project-source-index.ts',
|
|
1075
|
+
);
|
|
1100
1076
|
if (!mapped) return null;
|
|
1101
1077
|
try {
|
|
1102
1078
|
const loaded = createRequire(import.meta.url)(mapped) as {
|
|
@@ -1121,7 +1097,7 @@ function loadRegionSurfaces(): RegionSurfaces | null {
|
|
|
1121
1097
|
m: string,
|
|
1122
1098
|
a: string,
|
|
1123
1099
|
) => { regions: unknown[]; unreadable: boolean }
|
|
1124
|
-
)(read('
|
|
1100
|
+
)(read('volter.project.json'), read('volter.adapter.ts'));
|
|
1125
1101
|
const sources = srcFiles.map((file) => ({
|
|
1126
1102
|
path: relPath(file),
|
|
1127
1103
|
source: readFileSync(file, 'utf-8'),
|
|
@@ -1141,31 +1117,31 @@ function loadRegionSurfaces(): RegionSurfaces | null {
|
|
|
1141
1117
|
function checkAuthoringWarnings(): void {
|
|
1142
1118
|
const analyze = loadR3fAnalyzer();
|
|
1143
1119
|
if (!analyze) {
|
|
1144
|
-
// Silent for a folder that is not a
|
|
1120
|
+
// Silent for a folder that is not a volter-game-editor project at all — this scanner
|
|
1145
1121
|
// is pointed at scratch directories by its own tests and by curious
|
|
1146
1122
|
// agents, and a rule about a missing tsconfig mapping is a rule about a
|
|
1147
1123
|
// project. Inside a real project the mapping is scaffolded, so its
|
|
1148
1124
|
// absence is worth saying out loud rather than passing quietly.
|
|
1149
|
-
if (!existsSync(join(rootDir, '
|
|
1125
|
+
if (!existsSync(join(rootDir, 'volter.project.json'))) return;
|
|
1150
1126
|
addProjectFinding(
|
|
1151
1127
|
'E9',
|
|
1152
1128
|
'warn',
|
|
1153
1129
|
'authoring-warnings-zero',
|
|
1154
|
-
'the R3F authoring analyzer could not be loaded, so authoring warnings were NOT checked — this run says nothing about them. It resolves
|
|
1155
|
-
'
|
|
1130
|
+
'the R3F authoring analyzer could not be loaded, so authoring warnings were NOT checked — this run says nothing about them. It resolves from the installed `@volter/editor-react` package.',
|
|
1131
|
+
'Install the project\'s dependencies (`npm install`): the analyzer is `@volter/editor-react`\'s source and the region resolver `@volter/editor-sdk`\'s. `npm run volter -- status` reports the same counts from the live editor meanwhile.',
|
|
1156
1132
|
);
|
|
1157
1133
|
return;
|
|
1158
1134
|
}
|
|
1159
1135
|
|
|
1160
1136
|
const resolved = loadRegionSurfaces();
|
|
1161
1137
|
if (!resolved) {
|
|
1162
|
-
if (!existsSync(join(rootDir, '
|
|
1138
|
+
if (!existsSync(join(rootDir, 'volter.project.json'))) return;
|
|
1163
1139
|
addProjectFinding(
|
|
1164
1140
|
'E9',
|
|
1165
1141
|
'warn',
|
|
1166
1142
|
'authoring-warnings-zero',
|
|
1167
1143
|
"the region resolver could not be loaded, so no file could be attributed to this project's `three` region and authoring warnings were NOT checked — this run says nothing about them.",
|
|
1168
|
-
'
|
|
1144
|
+
'Install the project\'s dependencies (`npm install`): the analyzer is `@volter/editor-react`\'s source and the region resolver `@volter/editor-sdk`\'s. `npm run volter -- status` reports the same counts from the live editor meanwhile.',
|
|
1169
1145
|
);
|
|
1170
1146
|
return;
|
|
1171
1147
|
}
|
|
@@ -1175,7 +1151,7 @@ function checkAuthoringWarnings(): void {
|
|
|
1175
1151
|
'E9',
|
|
1176
1152
|
'warn',
|
|
1177
1153
|
'authoring-warnings-zero',
|
|
1178
|
-
"
|
|
1154
|
+
"volter.adapter.ts declares a `regions` binding that cannot be read statically, so its `include` globs were NOT consulted — any file those globs place is missing from this run, while the editor's own loader still honors them.",
|
|
1179
1155
|
'Write the regions as an array of object literals passed directly to defineAdapter({…}), with literal `id` and `include` values (not a hoisted const, not a spread).',
|
|
1180
1156
|
);
|
|
1181
1157
|
}
|
|
@@ -1349,7 +1325,7 @@ function checkPrefabStories(): void {
|
|
|
1349
1325
|
// ---------------------------------------------------------------------------
|
|
1350
1326
|
|
|
1351
1327
|
function manifestHasThreeRoot(): boolean {
|
|
1352
|
-
const manifestPath = join(rootDir, '
|
|
1328
|
+
const manifestPath = join(rootDir, 'volter.project.json');
|
|
1353
1329
|
if (!existsSync(manifestPath)) return false;
|
|
1354
1330
|
try {
|
|
1355
1331
|
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8')) as {
|
|
@@ -1448,7 +1424,7 @@ function checkSceneFolderContract(): void {
|
|
|
1448
1424
|
checkPlaywrightImports();
|
|
1449
1425
|
checkPackageJsonScripts();
|
|
1450
1426
|
checkNoTestFurniture();
|
|
1451
|
-
|
|
1427
|
+
checkWindowVolter();
|
|
1452
1428
|
checkBotParam();
|
|
1453
1429
|
checkPollingPump();
|
|
1454
1430
|
checkColyseusStaticImport();
|
|
@@ -1470,7 +1446,7 @@ const warnFindings = findings.filter((f) => f.severity === 'warn');
|
|
|
1470
1446
|
*
|
|
1471
1447
|
* Measured failure: a blind probe ran `typecheck` seven times and this scanner
|
|
1472
1448
|
* once, at minute 19, which turned every open finding into an end-of-build
|
|
1473
|
-
* scramble. `
|
|
1449
|
+
* scramble. `volter-game-editor status` — the command an agent polls constantly — reads this
|
|
1474
1450
|
* file and surfaces the open ERROR findings as an advisory count, so they are
|
|
1475
1451
|
* visible from the first status call while THIS script stays the gate.
|
|
1476
1452
|
*
|
|
@@ -1479,9 +1455,9 @@ const warnFindings = findings.filter((f) => f.severity === 'warn');
|
|
|
1479
1455
|
*/
|
|
1480
1456
|
function writeFindingsRecord(): void {
|
|
1481
1457
|
try {
|
|
1482
|
-
mkdirSync(join(rootDir, '.
|
|
1458
|
+
mkdirSync(join(rootDir, '.volter'), { recursive: true });
|
|
1483
1459
|
writeFileSync(
|
|
1484
|
-
join(rootDir, '.
|
|
1460
|
+
join(rootDir, '.volter', 'check-idioms.json'),
|
|
1485
1461
|
`${JSON.stringify(
|
|
1486
1462
|
{
|
|
1487
1463
|
at: new Date().toISOString(),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Plugin } from 'vite';
|
|
2
2
|
|
|
3
|
-
const MANIFEST_ENTRIES_ID = 'virtual:
|
|
3
|
+
const MANIFEST_ENTRIES_ID = 'virtual:volter-manifest-entries';
|
|
4
4
|
const RESOLVED_MANIFEST_ENTRIES_ID = `\0${MANIFEST_ENTRIES_ID}`;
|
|
5
5
|
|
|
6
6
|
function collectManifestEntries(manifest: unknown): string[] {
|
|
@@ -20,7 +20,7 @@ function collectManifestEntries(manifest: unknown): string[] {
|
|
|
20
20
|
|
|
21
21
|
for (const entry of entries) {
|
|
22
22
|
if (entry.startsWith('/') || entry.includes('\\') || entry.split('/').includes('..')) {
|
|
23
|
-
throw new Error(`
|
|
23
|
+
throw new Error(`volter.project.json world entry must be project-relative: ${entry}`);
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -31,18 +31,31 @@ function collectManifestEntries(manifest: unknown): string[] {
|
|
|
31
31
|
* Render imports for the manifest's exact `roots[].entry` declarations.
|
|
32
32
|
* The manifest—not a filename convention—is the only discovery source.
|
|
33
33
|
*/
|
|
34
|
+
function declaresCanvasRoot(manifest: unknown): boolean {
|
|
35
|
+
const roots = manifest && typeof manifest === 'object' ? (manifest as { roots?: unknown }).roots : undefined;
|
|
36
|
+
return (
|
|
37
|
+
Array.isArray(roots) &&
|
|
38
|
+
roots.some((root) => root && typeof root === 'object' && (root as { adapter?: unknown }).adapter === 'canvas')
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
34
42
|
export function renderManifestEntryModule(manifest: unknown): string {
|
|
35
43
|
const entries = collectManifestEntries(manifest);
|
|
36
44
|
const imports = entries.map(
|
|
37
45
|
(entry, index) => `import * as entry${index} from ${JSON.stringify(`/${entry}`)};`,
|
|
38
46
|
);
|
|
39
47
|
const members = entries.map((entry, index) => `${JSON.stringify(entry)}: entry${index}`);
|
|
40
|
-
|
|
48
|
+
// Pixi rides only with a declared `canvas` root: its mount (and the two packages it imports)
|
|
49
|
+
// is `src/canvas-mount.ts`, which only such a project carries.
|
|
50
|
+
const canvas = declaresCanvasRoot(manifest)
|
|
51
|
+
? `export { mountCanvasRoot } from "/src/canvas-mount.ts";`
|
|
52
|
+
: 'export const mountCanvasRoot = undefined;';
|
|
53
|
+
return `${imports.join('\n')}\nexport const manifestEntryModules = {${members.join(',')}};\n${canvas}\n`;
|
|
41
54
|
}
|
|
42
55
|
|
|
43
56
|
export function manifestEntryModulesPlugin(manifest: unknown): Plugin {
|
|
44
57
|
return {
|
|
45
|
-
name: '
|
|
58
|
+
name: 'volter:manifest-entry-modules',
|
|
46
59
|
resolveId(id) {
|
|
47
60
|
return id === MANIFEST_ENTRIES_ID ? RESOLVED_MANIFEST_ENTRIES_ID : undefined;
|
|
48
61
|
},
|
package/template/package.json
CHANGED
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
"node": ">=22.0.0"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
-
"
|
|
11
|
+
"volter": "volter-game-editor",
|
|
12
12
|
"dev": "volter-game-editor edit .",
|
|
13
13
|
"dev:standalone": "vite",
|
|
14
14
|
"build": "tsc && vite build",
|
|
15
15
|
"preview": "vite preview",
|
|
16
16
|
"postinstall": "node scripts/patch-drei-stats-gl.mjs",
|
|
17
17
|
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.tools.json && tsc --noEmit -p tsconfig.node.json && tsc --noEmit -p server/tsconfig.json",
|
|
18
|
-
"validate-manifest": "npx tsx validate-manifest.ts
|
|
18
|
+
"validate-manifest": "npx tsx validate-manifest.ts volter.project.json",
|
|
19
19
|
"check-idioms": "npx tsx check-idioms.ts .",
|
|
20
20
|
"server": "npx tsx --tsconfig server/tsconfig.json server/main.ts"
|
|
21
21
|
},
|
|
@@ -24,15 +24,13 @@
|
|
|
24
24
|
"@colyseus/sdk": "^0.17.34",
|
|
25
25
|
"@react-three/drei": "^10.7.7",
|
|
26
26
|
"@react-three/fiber": "^9.6.1",
|
|
27
|
-
"@volter/editor-project": "^0.5.
|
|
28
|
-
"@volter/game-runtime": "^0.5.
|
|
29
|
-
"@volter/threejs-runtime": "^0.5.
|
|
27
|
+
"@volter/editor-project": "^0.5.70",
|
|
28
|
+
"@volter/game-runtime": "^0.5.70",
|
|
29
|
+
"@volter/threejs-runtime": "^0.5.70",
|
|
30
30
|
"react": "~19.2.4",
|
|
31
31
|
"react-dom": "~19.2.4",
|
|
32
32
|
"three": "^0.180.0",
|
|
33
|
-
"zod": "^4.3.6"
|
|
34
|
-
"@pixi/react": "8.0.5",
|
|
35
|
-
"pixi.js": "^8.6.0"
|
|
33
|
+
"zod": "^4.3.6"
|
|
36
34
|
},
|
|
37
35
|
"devDependencies": {
|
|
38
36
|
"@colyseus/ws-transport": "^0.17.9",
|
|
@@ -42,13 +40,13 @@
|
|
|
42
40
|
"@types/react-dom": "^19.2.3",
|
|
43
41
|
"@types/three": "^0.180.0",
|
|
44
42
|
"@vitejs/plugin-react": "^5.1.4",
|
|
45
|
-
"@volter/editor-core": "^0.5.
|
|
46
|
-
"@volter/editor-game": "^0.5.
|
|
47
|
-
"@volter/editor-live": "^0.5.
|
|
48
|
-
"@volter/editor-sdk": "^0.5.
|
|
49
|
-
"@volter/editor-threejs": "^0.5.
|
|
50
|
-
"@volter/game-editor": "^0.5.
|
|
51
|
-
"@volter/game-live": "^0.5.
|
|
43
|
+
"@volter/editor-core": "^0.5.70",
|
|
44
|
+
"@volter/editor-game": "^0.5.70",
|
|
45
|
+
"@volter/editor-live": "^0.5.70",
|
|
46
|
+
"@volter/editor-sdk": "^0.5.70",
|
|
47
|
+
"@volter/editor-threejs": "^0.5.70",
|
|
48
|
+
"@volter/game-editor": "^0.5.70",
|
|
49
|
+
"@volter/game-live": "^0.5.70",
|
|
52
50
|
"colyseus": "^0.17.8",
|
|
53
51
|
"storybook": "10.6.0",
|
|
54
52
|
"tsx": "^4.23.0",
|