@forgeax/game 0.3.2 → 0.3.4

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/docs/asset3d.md CHANGED
@@ -14,11 +14,13 @@ second importer or Preview server.
14
14
 
15
15
  > [!IMPORTANT]
16
16
  > Provider archives are platform-specific artifacts. The npm package embeds the
17
- > currently released Darwin arm64 archive so a cache-empty user does not depend on a
18
- > private source repository or release download. Installation deliberately returns
17
+ > currently released Darwin arm64 and Linux x64 archives so a cache-empty user does
18
+ > not depend on a private source repository or release download. Linux requires an
19
+ > x86-64 host and Python 3.11 or 3.12. Installation deliberately returns
19
20
  > `provider_platform_mismatch` when an archive target differs from the current host.
20
- > Each bundled target therefore needs its own digest, offline verification, MCP
21
- > handshake, and real service-path evidence.
21
+ > Unsupported targets such as Linux arm64 and Windows fail closed. Each bundled
22
+ > target therefore needs its own digest, offline verification, MCP handshake, and
23
+ > real service-path evidence.
22
24
 
23
25
  ## Trust and data flow
24
26
 
@@ -54,19 +56,22 @@ one-to-eight member set is sorted and encoded as compact JSON in
54
56
  digest. The provider is responsible for enforcing that set on both initial and
55
57
  redirect requests.
56
58
 
57
- Normal installation writes the normalized AW service root to `AW_API_BASE_URL` and an
58
- absolute user credential-file path to `AW_API_CREDENTIAL_FILE`. It never writes
59
- `AW_API_SANDBOX_KEY` into project MCP configuration. `--catalog-base-url` remains a
59
+ Normal installation writes the selected service root to `AW_API_BASE_URL`, the
60
+ matching `AW_API_DEPOT_NAME=aw|ea`, and an absolute user credential-file path to
61
+ `AW_API_CREDENTIAL_FILE`. The `AW_API_*` names are the packaged Provider's legacy
62
+ environment contract. Installation never writes `AW_API_SANDBOX_KEY` into project
63
+ MCP configuration. `--catalog-base-url` remains a
60
64
  maintainer-only compatibility adapter for the retired directory service; when used,
61
65
  its authority must also appear in `--download-origin`.
62
66
 
63
67
  ## Installation ownership
64
68
 
65
- `asset3d enable` uses the documented AW production service when no override is
66
- present. Service selection precedence is explicit `--base-url`, then
67
- `FORGEAX_ASSET_LIBRARY_BASE_URL`, then the built-in production service. Therefore a
68
- test environment is contacted only when the caller supplies its gateway or service
69
- URL. The first interactive run asks for the AW Sandbox Key with terminal echo
69
+ `asset3d enable` keeps the public AW depot by default. `--library ea` selects the EA
70
+ depot and its office-network local gateway; `FORGEAX_ASSET_LIBRARY=ea` is the
71
+ deployment equivalent. Gateway selection precedence is explicit `--base-url`, then
72
+ `FORGEAX_ASSET_LIBRARY_BASE_URL`, then the selected library's built-in service.
73
+ Gateway overrides never change the selected depot. The first interactive run asks
74
+ for the Sandbox Key with terminal echo
70
75
  disabled. Automation can supply `FORGEAX_ASSET3D_AW_SANDBOX_KEY` from a secret store;
71
76
  command-line key arguments are deliberately unsupported.
72
77
 
@@ -109,6 +114,13 @@ idempotent. Uninstall removes only entries and Skill files that still match owne
109
114
  digests, leaving user-modified or unrelated content in place and reporting the
110
115
  collision.
111
116
 
117
+ For user-scoped MCP hosts such as Codex, Cursor, and Claude, `enable` additionally
118
+ registers a non-secret `asset3d-search` bridge command. The bridge resolves
119
+ `.forgeax/asset3d-install.json` and the owned `.forgeax/mcp.json` entry from the host
120
+ process working directory, rather than pinning a user config to one project. A
121
+ project without an Asset3D installation receives a healthy MCP handshake with an
122
+ empty tool list. Start a new Agent session after enabling so `search_asset` appears.
123
+
112
124
  The workflow package is projected beneath `art-3d-asset-library/` in exactly these
113
125
  mounts unless `--ide` selects a subset:
114
126
 
@@ -127,19 +139,22 @@ has its path, byte count, and digest in the ownership manifest.
127
139
 
