@forgeax/game 0.2.4 → 0.3.1
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 +199 -201
- package/assets/asset3d/provider/asset3d-search-provider-c181c48fbffc933a7ce9a0836f7878ca5e6d77e1-darwin-arm64.tar.gz +0 -0
- 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 +5333 -2115
- package/docs/asset3d.md +177 -0
- package/docs/release-0.3.0.md +100 -0
- package/docs/release-0.3.1.md +107 -0
- package/package.json +18 -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
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "forgeax.asset3d-search-result/1.0.0",
|
|
4
|
+
"title": "ForgeaX Asset3D Search Result",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"schemaVersion",
|
|
9
|
+
"total",
|
|
10
|
+
"succeeded",
|
|
11
|
+
"failed",
|
|
12
|
+
"results"
|
|
13
|
+
],
|
|
14
|
+
"properties": {
|
|
15
|
+
"schemaVersion": {
|
|
16
|
+
"const": "forgeax.asset3d-search-result/1.0.0"
|
|
17
|
+
},
|
|
18
|
+
"total": {
|
|
19
|
+
"type": "integer",
|
|
20
|
+
"minimum": 1,
|
|
21
|
+
"maximum": 16
|
|
22
|
+
},
|
|
23
|
+
"succeeded": {
|
|
24
|
+
"type": "integer",
|
|
25
|
+
"minimum": 0,
|
|
26
|
+
"maximum": 16
|
|
27
|
+
},
|
|
28
|
+
"failed": {
|
|
29
|
+
"type": "integer",
|
|
30
|
+
"minimum": 0,
|
|
31
|
+
"maximum": 16
|
|
32
|
+
},
|
|
33
|
+
"results": {
|
|
34
|
+
"type": "array",
|
|
35
|
+
"minItems": 1,
|
|
36
|
+
"maxItems": 16,
|
|
37
|
+
"items": {
|
|
38
|
+
"oneOf": [
|
|
39
|
+
{
|
|
40
|
+
"$ref": "#/$defs/success"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"$ref": "#/$defs/error"
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"receipt": {
|
|
49
|
+
"$ref": "receipt-1.0.0.json"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"allOf": [
|
|
53
|
+
{
|
|
54
|
+
"if": {
|
|
55
|
+
"properties": {
|
|
56
|
+
"succeeded": {
|
|
57
|
+
"minimum": 1
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"then": {
|
|
62
|
+
"required": ["receipt"]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"$defs": {
|
|
67
|
+
"queryIndex": {
|
|
68
|
+
"type": "integer",
|
|
69
|
+
"minimum": 0,
|
|
70
|
+
"maximum": 15
|
|
71
|
+
},
|
|
72
|
+
"safeId": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"minLength": 1,
|
|
75
|
+
"maxLength": 128,
|
|
76
|
+
"pattern": "^[A-Za-z0-9._-]+$",
|
|
77
|
+
"not": {
|
|
78
|
+
"enum": [".", ".."]
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"sha256": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
84
|
+
},
|
|
85
|
+
"relativePath": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"minLength": 1,
|
|
88
|
+
"maxLength": 512,
|
|
89
|
+
"pattern": "^(?!/)(?!.*\\\\)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*//)[^\\u0000]+$"
|
|
90
|
+
},
|
|
91
|
+
"manifestEntry": {
|
|
92
|
+
"type": "object",
|
|
93
|
+
"additionalProperties": false,
|
|
94
|
+
"required": ["path", "role", "bytes", "sha256"],
|
|
95
|
+
"properties": {
|
|
96
|
+
"path": {
|
|
97
|
+
"$ref": "#/$defs/relativePath"
|
|
98
|
+
},
|
|
99
|
+
"role": {
|
|
100
|
+
"enum": [
|
|
101
|
+
"primary-model",
|
|
102
|
+
"animation",
|
|
103
|
+
"auxiliary-model",
|
|
104
|
+
"texture",
|
|
105
|
+
"metadata"
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
"bytes": {
|
|
109
|
+
"type": "integer",
|
|
110
|
+
"minimum": 1,
|
|
111
|
+
"maximum": 134217728
|
|
112
|
+
},
|
|
113
|
+
"sha256": {
|
|
114
|
+
"$ref": "#/$defs/sha256"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"success": {
|
|
119
|
+
"type": "object",
|
|
120
|
+
"additionalProperties": false,
|
|
121
|
+
"required": [
|
|
122
|
+
"status",
|
|
123
|
+
"queryIndex",
|
|
124
|
+
"query",
|
|
125
|
+
"provider",
|
|
126
|
+
"providerAssetId",
|
|
127
|
+
"assetName",
|
|
128
|
+
"deliveredFormat",
|
|
129
|
+
"sha256",
|
|
130
|
+
"bytes",
|
|
131
|
+
"primaryModel",
|
|
132
|
+
"manifest",
|
|
133
|
+
"originSetDigest"
|
|
134
|
+
],
|
|
135
|
+
"properties": {
|
|
136
|
+
"status": {
|
|
137
|
+
"const": "ok"
|
|
138
|
+
},
|
|
139
|
+
"queryIndex": {
|
|
140
|
+
"$ref": "#/$defs/queryIndex"
|
|
141
|
+
},
|
|
142
|
+
"query": {
|
|
143
|
+
"type": "string",
|
|
144
|
+
"minLength": 1,
|
|
145
|
+
"maxLength": 200
|
|
146
|
+
},
|
|
147
|
+
"provider": {
|
|
148
|
+
"const": "ea-3d"
|
|
149
|
+
},
|
|
150
|
+
"providerAssetId": {
|
|
151
|
+
"$ref": "#/$defs/safeId"
|
|
152
|
+
},
|
|
153
|
+
"assetName": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"minLength": 1,
|
|
156
|
+
"maxLength": 128
|
|
157
|
+
},
|
|
158
|
+
"deliveredFormat": {
|
|
159
|
+
"const": "glb"
|
|
160
|
+
},
|
|
161
|
+
"sha256": {
|
|
162
|
+
"$ref": "#/$defs/sha256"
|
|
163
|
+
},
|
|
164
|
+
"bytes": {
|
|
165
|
+
"type": "integer",
|
|
166
|
+
"minimum": 1,
|
|
167
|
+
"maximum": 268435456
|
|
168
|
+
},
|
|
169
|
+
"primaryModel": {
|
|
170
|
+
"$ref": "#/$defs/relativePath"
|
|
171
|
+
},
|
|
172
|
+
"manifest": {
|
|
173
|
+
"type": "array",
|
|
174
|
+
"minItems": 1,
|
|
175
|
+
"maxItems": 1024,
|
|
176
|
+
"items": {
|
|
177
|
+
"$ref": "#/$defs/manifestEntry"
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
"originSetDigest": {
|
|
181
|
+
"$ref": "#/$defs/sha256"
|
|
182
|
+
},
|
|
183
|
+
"downloaded_to": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"minLength": 1,
|
|
186
|
+
"maxLength": 512,
|
|
187
|
+
"pattern": "^(?!/)(?!.*\\\\)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*//)[^\\u0000]+$"
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"error": {
|
|
192
|
+
"type": "object",
|
|
193
|
+
"additionalProperties": false,
|
|
194
|
+
"required": [
|
|
195
|
+
"status",
|
|
196
|
+
"queryIndex",
|
|
197
|
+
"query",
|
|
198
|
+
"code",
|
|
199
|
+
"retryable",
|
|
200
|
+
"message"
|
|
201
|
+
],
|
|
202
|
+
"properties": {
|
|
203
|
+
"status": {
|
|
204
|
+
"const": "error"
|
|
205
|
+
},
|
|
206
|
+
"queryIndex": {
|
|
207
|
+
"$ref": "#/$defs/queryIndex"
|
|
208
|
+
},
|
|
209
|
+
"query": {
|
|
210
|
+
"type": "string",
|
|
211
|
+
"minLength": 1,
|
|
212
|
+
"maxLength": 200
|
|
213
|
+
},
|
|
214
|
+
"code": {
|
|
215
|
+
"enum": [
|
|
216
|
+
"asset_not_found",
|
|
217
|
+
"asset_identity_missing",
|
|
218
|
+
"search_timeout",
|
|
219
|
+
"search_upstream_error",
|
|
220
|
+
"download_timeout",
|
|
221
|
+
"download_origin_rejected",
|
|
222
|
+
"download_too_large",
|
|
223
|
+
"archive_rejected",
|
|
224
|
+
"conversion_failed",
|
|
225
|
+
"digest_failed",
|
|
226
|
+
"batch_timeout",
|
|
227
|
+
"internal_error"
|
|
228
|
+
]
|
|
229
|
+
},
|
|
230
|
+
"retryable": {
|
|
231
|
+
"type": "boolean"
|
|
232
|
+
},
|
|
233
|
+
"message": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"minLength": 1,
|
|
236
|
+
"maxLength": 256,
|
|
237
|
+
"pattern": "^[^\\u0000-\\u001f\\u007f]+$"
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
Binary file
|
|
@@ -1,94 +1,84 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: forgeax-game
|
|
3
|
-
description: Build,
|
|
3
|
+
description: Build, preview, inspect, and repair a released ForgeaX Engine game through the @forgeax/game MCP connector.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# ForgeaX
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
`
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
##
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
- **Launch failure:** read the runtime log path returned by the tool. Browser-only
|
|
86
|
-
exceptions still require the browser console.
|
|
87
|
-
- **Viewport or Play defect:** reproduce through the real Studio UI. A direct curl to
|
|
88
|
-
the Play server does not prove the embedded editor path.
|
|
89
|
-
|
|
90
|
-
## Finish with evidence
|
|
91
|
-
|
|
92
|
-
Report the changed game and files, the MCP status/launch result, the exact browser
|
|
93
|
-
surface exercised, and any remaining unverified boundary. A passing unit test is not
|
|
94
|
-
evidence that the game rendered or behaved correctly.
|
|
6
|
+
# ForgeaX game development
|
|
7
|
+
|
|
8
|
+
Use this Skill for gameplay implementation and the edit-build-Preview-repair loop in
|
|
9
|
+
a standalone game created or bound by `forgeax-game init`. The host agent edits game code;
|
|
10
|
+
the connector owns Engine CLI execution and Preview lifecycle.
|
|
11
|
+
|
|
12
|
+
## Start with identity
|
|
13
|
+
|
|
14
|
+
1. Read the MCP resource `forgeax://status`. If the client cannot read resources,
|
|
15
|
+
call `forgeax_status_lite` with the game's current directory as `target_dir`.
|
|
16
|
+
2. Confirm the status reports one consistent installed Engine version/commit and an
|
|
17
|
+
exact matching DevKit/carrier. Never hardcode a historical release identity.
|
|
18
|
+
3. Read the game's `forge.json`, source, package declarations, and any Engine-owned
|
|
19
|
+
`skills/` installed with that game. Engine declarations are in its installed
|
|
20
|
+
`node_modules/@forgeax/engine*` packages; never substitute Studio or Editor source.
|
|
21
|
+
|
|
22
|
+
> [!IMPORTANT]
|
|
23
|
+
> In an empty directory, `forgeax-game init` creates the Engine-owned standalone game
|
|
24
|
+
> through the exact installed carrier. In an existing exact game it refreshes the
|
|
25
|
+
> binding idempotently. Standalone source is `<game-root>/src`; do not create Studio's
|
|
26
|
+
> hosted `.forgeax/games/<slug>` layout.
|
|
27
|
+
|
|
28
|
+
## Edit and verify
|
|
29
|
+
|
|
30
|
+
1. Make the smallest coherent game-source change using normal file tools. Mount browser
|
|
31
|
+
UI through the Engine Host `uiRoot` or `#game-ui`. The released standalone Host
|
|
32
|
+
provides `#game-ui`; do not mutate `document.body` directly.
|
|
33
|
+
2. When turning the Empty template into a requested game, also replace the template
|
|
34
|
+
identity in `forge.json`, `package.json`, and README; document controls and keep
|
|
35
|
+
tests aligned. Export at least one named game-specific state transition or rule and
|
|
36
|
+
exercise it in a behavior test. Renaming the Empty test suite is not completion.
|
|
37
|
+
The run tool rejects changed gameplay with stale or superficial evidence.
|
|
38
|
+
3. Call `forgeax_run_current_game` with the canonical game `target_dir`.
|
|
39
|
+
4. Treat success only as the returned exact Engine/build/Preview identity. Open only
|
|
40
|
+
its returned loopback `preview_url`.
|
|
41
|
+
5. When build or Preview fails, read `preview.stderr_log` and
|
|
42
|
+
`preview.stdout_log`, repair the game, and call the tool again.
|
|
43
|
+
6. After a code change, do not reuse an old visual observation as evidence; the new
|
|
44
|
+
build digest and Preview instance must be observed.
|
|
45
|
+
|
|
46
|
+
## Reuse 3D assets
|
|
47
|
+
|
|
48
|
+
- When the user asks for an existing, reusable, library, stock, or licensed 3D asset,
|
|
49
|
+
require the project-local `asset3d-search` MCP server and its `search_asset` tool.
|
|
50
|
+
- If that server or tool is absent, report `BLOCKED(asset-library-tools-missing)` and
|
|
51
|
+
run or recommend `forgeax-game asset3d doctor --json`. Do not describe procedural
|
|
52
|
+
primitives as the asset library, and do not silently substitute `forgeax_generate_3d`.
|
|
53
|
+
- Use `forgeax_generate_3d` only for an explicitly bespoke/generated asset or after a
|
|
54
|
+
library search found no acceptable candidate and the user approves generation.
|
|
55
|
+
|
|
56
|
+
> [!CAUTION]
|
|
57
|
+
> Any `forgeax_run_current_game` error means the current game is **not previewed**.
|
|
58
|
+
> Stop and report or repair that error. Never probe, reuse, open, or report an existing
|
|
59
|
+
> localhost port after a failed call; HTTP 200 is not Preview ownership evidence. Only
|
|
60
|
+
> a successful result containing `preview.status: ready`, `preview_url`, `preview.root`,
|
|
61
|
+
> `preview.build_digest`, and `preview.instance_id` authorizes a Preview claim.
|
|
62
|
+
|
|
63
|
+
The connector runs the exact installed Engine CLI with `build --json`, then starts or
|
|
64
|
+
reuses `preview --json`. When Engine exposes authenticated health, the connector binds
|
|
65
|
+
it to the canonical root, exact release, build digest, and Preview instance ID.
|
|
66
|
+
Released Engine 0.1.7 instead uses its documented minimal envelope plus an exact
|
|
67
|
+
served `forgeax-dist.json` SHA. PID alone is not ownership evidence in either mode.
|
|
68
|
+
|
|
69
|
+
## Stop
|
|
70
|
+
|
|
71
|
+
For explicit teardown use:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
forgeax-game preview stop --target-dir <game-root>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The connector signals only a verified owned child. A live unverifiable PID is
|
|
78
|
+
left untouched and reported as `preview_ownership_unverified`.
|
|
79
|
+
|
|
80
|
+
## Scope
|
|
81
|
+
|
|
82
|
+
Image and 3D generation helpers may still be exposed, but this G0 Skill does not
|
|
83
|
+
claim Asset3D provider installation/import, Studio/Editor integration, visible Play,
|
|
84
|
+
or real EA/provider end-to-end acceptance.
|