@genex-ai/cli-demo 1.34.8 → 1.34.9-dev.724

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.
@@ -7,10 +7,10 @@ import {
7
7
  isRenderMode,
8
8
  sceneSummary,
9
9
  sheetOf
10
- } from "./chunk-5WBSWMH5.js";
10
+ } from "./chunk-FYHYZYBC.js";
11
11
  import {
12
12
  getCliVersion
13
- } from "./chunk-QI7FIYBY.js";
13
+ } from "./chunk-K4EHXOZK.js";
14
14
 
15
15
  // src/commands/blender-mcp.ts
16
16
  import fs from "fs/promises";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  c,
3
3
  getTemplatesDir
4
- } from "./chunk-QI7FIYBY.js";
4
+ } from "./chunk-K4EHXOZK.js";
5
5
 
6
6
  // src/lib/blender-serve.ts
7
7
  import { spawn } from "child_process";
@@ -10,7 +10,7 @@ import {
10
10
  getGenexEnvPath,
11
11
  normalizeApiOrigin,
12
12
  originKey
13
- } from "./chunk-QI7FIYBY.js";
13
+ } from "./chunk-K4EHXOZK.js";
14
14
 
15
15
  // src/lib/terms.ts
16
16
  import readline from "readline";
@@ -38,7 +38,7 @@ import fs from "fs";
38
38
  import os from "os";
39
39
  import path from "path";
40
40
  import { fileURLToPath } from "url";
41
- var RAW_CHANNEL = "latest";
41
+ var RAW_CHANNEL = "dev";
42
42
  var CLI_CHANNEL = RAW_CHANNEL === "dev" ? "dev" : "latest";
43
43
  var STANDS = {
44
44
  prod: { api: "https://api.genex.games", dashboard: "https://genex.games" },
package/dist/index.js CHANGED
@@ -42,7 +42,7 @@ import {
42
42
  writeSecretFile,
43
43
  writeUserToken,
44
44
  writeWorkspace
45
- } from "./chunk-5WBSWMH5.js";
45
+ } from "./chunk-FYHYZYBC.js";
46
46
  import {
47
47
  CLI_CHANNEL,
48
48
  DEFAULT_API_URL,
@@ -63,7 +63,7 @@ import {
63
63
  normalizeApiOrigin,
64
64
  originKey,
65
65
  resolveAgentTargets
66
- } from "./chunk-QI7FIYBY.js";
66
+ } from "./chunk-K4EHXOZK.js";
67
67
 
68
68
  // src/instrument.ts
69
69
  import * as Sentry from "@sentry/node";
@@ -22758,7 +22758,7 @@ async function runBlender(opts) {
22758
22758
  return 1;
22759
22759
  }