128
140
  1. `asset3d begin` records a private journal with a new execution UUID, query digest,
129
141
  provider identity, exact Engine identity, requested count, and the only allowed
130
- quarantine root. It returns the relative `output_dir` for `search_asset`; the
131
- provider's `MCP_SHARED_PATH` is the same private `workspace/` root, so declared
132
- manifest paths and transaction validation address identical bytes.
133
- 2. The configured provider writes beneath that directory and returns one checked
134
- `forgeax.asset3d-search-result/1.0.0` TextContent JSON object.
135
- 3. `asset3d commit --provider-result-stdin` reads at most 1 MiB, validates exact
136
- fields/counts/roles/digests/sorted relative paths, and ignores `downloaded_to`.
137
- 4. The transaction rejects symlinks, special files, undeclared files, realpath escape,
142
+ quarantine root.
143
+ 2. `search_asset` accepts that execution UUID instead of an output path. The Game
144
+ Plugin bridge verifies the exact queries and injects the transaction-owned
145
+ provider directory beneath its private `workspace/` root.
146
+ 3. The configured provider writes beneath that directory and returns one checked
147
+ `forgeax.asset3d-search-result/1.0.0` TextContent JSON object. The bridge stores
148
+ those exact bytes against the execution; the agent does not copy the object.
149
+ 4. `asset3d commit --execution <uuid>` reads the stored result (at most 1 MiB),
150
+ validates exact fields/counts/roles/digests/sorted relative paths, and ignores
151
+ `downloaded_to`.
152
+ 5. The transaction rejects symlinks, special files, undeclared files, realpath escape,
138
153
  byte mismatch, or digest mismatch before a project asset write.
139
- 5. A 30-second per-asset lock serializes publication at
154
+ 6. A 30-second per-asset lock serializes publication at
140
155
  `assets/3d/ea-3d/<safeAssetId>`. The complete prior directory is preserved as the
141
156
  refresh/rollback snapshot.
142
- 6. With the game root as `cwd`, Game Plugin runs the exact released Engine CLI:
157
+ 7. With the game root as `cwd`, Game Plugin runs the exact released Engine CLI:
143
158
 
