@volter/game-editor 0.5.65
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 +11228 -0
- package/LICENSE +686 -0
- package/LICENSE-BLENDER +1409 -0
- package/LICENSE-MCP +21 -0
- package/NOTICE +21 -0
- package/catalog/entries/audio.json +14 -0
- package/catalog/entries/bake.json +36 -0
- package/catalog/entries/blender.json +17 -0
- package/catalog/entries/react-root.json +24 -0
- package/catalog/entries/reflections.json +29 -0
- package/catalog/entries/static-batch.json +25 -0
- package/catalog/project-source/LICENSE +37 -0
- package/catalog/project-source/src/contributions/bake.kind.ts +40 -0
- package/catalog/project-source/src/contributions/builder-document.tsx +65 -0
- package/catalog/project-source/src/contributions/builder-state.ts +27 -0
- package/catalog/project-source/src/contributions/builder-ui.tsx +61 -0
- package/catalog/project-source/src/contributions/module-source.ts +502 -0
- package/catalog/project-source/src/contributions/pages.finder.ts +61 -0
- package/catalog/project-source/src/lib/audio/sfx.ts +255 -0
- package/catalog/project-source/src/lib/bake/asset-seed.ts +128 -0
- package/catalog/project-source/src/lib/bake/bake-schema.ts +65 -0
- package/catalog/project-source/src/lib/bake/clip-layering.ts +203 -0
- package/catalog/project-source/src/lib/bake/gltf-bake.ts +657 -0
- package/catalog/project-source/src/lib/bake/mesh-slice.ts +157 -0
- package/catalog/project-source/src/lib/bake/node-image.ts +463 -0
- package/catalog/project-source/src/lib/bake/object3d-bake.ts +121 -0
- package/catalog/project-source/src/lib/bake/object3d-lifecycle.ts +15 -0
- package/catalog/project-source/src/lib/bake/object3d-source.ts +8 -0
- package/catalog/project-source/src/lib/bake/params.ts +75 -0
- package/catalog/project-source/src/lib/bake/rest-relative-animation.ts +217 -0
- package/catalog/project-source/src/lib/bake/use-model.ts +95 -0
- package/catalog/project-source/src/lib/react-root/index.ts +20 -0
- package/catalog/project-source/src/lib/react-root/react-root-adapter.tsx +57 -0
- package/catalog/project-source/src/lib/reflections/ReflectionProbe.tsx +201 -0
- package/catalog/project-source/src/lib/reflections/index.ts +19 -0
- package/catalog/project-source/src/lib/reflections/probe-controller.ts +75 -0
- package/catalog/project-source/src/lib/reflections/reflection-probe-registry.ts +402 -0
- package/catalog/project-source/src/lib/reflections/volume-reflection-material.ts +416 -0
- package/catalog/project-source/src/lib/static-batch/Frozen.tsx +91 -0
- package/catalog/project-source/src/lib/static-batch/freeze.ts +579 -0
- package/catalog/project-source/src/lib/static-batch/index.ts +44 -0
- package/catalog/project-source/src/lib/static-batch/mutation-watch.ts +149 -0
- package/catalog/project-source/src/lib/static-batch/shadow-cache.ts +171 -0
- package/catalog/project-source/src/tools/bake-module.tool.ts +139 -0
- package/catalog/project-source/src/tools/bake-preview.tool.ts +475 -0
- package/dist/.vite/manifest.json +8304 -0
- package/dist/assets/AssetBudgetPanel-J9--TZPU.js +23 -0
- package/dist/assets/AudioViewer-CR7333fe.js +1 -0
- package/dist/assets/BVHLoader-6bQIXhMX.js +1 -0
- package/dist/assets/BufferGeometryUtils-Nz37EVXf.js +1 -0
- package/dist/assets/CCDIKSolver-CD7vLpsK.js +1 -0
- package/dist/assets/CSS3DRenderer-CL7ABLVK.js +1 -0
- package/dist/assets/CanvasSceneViewport-Bpi6gVTC.js +1 -0
- package/dist/assets/ColladaLoader-aVOPIsCh.js +3 -0
- package/dist/assets/ColorInput-DQBNrW-K.js +1 -0
- package/dist/assets/ConvexGeometry-CAzXlPVG.js +1 -0
- package/dist/assets/ConvexHull-BINCESFp.js +1 -0
- package/dist/assets/CopyShader-BzTUYzf6.js +24 -0
- package/dist/assets/DecalGeometry-160KRdfg.js +1 -0
- package/dist/assets/EXRLoader-Cdans_oJ.js +1 -0
- package/dist/assets/EffectComposer-DQxfsXBZ.js +1 -0
- package/dist/assets/EntityModelDocument-Ccvw66N9.js +1 -0
- package/dist/assets/EnvironmentAssetDocument-Dg-Qq6O6.js +1 -0
- package/dist/assets/FBXLoader-B4MoUtAn.js +1 -0
- package/dist/assets/Fbo-Dz-Soul3.js +1 -0
- package/dist/assets/FontLoader-CvGoVI5a.js +2 -0
- package/dist/assets/GLTFExporter-HgrCle4L.js +1 -0
- package/dist/assets/GameplaySessionTimeline-B52W3FVZ.js +1 -0
- package/dist/assets/Gltf-UHVWKz65.js +2 -0
- package/dist/assets/HDRLoader-THU88oVD.js +5 -0
- package/dist/assets/ImageViewer-Tn7s_MnW.js +1 -0
- package/dist/assets/InspectorCanvasPreview-CEr_Kxna.js +1 -0
- package/dist/assets/InspectorObjectPreview-CVejvLRg.js +1 -0
- package/dist/assets/JsonAssetDocument-C7VGcLhu.js +3 -0
- package/dist/assets/LineSegments2-CsOpKSiM.js +370 -0
- package/dist/assets/MTLLoader-_Xzd4_0p.js +2 -0
- package/dist/assets/MarchingCubes-Bsp4wrzd.js +1 -0
- package/dist/assets/MeshBVH-BiDHDcu-.js +1 -0
- package/dist/assets/ModelAssetDocument-F5GACirk.js +1 -0
- package/dist/assets/NonThreeAuthoringBootstrap-C3woOMxX.js +1 -0
- package/dist/assets/OBJLoader-BhIC6Hwo.js +5 -0
- package/dist/assets/Object3DDocumentViewport-DB7T0NTl.js +2 -0
- package/dist/assets/Object3DPreview-DL8oi7Xs.js +2 -0
- package/dist/assets/OnlineAssetDetail-C6z9RvYK.js +2 -0
- package/dist/assets/OrbitControls-CM3bPray.js +1 -0
- package/dist/assets/OrbitControls-DLpayAaK.js +1 -0
- package/dist/assets/OrthographicCamera-bQozawrh.js +1 -0
- package/dist/assets/PLYLoader-DYQqs5Ik.js +2 -0
- package/dist/assets/PerspectiveCamera-CQ2lh01o.js +1 -0
- package/dist/assets/PlayBar-BR-Vg3Jb.js +2 -0
- package/dist/assets/RGBELoader-BgBcQv8j.js +1 -0
- package/dist/assets/RectAreaLightUniformsLib-CMMoWfll.js +1 -0
- package/dist/assets/RenderPass-DPrn-Uky.js +1 -0
- package/dist/assets/ResolutionPicker-C67vs1F3.js +1 -0
- package/dist/assets/RootSelectionOverlay-BZPlxmXU.js +1 -0
- package/dist/assets/RoundedBox-BDGBg6QZ.js +1 -0
- package/dist/assets/RoundedBoxGeometry-CyUuYPfW.js +1 -0
- package/dist/assets/STLLoader-Dyv3lsxY.js +1 -0
- package/dist/assets/SelectionBox-D_75KrNW.js +1 -0
- package/dist/assets/ShaderPass-QYRpPuFJ.js +1 -0
- package/dist/assets/ShadowEditor-DkImwu1Y.js +1 -0
- package/dist/assets/SimplifyModifier-C8ayvRzd.js +1 -0
- package/dist/assets/SkeletonUtils-Cps8GOC6.js +1 -0
- package/dist/assets/Sky-CQKCgYDs.js +154 -0
- package/dist/assets/SourceAssetViewer-2SWQoUut.js +12 -0
- package/dist/assets/StageHost-BN-IoTef.js +2 -0
- package/dist/assets/StoryPreviewMount-DjyxRCXu.js +1 -0
- package/dist/assets/TDSLoader-D_T8XJ81.js +1 -0
- package/dist/assets/TextGeometry-DOWAEUV0.js +1 -0
- package/dist/assets/ThreeBoardDocument-CVncZyIq.js +2 -0
- package/dist/assets/ThreeIsolationSceneContent-C8C8whSF.js +1 -0
- package/dist/assets/ToolObject3DPreview-BRoDWe4Q.js +1 -0
- package/dist/assets/TrackballControls-DfznuQTh.js +1 -0
- package/dist/assets/TransientHint-BB1fwrvK.js +1 -0
- package/dist/assets/UnrealBloomPass-CR-cS_K5.js +83 -0
- package/dist/assets/VideoViewer-C6kocgIU.js +1 -0
- package/dist/assets/_commonjsHelpers-D6-XlEtG.js +1 -0
- package/dist/assets/active-ingest-CT6jSGhr.js +3 -0
- package/dist/assets/adapter-surface-Y37Nzcyw.js +1 -0
- package/dist/assets/after-paint-CB4bz1-e.js +1 -0
- package/dist/assets/agx-base-srgb-BjWZJgrZ.lut +0 -0
- package/dist/assets/agx-look-medium-high-contrast-D5F_ob1L.lut +0 -0
- package/dist/assets/agx-look-punchy-dxsnycNs.lut +0 -0
- package/dist/assets/animation-clock-CnjZqfJp.js +1 -0
- package/dist/assets/asset-budget-asset.menu-Di3KiQCd.js +1 -0
- package/dist/assets/asset-budget.action-DCzzcuTh.js +1 -0
- package/dist/assets/asset-budget.document-BWU8wnVW.js +1 -0
- package/dist/assets/asset-budget.menu-BGZpT_31.js +1 -0
- package/dist/assets/asset-editor-persistence-BBaONOJt.js +1 -0
- package/dist/assets/asset-loaders-BOy5Ss8k.js +2 -0
- package/dist/assets/asset-parse-error-BHMwBRU3.js +3 -0
- package/dist/assets/assets-BuSoGjBX.js +1 -0
- package/dist/assets/audio-meter-CyiToeUW.js +1 -0
- package/dist/assets/audio-unlock.service-CfUgUQVy.js +1 -0
- package/dist/assets/audio.utility-C6K6jem8.js +1 -0
- package/dist/assets/authoring-CgcOFhGS.js +1 -0
- package/dist/assets/autoplay.service-BZBGNSvt.js +1 -0
- package/dist/assets/axe-LkjAB6Lv.js +30 -0
- package/dist/assets/babylon-authoring-adapter-CL02gWDn.js +1 -0
- package/dist/assets/binding-Bmxqznjk.js +1 -0
- package/dist/assets/binding-identity-DcTpbvyg.js +1 -0
- package/dist/assets/binding-resolver-Dsh-6Vor.js +2 -0
- package/dist/assets/blender-emscripten-engine-9ZIRYNhe.js +2 -0
- package/dist/assets/blender-node-editor.document-iIDkB9sI.js +1 -0
- package/dist/assets/blender-properties-tab-C5CyPydi.js +3 -0
- package/dist/assets/blender-runtime-host-BpBwGv7r.js +4 -0
- package/dist/assets/blender-runtime-skin-DyQ9B6CR.js +7140 -0
- package/dist/assets/blender-runtime.document-lIYhhPtv.js +8 -0
- package/dist/assets/blender-timeline.document-77fx96N7.js +1 -0
- package/dist/assets/blender-uv-editor.document-fsT7B4gV.js +1 -0
- package/dist/assets/blender-version.status-o6dBm3n6.js +1 -0
- package/dist/assets/blender-wali-engine-wTOcrOMC.js +2 -0
- package/dist/assets/blender.command-BtJeWk-A.js +1 -0
- package/dist/assets/blender.keymap-GAQgeklK.js +1 -0
- package/dist/assets/blender.status-ujwGU6dU.js +1 -0
- package/dist/assets/blender.style-Dcem5f_T.js +1 -0
- package/dist/assets/board-guides-DziKSTss.js +1 -0
- package/dist/assets/body-marks-h_xDxiDE.js +1 -0
- package/dist/assets/bridge.command-o5gDNEwa.js +3 -0
- package/dist/assets/browserAll-DeWblVez.js +1 -0
- package/dist/assets/build-profiles.document-kW8iw8Xj.js +2 -0
- package/dist/assets/build-progress.status-BNRLytg2.js +1 -0
- package/dist/assets/build-session-C_sg3CEn.js +9 -0
- package/dist/assets/build.action-lYjTLb7K.js +1 -0
- package/dist/assets/build.command-DIGgUPU_.js +1 -0
- package/dist/assets/build.header-CKajx5U3.js +1 -0
- package/dist/assets/build.menu-BdU0QXny.js +1 -0
- package/dist/assets/build.service-CbBAyeu3.js +1 -0
- package/dist/assets/bus-mixer-CGfWDP3C.js +1 -0
- package/dist/assets/camera-KEsKvOL7.js +1 -0
- package/dist/assets/camera-runtime.inspector-B7unX4g1.js +1 -0
- package/dist/assets/canvas-entry-runtime-SfBxaR9M.js +2 -0
- package/dist/assets/capability-coverage-Czas4C18.js +7 -0
- package/dist/assets/chrome-trace-YZHMz60-.js +1 -0
- package/dist/assets/client-DNXj_opT.js +25 -0
- package/dist/assets/clip-planes-CnAI6DZn.js +1 -0
- package/dist/assets/collaboration-presence-DLoZ7EA3.js +1 -0
- package/dist/assets/collider-Bw0mXlsW.js +1 -0
- package/dist/assets/collider-dimensions-9xoFADXN.js +1 -0
- package/dist/assets/collision-system-DpNUJRJ3.js +1 -0
- package/dist/assets/command-results-CUQD49AB.js +1 -0
- package/dist/assets/component-board-registry-DrIa2csL.js +1 -0
- package/dist/assets/component-board.service-DCwcUssB.js +2 -0
- package/dist/assets/component-board.service-DidCyM4O.js +2 -0
- package/dist/assets/component-verbs.command-7xzfjGMZ.js +1 -0
- package/dist/assets/component-verbs.service-Bv9jId3q.js +1 -0
- package/dist/assets/config-CEZk921y.js +6 -0
- package/dist/assets/configurations-DTBMdaTL.js +1 -0
- package/dist/assets/connection.status-BifnQdOs.js +1 -0
- package/dist/assets/console-bridge-CHcb-xk5.js +1 -0
- package/dist/assets/constraint-De8f1Uiq.js +1 -0
- package/dist/assets/constraints.inspector-B9U9Yj-u.js +1 -0
- package/dist/assets/countdown-timer-CUm74dom.js +1 -0
- package/dist/assets/coverage.service-VTX5Mcsx.js +3 -0
- package/dist/assets/crash-null-boundary-v3a0uEgw.js +1 -0
- package/dist/assets/create-runtime-CVCc1BDx.js +1 -0
- package/dist/assets/curve-7Q79VgU4.js +1 -0
- package/dist/assets/data-asset-4hjS642k.js +5 -0
- package/dist/assets/data-check-core-CQEjuFyt.js +1 -0
- package/dist/assets/data-ref-CQI28C0D.js +1 -0
- package/dist/assets/debug-bridge-CCohG-d-.js +1 -0
- package/dist/assets/debug-registry-Dgvitx8M.js +1 -0
- package/dist/assets/defaults-DKiBJCPN.js +1 -0
- package/dist/assets/deferred-commands-CEMmvL47.js +1 -0
- package/dist/assets/deferred-ingest-play-DCJi_Pgu.js +2 -0
- package/dist/assets/design-time-layers-wYgOTgni.js +1 -0
- package/dist/assets/design-time-mount-registry-DUpXCg1U.js +1 -0
- package/dist/assets/design-time-mount.service-BzY21e1F.js +2 -0
- package/dist/assets/design-time-react-mount-DM9WLrF2.js +1 -0
- package/dist/assets/dev-build-gDYrq68M.js +1 -0
- package/dist/assets/directional-shadow-fit-BVkOKAv2.js +1 -0
- package/dist/assets/document-preview-three-Kbg2GCLm.js +1 -0
- package/dist/assets/dom-authoring-adapter-CY8C7f4T.js +1 -0
- package/dist/assets/draco3d-BBUTcNkz.js +1 -0
- package/dist/assets/draco_decoder-DsQ12WqX.wasm +0 -0
- package/dist/assets/draco_encoder-2Tcju8Ns.wasm +0 -0
- package/dist/assets/edit-mode-audio.service-Bzetwd5B.js +1 -0
- package/dist/assets/edit-mode-authoring-B47TfLqu.js +1 -0
- package/dist/assets/edit-mode-networking.service-YCX6RRb_.js +1 -0
- package/dist/assets/editor-api-BoJIcyZG.js +1 -0
- package/dist/assets/editor-port-C_FeBdeV.js +1 -0
- package/dist/assets/editor-presentation-activity-C7SNSmTd.js +1 -0
- package/dist/assets/entry-adjudication-Cq8Yeb74.js +1 -0
- package/dist/assets/environment-capture-7himRh2L.js +1 -0
- package/dist/assets/esbuild-BHljloGq.wasm +0 -0
- package/dist/assets/events-156d8d12.esm-ErOhDXXB.js +36 -0
- package/dist/assets/extend-B-eOccUm.js +36 -0
- package/dist/assets/extends-CF3RwP-h.js +1 -0
- package/dist/assets/eyedropper-session-bjPXnfeX.js +1 -0
- package/dist/assets/fflate.module-DPuTF8aG.js +6 -0
- package/dist/assets/filmic-srgb-Ct35FIH6.lut +0 -0
- package/dist/assets/first-party-audio-system-DxnGJOER.js +1 -0
- package/dist/assets/first-party-navigation-system-CL5Bquub.js +1 -0
- package/dist/assets/fork-menu-BoVyw2Wu.js +1 -0
- package/dist/assets/frame-debugger-store-D1Mf_5up.js +1 -0
- package/dist/assets/frame-delta-D2nsw_Ht.js +1 -0
- package/dist/assets/frame-pacing-D5acoOzO.js +1 -0
- package/dist/assets/frame-selector-cache-cCeUbcjG.js +1 -0
- package/dist/assets/game-DHOZVb-7.js +1 -0
- package/dist/assets/game-contract-seams-a5YXejOu.js +1 -0
- package/dist/assets/game-css-scope-transform-Eng4wS8E.js +33 -0
- package/dist/assets/game-document.service-DbRfx2V0.js +1 -0
- package/dist/assets/game-eval.command-D-7Dxbj_.js +2 -0
- package/dist/assets/game-input-seams-CIQdetRw.js +1 -0
- package/dist/assets/game-loop-CZvXlY00.js +1 -0
- package/dist/assets/game-module-access-B2mFxv-i.js +1 -0
- package/dist/assets/game.layout-CBASrvQu.js +1 -0
- package/dist/assets/gameplay-export-BoKXm51x.js +1 -0
- package/dist/assets/gameplay-replay-e5umMlXv.js +1 -0
- package/dist/assets/gameplay-rng-trap-CTNhm-UW.js +3 -0
- package/dist/assets/gameplay.command-DxcVYX6F.js +1 -0
- package/dist/assets/generation-DhwCUHPf.css +1 -0
- package/dist/assets/generation-jobs-BQrXbGp_.js +1 -0
- package/dist/assets/generation.service-CDIgObuw.js +1 -0
- package/dist/assets/generations-DzUogZsM.js +1 -0
- package/dist/assets/generations.status-CgOUBCum.js +1 -0
- package/dist/assets/hierarchy-marks-BLPfSIym.js +1 -0
- package/dist/assets/host-pointer-DbGSCjE9.js +1 -0
- package/dist/assets/hosted-asset-materialization-CiIvWkGU.js +2 -0
- package/dist/assets/ibl-override-material-BlmCxFKq.js +6 -0
- package/dist/assets/index-96FBF1Oj.js +1 -0
- package/dist/assets/index-BAWkB0dv.js +1 -0
- package/dist/assets/index-BDnS2b6S.js +1 -0
- package/dist/assets/index-BHp07vN0.js +2 -0
- package/dist/assets/index-BMxv2MNV.js +1 -0
- package/dist/assets/index-BP6wv2A0.js +5 -0
- package/dist/assets/index-BcCBqgM_.js +952 -0
- package/dist/assets/index-Bge9JUr6.js +1 -0
- package/dist/assets/index-BjTCPEQ7.js +134 -0
- package/dist/assets/index-BncK9THk.js +1 -0
- package/dist/assets/index-CJbYy-CF.js +3 -0
- package/dist/assets/index-CVCb_ImQ.js +1 -0
- package/dist/assets/index-CZd9o7Lu.js +1 -0
- package/dist/assets/index-CanA16PU.js +2 -0
- package/dist/assets/index-CinJrH5C.js +9 -0
- package/dist/assets/index-CtzuWnCS.js +1 -0
- package/dist/assets/index-D2fNXpHa.css +1 -0
- package/dist/assets/index-DUpHH6JR.js +3120 -0
- package/dist/assets/index-DUqP1RMl.js +1 -0
- package/dist/assets/index-D_NuPfjr.js +9 -0
- package/dist/assets/index-Da9JhEvW.js +25 -0
- package/dist/assets/index-DgapqSPi.js +7 -0
- package/dist/assets/index-FUuS4qwW.js +562 -0
- package/dist/assets/index-GIL7oGEO.js +4894 -0
- package/dist/assets/index-IEjydI9d.js +1 -0
- package/dist/assets/index-OrYXPk3Z.js +487 -0
- package/dist/assets/index-V1R-e5Bd.js +1 -0
- package/dist/assets/index-bQE2NA0D.js +1 -0
- package/dist/assets/index-gHZae-lw.js +13 -0
- package/dist/assets/index-mjWQmGhM.js +1 -0
- package/dist/assets/index-nmcBqr7Y.js +1 -0
- package/dist/assets/inference-diagnostics-Dhmtfbq_.js +1 -0
- package/dist/assets/ingest-BbYMC2vQ.js +1 -0
- package/dist/assets/ingest-boot-viewport-D5rI_Kk_.js +1 -0
- package/dist/assets/ingest-siblings-Bop2kqVl.js +1 -0
- package/dist/assets/ingest-source-persistence-C_6Hiyra.js +1 -0
- package/dist/assets/ingest.service-BTDnQfM1.js +1 -0
- package/dist/assets/input-manager-DH_hGW6d.js +1 -0
- package/dist/assets/input-router-BNQvtIqw.js +1 -0
- package/dist/assets/inspect-BZfi3mmo.js +1 -0
- package/dist/assets/inspection-CObLhnrs.js +1 -0
- package/dist/assets/instance-fork-actions-D3sRzS3K.js +1 -0
- package/dist/assets/instances.command-D6UkZNO8.js +1 -0
- package/dist/assets/instruments-CKR02Y8I.js +1 -0
- package/dist/assets/json-history-resource-BbxllWfV.js +1 -0
- package/dist/assets/jsx-runtime-DPjLkJKQ.js +9 -0
- package/dist/assets/light-D-_wsKTq.js +1 -0
- package/dist/assets/light-camera-factory-CWbbe9gI.js +1 -0
- package/dist/assets/lil-gui.module.min-BF55BEwA.js +10 -0
- package/dist/assets/live-behaviors-Bxq49Maz.js +1 -0
- package/dist/assets/live-gesture-lock-DJbrjOqf.js +1 -0
- package/dist/assets/loader-CaF_I7Yt.js +1 -0
- package/dist/assets/logger-Dqis-7W1.js +1 -0
- package/dist/assets/loop-gate-report-N52EWFGD.js +1 -0
- package/dist/assets/matcap-texture-CVfalpWT.js +1 -0
- package/dist/assets/material-CpAdjDxn.js +1 -0
- package/dist/assets/material-factory-Bz6h__6g.js +1 -0
- package/dist/assets/mesh-B3WPtNKO.js +1 -0
- package/dist/assets/mesh-shadow-CZnXrw_l.js +1 -0
- package/dist/assets/mikktspace.module-DO88SLib.js +1 -0
- package/dist/assets/model-asset-sections-CFvvihfx.css +1 -0
- package/dist/assets/model-asset-sections.service-CHhFS3ZX.js +1 -0
- package/dist/assets/model.layout-BJUEQYUI.js +1 -0
- package/dist/assets/models.finder-G2jQgIRu.js +1 -0
- package/dist/assets/module-mode-DVBLT9d-.js +2 -0
- package/dist/assets/mount-canvas-ingest-root-DDuAWf_C.js +2 -0
- package/dist/assets/mount-dom-ingest-root-D_EiBgpn.js +2 -0
- package/dist/assets/mount-game-6t9cKNo4.js +1 -0
- package/dist/assets/mount-ingest-root-glv2SSWf.js +2 -0
- package/dist/assets/mount-manifest-CGVxhmAw.js +1 -0
- package/dist/assets/mount-readiness-Ds0HvvLH.js +4 -0
- package/dist/assets/mount-three-ingest-root-hrUt9VVU.js +1 -0
- package/dist/assets/mounted-authoring-Dmg5xmhP.js +1 -0
- package/dist/assets/mounted-story-viewport-source-DjP6RA9U.js +1 -0
- package/dist/assets/native-debug-module-CWicoSGD.js +1 -0
- package/dist/assets/native-entry-surface-BE8LJNdu.js +1 -0
- package/dist/assets/navigation-CIiCx-SM.js +1 -0
- package/dist/assets/navmesh-workflow-store-Cmnm57TB.js +1 -0
- package/dist/assets/navmesh.menu-CAKiH8PW.js +1 -0
- package/dist/assets/navmesh.service-jgDWlgj1.js +1 -0
- package/dist/assets/network.utility-CEu5nHf7.js +1 -0
- package/dist/assets/object-marks-DwvIEBOK.js +1 -0
- package/dist/assets/object3d-authoring-subject-CH5sI2oP.js +1 -0
- package/dist/assets/output-DK8waum9.js +195 -0
- package/dist/assets/particles-Y626p22p.js +1 -0
- package/dist/assets/particles-factory-DnLOHXT8.js +1 -0
- package/dist/assets/pasteboard-materialize-BqSS4QzV.js +20 -0
- package/dist/assets/pasteboard.action-DU3UHtJG.js +2 -0
- package/dist/assets/performance-profiler-D_Jey87L.js +1 -0
- package/dist/assets/physics-registry-B2Jkp8e6.js +1 -0
- package/dist/assets/physics-registry-CUB9cT9p.js +1 -0
- package/dist/assets/pixi-authoring-adapter-CjibysC3.js +1 -0
- package/dist/assets/pixi-live-write-target-DuWydlWb.js +1 -0
- package/dist/assets/pixi-primitive-DlWbUPN9.js +1 -0
- package/dist/assets/pixi-react-root-factory-DYsznYRQ.js +1 -0
- package/dist/assets/pixi-story-model-DNkfnWUV.js +1 -0
- package/dist/assets/pixi-transform-channels-VjdohT11.js +1 -0
- package/dist/assets/play-mode-BFU2PCkG.js +22 -0
- package/dist/assets/play.command-BpqqLqkq.js +2 -0
- package/dist/assets/playtest-BXIL1JEF.js +1 -0
- package/dist/assets/pose-guard-6Osb2cFu.js +1 -0
- package/dist/assets/presentation-BPP5pXeQ.js +1 -0
- package/dist/assets/product-DFhyARJj.js +1 -0
- package/dist/assets/profiler.action-CaXJDp3t.js +1 -0
- package/dist/assets/profiler.menu-BIMF6Bi4.js +1 -0
- package/dist/assets/profiler.utility-BExw9wBO.js +1 -0
- package/dist/assets/project-authoring-session-Bnt6icLr.js +2 -0
- package/dist/assets/project-provenance-BoP3nrle.js +1 -0
- package/dist/assets/prompt-labels-DSMdM2_B.js +1 -0
- package/dist/assets/properties-bone-constraints.inspector-ByT6p7S-.js +1 -0
- package/dist/assets/properties-bone.inspector-z4qJwKO5.js +1 -0
- package/dist/assets/properties-collection.inspector-D0_3ijWU.js +1 -0
- package/dist/assets/properties-constraints.inspector-CESzjuls.js +1 -0
- package/dist/assets/properties-data.inspector-hG8Wgyzb.js +1 -0
- package/dist/assets/properties-material.inspector-CzY0JCQ6.js +1 -0
- package/dist/assets/properties-modifiers.inspector-3dDhwf7g.js +1 -0
- package/dist/assets/properties-object.inspector-CiarfxkT.js +1 -0
- package/dist/assets/properties-output.inspector-DKJxmKSD.js +1 -0
- package/dist/assets/properties-particles.inspector-CCEdYWGm.js +1 -0
- package/dist/assets/properties-physics.inspector-B2c0KUyA.js +1 -0
- package/dist/assets/properties-render.inspector-Bcm0HLRW.js +1 -0
- package/dist/assets/properties-scene.inspector-PIM_eTb_.js +1 -0
- package/dist/assets/properties-texture.inspector-CgFlnyr8.js +1 -0
- package/dist/assets/properties-view-layer.inspector-DGjF_Aqo.js +1 -0
- package/dist/assets/properties-world.inspector-CrMvaRvB.js +1 -0
- package/dist/assets/r3f-design-session-D-4yyDO9.js +2 -0
- package/dist/assets/r3f-physics-binding-BBo8oma9.js +1 -0
- package/dist/assets/r3f-root-factory-z9llD1OU.js +1 -0
- package/dist/assets/r3f-source-authoring-adapter-w6Bc60K-.js +13 -0
- package/dist/assets/rapier-physics-adapter-CaZqWLu0.js +1 -0
- package/dist/assets/rapier-physics-bridge-CMoeVo3Y.js +1 -0
- package/dist/assets/react-18-By2b4xR9.js +1 -0
- package/dist/assets/react-inspector.service-B_neRnSK.js +1 -0
- package/dist/assets/react-root-CEz5NTck.js +1 -0
- package/dist/assets/react-story-board-BDDwiE2H.js +1 -0
- package/dist/assets/react-three-fiber.esm-CycrbDlA.js +1 -0
- package/dist/assets/react-three-rapier.esm-CEfKpvxT.js +1 -0
- package/dist/assets/react-world-authoring-adapter-DmrwM3py.js +1 -0
- package/dist/assets/realm-services-CobQsq_X.js +1 -0
- package/dist/assets/rebind-controller-Dtq19Vb3.js +1 -0
- package/dist/assets/recast-navigation.wasm-compat-Dsoa_MD-.js +1 -0
- package/dist/assets/reflection-probe-Don-M3Fj.js +1 -0
- package/dist/assets/reflection-probe-capture.inspector-CmFUoJCx.js +1 -0
- package/dist/assets/register-render-vitals-BiZk29b2.js +1 -0
- package/dist/assets/registry-02YZjMNp.js +1 -0
- package/dist/assets/relative-path-guard-GiM7Lsz8.js +1 -0
- package/dist/assets/render-audio-control-vMRlePWb.js +1 -0
- package/dist/assets/render-batch-system-0vq7p0VC.js +1 -0
- package/dist/assets/render-census-BrQX_CXv.js +1 -0
- package/dist/assets/render-control-Df3yTiyr.js +1 -0
- package/dist/assets/render-env-D2IV2x5k.js +1 -0
- package/dist/assets/render-features-CPQ_e568.js +1 -0
- package/dist/assets/render-seed-DF4JHy7P.js +1 -0
- package/dist/assets/render-settings-Bw4W9SYF.js +1 -0
- package/dist/assets/render-vitals-BZ5HtvMi.js +1 -0
- package/dist/assets/renderer-config-BqG4O8i9.js +1 -0
- package/dist/assets/resolve-three-SZE_WWUM.js +702 -0
- package/dist/assets/root-seam-contract-Z0VWX3Bk.js +1 -0
- package/dist/assets/rrweb-Cd2ifIRP.js +142 -0
- package/dist/assets/run-ticks-settled-C4ksViyA.js +1 -0
- package/dist/assets/runtime-inspection-l2iFQSsg.js +1 -0
- package/dist/assets/scene-capture-BQKzU0NT.js +1 -0
- package/dist/assets/scene-capture-CGYF-Viw.js +1 -0
- package/dist/assets/scene-document.service-qkDjUrlP.js +2 -0
- package/dist/assets/scene-framing-Cat0GtyJ.js +1 -0
- package/dist/assets/scene-index-B6BZOHMk.js +1 -0
- package/dist/assets/scene-query-C7_N-TpI.js +1 -0
- package/dist/assets/schema-kl9-2B_J.js +1 -0
- package/dist/assets/sculpt.layout-zJF55yCR.js +1 -0
- package/dist/assets/seeded-random-i3mtgBKZ.js +1 -0
- package/dist/assets/session-CZ5JPg-z.js +4877 -0
- package/dist/assets/setup-audio-S8GQF91f.js +1 -0
- package/dist/assets/setup-particles-GCXlnkj_.js +1 -0
- package/dist/assets/setup-physics-BeZ7-LKD.js +1 -0
- package/dist/assets/setup-renderer-DVXaSGin.js +1587 -0
- package/dist/assets/shading.layout-DULYZV6M.js +1 -0
- package/dist/assets/sim-clock-CLflx7kg.js +1 -0
- package/dist/assets/sky-precompute-worker-ChN7J87v.js +1 -0
- package/dist/assets/soft-particle-depth-DGvfQDi1.js +1 -0
- package/dist/assets/source-object3d-authoring-adapter-B-L6Ha6f.js +1 -0
- package/dist/assets/source-persistence-backend-C-aR-B_Y.js +1 -0
- package/dist/assets/spark-renderer-lifecycle-ynWESJcv.js +1 -0
- package/dist/assets/spark.module-4pXQoz5d.js +12120 -0
- package/dist/assets/stage-invalidation-DBg3C3Ta.js +1 -0
- package/dist/assets/stage-keyboard-n-5kKH-m.js +1 -0
- package/dist/assets/stage-overlay-set-B9zp2sLB.js +1 -0
- package/dist/assets/stage-presence-markers-DiGI6A45.js +1 -0
- package/dist/assets/standard-viewport-dressing-CzjAe_0A.js +7 -0
- package/dist/assets/state-bridge-DLP1jLRW.js +1 -0
- package/dist/assets/state-watch.action-BOvQR2qt.js +1 -0
- package/dist/assets/state-watch.menu-CNLvDeeY.js +1 -0
- package/dist/assets/state-watch.utility-Bg1tTTQU.js +1 -0
- package/dist/assets/static-batch-advisor-B13QEH7d.js +1 -0
- package/dist/assets/stats.module-BL02l9NC.js +1 -0
- package/dist/assets/story-arg-descriptors-Ek86ExX7.js +1 -0
- package/dist/assets/story-capture-_gC8dXV-.js +1 -0
- package/dist/assets/story-documents--TDLaPeL.js +3 -0
- package/dist/assets/story-documents.service-BiS_YbNQ.js +1 -0
- package/dist/assets/story-documents.service-CxOPYJ2j.js +1 -0
- package/dist/assets/story-media-presence-BHzk2IV5.js +1 -0
- package/dist/assets/story-mount-turn-DFRTj5hi.js +1 -0
- package/dist/assets/story-pixi-preview-BUrOJZXS.js +1 -0
- package/dist/assets/story-presentation-j2AVN-mK.js +1 -0
- package/dist/assets/story-three-preview-BHEDZzcl.js +2 -0
- package/dist/assets/structural-ids-Dc-7rEwi.js +1 -0
- package/dist/assets/structural-signature-0w-i_ats.js +1 -0
- package/dist/assets/surface-content-Dg9Kkazf.js +1 -0
- package/dist/assets/surface-state-DaxyruCj.js +3 -0
- package/dist/assets/system-adapters-rIC8FSGP.js +1 -0
- package/dist/assets/system-runner-DkOjxEBt.js +1 -0
- package/dist/assets/system-slot-E2mEdiih.js +1 -0
- package/dist/assets/team-playtest.service-DqOinFVA.js +1 -0
- package/dist/assets/texture.layout-DASpHVht.js +1 -0
- package/dist/assets/three-CDSueJyJ.js +1 -0
- package/dist/assets/three-authoring-adapter-CmSQ3Vui.js +1 -0
- package/dist/assets/three-authoring.service-iuHLwtf1.js +2 -0
- package/dist/assets/three-ingest-runtime-QzDYk6tU.js +1 -0
- package/dist/assets/three-projection-core-BmKMZ-nf.js +1 -0
- package/dist/assets/three-viewport-presentation-QBQpSdMh.js +1 -0
- package/dist/assets/three.module-D396a9Mn.js +3840 -0
- package/dist/assets/three.quarks.esm-B1C61jGo.js +1039 -0
- package/dist/assets/tools-B_NJsk05.js +1 -0
- package/dist/assets/transform-writer-BhBBTx33.js +1 -0
- package/dist/assets/transport.header-B-6HQlU2.js +1 -0
- package/dist/assets/trigger-volume-BNK2XzPL.js +1 -0
- package/dist/assets/tuples-CIQ4Bn1U.js +1 -0
- package/dist/assets/tween.module-DciWpAG6.js +1 -0
- package/dist/assets/ui-board-document-Bwtt--xp.js +2 -0
- package/dist/assets/unexported-game-trap-Dm1JYKHy.js +2 -0
- package/dist/assets/unmanaged-root-detector-B8CpbkSN.js +2 -0
- package/dist/assets/upstream-pin-BdgRH6ID.js +1 -0
- package/dist/assets/use-data-Dzq-MytE.js +1 -0
- package/dist/assets/use-live-actor-state-DErbWQWF.js +1 -0
- package/dist/assets/use-selection-DbR73-xd.js +1 -0
- package/dist/assets/user-data-BB2Of6Ht.js +1 -0
- package/dist/assets/utility-view-state-BHypxA33.js +1 -0
- package/dist/assets/uv-editing.layout-BEKHxmHw.js +1 -0
- package/dist/assets/vgai-shared-fontawesome-CU65D4Ij.js +1 -0
- package/dist/assets/vgai-shared-jsx-dev-runtime-DFDKL7fx.js +1 -0
- package/dist/assets/vgai-shared-jsx-runtime-DIqBpTut.js +1 -0
- package/dist/assets/vgai-shared-react-BT7rMc2H.js +1 -0
- package/dist/assets/vgai-shared-react-dom-DFajMqMT.js +1 -0
- package/dist/assets/vgai-shared-react-dom-client-S0ozfl6_.js +1 -0
- package/dist/assets/vgai-shared-three-Bc5PvpLM.js +1 -0
- package/dist/assets/viewport-pick-context-DkawXbEi.js +1 -0
- package/dist/assets/viewport-root-presentation-CWsE56K6.js +1 -0
- package/dist/assets/viewport-shading-BuA88e_A.js +1 -0
- package/dist/assets/viewport-shading-boundary-B_-_gABg.js +82 -0
- package/dist/assets/viewport-surface-status-B3om4Kcf.js +1 -0
- package/dist/assets/vision_bundle-DX0dWqEa.js +15 -0
- package/dist/assets/voxel-surface-DtcsSWRL.js +1 -0
- package/dist/assets/wav-encode-D31zWF6O.js +1 -0
- package/dist/assets/webgl-frame-capture-FlF9zQmW.js +1 -0
- package/dist/assets/webgl-gpu-timer-D3YX7RaD.js +1 -0
- package/dist/assets/webworkerAll-CM2o_dnz.js +1 -0
- package/dist/assets/worker-UrMcrc5_.js +2 -0
- package/dist/assets/world-documents-147tiFZe.js +1 -0
- package/dist/assets/world-root-stage-binding-vwTrtBz6.js +1 -0
- package/dist/assets/world-state-BWG-IcOd.js +1 -0
- package/dist/assets/writer-B-KovzkA.js +5 -0
- package/dist/assets/xstate-animation-binding-Brd0NST6.js +1 -0
- package/dist/assets/xstate-animation-meta-Q3u9zh_m.js +1 -0
- package/dist/assets/xstate-behavior.action-B8UluFBK.js +1 -0
- package/dist/assets/xstate-behavior.document-CKAsE45I.js +1 -0
- package/dist/assets/xstate-behavior.inspector-vJJyuifc.js +1 -0
- package/dist/assets/xstate-behavior.menu-BXbPICIh.js +1 -0
- package/dist/assets/xstate-inspection-BsZv8LS9.js +1 -0
- package/dist/vgai-shared-react.json +10 -0
- package/dist/vgai-shared-three.json +3 -0
- package/dist-node/cli.js +9320 -0
- package/dist-node/create.js +3239 -0
- package/package.json +91 -0
- package/presets.mjs +2 -0
- package/src/contributions.d.ts +4 -0
- package/src/index.ts +38 -0
- package/starter/cube.blend +0 -0
- package/starter/cube.py +81 -0
- package/template/.agents/references/project-manual.md +341 -0
- package/template/.agents/skills/editor/SKILL.md +53 -0
- package/template/.agents/skills/editor/agents/openai.yaml +4 -0
- package/template/.agents/skills/editor/references/editor-control.md +363 -0
- package/template/.agents/skills/vgai-3d-models/SKILL.md +64 -0
- package/template/.agents/skills/vgai-ingest-existing-game/SKILL.md +112 -0
- package/template/.agents/skills/vgai-threejs-authoring/SKILL.md +347 -0
- package/template/.agents/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
- package/template/.agents/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
- package/template/.claude/skills/editor/SKILL.md +53 -0
- package/template/.claude/skills/editor/agents/openai.yaml +4 -0
- package/template/.claude/skills/editor/references/editor-control.md +363 -0
- package/template/.claude/skills/vgai-3d-models/SKILL.md +64 -0
- package/template/.claude/skills/vgai-ingest-existing-game/SKILL.md +112 -0
- package/template/.claude/skills/vgai-threejs-authoring/SKILL.md +347 -0
- package/template/.claude/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
- package/template/.claude/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
- package/template/.github/copilot-instructions.md +6 -0
- package/template/.github/skills/editor/SKILL.md +53 -0
- package/template/.github/skills/editor/agents/openai.yaml +4 -0
- package/template/.github/skills/editor/references/editor-control.md +363 -0
- package/template/.github/skills/vgai-3d-models/SKILL.md +64 -0
- package/template/.github/skills/vgai-ingest-existing-game/SKILL.md +112 -0
- package/template/.github/skills/vgai-threejs-authoring/SKILL.md +347 -0
- package/template/.github/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
- package/template/.github/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
- package/template/.mcp.json +12 -0
- package/template/.vgai/assets.json +1 -0
- package/template/.vgai/provenance.json +4 -0
- package/template/.volter/tracker/validation/.preset.base.mts +178 -0
- package/template/.volter/tracker/validation/preset.mts +186 -0
- package/template/.volter/tracker/visualizer/.extension.base.tsx +14 -0
- package/template/.volter/tracker/visualizer/extension.tsx +14 -0
- package/template/.volter/tracker-config.json +17 -0
- package/template/AGENTS.md +176 -0
- package/template/CLAUDE.md +1 -0
- package/template/DEVLOG.md +20 -0
- package/template/IDIOMS.md +118 -0
- package/template/LICENSE +30 -0
- package/template/README.md +83 -0
- package/template/ROADMAP.md +20 -0
- package/template/asset-manifest.json +3 -0
- package/template/check-idioms.ts +1533 -0
- package/template/index.html +18 -0
- package/template/manifest-entry-modules-plugin.ts +53 -0
- package/template/package.json +62 -0
- package/template/public/jsm/libs/basis/basis_transcoder.js +19 -0
- package/template/public/jsm/libs/basis/basis_transcoder.wasm +0 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
- package/template/public/jsm/libs/draco/gltf/draco_encoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/template/public/shaders/daylight-sky.frag.glsl +15 -0
- package/template/public/shaders/daylight-sky.vert.glsl +7 -0
- package/template/scripts/patch-drei-stats-gl.mjs +35 -0
- package/template/server/colyseus-setup.ts +111 -0
- package/template/server/loopback.ts +76 -0
- package/template/server/main.ts +78 -0
- package/template/server/rooms/arena-room.ts +488 -0
- package/template/server/rooms/game-room.ts +274 -0
- package/template/server/rooms.ts +15 -0
- package/template/server/tsconfig.json +19 -0
- package/template/src/bot/QaTester.tsx +35 -0
- package/template/src/bot/behaviors.ts +203 -0
- package/template/src/bot/bot-station.ts +192 -0
- package/template/src/bot/tester-run.ts +238 -0
- package/template/src/bot/tester-station.ts +193 -0
- package/template/src/components/environment/DaylightSky.tsx +54 -0
- package/template/src/components/environment/Ground.tsx +129 -0
- package/template/src/components/environment/SceneAtmosphere.tsx +14 -0
- package/template/src/components/environment/SoftGroundShadow.tsx +62 -0
- package/template/src/components/environment/SunShadowFit.tsx +141 -0
- package/template/src/contributions/README.md +98 -0
- package/template/src/contributions/analytics.analytics.tsx +26 -0
- package/template/src/contributions/data.document.tsx +35 -0
- package/template/src/contributions/pages.finder.ts +61 -0
- package/template/src/contributions/tester.inspector.tsx +64 -0
- package/template/src/contributions/use-game-modules.ts +80 -0
- package/template/src/data/README.md +17 -0
- package/template/src/input.ts +97 -0
- package/template/src/lib/audio/capability.json +4 -0
- package/template/src/lib/audio/sfx.ts +255 -0
- package/template/src/lib/react-root/capability.json +4 -0
- package/template/src/lib/react-root/index.ts +20 -0
- package/template/src/lib/react-root/react-root-adapter.tsx +57 -0
- package/template/src/lib/reflections/ReflectionProbe.tsx +201 -0
- package/template/src/lib/reflections/capability.json +4 -0
- package/template/src/lib/reflections/index.ts +19 -0
- package/template/src/lib/reflections/probe-controller.ts +75 -0
- package/template/src/lib/reflections/reflection-probe-registry.ts +402 -0
- package/template/src/lib/reflections/volume-reflection-material.ts +416 -0
- package/template/src/lib/static-batch/Frozen.tsx +91 -0
- package/template/src/lib/static-batch/capability.json +4 -0
- package/template/src/lib/static-batch/freeze.ts +579 -0
- package/template/src/lib/static-batch/index.ts +44 -0
- package/template/src/lib/static-batch/mutation-watch.ts +149 -0
- package/template/src/lib/static-batch/shadow-cache.ts +171 -0
- package/template/src/main.ts +63 -0
- package/template/src/manifest-entry-modules.d.ts +3 -0
- package/template/src/prefabs/HeroBox.stories.tsx +23 -0
- package/template/src/prefabs/HeroBox.tsx +35 -0
- package/template/src/scenes/MainScene.tsx +77 -0
- package/template/src/world.tsx +87 -0
- package/template/tsconfig.json +35 -0
- package/template/tsconfig.node.json +32 -0
- package/template/tsconfig.tools.json +22 -0
- package/template/validate-asset-content.ts +27 -0
- package/template/validate-assets.ts +60 -0
- package/template/validate-manifest.ts +55 -0
- package/template/vgai.adapter.ts +76 -0
- package/template/vgai.project.json +24 -0
- package/template/vite.config.ts +247 -0
- package/template-dotfiles/gitignore +63 -0
- package/workbench/src/media/game-cover.css +83 -0
- package/workbench/src/product.contribution.ts +188 -0
- package/workbench/src/vgaiGameSkew.ts +276 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// A game-roadmap preset. Each issue is one game-level feature arc with a title,
|
|
2
|
+
// one lifecycle status, and one required Summary description. Acceptance
|
|
3
|
+
// criteria remain parseable for future use but are not scaffolded: the initial
|
|
4
|
+
// roadmap task is the complete playable prototype, proven by the game's
|
|
5
|
+
// autoplay record and analytics/readouts rather than a checklist here.
|
|
6
|
+
//
|
|
7
|
+
// Hard schema = the core fields (id/title/summary/status, id/status/evidence,
|
|
8
|
+
// id) PLUS preset-specific strict fields (a status enum, AC `text`, evidence
|
|
9
|
+
// `commit`). No passthrough, no unknown.
|
|
10
|
+
|
|
11
|
+
// A STANDALONE preset: imports ONLY the public mechanism from `ztrack/preset-kit`.
|
|
12
|
+
import {
|
|
13
|
+
z, toMdast, nodeText, type MdNode,
|
|
14
|
+
check as runCheck, rule, gitWorld,
|
|
15
|
+
type Context, type IssueColumns, type IssueRecord, type Preset, type VisualizerSpec,
|
|
16
|
+
} from 'ztrack/preset-kit';
|
|
17
|
+
|
|
18
|
+
// ── the hard schema (core + preset-specific, all strict) ────────────────────
|
|
19
|
+
export const SpecEvidenceSchema = z.object({
|
|
20
|
+
id: z.string().min(1), // core
|
|
21
|
+
commit: z.string().regex(/^[0-9a-f]{7,40}$/), // preset: evidence is commit-backed
|
|
22
|
+
}).strict();
|
|
23
|
+
|
|
24
|
+
export const SpecAcStatusSchema = z.enum(['pending', 'passed', 'failed']); // preset's status vocabulary
|
|
25
|
+
export const SpecAcSchema = z.object({
|
|
26
|
+
id: z.string().min(1), // core
|
|
27
|
+
status: SpecAcStatusSchema, // core (preset narrows the type)
|
|
28
|
+
evidence: z.array(SpecEvidenceSchema), // core
|
|
29
|
+
text: z.string().min(1), // preset
|
|
30
|
+
}).strict();
|
|
31
|
+
|
|
32
|
+
export const SpecIssueStatusSchema = z.enum(['draft', 'in-review', 'done']);
|
|
33
|
+
export const SpecIssueSchema = z.object({
|
|
34
|
+
id: z.string().min(1), // core
|
|
35
|
+
title: z.string().min(1), // core
|
|
36
|
+
summary: z.string().min(1), // core; every roadmap task explains its arc
|
|
37
|
+
status: SpecIssueStatusSchema, // core (narrowed)
|
|
38
|
+
acceptanceCriteria: z.array(SpecAcSchema), // core
|
|
39
|
+
}).strict();
|
|
40
|
+
|
|
41
|
+
export const SpecRootSchema = z.object({ issues: z.array(SpecIssueSchema) }).strict();
|
|
42
|
+
export type SpecRoot = z.infer<typeof SpecRootSchema>;
|
|
43
|
+
|
|
44
|
+
// ── mdast parse: markdown -> the schema shape (structured, no prose mining) ──
|
|
45
|
+
// MdNode / toMdast / nodeText are rented from the kit (shared mdast mechanism).
|
|
46
|
+
function firstParagraphText(item: MdNode): string {
|
|
47
|
+
const p = (item.children ?? []).find((c) => c.type === 'paragraph');
|
|
48
|
+
return p ? nodeText(p).split('\n')[0]!.trim() : '';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// designated-position parses (the AC line, the evidence line) — not free-prose mining.
|
|
52
|
+
function splitAcIdText(line: string): { id: string; text: string } {
|
|
53
|
+
const m = /^(\S+)\s+(.+)$/.exec(line);
|
|
54
|
+
return m ? { id: m[1]!, text: m[2]!.trim() } : { id: line, text: line };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function parseSpecIssue(record: IssueRecord): Record<string, unknown> {
|
|
58
|
+
// id/title/status come STRUCTURED from the record's columns; only summary + ACs are
|
|
59
|
+
// parsed from the body.
|
|
60
|
+
const issue: Record<string, unknown> = { id: record.id, title: record.title, status: record.status || 'draft', summary: '', acceptanceCriteria: [] };
|
|
61
|
+
const tree = toMdast(record.body);
|
|
62
|
+
let inAc = false;
|
|
63
|
+
|
|
64
|
+
for (const node of tree.children ?? []) {
|
|
65
|
+
if (node.type === 'heading') {
|
|
66
|
+
inAc = /acceptance criteria/i.test(nodeText(node));
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (node.type === 'paragraph') {
|
|
70
|
+
const summary = /^Summary:\s*(.+)$/im.exec(nodeText(node))?.[1]?.trim();
|
|
71
|
+
if (summary) issue.summary = summary;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (node.type === 'list' && inAc) {
|
|
75
|
+
const acs: unknown[] = [];
|
|
76
|
+
for (const item of node.children ?? []) {
|
|
77
|
+
if (item.type !== 'listItem') continue;
|
|
78
|
+
const { id, text } = splitAcIdText(firstParagraphText(item));
|
|
79
|
+
const status = item.checked === true ? 'passed' : 'pending';
|
|
80
|
+
const evidence: unknown[] = [];
|
|
81
|
+
const nested = (item.children ?? []).find((c) => c.type === 'list');
|
|
82
|
+
for (const evItem of nested?.children ?? []) {
|
|
83
|
+
const commit = /commit:\s*([0-9a-fA-F]+)/.exec(firstParagraphText(evItem))?.[1]?.toLowerCase();
|
|
84
|
+
if (commit) evidence.push({ id: `${id}/ev${evidence.length + 1}`, commit });
|
|
85
|
+
}
|
|
86
|
+
acs.push({ id, status, text, evidence });
|
|
87
|
+
}
|
|
88
|
+
issue.acceptanceCriteria = acs;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return issue;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The root: each issue's metadata is structured (its record's columns); content from body.
|
|
95
|
+
export function parseSpec(records: IssueRecord[]): unknown {
|
|
96
|
+
return { issues: records.map(parseSpecIssue) };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ── serialize: the validated issue -> its STORED form (content body + metadata columns) ──
|
|
100
|
+
// The evidence id is positional (`<acId>/ev<n>`), so it isn't emitted — re-parsing
|
|
101
|
+
// regenerates it. A passed AC is the checked box; pending/failed are unchecked.
|
|
102
|
+
export function serializeSpecIssue(issue: SpecRoot['issues'][number]): { body: string; columns: IssueColumns } {
|
|
103
|
+
const out: string[] = [];
|
|
104
|
+
if (issue.summary) out.push(`Summary: ${issue.summary}`, '');
|
|
105
|
+
if (issue.acceptanceCriteria.length > 0) {
|
|
106
|
+
out.push('## Acceptance Criteria', '');
|
|
107
|
+
for (const ac of issue.acceptanceCriteria) {
|
|
108
|
+
out.push(`- [${ac.status === 'passed' ? 'x' : ' '}] ${ac.id} ${ac.text}`);
|
|
109
|
+
for (const ev of ac.evidence) out.push(` - commit: ${ev.commit}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { body: out.join('\n') + '\n', columns: { title: issue.title, status: issue.status } };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// ── rules: declarative records over the engine's derived model ──────────────
|
|
116
|
+
// Duplicate-id detection is universal, so it arrives on the core model (m.duplicateAcIds
|
|
117
|
+
// / m.duplicateIssueIds) — this preset writes no derive and uses no blocking graph.
|
|
118
|
+
type SpecAC = SpecRoot['issues'][number]['acceptanceCriteria'][number];
|
|
119
|
+
type SpecEvidence = SpecAC['evidence'][number];
|
|
120
|
+
|
|
121
|
+
const shaMatches = (a: string, b: string) => a.startsWith(b) || b.startsWith(a);
|
|
122
|
+
|
|
123
|
+
const SPEC_RULES = [
|
|
124
|
+
rule<SpecRoot, Record<string, never>>({
|
|
125
|
+
code: 'roadmap_empty',
|
|
126
|
+
severity: 'warning',
|
|
127
|
+
select: (m) => (m.root.issues.length === 0 ? [{}] : []),
|
|
128
|
+
message: () =>
|
|
129
|
+
'Roadmap is empty. Before coding, add one carefully scoped task for the complete playable prototype, including game-owned autoplay and gameplay analytics.',
|
|
130
|
+
}),
|
|
131
|
+
// Evidence is opt-in for a game: a checked box is done, and the real proof lives in the
|
|
132
|
+
// playtest record. Restore ztrack's `passed_ac_missing_evidence` rule here to require it.
|
|
133
|
+
rule<SpecRoot, { issueId: string; acId: string; evidenceId: string; ev: SpecEvidence }>({
|
|
134
|
+
code: 'evidence_commit_not_found', select: (m) => m.evidence,
|
|
135
|
+
when: ({ ev }, m) => { const c = m.context.git?.existingCommits; return !!c && !c.some((x) => shaMatches(x, ev.commit)); },
|
|
136
|
+
message: ({ ev }) => `Evidence ${ev.id} cites commit ${ev.commit}, which does not exist.`,
|
|
137
|
+
subject: ({ ev }) => ev.commit, // the missing sha — a `ref:` waiver pins to exactly this occurrence
|
|
138
|
+
}),
|
|
139
|
+
rule<SpecRoot, { issueId: string; acId: string }>({
|
|
140
|
+
code: 'duplicate_ac_id', select: (m) => m.duplicateAcIds,
|
|
141
|
+
message: ({ acId }) => `Duplicate AC id ${acId}.`,
|
|
142
|
+
}),
|
|
143
|
+
rule<SpecRoot, { issueId: string }>({
|
|
144
|
+
code: 'duplicate_issue_id', select: (m) => m.duplicateIssueIds,
|
|
145
|
+
message: ({ issueId }) => `Duplicate issue id ${issueId}.`,
|
|
146
|
+
}),
|
|
147
|
+
];
|
|
148
|
+
|
|
149
|
+
// ── the dashboard's vocabulary (VIZ-2), as plain data ────────────────────────────────────────
|
|
150
|
+
// spec's OWN vocabulary — NOT simple-sdlc's default.tsx vocabulary, which this preset's schema
|
|
151
|
+
// doesn't share: a 3-state lifecycle (no ready/in-progress split), no assignee, no PR, and an AC
|
|
152
|
+
// with just id/text (no version, no proof, no image/acVersion-bearing evidence — see
|
|
153
|
+
// SpecAcSchema/SpecEvidenceSchema above). Only map fields this schema actually has; a mapping
|
|
154
|
+
// this preset can't back with a real field (pr, acProof, acEvidence) is simply omitted. Field
|
|
155
|
+
// references and literal labels ONLY (see `VisualizerSpec`, `ztrack/preset-kit`) — no functions,
|
|
156
|
+
// no markup. Installed into your repo verbatim: edit freely, keeping statusOrder in sync with
|
|
157
|
+
// SpecIssueStatusSchema above (`boilerplates/presets/visualizerVocabulary.test.ts` checks that).
|
|
158
|
+
const SPEC_VISUALIZER: VisualizerSpec = {
|
|
159
|
+
statusOrder: ['draft', 'in-review', 'done'], // must equal SpecIssueStatusSchema above
|
|
160
|
+
acUnitLabel: 'Acceptance Criteria',
|
|
161
|
+
acText: { id: 'id', text: 'text' }, // SpecAcSchema.{id,text} — no `version` field to map
|
|
162
|
+
// no assignee/pr: SpecIssueSchema has neither. No acProof: SpecAcSchema has no proof field.
|
|
163
|
+
// No acEvidence: SpecEvidenceSchema is only {id, commit} — no image/acVersion fields to map.
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
export const SpecPreset: Preset<SpecRoot> = {
|
|
167
|
+
name: 'spec',
|
|
168
|
+
schema: SpecRootSchema,
|
|
169
|
+
visualizer: SPEC_VISUALIZER,
|
|
170
|
+
// observed facts: commit existence (no PR model in this preset).
|
|
171
|
+
loadContext: (input) => gitWorld(input.projectRoot, [], { verifyCommits: input.verifyCommits }),
|
|
172
|
+
parse: parseSpec,
|
|
173
|
+
serialize: serializeSpecIssue, // issue -> { body, columns }; the inverse of parse
|
|
174
|
+
rules: SPEC_RULES,
|
|
175
|
+
// A new task starts with its feature-arc description and one lifecycle status supplied by
|
|
176
|
+
// the document record. Acceptance criteria are intentionally not invented at this stage.
|
|
177
|
+
scaffold: (_title) =>
|
|
178
|
+
'Summary: Describe the complete playable prototype or later major game feature.\n',
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export function checkSpec(records: IssueRecord[], ctx?: Context) {
|
|
182
|
+
return runCheck(SpecPreset, records, ctx);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// The installed entrypoint: the resolver reads the preset off `default`.
|
|
186
|
+
export default SpecPreset;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Your repo-owned dashboard extension (see docs/VISUALIZER.md). It compiles into the served
|
|
2
|
+
// board automatically — no config, no restart. Every member below is optional; this file ships
|
|
3
|
+
// as a no-op, so the stock board is what you get until you fill one in.
|
|
4
|
+
//
|
|
5
|
+
// import { defineVisualizerExtension } from 'ztrack/visualizer-kit';
|
|
6
|
+
//
|
|
7
|
+
// export default defineVisualizerExtension({
|
|
8
|
+
// issuePanels: (issue) => <section className="panel">...</section>,
|
|
9
|
+
// acText: (ac) => ac.id,
|
|
10
|
+
// });
|
|
11
|
+
|
|
12
|
+
import { defineVisualizerExtension } from 'ztrack/visualizer-kit';
|
|
13
|
+
|
|
14
|
+
export default defineVisualizerExtension({});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Your repo-owned dashboard extension (see docs/VISUALIZER.md). It compiles into the served
|
|
2
|
+
// board automatically — no config, no restart. Every member below is optional; this file ships
|
|
3
|
+
// as a no-op, so the stock board is what you get until you fill one in.
|
|
4
|
+
//
|
|
5
|
+
// import { defineVisualizerExtension } from 'ztrack/visualizer-kit';
|
|
6
|
+
//
|
|
7
|
+
// export default defineVisualizerExtension({
|
|
8
|
+
// issuePanels: (issue) => <section className="panel">...</section>,
|
|
9
|
+
// acText: (ac) => ac.id,
|
|
10
|
+
// });
|
|
11
|
+
|
|
12
|
+
import { defineVisualizerExtension } from 'ztrack/visualizer-kit';
|
|
13
|
+
|
|
14
|
+
export default defineVisualizerExtension({});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"backend": "markdown",
|
|
3
|
+
"local": {
|
|
4
|
+
"teamKey": "LOCAL"
|
|
5
|
+
},
|
|
6
|
+
"board": "shared",
|
|
7
|
+
"validation": {
|
|
8
|
+
"entrypoint": ".volter/tracker/validation/preset.mts",
|
|
9
|
+
"installedFrom": "spec"
|
|
10
|
+
},
|
|
11
|
+
"sources": [
|
|
12
|
+
{
|
|
13
|
+
"path": "ROADMAP.md",
|
|
14
|
+
"format": "document"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# AGENTS.md — VGAI Game Project
|
|
2
|
+
|
|
3
|
+
A standalone game built with VGAI — work here, not in the engine repo.
|
|
4
|
+
The editor is the authoring and verification surface.
|
|
5
|
+
|
|
6
|
+
## Route the request first
|
|
7
|
+
|
|
8
|
+
| Intent | First action |
|
|
9
|
+
| --- | --- |
|
|
10
|
+
| Build or change this game | This file + the relevant `.agents/references/project-manual.md` section |
|
|
11
|
+
| Open, play, or verify it | `.agents/skills/editor/SKILL.md` |
|
|
12
|
+
| Model or revise a game prop with Blender | `.agents/skills/vgai-3d-models/SKILL.md` |
|
|
13
|
+
| The game needs a 3D asset placed, rigged, or baked | `.agents/skills/vgai-3d-assets/SKILL.md` |
|
|
14
|
+
| Other craft (2D/3D art, animation, humanoids, generated assets) | The matching `.agents/skills/vgai-*/SKILL.md` |
|
|
15
|
+
| Import an existing web game | Read-only compatibility report; never rewrite its source |
|
|
16
|
+
| Browse or modify an example | Read-only, or scaffold a copy; user games never go in `examples/` |
|
|
17
|
+
|
|
18
|
+
`.agents/` is canonical; `.claude/skills/` and `.github/skills/` are
|
|
19
|
+
generated projections (never edit); `CLAUDE.md` and
|
|
20
|
+
`.github/copilot-instructions.md` only point here.
|
|
21
|
+
|
|
22
|
+
**Capabilities are this project's standard libraries, and they are ADDED.**
|
|
23
|
+
Before writing reusable plumbing, run
|
|
24
|
+
bare `npm run --silent vgai -- add` (lists), inspect the match, and `add <id>` it —
|
|
25
|
+
the installed source is project-owned and editable. A doc naming
|
|
26
|
+
`src/lib/<x>` describes what that capability installs.
|
|
27
|
+
|
|
28
|
+
## Before writing code
|
|
29
|
+
|
|
30
|
+
1. Read the brief; write the initial `ROADMAP.md` task first (shape:
|
|
31
|
+
the ROADMAP rule below).
|
|
32
|
+
2. Read `vgai.project.json` — each root's `adapter` owns its document
|
|
33
|
+
and lifecycle; read the root entry files and any data schema before
|
|
34
|
+
editing. `src/main.ts` registers each root's adapter (`three`, `dom`).
|
|
35
|
+
3. Start the editor now (`npm run dev`); tell the user the URL in your
|
|
36
|
+
FIRST visible message. Keep it running and narrate as you build. The
|
|
37
|
+
editor IS the Code-OSS workbench this machine declares in
|
|
38
|
+
`.vgai/workbench.json` (the product's `create --workbench <dir>` writes it); with
|
|
39
|
+
no declaration `npm run dev` refuses and prints the exact JSON to write —
|
|
40
|
+
write it, do not work around it.
|
|
41
|
+
4. Multiplayer: every SEAT is a person — an INSTANCE in one editor,
|
|
42
|
+
played by its resident tester (`game.instance(id)` → the running
|
|
43
|
+
`tester-station.ts` module's `hireTester`) or a human via handoff; never a
|
|
44
|
+
second browser or synthetic player.
|
|
45
|
+
|
|
46
|
+
Everything else is in the project manual; read only the sections the
|
|
47
|
+
request needs.
|
|
48
|
+
|
|
49
|
+
## Non-negotiable rules
|
|
50
|
+
|
|
51
|
+
- **Author in playable slices, playtested LIVE by two people: you are
|
|
52
|
+
the DEVELOPER, the bot is your QA TESTER.** All in-game action is the
|
|
53
|
+
tester's honest input at sim speed, directed by calling `hireTester` on the
|
|
54
|
+
running `src/bot/tester-station.ts` module,
|
|
55
|
+
never by sending inputs yourself. The playtest is INTERACTIVE; its
|
|
56
|
+
receipt is the play log — never a script.
|
|
57
|
+
- **A control is done when ITS OWN CLICK visibly changes something.**
|
|
58
|
+
Acceptance for any face control is driving the control itself in the live
|
|
59
|
+
session (a DOM click through `game.run`) and seeing a change a human would
|
|
60
|
+
see—never merely calling the function it wraps. An action whose success can
|
|
61
|
+
be invisible (for example, a goal completing before the next paint) must
|
|
62
|
+
narrate itself in the face.
|
|
63
|
+
- **Development panels are game-specific.** The `game` starter includes required
|
|
64
|
+
Inspector, Data and Analytics stubs; replace them with useful fields and controls.
|
|
65
|
+
The `prototype` starter omits them. Any panels you add must use game vocabulary,
|
|
66
|
+
not raw JSON or generic event lists. The editor already provides session playback.
|
|
67
|
+
- **Every mechanic ships its debug function and readout in the same slice.**
|
|
68
|
+
Export them beside the mechanic for the REPL and tester; provide setup helpers
|
|
69
|
+
for situations that are costly to reach through normal play.
|
|
70
|
+
- **Keep game data in typed `src/data/` modules named for the mechanic or content.**
|
|
71
|
+
Editor panels read that data; they do not determine its storage shape.
|
|
72
|
+
- Use the real audio adapter even when the game is silent.
|
|
73
|
+
- Contributions live in `src/contributions/`. Use `use-game-modules.ts` for live
|
|
74
|
+
state and the selected Gameplay Session for Analytics. Implementation details
|
|
75
|
+
are in the project manual's Studio surfaces section.
|
|
76
|
+
- **Game-level feature arcs live in `ROADMAP.md` — one file.** Task one
|
|
77
|
+
is the complete playable prototype from the brief — mechanics,
|
|
78
|
+
rendering, UI, tooling, readouts are parts of it, not peer tasks; later
|
|
79
|
+
entries are only major features of comparable scope. One `Summary:` and
|
|
80
|
+
one lifecycle `status:` each; no acceptance criteria yet; never a
|
|
81
|
+
second task file; never done before a DEVLOG'd live playtest proves
|
|
82
|
+
the arc (`ztrack check` verifies structure).
|
|
83
|
+
- **`DEVLOG.md` is the development journal, not a second tracker.** One
|
|
84
|
+
entry per arc: what changed, why, decisions, playtest outcome, what
|
|
85
|
+
remains — with reviewed screenshots (a clip when motion matters)
|
|
86
|
+
promoted from `.vgai/` history into `media/`; inspect every artifact
|
|
87
|
+
you attach, never the latest blindly.
|
|
88
|
+
- **Record through the eval door**: Play running →
|
|
89
|
+
`eval 'return editor.recording.start({ fps: 30 })'`, drive via
|
|
90
|
+
`game.*`, `eval 'return editor.recording.stop()'` → WebM under
|
|
91
|
+
`.vgai/recordings/`. Inspect/trim with ordinary `ffmpeg`; no wrappers.
|
|
92
|
+
- **Keep Three source modular:** thin `src/world.tsx`; compositions in
|
|
93
|
+
`src/scenes/*Scene.tsx` (no stories); placeables in `src/prefabs/` with
|
|
94
|
+
stories; support in `src/components/`. Owned parts stay inside their
|
|
95
|
+
owner; independent entities never hide in scenery; no monoliths, no
|
|
96
|
+
prefab-per-primitive. E10/E11 enforce declared classifications and W10
|
|
97
|
+
warns when a Three project silently loses all prefabs. Characters are ALWAYS rigged models
|
|
98
|
+
authored in Blender (`vgai-3d-models`), never primitive stacks.
|
|
99
|
+
- Use Three.js, PixiJS, React, Rapier, and Colyseus directly — no
|
|
100
|
+
wrappers, no parallel ECS or mirror tree.
|
|
101
|
+
- The world node is the entity. On a TSX root, behavior is a React
|
|
102
|
+
component calling `useFrame`; physics is `@react-three/rapier` JSX.
|
|
103
|
+
Debug state is ordinary exported functions in the game's own modules —
|
|
104
|
+
reached via `game.run` and the contributions the game writes. Static
|
|
105
|
+
scenery, lights, and UI stay native objects.
|
|
106
|
+
- The source is the document: TSX for a Three root, JSX for React; an
|
|
107
|
+
unrecognized manifest key is rejected. Never call `createRoot`,
|
|
108
|
+
`hydrateRoot`, or `ReactDOM.render` from project code.
|
|
109
|
+
- One component, one concern.
|
|
110
|
+
- A player HUD is a `dom` root, never drei `Html` (invisible in
|
|
111
|
+
captures).
|
|
112
|
+
- Never fabricate first-party data, modify imported game source without
|
|
113
|
+
consent, or author schema fields with no runtime reader. The game's
|
|
114
|
+
numbers and tables are plain typed literals under `src/data/`.
|
|
115
|
+
- Preserve existing user edits and unrelated files.
|
|
116
|
+
- Generated assets: provider-native APIs + `ctx.projectOutputs.write(...)`;
|
|
117
|
+
load the generative-assets skill before spending funds.
|
|
118
|
+
- Keep reference images and motion studies in `references/`; Content shows
|
|
119
|
+
them without shipping them. Put assets the game loads in `public/`.
|
|
120
|
+
- Repeatable sequences: flat scripts in `scripts/<task>/steps/` (README
|
|
121
|
+
per step); intermediates in `.vgai/tmp/<task>/`. Helpers in
|
|
122
|
+
`src/lib/<domain>/` only when reusable and purely mechanical; no
|
|
123
|
+
runners, task graphs, or auto-judges.
|
|
124
|
+
- Editor control is observation and verification; write through source
|
|
125
|
+
edits, not UI automation. `npm run dev:standalone` serves EXPORTED
|
|
126
|
+
builds only — until exported it refuses; the editor is the one surface.
|
|
127
|
+
|
|
128
|
+
## Verification contract — after every slice
|
|
129
|
+
|
|
130
|
+
**Never write automated tests — no vitest, no `tests/` (E12 enforces).**
|
|
131
|
+
Games are fundamentally unpredictable; pre-written assertions enter an
|
|
132
|
+
endless rewrite cycle. Playtest live; the play log is the receipt.
|
|
133
|
+
|
|
134
|
+
1. Run `check-idioms`, `typecheck`, `validate`, and `validate-manifest`.
|
|
135
|
+
**`npm run typecheck` is the gate, never bare `tsc`** (bare `tsc`
|
|
136
|
+
skips `src/tools`).
|
|
137
|
+
2. The ONLY approved slice test is LIVE: a REPL-style manual session in
|
|
138
|
+
the editor-owned tab — set up, enter Play, advance sim time, inspect,
|
|
139
|
+
act one step at a time. Keep the probe disposable (never a spec,
|
|
140
|
+
script, or harness). After init-time edits, `restart`.
|
|
141
|
+
3. `npx volter-game-editor status` must show `connected: true`; it tails the session
|
|
142
|
+
journal (`logs/editor-*.jsonl`). Read the play logs. Any
|
|
143
|
+
`UNRESOLVED CONSOLE SET` is remaining work; `npx volter-game-editor console` silent is
|
|
144
|
+
the only all-clear.
|
|
145
|
+
4. Enter Play and look. Capture a legible screenshot; **a hidden tab
|
|
146
|
+
captures t≈0** — drive `game.waitSimTime` first.
|
|
147
|
+
5. Drive the game with `npm run --silent vgai -- eval '<js>'` — the one general
|
|
148
|
+
door (`{ editor, game, page, tools, session }`). Never synthetic
|
|
149
|
+
keys, rAF loops, wall-clock sleeps, or `window.__vgai*` reads.
|
|
150
|
+
6. Repeat for the few varied situations that could expose the change;
|
|
151
|
+
the observations and screenshots ARE the proof.
|
|
152
|
+
7. Inspect the live hierarchy against the taxonomy above; every prefab
|
|
153
|
+
appears in Content; collapse repeated primitives.
|
|
154
|
+
8. **Commit NOW, one commit per slice**, message naming the mechanic. A
|
|
155
|
+
single end-of-build commit is a process failure.
|
|
156
|
+
9. Arc complete → update `DEVLOG.md` (rule above).
|
|
157
|
+
10. Before handoff, report what was tested and which optional harnesses
|
|
158
|
+
were absent; remaining major arcs go in `ROADMAP.md`.
|
|
159
|
+
|
|
160
|
+
## Commands
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
npm run dev # open/reuse this project's editor (the workbench .vgai/workbench.json names)
|
|
164
|
+
npm run --silent vgai -- status # require connected: true
|
|
165
|
+
npm run --silent vgai -- play # editor Play mode
|
|
166
|
+
npm run --silent vgai -- restart # remount after init-time edits
|
|
167
|
+
npm run --silent vgai -- screenshot # visible evidence
|
|
168
|
+
npm run --silent vgai -- eval '<js>' # THE door onto the running game
|
|
169
|
+
npm run check-idioms # every slice
|
|
170
|
+
npm run validate # manifest/files + React design states
|
|
171
|
+
npm run typecheck # THE gate: src + src/tools + server
|
|
172
|
+
npm run dev:standalone # EXPORTED builds only
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Always `npm run --silent vgai -- <verb>`, never a bare `vgai` (a global one may
|
|
176
|
+
belong to another checkout).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Development Log
|
|
2
|
+
|
|
3
|
+
This is the project's internal development journal. It records the reasoning
|
|
4
|
+
that source history and playtest receipts cannot: what changed, why that path
|
|
5
|
+
was chosen, what was learned, and what remains.
|
|
6
|
+
|
|
7
|
+
Add one entry when a coherent workstream or feature arc finishes—not after
|
|
8
|
+
every small edit. Put the newest entry first and cover:
|
|
9
|
+
|
|
10
|
+
- what changed and why;
|
|
11
|
+
- important decisions, rejected alternatives, and lessons;
|
|
12
|
+
- the playtest outcome and anything still unresolved;
|
|
13
|
+
- links to the best representative screenshots and, when motion matters, a
|
|
14
|
+
short gameplay clip.
|
|
15
|
+
|
|
16
|
+
Evidence linked here is durable project material. Review the actual candidate
|
|
17
|
+
captures, reject unclear or unrepresentative frames, and watch each selected
|
|
18
|
+
clip from beginning to end. Copy only the chosen media out of the bounded
|
|
19
|
+
`.vgai/` run history into `media/screenshots/` or `media/clips/` before linking
|
|
20
|
+
it here. Never cite an unreviewed capture merely because it is the latest one.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# IDIOMS.md — project architecture checks
|
|
2
|
+
|
|
3
|
+
`AGENTS.md` is the working contract. This page is the compact map of what
|
|
4
|
+
`npm run check-idioms` can enforce mechanically and what still requires live
|
|
5
|
+
judgment.
|
|
6
|
+
|
|
7
|
+
Legend: **ERROR** fails every run; **WARN** prints but fails only with
|
|
8
|
+
`--strict`; **LOOK** is judged in the live editor and recorded in `DEVLOG.md`.
|
|
9
|
+
|
|
10
|
+
## Source and roots
|
|
11
|
+
|
|
12
|
+
- The source is the document. Three roots are ordinary R3F TSX, Canvas roots
|
|
13
|
+
are ordinary Pixi/React source, and DOM roots are ordinary React. The world
|
|
14
|
+
node is the entity; no mirror ECS, registration layer, or vgai runtime API
|
|
15
|
+
belongs in gameplay components. **LOOK**
|
|
16
|
+
- A DOM HUD is a manifest `dom` root and reads the project's own React
|
|
17
|
+
context/store. A timer repeatedly copying game state into React state is a
|
|
18
|
+
manual polling pump. **WARN W1**
|
|
19
|
+
- A positive `useFrame(callback, priority)` priority takes over rendering;
|
|
20
|
+
use zero/negative values for ordering unless that callback actually calls
|
|
21
|
+
`render`. **WARN W8**
|
|
22
|
+
- Display names are editable presentation, not gameplay identity. Trigger
|
|
23
|
+
logic comparing `.name` can silently break after an editor rename. **WARN
|
|
24
|
+
W4**
|
|
25
|
+
|
|
26
|
+
## Scenes, prefabs, and supporting components
|
|
27
|
+
|
|
28
|
+
- `src/world.tsx` is thin: root-wide providers/instruments and the active scene
|
|
29
|
+
swap slot. Complete compositions live as `src/scenes/*Scene.tsx`; support
|
|
30
|
+
that is not a scene belongs in `src/components/`. Stories inside
|
|
31
|
+
`src/scenes/`, or helper-shaped files there, are misclassification. **ERROR
|
|
32
|
+
E11**
|
|
33
|
+
- A prefab is one independently placeable/duplicable/reusable object under
|
|
34
|
+
`src/prefabs/`. Its colocated portable story names it as `meta.component`;
|
|
35
|
+
that story is its Content registration. A module claiming prefab residence
|
|
36
|
+
without that registration is incomplete. **ERROR E10**
|
|
37
|
+
- Owned construction pieces remain inside their owner; do not create a prefab
|
|
38
|
+
per mesh/primitive. Conversely, independent entities do not hide inside
|
|
39
|
+
scenery or one scene monolith. The template demonstrates the contrast with
|
|
40
|
+
`HeroBox` (prefab) and `Ground` (support).
|
|
41
|
+
- A Three project with no correctly story-backed prefab is suspicious. Fully
|
|
42
|
+
procedural or wholly simulation-owned games can be honest exceptions, but
|
|
43
|
+
ordinary games should not silently lose the architecture when replacing the
|
|
44
|
+
starter subject. **WARN W10**
|
|
45
|
+
- R3F placeables forward ordinary `ThreeElements[...]` props to one native
|
|
46
|
+
outer root and every spatial instance has a meaningful `name`; runtime
|
|
47
|
+
motion belongs on an inner child so it cannot fight authored placement.
|
|
48
|
+
The editor's own `R3F00x` analyzer supplies the finding. **WARN E9**
|
|
49
|
+
|
|
50
|
+
## Mechanics, tester, and studio surfaces
|
|
51
|
+
|
|
52
|
+
- Every mechanic exports the functions and readings needed to arrange and
|
|
53
|
+
judge it. The developer calls the running instance directly through
|
|
54
|
+
`game.run(({ modules }) => ...)`; contributions read the same instances
|
|
55
|
+
through `src/tools/use-game-modules.ts`. There is no command registry or
|
|
56
|
+
prescribed vocabulary. **LOOK**
|
|
57
|
+
- The resident QA tester is game code. It receives intent-level goals, runs at
|
|
58
|
+
simulation speed, and actuates only the game's normal input store. Setup
|
|
59
|
+
functions may arrange an expensive situation; they do not perform the
|
|
60
|
+
behavior being judged. The tester's repertoire grows in the slice that adds
|
|
61
|
+
each mechanic. **LOOK**
|
|
62
|
+
- `src/tools/` is literal contribution TSX. The unfinished Tester/Data/Analytics stubs
|
|
63
|
+
emit `VGAI_STUB_UNIMPLEMENTED`; replacing or honestly deleting the relevant
|
|
64
|
+
stub is required before completion. **ERROR E6**
|
|
65
|
+
- Tester holds live QA state, controller ownership, goals/mind, setup cheats,
|
|
66
|
+
and judgment readings. Analytics holds historical session data. Data holds
|
|
67
|
+
authored typed literals and derived views. A HUD number does not earn an
|
|
68
|
+
inspector row merely because it exists. **LOOK**
|
|
69
|
+
- Analytics receives a durable Gameplay Session and cursor, not a live `play`
|
|
70
|
+
handle. Every chart derives from the selected `logs/play-*.jsonl` session so
|
|
71
|
+
it survives Stop and reload. A raw event listing does not fulfill Analytics;
|
|
72
|
+
supply game-specific analysis using the editor's existing playback shell. **LOOK**
|
|
73
|
+
|
|
74
|
+
## Live proof
|
|
75
|
+
|
|
76
|
+
- Playtesting is interactive: arrange, direct the tester, advance sim time,
|
|
77
|
+
observe, read the log, redirect. No committed route, test file, test-runner
|
|
78
|
+
dependency, or test script belongs in a game project. **ERROR E12**
|
|
79
|
+
- Do not boot a private Playwright harness, reach through `window.__vgai`, or
|
|
80
|
+
add `?bot=` boot plumbing. Use the editor-owned session and the game's
|
|
81
|
+
running modules. **ERROR E1–E4**
|
|
82
|
+
- Gameplay source must not accumulate for many commits before the first Play
|
|
83
|
+
receipt. `logs/play-*.jsonl` is written by the editor and cannot be replaced
|
|
84
|
+
by an assertion that somebody intended to play. **WARN W9**
|
|
85
|
+
- At handoff, read `npx volter-game-editor console`, inspect the live hierarchy and Content
|
|
86
|
+
gallery, look at several relevant situations, and promote only reviewed
|
|
87
|
+
screenshots/clips into `media/`. **LOOK**
|
|
88
|
+
|
|
89
|
+
## Native libraries
|
|
90
|
+
|
|
91
|
+
- Call Three, Rapier, React, Pixi, XState, and Colyseus directly. A helper that
|
|
92
|
+
returns the library's own object is fine; a wrapper or registry that becomes
|
|
93
|
+
a second programming model is not. **LOOK**
|
|
94
|
+
- Dynamically import the Colyseus client so a single-player bundle does not
|
|
95
|
+
pay for it. **WARN W3**
|
|
96
|
+
- If this project's manifest explicitly claims seeded determinism, raw
|
|
97
|
+
gameplay `Math.random()` or wall-clock reads violate that claim. **ERROR
|
|
98
|
+
E5**
|
|
99
|
+
- Every owner releases what it creates: listeners, timers, bodies, scene
|
|
100
|
+
objects, and GPU resources. Play→Stop must leave `npx volter-game-editor console` silent.
|
|
101
|
+
**LOOK**
|
|
102
|
+
|
|
103
|
+
## Run the scanner
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npm run check-idioms
|
|
107
|
+
npm run check-idioms -- --strict
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
A heuristic false positive may be suppressed on the relevant source line with
|
|
111
|
+
a real reason:
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
setTimeout(closeSdkToast, 250); // idioms-ignore W1 one-shot SDK transition, not a state pump
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Project-wide warnings such as W10 accept the same comment anywhere under
|
|
118
|
+
`src/`. An empty or missing reason does not suppress a finding.
|
package/template/LICENSE
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Volter AI, Inc.
|
|
4
|
+
|
|
5
|
+
This MIT license covers the vgai game-project template (this directory) — the
|
|
6
|
+
starter code scaffolded into your project. It is intentionally permissive so that
|
|
7
|
+
the game you build with vgai, and anything you generate from this template, is
|
|
8
|
+
YOURS, free of any obligations to us. You may relicense your generated game
|
|
9
|
+
under any terms you choose.
|
|
10
|
+
|
|
11
|
+
(The vgai engine and tooling — everything outside this directory — are licensed
|
|
12
|
+
per component: Apache-2.0 core, AGPL-3.0 editor. See the repository LICENSE.md.)
|
|
13
|
+
|
|
14
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
15
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
16
|
+
in the Software without restriction, including without limitation the rights
|
|
17
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
18
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
19
|
+
furnished to do so, subject to the following conditions:
|
|
20
|
+
|
|
21
|
+
The above copyright notice and this permission notice shall be included in all
|
|
22
|
+
copies or substantial portions of the Software.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
25
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
26
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
27
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
28
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
29
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
30
|
+
SOFTWARE.
|