@forgeax/game 0.2.4 → 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.
- package/README.md +180 -201
- package/assets/asset3d/schemas/receipt-1.0.0.json +29 -0
- package/assets/asset3d/schemas/result-1.0.0.json +242 -0
- package/assets/asset3d/vibegame-art-3d-asset-library-2.0.0.tgz +0 -0
- package/assets/skills/forgeax-game/SKILL.md +80 -90
- package/dist/main.js +4271 -1257
- package/docs/asset3d.md +157 -0
- package/docs/release-0.3.0.md +100 -0
- package/package.json +17 -7
- package/assets/skills/forgeax-game/references/engine-authoring-traps.md +0 -81
- package/assets/skills/forgeax-game/references/engine-project.md +0 -35
- package/assets/skills/forgeax-game/references/engine-skills.md +0 -24
- package/assets/skills/forgeax-game/references/validation.md +0 -26
package/docs/asset3d.md
ADDED
|
@@ -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,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"packageManager": "bun@1.3.14",
|
|
3
3
|
"name": "@forgeax/game",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
7
|
-
"description": "@forgeax/game
|
|
7
|
+
"description": "@forgeax/game — an MCP/CLI connector for exact released ForgeaX Engine games and Engine-owned Preview.",
|
|
8
8
|
"main": "./dist/main.js",
|
|
9
9
|
"bin": {
|
|
10
|
-
"forgeax-game": "dist/main.js"
|
|
10
|
+
"forgeax-game": "dist/main.js",
|
|
11
|
+
"game": "dist/main.js"
|
|
11
12
|
},
|
|
12
13
|
"engines": {
|
|
13
|
-
"node": ">=
|
|
14
|
+
"node": ">=22.13.0"
|
|
14
15
|
},
|
|
15
16
|
"publishConfig": {
|
|
16
17
|
"access": "public",
|
|
@@ -18,13 +19,16 @@
|
|
|
18
19
|
},
|
|
19
20
|
"files": [
|
|
20
21
|
"dist",
|
|
21
|
-
"assets
|
|
22
|
+
"assets",
|
|
23
|
+
"docs/asset3d.md",
|
|
24
|
+
"docs/release-0.3.0.md",
|
|
22
25
|
"README.md"
|
|
23
26
|
],
|
|
24
27
|
"scripts": {
|
|
25
28
|
"build": "bun build.mjs",
|
|
26
29
|
"release:check": "bun scripts/check-package-artifact.ts",
|
|
27
30
|
"acceptance": "bun scripts/accept-packed-consumer.ts",
|
|
31
|
+
"acceptance:asset3d": "bun scripts/accept-asset3d-packed-consumer.ts",
|
|
28
32
|
"release:publish": "bun scripts/publish-package.ts",
|
|
29
33
|
"prepack": "bun build.mjs",
|
|
30
34
|
"typecheck": "tsc --noEmit",
|
|
@@ -42,10 +46,16 @@
|
|
|
42
46
|
],
|
|
43
47
|
"license": "MIT",
|
|
44
48
|
"dependencies": {
|
|
45
|
-
"@forgeax/
|
|
49
|
+
"@forgeax/engine-sdk": "0.1.7",
|
|
50
|
+
"pnpm": "11.7.0"
|
|
46
51
|
},
|
|
47
52
|
"devDependencies": {
|
|
48
53
|
"@types/bun": "^1.2.0",
|
|
49
54
|
"typescript": "^5.9.2"
|
|
50
|
-
}
|
|
55
|
+
},
|
|
56
|
+
"directories": {
|
|
57
|
+
"doc": "docs",
|
|
58
|
+
"test": "test"
|
|
59
|
+
},
|
|
60
|
+
"author": ""
|
|
51
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.33
|
|
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 渲染管线、后处理与 typed RenderGraph。Use when toggling camera effects, authoring a custom RenderPipeline, contributing compute or raster RenderFeature work, or tracing graph |
|
|
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.
|