144
159
  ```text
145
160
  asset add assets/3d/ea-3d/<safeAssetId> --reimport-policy semantic-only --json
@@ -151,7 +166,7 @@ has its path, byte count, and digest in the ownership manifest.
151
166
  Each command must produce exactly one newline-terminated, at-most-1-MiB
152
167
  `CommandEnvelope@1.0.0`. Game Plugin does not filter diagnostic stdout into a
153
168
  synthetic success.
154
- 7. Only after Engine readback succeeds does `.forgeax-asset.json` publish the provider
169
+ 8. Only after Engine readback succeeds does `.forgeax-asset.json` publish the provider
155
170
  commit, origin-set digest, exact Engine version/commit, per-file role/digest/bytes,
156
171
  Engine rows, and catalog readback. An Engine failure restores the whole previous
157
172
  asset directory.
@@ -165,11 +180,12 @@ successful; `asset3d abort` removes only its transaction quarantine.
165
180
  ## Distribution and evidence boundary
166
181
 
167
182
  The packed Game Plugin includes the self-contained CLI bundle, existing connector
168
- Skill, exact K0 TGZ, checked P0 result/receipt schemas, and the immutable URL/digest
169
- table for supported Provider targets. It does not embed the Provider runtime archive,
170
- Engine payload, source checkout, credentials, or workspace links. Provider archives
171
- are separate release assets so a disabled installation downloads nothing. The package
172
- artifact gate recomputes every embedded predecessor digest.
183
+ Skill, exact K0 TGZ, checked P0 result/receipt schemas, and an inert, digest-pinned
184
+ Provider archive for every supported target. It does not embed a provisioned Python
185
+ environment, managed Provider cache, Engine payload, source checkout, credentials, or
186
+ workspace links. A disabled installation neither extracts an archive nor contacts a
187
+ network service. The package artifact gate recomputes every embedded predecessor
188
+ digest.
173
189
 
174
190
  Controlled external-consumer evidence may establish package installation, raw MCP
175
191
  framing, local redirect/ZIP handling, multi-GLB and texture import, reuse, refresh,
@@ -0,0 +1,73 @@
1
+ # `@forgeax/game` 0.3.3 release guide
2
+
3
+ Version `0.3.3` adds the EA depot without removing the public AW path. The packaged
4
+ provider is unchanged; one explicit library selection binds the matching depot and
5
+ gateway together.
6
+
7
+ > [!IMPORTANT]
8
+ > EA is currently available only through the office-network `local` gateway.
9
+ > There is no reachability-based fallback: silently changing libraries would make
10
+ > identical queries resolve to different assets.
11
+
12
+ ## User contract
13
+
14
+ ```bash
15
+ # Public/default
16
+ npx -y @forgeax/game@0.3.3 asset3d enable
17
+
18
+ # Office network
19
+ npx -y @forgeax/game@0.3.3 asset3d enable --library ea
20
+
21
+ npx -y @forgeax/game@0.3.3 asset3d doctor --json
22
+ ```
23
+
24
+ The selected mode writes these non-secret provider settings:
25
+
26
+ | Mode | Depot | Built-in gateway |
27
+ |:--|:--|:--|
28
+ | Default or `--library aw` | `aw` | Existing public AW service |
29
+ | `--library ea` | `ea` | `http://test-ultrongw.woa.com/trpc.oasismetric.omcontentserver.http` |
30
+
31
+ `FORGEAX_ASSET_LIBRARY=aw|ea` is the deployment selector. `--base-url` and
32
+ `FORGEAX_ASSET_LIBRARY_BASE_URL` remain gateway overrides and never change the
33
+ selected depot. The project stores only the service URL, depot name, private
34
+ credential-file path, and live-derived download origins.
35
+
36
+ ## Transaction-bound search
37
+
38
+ `search_asset` accepts the execution UUID returned by `asset3d begin`; it no longer
39
+ accepts a caller-selected `output_dir`. The Game Plugin bridge verifies the execution
40
+ and exact query list, then injects the private quarantine path before invoking the
41
+ packaged provider. This removes agent path guesses such as `assets` from the tool
42
+ contract while preserving the existing provider implementation.
43
+
44
+ The bridge also persists the exact checked TextContent by execution. A normal commit
45
+ is now `asset3d commit --execution <uuid> --json`; agents no longer reconstruct large
46
+ provider JSON as shell input.
47
+
48
+ `asset3d enable` now installs the generic `asset3d-search` bridge into every Agent
49
+ host previously selected by `install`. The user-level launch command carries no key
50
+ and no project path; it discovers the active project's owned Provider configuration
51
+ from its working directory. Disabled projects advertise zero Asset3D tools. Start a
52
+ new Agent session after enabling so the host refreshes its MCP tool inventory.
53
+
54
+ ## Verified migration
55
+
56
+ - [x] EA access check succeeded through the packaged provider.
57
+ - [x] Query `wooden barrel` returned EA asset `SM_Prop_Bucket_001.zip`.
58
+ - [x] The provider downloaded and converted the result to GLB.
59
+ - [x] Delivered result was 565,650 bytes with SHA-256
60
+ `17897a89e652170e7ab98b08dd71f10c4289e58b38caac52e0b41e44b5f72185`.
61
+ - [x] The primary GLB was 314,908 bytes.
62
+ - [ ] Registry publication and registry-downloaded tarball verification.
63
+
64
+ ## Release gates
65
+
66
+ ```bash
67
+ bun run typecheck
68
+ bun test test/*.test.ts
69
+ FORGEAX_ASSET3D_PROVIDER_BUNDLE=<audited-provider-archive> bun run build
70
+ FORGEAX_ASSET3D_PROVIDER_BUNDLE=<audited-provider-archive> \
71
+ npm pack --ignore-scripts --json --pack-destination <audited-directory>
72
+ bun scripts/check-package-artifact.ts <audited-directory>/forgeax-game-0.3.3.tgz
73
+ ```
@@ -0,0 +1,66 @@
1
+ # @forgeax/game 0.3.4 release contract
2
+
3
+ Version `0.3.4` adds a self-contained Linux x64 Asset3D Provider while preserving
4
+ the existing opt-in workflow. Ordinary `install` and `init` remain platform-neutral
5
+ and keep Asset3D disabled. A user enables Asset3D only from an initialized game:
6
+
7
+ ```bash
8
+ npx -y @forgeax/game@0.3.4 asset3d enable
9
+ npx -y @forgeax/game@0.3.4 asset3d doctor --json
10
+ ```
11
+
12
+ ## Supported Provider targets
13
+
14
+ | Host | Provider archive SHA-256 | Status |
15
+ |---|---|---|
16
+ | Darwin arm64 | `9492c507a3afe5cafcd50b5f782b313c8716c2e52f5def06592c6a100c0459db` | Supported |
17
+ | Linux x64 | `e6ac3df76c8b82f9fe2c063dd3f221324a9dad5176fd52535a5144b0ff6002d8` | Supported; Python 3.11 or 3.12 required |
18
+
19
+ Both archives bind Provider commit
20
+ `c181c48fbffc933a7ce9a0836f7878ca5e6d77e1`. The package build fails if either
21
+ source archive is absent, is a symlink, or differs from its approved digest. The npm
22
+ artifact gate repeats those checks against the packed bytes.
23
+
24
+ The offline wheelhouses omit upstream dependency test suites and redact
25
+ credential-shaped user-info from dependency documentation examples. Runtime modules
26
+ and package metadata remain present, each rewritten wheel is re-RECORDed and
27
+ hash-locked, and the resulting platform archives are byte-reproducible. This keeps
28
+ test-only public tokens and false credential patterns out of the npm payload.
29
+
30
+ Linux arm64 and Windows are not part of this release. `asset3d enable` fails closed
31
+ with `asset3d_provider_target_unreleased` on those hosts; it does not install a
32
+ different target or fall back to downloaded Provider code.
33
+
34
+ ## Linux release gate
35
+
36
+ The Ubuntu x64 CI job performs the Linux-specific verification from the same package
37
+ assets that are published:
38
+
39
+ 1. Provision the Provider into an empty managed cache without downloading Provider
40
+ code or Python dependencies.
41
+ 2. Verify the archive manifest, target, file digests, wheel lock, and converter.
42
+ 3. Execute the bundled Linux x64 `FBX2glTF` binary.
43
+ 4. Launch the installed Provider over stdio MCP and require `search_asset` in
44
+ `tools/list`.
45
+
46
+ This proves Linux provisioning and MCP capability discovery. It does not substitute
47
+ for an authenticated request to the internal AW service, which requires network
48
+ reachability and user credentials and remains a separate environment acceptance
49
+ gate.
50
+
51
+ ## Maintainer checklist
52
+
53
+ - [ ] `bun run typecheck`
54
+ - [ ] `bun test`
55
+ - [ ] `bun run build`
56
+ - [ ] `npm pack --ignore-scripts --pack-destination <empty-directory>`
57
+ - [ ] `bun run release:check -- <exact-tarball>`
58
+ - [ ] Ubuntu x64 `asset3d-linux-x64` CI job is green on the exact release commit.
59
+ - [ ] The packed artifact contains both Provider archives and no credential, source
60
+ checkout, managed cache, or provisioned Python environment.
61
+ - [ ] The exact tarball passes the repository secret and private-path scans before
62
+ publication.
63
+
64
+ The AW production default and explicit EA override remain as documented in
65
+ [`release-0.3.3.md`](release-0.3.3.md). Credential storage and real search/import
66
+ acceptance boundaries remain unchanged and are defined in [`asset3d.md`](asset3d.md).
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "packageManager": "bun@1.3.14",
3
3
  "name": "@forgeax/game",
4
- "version": "0.3.2",
4
+ "version": "0.3.4",
5
5
  "private": false,
6
6
  "type": "module",
7
7
  "description": "@forgeax/game — an MCP/CLI connector for exact released ForgeaX Engine games and Engine-owned Preview.",
@@ -24,6 +24,8 @@
24
24
  "docs/release-0.3.0.md",
25
25
  "docs/release-0.3.1.md",
26
26
  "docs/release-0.3.2.md",
27
+ "docs/release-0.3.3.md",
28
+ "docs/release-0.3.4.md",
27
29
  "README.md"
28
30
  ],
29
31
  "scripts": {
@@ -31,6 +33,7 @@
31
33
  "release:check": "bun scripts/check-package-artifact.ts",
32
34
  "acceptance": "bun scripts/accept-packed-consumer.ts",
33
35
  "acceptance:asset3d": "bun scripts/accept-asset3d-packed-consumer.ts",
36
+ "verify:asset3d-linux": "bun scripts/verify-linux-asset3d-provider.ts",
34
37
  "release:publish": "bun scripts/publish-package.ts",
35
38
  "prepack": "bun build.mjs",
36
39
  "typecheck": "tsc --noEmit",