@forgeax/game 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,157 @@
1
+ # Asset3D local provider and Engine transaction
2
+
3
+ Asset3D is a project-local integration composed from three separately reviewed
4
+ inputs: the `asset3d-search` provider bundle, the `art-3d-asset-library` workflow
5
+ package, and the released ForgeaX Engine SDK. `@forgeax/game` owns installation,
6
+ configuration, quarantine validation, transaction state, and the handoff to the
7
+ Engine CLI. It does not call an asset service directly and does not implement a
8
+ second importer or Preview server.
9
+
10
+ > [!IMPORTANT]
11
+ > Asset3D is disabled by default. `install` and ordinary `init` neither contact the
12
+ > internal catalog nor write Asset3D project state. The user must run `asset3d enable`
13
+ > inside an already initialized Engine game.
14
+
15
+ > [!IMPORTANT]
16
+ > Provider archives are platform-specific release artifacts and are not embedded in
17
+ > the platform-neutral npm package. Installation deliberately returns
18
+ > `provider_platform_mismatch` when an archive target differs from the current host.
19
+ > Each published target therefore needs its own digest, offline verification, MCP
20
+ > handshake, and real service-path evidence.
21
+
22
+ ## Trust and data flow
23
+
24
+ ```mermaid
25
+ flowchart LR
26
+ B["Digest-pinned local provider bundle"] --> C["Managed digest cache"]
27
+ K["Exact K0 workflow TGZ"] --> S["Nine project Skill mounts"]
28
+ C --> M["Project-local stdio MCP"]
29
+ M --> Q["Private transaction quarantine"]
30
+ Q --> V["Checked result and file manifest"]
31
+ V --> A["Atomic asset-directory publication"]
32
+ A --> E["Exact Engine semantic-only asset add"]
33
+ E --> R["Engine verify, list, and inspect"]
34
+ R --> P["Per-file provenance and terminal result"]
35
+ ```
36
+
37
+ The provider is the only network adapter. Installed download authorities are
38
+ lexically exact `http://host:port` or `https://host:port` values: explicit port,
39
+ no path (including `/`), no query, fragment, userinfo, or wildcard. The canonical
40
+ one-to-eight member set is sorted and encoded as compact JSON in
41
+ `AW_DOWNLOAD_ORIGINS`; `.forgeax/asset3d-install.json` records only its SHA-256
42
+ digest. The provider is responsible for enforcing that set on both initial and
43
+ redirect requests.
44
+
45
+ When installation supplies `--catalog-base-url`, the exact pathless authority is
46
+ written only to the project-local provider environment. It must also appear in
47
+ `--download-origin`. The provider first attempts the bounded `/api/search` route;
48
+ only an explicit `404` or `405` permits a bounded `/api/assets` fallback, and the
49
+ selected asset is fetched through `/api/download/assets`. Other upstream failures
50
+ remain failures rather than silently expanding to a full-catalog scan. Without the
51
+ option, the provider retains the managed AW search adapter.
52
+
53
+ ## Installation ownership
54
+
55
+ `asset3d enable` probes the default internal catalog with `HEAD /api/assets`. A `2xx`
56
+ response selects `authentication=none`; the current service follows this path and no
57
+ API Key is required. `401` or `403` without an explicit supported authentication
58
+ contract fails closed as `asset3d_api_key_contract_missing`. The plugin never treats
59
+ an Anthropic or other model-provider credential as an Asset3D credential.
60
+
61
+ The command reuses an exact verified cache when present. Otherwise it downloads the
62
+ platform release archive over HTTPS, follows at most five HTTPS redirects, enforces a
63
+ 256 MiB bound, and verifies the pinned SHA-256 before any provisioning. Bundle schema,
64
+ provider commit, platform, Python range, and checked result/receipt schema digests are
65
+ then verified before invoking the offline bundle verifier. Provisioning uses system
66
+ Python 3.11 or 3.12 and the Provider's hash-locked `--provision` flow. The published
67
+ cache is keyed by archive digest under `~/.forgeax/providers/asset3d-search/`.
68
+
69
+ The low-level `asset3d install --provider-bundle ...` command remains a maintainer
70
+ surface for release production and controlled evidence; users enable the pinned
71
+ release rather than selecting an arbitrary archive.
72
+
73
+ The installer merges, rather than replaces, the complete `.forgeax/mcp.json` object.
74
+ Unrelated top-level keys and servers survive. The owned entries are local stdio only:
75
+
76
+ | Server | Tool timeout | Operation bound |
77
+ |:--|--:|--:|
78
+ | `asset3d-search` / `search_asset` | 195,000 ms | provider work 180,000 ms plus cleanup and bridge margin |
79
+ | `forgeax` / `forgeax_run_current_game` | 165,000 ms | Game Plugin build/readiness 150,000 ms plus cleanup and bridge margin |
80
+ | either server, unknown tool | 30,000 ms | project-MCP default |
81
+
82
+ A conflicting server is not overwritten. `--replace-owned` is accepted only when the
83
+ current entry still matches the prior ownership digest. Configuration, manifests,
84
+ journals, locks, and provenance are private; file publication uses same-directory
85
+ temporary files, file and directory fsync, and atomic rename. Reinstall is byte
86
+ idempotent. Uninstall removes only entries and Skill files that still match owned
87
+ digests, leaving user-modified or unrelated content in place and reporting the
88
+ collision.
89
+
90
+ The workflow package is projected beneath `art-3d-asset-library/` in exactly these
91
+ mounts unless `--ide` selects a subset:
92
+
93
+ ```text
94
+ .agents/skills .claude/skills
95
+ .cursor/skills .trae/skills
96
+ .codebuddy/skills .codeium/windsurf/skills
97
+ .vscode/skills .zcode/skills
98
+ .config/opencode/skills
99
+ ```
100
+
101
+ `workbuddy` is an input alias for the `.codebuddy/skills` mount. Every projected file
102
+ has its path, byte count, and digest in the ownership manifest.
103
+
104
+ ## Transaction protocol
105
+
106
+ 1. `asset3d begin` records a private journal with a new execution UUID, query digest,
107
+ provider identity, exact Engine identity, requested count, and the only allowed
108
+ quarantine root. It returns the relative `output_dir` for `search_asset`; the
109
+ provider's `MCP_SHARED_PATH` is the same private `workspace/` root, so declared
110
+ manifest paths and transaction validation address identical bytes.
111
+ 2. The configured provider writes beneath that directory and returns one checked
112
+ `forgeax.asset3d-search-result/1.0.0` TextContent JSON object.
113
+ 3. `asset3d commit --provider-result-stdin` reads at most 1 MiB, validates exact
114
+ fields/counts/roles/digests/sorted relative paths, and ignores `downloaded_to`.
115
+ 4. The transaction rejects symlinks, special files, undeclared files, realpath escape,
116
+ byte mismatch, or digest mismatch before a project asset write.
117
+ 5. A 30-second per-asset lock serializes publication at
118
+ `assets/3d/ea-3d/<safeAssetId>`. The complete prior directory is preserved as the
119
+ refresh/rollback snapshot.
120
+ 6. With the game root as `cwd`, Game Plugin runs the exact released Engine CLI:
121
+
122
+ ```text
123
+ asset add assets/3d/ea-3d/<safeAssetId> --reimport-policy semantic-only --json
124
+ asset verify --json
125
+ asset list --json
126
+ asset inspect <guid> --json
127
+ ```
128
+
129
+ Each command must produce exactly one newline-terminated, at-most-1-MiB
130
+ `CommandEnvelope@1.0.0`. Game Plugin does not filter diagnostic stdout into a
131
+ synthetic success.
132
+ 7. Only after Engine readback succeeds does `.forgeax-asset.json` publish the provider
133
+ commit, origin-set digest, exact Engine version/commit, per-file role/digest/bytes,
134
+ Engine rows, and catalog readback. An Engine failure restores the whole previous
135
+ asset directory.
136
+
137
+ Same provider ID and aggregate digest can reuse the existing directory only when all
138
+ declared live files still match and recorded Engine GUIDs remain in list/inspect
139
+ readback. A changed digest fails unless `--refresh` is explicit. `asset3d doctor`
140
+ restores a stale `committing` snapshot and never reports the interrupted operation as
141
+ successful; `asset3d abort` removes only its transaction quarantine.
142
+
143
+ ## Distribution and evidence boundary
144
+
145
+ The packed Game Plugin includes the self-contained CLI bundle, existing connector
146
+ Skill, exact K0 TGZ, checked P0 result/receipt schemas, and the immutable URL/digest
147
+ table for supported Provider targets. It does not embed the Provider runtime archive,
148
+ Engine payload, source checkout, credentials, or workspace links. Provider archives
149
+ are separate release assets so a disabled installation downloads nothing. The package
150
+ artifact gate recomputes every embedded predecessor digest.
151
+
152
+ Controlled external-consumer evidence may establish package installation, raw MCP
153
+ framing, local redirect/ZIP handling, multi-GLB and texture import, reuse, refresh,
154
+ failure rollback, offline recovery, Engine build/Preview health, uninstall, and
155
+ process cleanup. Its status is `PASS_SUPPORTING`. Real provider network results,
156
+ Studio project-MCP discovery, supported-host permission behavior, RuntimeInstance UI,
157
+ visible Play, and final independent acceptance remain outside this repository unit.
@@ -0,0 +1,100 @@
1
+ # `@forgeax/game` 0.3.0 release guide
2
+
3
+ ## User-visible contract
4
+
5
+ Version `0.3.0` makes the public onboarding flow exactly two commands:
6
+
7
+ ```bash
8
+ npx -y @forgeax/game install --ide codex,cursor,claude
9
+ cd /path/to/a-genuinely-empty-directory
10
+ npx -y @forgeax/game init
11
+ ```
12
+
13
+ Restart or reload an Agent host when the install command asks. `init` creates the
14
+ Engine-owned standalone game in the current directory through the exact
15
+ `@forgeax/engine-sdk@0.1.7` carrier, then installs the same Game Plugin Skill/routing
16
+ contract for every selected host. Users do not run `forgeax new` separately.
17
+
18
+ Standalone author source is `<game-root>/src`. `.forgeax/games/<slug>` belongs to the
19
+ Studio-hosted project model and is not created by this package.
20
+
21
+ ## Agent authoring and Preview
22
+
23
+ After `init`, ask the Agent to create a game and open Preview. A valid completion must
24
+ include all of the following:
25
+
26
+ - concrete `forge.json` id/name and a non-template package name;
27
+ - one coherent README with controls and no Empty package-output residue;
28
+ - a behavior test that imports and exercises a named game-specific state transition or
29
+ rule; renaming an Empty template test is insufficient;
30
+ - UI mounted under Engine Host `uiRoot` or `#game-ui`; direct `document.body` mutation
31
+ is rejected because the released standalone Host provides `#game-ui`;
32
+ - a successful `forgeax_run_current_game` response containing
33
+ `preview.status: ready`, the exact root, Engine release, build digest, Preview
34
+ instance ID, and the returned loopback URL.
35
+
36
+ An MCP error, a bare HTTP 200, a PID, an old build, or a localhost URL discovered by
37
+ shell probing is not Preview evidence. When another game owns the Preview port, stop
38
+ that exact verified game first:
39
+
40
+ ```bash
41
+ forgeax-game preview stop --target-dir /path/to/the-running-game
42
+ ```
43
+
44
+ The internal 3D catalog is disabled by default and is not contacted by `install` or
45
+ ordinary `init`. A user opts one initialized project in with:
46
+
47
+ ```bash
48
+ npx -y @forgeax/game asset3d enable
49
+ ```
50
+
51
+ The current `http://21.214.216.8:5180` catalog is network-gated and its body-free
52
+ access probe requires no API Key. In particular, `ANTHROPIC_API_KEY` is unrelated and
53
+ must not be supplied. If the service changes to `401`/`403` without publishing a
54
+ supported authentication contract, enablement fails closed. If
55
+ `asset3d-search/search_asset` is absent, the Agent must report
56
+ `BLOCKED(asset-library-tools-missing)`. Procedural meshes and `forgeax_generate_3d`
57
+ are not evidence that the reusable asset library is available.
58
+
59
+ ## Upgrade and compatibility
60
+
61
+ - Node.js `>=22.13.0` is required.
62
+ - Existing exact Engine games can rerun `forgeax-game init` to refresh project Skill,
63
+ routing, and authoring baseline without recreating gameplay source.
64
+ - `install` and `init` are idempotent for already-current owned state.
65
+ - Unknown non-empty directories fail before carrier execution or workspace mutation.
66
+ - Engine-owned `forgeax-engine-*` Skills remain supplied by the selected Engine game;
67
+ this release changes only the Game Plugin-owned `forgeax-game` Skill and rule.
68
+
69
+ ## Release verification
70
+
71
+ Before publishing, maintainers must run:
72
+
73
+ ```bash
74
+ bun run typecheck
75
+ bun test test/*.test.ts
76
+ bun run build
77
+ npm pack --json
78
+ bun scripts/check-package-artifact.ts /absolute/path/to/forgeax-game-0.3.0.tgz
79
+ ```
80
+
81
+ Then use the TGZ from a fresh consumer to verify:
82
+
83
+ 1. blank-directory `init`;
84
+ 2. identical Skill/rule projection for configured hosts;
85
+ 3. changed gameplay with stale template identity/tests fails closed;
86
+ 4. Engine build diagnostics before the terminal JSON frame are accepted;
87
+ 5. duplicate JSON or post-frame diagnostics fail closed;
88
+ 6. Preview failure is returned with MCP `isError: true`;
89
+ 7. a different game's occupied port is never reported as the new game's Preview;
90
+ 8. after stopping the old verified Preview, the new game returns its own exact
91
+ root/build/instance identity and loopback URL.
92
+
93
+ Publishing and npm dist-tag changes remain separate maintainer actions after the MR
94
+ and required checks are approved.
95
+
96
+ > [!CAUTION]
97
+ > Do not publish the npm dist-tag until every advertised host target has a Provider
98
+ > release artifact at the exact URL pinned by the package and its SHA-256 has been
99
+ > verified. The current source pins only `darwin-arm64`; other targets intentionally
100
+ > fail with `asset3d_provider_target_unreleased`.
package/package.json CHANGED
@@ -1,15 +1,17 @@
1
1
  {
2
+ "packageManager": "bun@1.3.14",
2
3
  "name": "@forgeax/game",
3
- "version": "0.2.3",
4
+ "version": "0.3.0",
4
5
  "private": false,
5
6
  "type": "module",
6
- "description": "@forgeax/game \u2014 ForgeaX game development as a plugin for MCP-capable agent CLIs (Codex, Claude Code, Cursor, Trae, ZCode, OpenCode, WorkBuddy). Single binary, dual mode: no args = stdio MCP server, subcommand = CLI.",
7
+ "description": "@forgeax/game an MCP/CLI connector for exact released ForgeaX Engine games and Engine-owned Preview.",
7
8
  "main": "./dist/main.js",
8
9
  "bin": {
9
- "forgeax-game": "dist/main.js"
10
+ "forgeax-game": "dist/main.js",
11
+ "game": "dist/main.js"
10
12
  },
11
13
  "engines": {
12
- "node": ">=18"
14
+ "node": ">=22.13.0"
13
15
  },
14
16
  "publishConfig": {
15
17
  "access": "public",
@@ -17,13 +19,16 @@
17
19
  },
18
20
  "files": [
19
21
  "dist",
20
- "assets/skills",
22
+ "assets",
23
+ "docs/asset3d.md",
24
+ "docs/release-0.3.0.md",
21
25
  "README.md"
22
26
  ],
23
27
  "scripts": {
24
28
  "build": "bun build.mjs",
25
29
  "release:check": "bun scripts/check-package-artifact.ts",
26
30
  "acceptance": "bun scripts/accept-packed-consumer.ts",
31
+ "acceptance:asset3d": "bun scripts/accept-asset3d-packed-consumer.ts",
27
32
  "release:publish": "bun scripts/publish-package.ts",
28
33
  "prepack": "bun build.mjs",
29
34
  "typecheck": "tsc --noEmit",
@@ -41,10 +46,16 @@
41
46
  ],
42
47
  "license": "MIT",
43
48
  "dependencies": {
44
- "@forgeax/game-runtime": "0.3.32"
49
+ "@forgeax/engine-sdk": "0.1.7",
50
+ "pnpm": "11.7.0"
45
51
  },
46
52
  "devDependencies": {
47
53
  "@types/bun": "^1.2.0",
48
54
  "typescript": "^5.9.2"
49
- }
55
+ },
56
+ "directories": {
57
+ "doc": "docs",
58
+ "test": "test"
59
+ },
60
+ "author": ""
50
61
  }
