@genex-ai/cli-demo 0.77.0 → 0.77.1-dev.199
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/dist/index.js +2 -2
- package/package.json +1 -1
- package/templates/controllers/quality/pick-asset.ts +6 -1
- package/templates/skills/genex-ai-skybox/SKILL.md +1 -1
- package/templates/skills/genex-ai-texture/SKILL.md +1 -1
- package/templates/skills/genex-ai-video/SKILL.md +1 -1
- package/templates/skills/genex-getting-started/SKILL.md +2 -2
- package/templates/skills/genex-threejs-adaptive-quality/SKILL.md +12 -2
- package/templates/skills/genex-threejs-adaptive-quality/references/adaptive-quality.md +10 -1
- package/templates/skills/genex-threejs-lighting-design/SKILL.md +8 -0
- package/templates/skills/genex-updates/SKILL.md +1 -1
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import fs from "fs";
|
|
|
8
8
|
import os from "os";
|
|
9
9
|
import path from "path";
|
|
10
10
|
import { fileURLToPath } from "url";
|
|
11
|
-
var RAW_CHANNEL = "
|
|
11
|
+
var RAW_CHANNEL = "dev";
|
|
12
12
|
var CLI_CHANNEL = RAW_CHANNEL === "dev" ? "dev" : "latest";
|
|
13
13
|
var STANDS = {
|
|
14
14
|
prod: { api: "https://api.genex.games", dashboard: "https://genex.games" },
|
|
@@ -1640,7 +1640,7 @@ function scanGlb(bytes) {
|
|
|
1640
1640
|
}
|
|
1641
1641
|
|
|
1642
1642
|
// ../../packages/mobile-scan/src/scan.ts
|
|
1643
|
-
var GENEX_GENERATION_URL_RE = /https:\/\/
|
|
1643
|
+
var GENEX_GENERATION_URL_RE = /https:\/\/[A-Za-z0-9.-]+\/generations\/([A-Za-z0-9._-]+)\/([A-Za-z0-9._@-]+)/g;
|
|
1644
1644
|
var SKYBOX_ROLE = "skybox-equirect";
|
|
1645
1645
|
var MOBILE_RUNG_SUFFIX_RE = /@(\d+)$/;
|
|
1646
1646
|
var MOBILE_BUDGET_MB = { broad: 300, modern: 700 };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genex-ai/cli-demo",
|
|
3
|
-
"version": "0.77.
|
|
3
|
+
"version": "0.77.1-dev.199",
|
|
4
4
|
"description": "Set up your project's agent workspace (.claude/.codex/.cursor in the game folder), authorize, create a game project, generate AI assets, and publish (genex CLI).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,7 +10,12 @@
|
|
|
10
10
|
// a rung failure, so the worst case is today's behavior — never a broken boot.
|
|
11
11
|
import type { QualityTier } from './tier.ts';
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
// Host-agnostic on purpose: each stand serves generated assets from its own
|
|
14
|
+
// domain (prod assets.genex.technology, dev assets.auras.cc), and baking one
|
|
15
|
+
// host in would silently disable the whole ladder everywhere else — the
|
|
16
|
+
// fallback contract makes a false positive harmless (404 rung -> warn ->
|
|
17
|
+
// original), so the path shape is the only thing worth matching.
|
|
18
|
+
const GENEX_GENERATIONS_RE = /^https:\/\/[^/]+\/generations\/[^/]+\/[^/@]+$/;
|
|
14
19
|
|
|
15
20
|
/** Rung widths by role family — mirrors the server's ladder (store.ts MOBILE_RUNGS). */
|
|
16
21
|
function rungWidthFor(url: string, tier: QualityTier): number | null {
|
|
@@ -87,7 +87,7 @@ scene.background = texture; // keep the raw texture for the visible sky
|
|
|
87
87
|
|
|
88
88
|
## Troubleshooting
|
|
89
89
|
|
|
90
|
-
- **"Not authorized"** — run `npx @genex-ai/cli-demo@
|
|
90
|
+
- **"Not authorized"** — run `npx @genex-ai/cli-demo@dev init` first (it writes your `GENEX_TOKEN`).
|
|
91
91
|
- **"Out of credits" (`insufficient_credits`)** — the account has no credits left for
|
|
92
92
|
this skybox generation. Tell the user the facts the CLI printed: their balance, this
|
|
93
93
|
generation's cost, and when their credits refill. Then offer to continue the build
|
|
@@ -225,7 +225,7 @@ first one is the one a screenshot of the whole arena will not show you.
|
|
|
225
225
|
|
|
226
226
|
## Troubleshooting
|
|
227
227
|
|
|
228
|
-
- **"Not authorized"** — run `npx @genex-ai/cli-demo@
|
|
228
|
+
- **"Not authorized"** — run `npx @genex-ai/cli-demo@dev init` first (it writes your `GENEX_TOKEN`).
|
|
229
229
|
- **"Out of credits" (`insufficient_credits`)** — the account has no credits left for
|
|
230
230
|
this texture generation. Tell the user the facts the CLI printed: their balance,
|
|
231
231
|
this generation's cost, and when their credits refill. Then offer to continue the
|
|
@@ -145,7 +145,7 @@ set belongs to `$genex-ai-hud` — both build on `npx genex image`/`video`.
|
|
|
145
145
|
|
|
146
146
|
## Troubleshooting
|
|
147
147
|
|
|
148
|
-
- **"Not authorized"** — run `npx @genex-ai/cli-demo@
|
|
148
|
+
- **"Not authorized"** — run `npx @genex-ai/cli-demo@dev init` first (it writes your `GENEX_TOKEN`).
|
|
149
149
|
- **"Prompt rejected"** — the provider's content-safety filter blocked the prompt.
|
|
150
150
|
This is non-retryable; retrying the same wording fails again. Rewrite the prompt.
|
|
151
151
|
- **Nothing plays / black surface** — the first `video.play()` must run inside a user
|
|
@@ -130,7 +130,7 @@ and re-link the clone to the same live game:
|
|
|
130
130
|
```bash
|
|
131
131
|
git clone <the game's repo url> my-game && cd my-game
|
|
132
132
|
npm install
|
|
133
|
-
npx @genex-ai/cli-demo@
|
|
133
|
+
npx @genex-ai/cli-demo@dev link <slug> # slug = the name in the play URL
|
|
134
134
|
```
|
|
135
135
|
|
|
136
136
|
Don't know the slug? **`npx genex list`** prints every game on your account —
|
|
@@ -157,7 +157,7 @@ Safe to run any time — genex-owned skills are refreshed to the latest version,
|
|
|
157
157
|
and your own files are never touched:
|
|
158
158
|
|
|
159
159
|
```bash
|
|
160
|
-
npx @genex-ai/cli-demo@
|
|
160
|
+
npx @genex-ai/cli-demo@dev init
|
|
161
161
|
```
|
|
162
162
|
|
|
163
163
|
Use `--force` only if you intentionally want your own existing files overwritten
|
|
@@ -68,10 +68,20 @@ const governor = new QualityGovernor(tier, {
|
|
|
68
68
|
sun.shadow.map?.dispose(); sun.shadow.map = null; // realloc at the new size
|
|
69
69
|
},
|
|
70
70
|
setDrawDistanceScale: (m) => (scene.fog!.far = baseFogFar * tier.drawDistanceScale * m),
|
|
71
|
+
setFrameCap: (fps) => (frameCap = fps), // 0/undefined-safe: tier.frameCap restores it
|
|
71
72
|
}, renderer);
|
|
72
73
|
|
|
73
|
-
// In the render loop, with the same performance.now() delta the loop already
|
|
74
|
-
governor
|
|
74
|
+
// In the render loop, with the same performance.now() delta the loop already
|
|
75
|
+
// computes. Wire ALL the callbacks — every omitted one is a governor rung
|
|
76
|
+
// that silently no-ops. The frame cap paces inside setAnimationLoop:
|
|
77
|
+
let frameCap = tier.frameCap, lastFrame = 0;
|
|
78
|
+
renderer.setAnimationLoop((t) => {
|
|
79
|
+
if (frameCap < 60 && t - lastFrame < 1000 / frameCap - 1) return; // skip: stable 30 > stuttery 45
|
|
80
|
+
const deltaMs = lastFrame ? t - lastFrame : 16;
|
|
81
|
+
lastFrame = t;
|
|
82
|
+
governor.frame(deltaMs);
|
|
83
|
+
// ...update + render
|
|
84
|
+
});
|
|
75
85
|
```
|
|
76
86
|
|
|
77
87
|
Sustained slow frames step down (DPR ×0.8 → post off → shadows reduced →
|
|
@@ -56,10 +56,19 @@ Getting this wrong produces silent no-ops or a session stuck ugly:
|
|
|
56
56
|
- **Load-time (fixed for the session once fetched):** asset rungs (skybox and
|
|
57
57
|
texture resolutions), model LOD sets. `pickAsset` decides them from the tier
|
|
58
58
|
at load; switching later means a re-fetch — treat as fixed.
|
|
59
|
+
- **Scene-build-fixed: the light COUNT.** Three.js bakes the number of lights
|
|
60
|
+
of each type into every lit material's shader program; add, remove, or hide
|
|
61
|
+
a light (or a group containing one) mid-play and ALL lit materials recompile
|
|
62
|
+
synchronously on that frame — a multi-second freeze that boot-time
|
|
63
|
+
`compileAsync` cannot pre-warm because each new count is a new shader. A
|
|
64
|
+
pilot game froze ~3 s on every pickup exactly this way (each collected
|
|
65
|
+
relic's group hid a child PointLight). Drive `intensity` to 0 instead;
|
|
66
|
+
change the population only on full level swaps.
|
|
59
67
|
- **Runtime-free (the governor's domain):** `setPixelRatio`, post passes on/off
|
|
60
68
|
and their target resolutions, shadow map size (realloc), draw distance and
|
|
61
69
|
fog, LOD bias, particle counts, mixer update rates, frame cap, remote-avatar
|
|
62
|
-
animation count.
|
|
70
|
+
animation count. Light `intensity` is runtime-free; light COUNT is not (see
|
|
71
|
+
above).
|
|
63
72
|
|
|
64
73
|
## Governor mechanics
|
|
65
74
|
|
|
@@ -101,6 +101,14 @@ kill-switch diagnostic.
|
|
|
101
101
|
## Rules
|
|
102
102
|
|
|
103
103
|
- Every light names its cause; a light nothing explains is a bug, not mood.
|
|
104
|
+
- **The light population is fixed at scene build — never add, remove, or hide
|
|
105
|
+
a light (or a group containing one) during play.** Three.js counts lights
|
|
106
|
+
into every lit material's shader; a changed count recompiles ALL of them
|
|
107
|
+
synchronously — a multi-second freeze on the exact frame a pickup, door, or
|
|
108
|
+
death "removes" a light (a real pilot game froze ~3 s per relic collected
|
|
109
|
+
this way). Turn a light off by driving `intensity` to 0 and leave it in the
|
|
110
|
+
graph; per-level swaps rebuild the whole scene anyway, which is the one
|
|
111
|
+
legitimate time the population changes.
|
|
104
112
|
- Couple a practical to its emitter: one color, one envelope, one on/off state.
|
|
105
113
|
- The key owns shadows; practicals cast none until a shot proves they must.
|
|
106
114
|
- Tune intensities only after the renderer baseline is locked — retuning the
|
|
@@ -38,7 +38,7 @@ update, so update immediately.)
|
|
|
38
38
|
Run exactly the command the nudge printed, from the game project root:
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
|
-
npm i -D @genex-ai/cli-demo@
|
|
41
|
+
npm i -D @genex-ai/cli-demo@dev # the genex CLI (a dev dependency)
|
|
42
42
|
npm i @genex-ai/embed-sdk@latest # identity/saves SDK (ships inside the game)
|
|
43
43
|
npm i @genex-ai/multiplayer@latest # multiplayer SDK (only if the game uses it)
|
|
44
44
|
```
|