22760
22760
  if (sub === "serve") {
22761
- const { serveLocalBlender } = await import("./blender-serve-66OHC4ML.js");
22761
+ const { serveLocalBlender } = await import("./blender-serve-EH2MOW3U.js");
22762
22762
  const port = Number(process.env.GENEX_BLENDER_PORT ?? 8088);
22763
22763
  log.step(`Starting a local Blender service on port ${port}`);
22764
22764
  log.plain(
@@ -22767,7 +22767,7 @@ async function runBlender(opts) {
22767
22767
  return serveLocalBlender({ port, log });
22768
22768
  }
22769
22769
  if (sub === "mcp") {
22770
- const { runBlenderMcp } = await import("./blender-mcp-6TEAE65U.js");
22770
+ const { runBlenderMcp } = await import("./blender-mcp-HKT7N5BQ.js");
22771
22771
  return runBlenderMcp();
22772
22772
  }
22773
22773
  if (sub === "seat") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genex-ai/cli-demo",
3
- "version": "1.34.8",
3
+ "version": "1.34.9-dev.724",
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": {
@@ -161,7 +161,7 @@ downloads the game too, binary assets and all:
161
161
 
162
162
  ```bash
163
163
  mkdir my-game && cd my-game
164
- npx @genex-ai/cli-demo@latest link <slug> # slug = the name in the play URL
164
+ npx @genex-ai/cli-demo@dev link <slug> # slug = the name in the play URL
165
165
  npm install
166
166
  ```
167
167
 
@@ -225,7 +225,7 @@ Safe to run any time — genex-owned skills are refreshed to the latest version,
225
225
  and your own files are never touched:
226
226
 
227
227
  ```bash
228
- npx @genex-ai/cli-demo@latest init
228
+ npx @genex-ai/cli-demo@dev init
229
229
  ```
230
230
 
231
231
  Use `--force` only if you intentionally want your own existing files overwritten
@@ -130,13 +130,13 @@ Durable state + leaderboards (all six are safe to call from boot — they wait
130
130
  for identity internally, never throw for guests, and reject only when the
131
131
  session is blocked):
132
132
 
133
- - `loadPlayerState()` → `Promise<{ data, version, guest? }>` — THIS player's
134
- own save (per-player, per-game; other players can never read or overwrite
135
- it). `{ data: null, version: 0 }` when they never saved.
133
+ - `loadPlayerState()` → `Promise<{ data, version, guest?, staging? }>` — THIS
134
+ player's own save (per-player, per-game; other players can never read or
135
+ overwrite it). `{ data: null, version: 0 }` when they never saved.
136
136
  - `savePlayerState(data, { ifVersion? }?)` → `Promise<{ saved, version?,
137
- conflict?, guest?, queued? }>` — save any JSON ≤ 256KB to their slot. For
138
- guests the value is QUEUED in memory and auto-flushed if they sign in
139
- mid-game — no extra code. Small saves survive tab close automatically.
137
+ conflict?, guest?, queued?, staging? }>` — save any JSON ≤ 256KB to their
138
+ slot. For guests the value is QUEUED in memory and auto-flushed if they sign
139
+ in mid-game — no extra code. Small saves survive tab close automatically.
140
140
  - `loadWorldState()` / `saveWorldState(data, { ifVersion? }?)` — the game's
141
141
  ONE shared world slot (≤ 1MB, every player reads/writes the same blob) —
142
142
  level layouts, persistent-world object positions. Multiplayer games: only
@@ -156,6 +156,17 @@ Server write limits (per player, per minute): **60 player-saves, 120
156
156
  world-saves, 30 score submits**. A debounced ~1/sec checkpoint never gets near
157
157
  them — only a save-per-frame loop does (it surfaces as HTTP 429).
158
158
 
159
+ **The preview channel has no server saves.** The owner's draft workspace and
160
+ every `preview--<slug>` URL play the STAGING build, and the API refuses loads
161
+ and saves there by design (a staging build with a changed save schema must
162
+ never overwrite the save of the game people are playing). The helpers resolve
163
+ `{ staging: true }` — `loadPlayerState()` → `{ data: null, version: 0,
164
+ staging: true }`, `savePlayerState()` → `{ saved: false, staging: true }` —
165
+ and never throw or fire `"error"` for it. Keep a localStorage fallback for
166
+ progress, and if the game says anything about it, say "Preview build —
167
+ progress isn't saved to your account". Never "offline" or "unavailable": the
168
+ owner is testing their own game, and Genex is up.
169
+
159
170
 
160
171
  ## Saving progress (per-player — every player has their own slot)
161
172
 
@@ -166,7 +177,8 @@ inventory, unlocks — anything about ONE player — goes in their player slot:
166
177
  import { loadPlayerState, savePlayerState } from "@genex-ai/embed-sdk";
167
178
 
168
179
  // boot: load whatever this player saved last time (fine for guests — resolves
169
- // { data: null, guest: true } instead of failing)
180
+ // { data: null, guest: true } and on the preview channel — { data: null,
181
+ // staging: true } — instead of failing)
170
182
  const { data } = await loadPlayerState();
171
183
  applyProgress(data ?? defaultProgress());
172
184
 
@@ -348,6 +360,10 @@ Rules:
348
360
  header (401), a guest token (403 `guest_no_save`), or the token belongs to a
349
361
  different game (403). All three mean the code bypassed the SDK helpers —
350
362
  switch to `savePlayerState`/`saveWorldState`, which handle every case.
363
+ - **Saves/loads resolve `{ staging: true }`** — the build is on the preview
364
+ channel (the draft workspace, `preview--<slug>`), where server saves are off
365
+ by design. Not an outage: keep the localStorage fallback and tell the player
366
+ "Preview build — progress isn't saved to your account", never "offline".
351
367
  - **Saves or score submits return 429** — writing too often (per-player limits:
352
368
  60 player-saves/min, 120 world-saves/min, 30 score submits/min). Debounce to
353
369
  ~1 write/sec at checkpoints and never save in the render loop; back off a
@@ -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@latest # the genex CLI (a dev dependency)
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
  ```