@@ -1,81 +0,0 @@
1
- # Verified Engine authoring traps
2
-
3
- Each entry below was hit while authoring a working game against this Engine pin and
4
- confirmed against Engine source. They are the failures that do **not** announce
5
- themselves: the game keeps running, nothing throws, and only the picture or the input
6
- is wrong. Check them before debugging anything else.
7
-
8
- ## Camera `fov` is vertical **radians**
9
-
10
- `Camera.fov` is passed unchanged to `mat4.perspective(out, fovYRadians, …)`. Degrees
11
- silently frame the wrong volume — the scene renders, so it reads as a layout bug.
12
-
13
- ```ts
14
- // wrong: 50 radians
15
- perspective({ fov: 50, aspect, near: 0.1, far: 200 })
16
- // right
17
- perspective({ fov: Math.PI / 4, aspect, near: 0.1, far: 200 })
18
- ```
19
-
20
- Some doc comments in `camera.ts` show `fov: 60`, and the preview host's own fallback
21
- camera does the same. Trust `mat4.perspective`, not those examples.
22
-
23
- ## Keyboard is dead until an InputMap resource exists
24
-
25
- The input scan system publishes `INPUT_SNAPSHOT_RESOURCE_KEY` only when an InputMap is
26
- registered. Without it `hasResource` is false forever and every key read is skipped —
27
- with no error.
28
-
29
- ```ts
30
- const KEY = (key: string) => ({ type: 'key', key } as const);
31
- world.insertResource(INPUT_MAP_KEY, [
32
- { action: 'up', bindings: [KEY('ArrowUp'), KEY('w')] },
33
- ] satisfies ActionConfig[]);
34
- ```
35
-
36
- The snapshot also lands only after the first `world.update`, so read
37
- `createInputSnapshot()` as an empty fallback rather than branching every frame.
38
-
39
- ## Action readpoints are functions, not properties
40
-
41
- ```ts
42
- input.action('up').justPressed // a function object — always truthy, fires every frame
43
- input.action('up').justPressed() // the actual edge
44
- ```
45
-
46
- `isPressed`, `justPressed` and `justReleased` are all calls; `strength` is a number.
47
-
48
- ## Diagnose "nothing renders" with `frustumStats`, not screenshots
49
-
50
- `__forgeax.renderer.frustumStats` reports `{ culled, total }`. `culled` equal to
51
- `total` means the camera is aimed away from the content — an orientation or `fov`
52
- problem, not a material or mesh problem. `__forgeax` also exposes `world`, `app`
53
- (with `lastError`) and `renderer.perFramePassNames`.
54
-
55
- ## An unlit dark material is indistinguishable from the cleared background
56
-
57
- `Materials.standard` with a low `baseColor` and no `emissive` renders as near-black on
58
- a dark `clearColor`, which looks identical to "not rendering". Give static geometry a
59
- small `emissive` value while bringing a scene up, then tune once it is visibly drawing.
60
-
61
- ## A pure top-down camera hits the degenerate `up` path
62
-
63
- `quat.fromLookAt(out, eye, target, up)` auto-selects an alternative `up` when `up` is
64
- collinear with the view direction. Prefer a tilted eye, and prefer `fromLookAt` over a
65
- hand-built axis-angle pitch so the forward/up convention stays the Engine's.
66
-
67
- ## The entry is `bootstrap(world, ctx)` — world first
68
-
69
- The preview host instantiates the default scene, then calls
70
- `export async function bootstrap(world: World, ctx?: BootstrapContext)`. It only spawns
71
- its own fallback camera when no game entry resolves, so a game that exports `bootstrap`
72
- owns the camera.
73
-
74
- ## `Materials.standard` returns the asset, not a Result
75
-
76
- ```ts
77
- world.allocSharedRef<'MaterialAsset', MaterialAsset>('MaterialAsset', Materials.standard({ … }))
78
- ```
79
-
80
- The `.value` seen in some `mesh-renderer.ts` examples belongs to
81
- `engine.assets.catalog(...)`, not to `Materials.standard`.
@@ -1,35 +0,0 @@
1
- # Engine project map
2
-
3
- Keep these boundaries in working memory while changing a ForgeaX game.
4
-
5
- | Concern | Authoritative location |
6
- |:--|:--|
7
- | Game selected by the user | `.forgeax/active-game.json` |
8
- | Game source and local assets | `.forgeax/games/<slug>/` |
9
- | Engine SDK declarations, templates, skills, and source | `.forgeax/engine-sdk/` |
10
- | SDK/runtime identity | `.forgeax/engine-sdk.json` and `forgeax_run_current_game` output |
11
- | New-game scaffold | ForgeaX server `POST /api/workbench/games` |
12
- | New-game template authority | `.forgeax/engine-sdk/templates/game-default/` and `.forgeax/engine-sdk/templates/game-empty/` |
13
- | Engine implementation source | `.forgeax/engine-sdk/source/<package>/src/` |
14
- | Runtime output owned by this plugin | `.forgeax/logs/runtime/runtime.log` |
15
-
16
- `forgeax-game init` calls the server scaffold endpoint. Do not copy the template by
17
- hand: that would bypass the server's active-game update and instance-root checks.
18
-
19
- ## Change a game
20
-
21
- - Work only under the active game's directory unless the request explicitly changes
22
- shared engine behavior.
23
- - Preserve the existing ECS and lifecycle style in that game; inspect neighboring
24
- systems before introducing a new abstraction.
25
- - Keep asset paths relative to the game and use the existing asset-loading APIs.
26
- - Do not make subagents independently edit `.forgeax/games/<slug>/src/`; the primary
27
- agent owns the source and the hot-reload feedback loop.
28
- - Use a nearby game under `.forgeax/games/` or `packages/games/` as an example, not as
29
- a template to duplicate wholesale.
30
-
31
- The plugin materializes the SDK from the same Engine pin used by its selected Runtime package.
32
- Read the relevant `package.json`, declaration files, and template first. If the bundled
33
- snapshot lacks an API, inspect the matching implementation source under `source/` rather
34
- than substituting a guessed import. A successful TypeScript transform does not prove that
35
- the preview is running the intended Engine.
@@ -1,24 +0,0 @@
1
- # Engine skills available in Runtime 0.3.32
2
-
3
- Derived from the Engine skills carried by the installed Runtime package. Invoke only
4
- ids listed here; Engine package names and skill ids are not interchangeable.
5
-
6
- | Skill id | Covers |
7
- |:--|:--|
8
- | `forgeax-engine-app` | ForgeaX application bootstrap and browser frame loop. |
9
- | `forgeax-engine-assets` | forgeax-engine 资产链路:GUID sidecar → CLI 校验 → vite 折 pack-index → runtime 按 GUID 取 payload, `<packagePath>.<name>` 两段式 identity。 |
10
- | `forgeax-engine-audio` | ForgeaX realm-neutral ECS audio with Host-owned Web Audio playback. |
11
- | `forgeax-engine-cli` | forgeax-engine 远程求值:对运行中引擎活实例执行 eval(script) + kubectl 式 plugin bin。 |
12
- | `forgeax-engine-debug` | forgeax-engine 渲染 / 测试 / CI 实战排查手册——按"症状 → 根因 → 修法"索引已踩过的坑(贴图纯白、 CI 断言全过却 exit 1、worktree 本地假失败、热更新贴图丢失等)。 |
13
- | `forgeax-engine-debug-draw` | forgeax-engine immediate-mode 调试可视化层:line / sphere / aabb / frustum / arrow / axes 线框 overlay, runtime 自动挂载 app.debugDraw(零配置),low path 手写 RHI flush(自定义 graph / 录帧脚本)。 |
14
- | `forgeax-engine-ecs` | ForgeaX archetype ECS: define SoA components and systems, attach systems to the Update or FixedUpdate schedule with token-first World APIs, and advance a World through world.update |
15
- | `forgeax-engine-material` | Build and debug visible ForgeaX materials through the single MaterialAsset route. |
16
- | `forgeax-engine-math` | forgeax-engine 的纯函数数学库:vec / mat / quat / euler / color 的 out-param 风格函数, 从 Transform.world mat4 读 pose,screenToRay / rayAabbIntersects 做拾取。 |
17
- | `forgeax-engine-physics` | forgeax-engine 物理:给 entity 挂 Transform + RigidBody + Collider 即被每帧驱动位置。 |
18
- | `forgeax-engine-render-pipeline` | forgeax-engine 渲染管线与后处理:Camera 内建后处理开关 + skybox + 后处理读相机深度 + 声明式 RenderGraph 替换整条 per-frame 管线。Use when toggling tonemap/bloom/fxaa/ msaa/skybox, reading camera depth in a post-pro |
19
- | `forgeax-engine-rhi` | forgeax-engine 底层渲染硬件接口(贡献者向):spec-aligned 纯接口、opaque handle、 math-free、双实现同发、capability gate。Use when contributing to or debugging the RHI backend, reading capability gates, or tr |
20
- | `forgeax-engine-rhi-debug` | forgeax-engine 的 RHI 帧录制 + 确定性 replay + 离线 per-draw inspect(RenderDoc 思想)。 |
21
- | `forgeax-engine-sdk` | Build and verify the portable ForgeaX browser-game SDK ZIP from an Engine checkout. |
22
- | `forgeax-engine-shader` | Author WGSL modules that are consumed by cooked MaterialAsset contracts. |
23
- | `forgeax-engine-state` | forgeax-engine typed state-machine: defineState creates a StateToken, setNextState requests a transition, state-scoped entities auto-despawn via despawnOnExit/despawnOnEnter, OnEnt |
24
- | `forgeax-engine-vfx` | ForgeaX code-first GPU VFX: author two WGSL hooks, cook Pack v2, play through ECS, and render executable billboard, mesh, ribbon, trail, or beam output. |
@@ -1,26 +0,0 @@
1
- # Validation loop
2
-
3
- Use the narrowest proof that exercises the user's real path, then run the repository
4
- gate before shipping a product change.
5
-
6
- 1. Call `forgeax://status` or `forgeax_status_lite` and record the active game.
7
- 2. Run focused tests for the changed code.
8
- 3. Call `forgeax_run_current_game` and use the returned URLs.
9
- 4. For Studio or viewport behavior, open `http://localhost:18920` and exercise the
10
- embedded editor path. For standalone Play behavior, exercise the returned Play URL.
11
- 5. Inspect browser errors and the runtime log returned by the tool.
12
- 6. Run `bun fx check` for a normal repository change. Run the owning repository's
13
- `bun fx ci` before creating or updating a pull request.
14
-
15
- ## Evidence boundary
16
-
17
- | Result | What it proves |
18
- |:--|:--|
19
- | MCP handshake and status | The host can load the plugin and bind the project |
20
- | Focused tests | The changed code's asserted contract |
21
- | Play URL responds | The standalone runtime is reachable |
22
- | Real Studio interaction | The assembled product path works |
23
- | Full repository gate | The broader source tree remains compatible |
24
-
25
- Do not collapse these into one “green” claim. Mark any layer that was not exercised as
26
- unverified.