@genex-ai/cli-demo 1.32.3 → 1.33.0-dev.684

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @genex-ai/cli-demo
2
2
 
3
- Set up your `~/.claude` workspace, authorize, create a game project, and publish.
3
+ Install the Genex skills into your project's agent workspaces, authorize, create a game project, and publish.
4
4
  This is the `cli` app of the [genex monorepo](../../README.md).
5
5
 
6
6
  ```bash
@@ -55,9 +55,11 @@ as the latest available snapshot.
55
55
  `genex init` does four things:
56
56
 
57
57
  1. **Installs the skills for your coding agents** — copies the bundled templates
58
- into every agent it detects: Claude Code (`~/.claude`, full set incl.
59
- agents/ + commands/), Codex (`~/.codex/skills`), and Cursor
60
- (`~/.cursor/skills`). genex-owned skills (`genex-*`) are **always refreshed**
58
+ PROJECT-LOCALLY into every agent workspace it detects: Claude Code
59
+ (`<project>/.claude`, full set incl. agents/ + commands/), Codex
60
+ (`<project>/.codex/skills`), and Cursor (`<project>/.cursor/skills`). The
61
+ CLI never writes agent state into your home directory — only the token and
62
+ caches live in `~/.genex`. genex-owned skills (`genex-*`) are **always refreshed**
61
63
  to the package version so a stale copy can't linger; your own files are never
62
64
  overwritten. After init, **every** `genex` command re-syncs them to the
63
65
  installed CLI version automatically (printing `🔄 Genex skills updated to
@@ -113,15 +115,19 @@ downloaded or committed:
113
115
  | Command | Provider | Prints (role) |
114
116
  | --- | --- | --- |
115
117
  | `genex model "<prompt>"` | Tripo | `…/generations/<id>/model-glb` |
118
+ | `genex character "<direction>"` | Meshy | a concept sheet, then a rigged character |
119
+ | `genex character import <file.glb>` | Uthana | a rigged character from your own mesh |
116
120
  | `genex sfx "<prompt>" [--duration <s>]` | ElevenLabs | `…/generations/<id>/audio-sfx` |
117
- | `genex texture "<prompt>" [--terrain]` | Gemini | `…/generations/<id>/texture-basecolor` |
118
- | `genex image "<prompt>" [--transparent] [--aspect <ratio>]` | fal.ai | `…/generations/<id>/image-main` |
119
- | `genex video "<prompt>" [--duration <s>] [--loop]` | fal.ai | `…/generations/<id>/video-mp4` |
121
+ | `genex music "<prompt>" [--duration <s>]` | ElevenLabs | `…/generations/<id>/audio-music` |
122
+ | `genex voice "<line>" [--voice <cast>]` | ElevenLabs | `…/generations/<id>/audio-voice` |
123
+ | `genex texture "<prompt>" [--terrain]` | Gemini (Nano Banana 2) | `…/generations/<id>/texture-basecolor` |
124
+ | `genex image "<prompt>" [--transparent] [--aspect <ratio>]` | fal.ai (GPT Image 2.5) | `…/generations/<id>/image-main` |
125
+ | `genex video "<prompt>" [--duration <s>] [--loop]` | fal.ai (MiniMax H3 family; Luma for `--loop`) | `…/generations/<id>/video-mp4` |
120
126
 
121
127
  `genex image` and `genex video` also power the game-UI pipeline (menus + HUD
122
128
  sprite sets — see the `genex-ai-menu` / `genex-ai-hud` skills):
123
129
 
124
- - **image** — `--quality <low|medium|high>` (provider quality preset),
130
+ - **image** — `--quality <low|medium|high|xhigh|max>` (GPT Image 2.5 quality tiers),
125
131
  `--size <WxH>` (exact pixel size, e.g. `2560x1440`), `--edit <url|file>`
126
132
  (edit an existing image with the prompt — a generated-asset URL or a LOCAL
127
133
  image file, inlined as a data URI up to ~4 MB: a user's reference
@@ -169,7 +175,7 @@ genex character finalize <preview-id> --user-approved --approve-remesh 10000
169
175
 
170
176
  The first command produces exactly three full-body neutral-A-pose concept
171
177
  images and a contact sheet, then stops. The second converts only the selected
172
- image into an unremeshed, textured Meshy 6 high-detail GLB, preserves it in R2,
178
+ image into an unremeshed, textured Meshy 7 high-detail GLB, preserves it in R2,
173
179
  and returns front/back/left/right views plus its measured face count. The final
174
180
  command requires another explicit approval, creates a separate 10,000-face
175
181
  triangle remesh, rigs that exact remesh, and installs the immutable
@@ -403,7 +409,7 @@ src/
403
409
  env.ts read/modify/write .env safely
404
410
  auth.ts loopback server + browser opener
405
411
  utils/ logger + colors (zero runtime deps)
406
- templates/ copied into ~/.claude by `genex init`
412
+ templates/ copied into the project's agent workspaces (.claude, .codex/skills, .cursor/skills) by `genex init`
407
413
  ```
408
414
 
409
415
  ## Publishing
@@ -7,10 +7,10 @@ import {
7
7
  isRenderMode,
8
8
  sceneSummary,
9
9
  sheetOf
10
- } from "./chunk-OJAXYQ5L.js";
10
+ } from "./chunk-2COG4P3T.js";
11
11
  import {
12
12
  getCliVersion
13
- } from "./chunk-5FA2WLM7.js";
13
+ } from "./chunk-HYCSNWYX.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-5FA2WLM7.js";
4
+ } from "./chunk-HYCSNWYX.js";
5
5
 
6
6
  // src/lib/blender-serve.ts
7
7
  import { spawn } from "child_process";
@@ -7,7 +7,7 @@ import {
7
7
  getAuthUrl,
8
8
  getCliVersion,
9
9
  getGenexEnvPath
10
- } from "./chunk-5FA2WLM7.js";
10
+ } from "./chunk-HYCSNWYX.js";
11
11
 
12
12
  // src/lib/terms.ts
13
13
  import readline from "readline";
@@ -3,7 +3,7 @@ import fs from "fs";
3
3
  import os from "os";
4
4
  import path from "path";
5
5
  import { fileURLToPath } from "url";
6
- var RAW_CHANNEL = "latest";
6
+ var RAW_CHANNEL = "dev";
7
7
  var CLI_CHANNEL = RAW_CHANNEL === "dev" ? "dev" : "latest";
8
8
  var STANDS = {
9
9
  prod: { api: "https://api.genex.games", dashboard: "https://genex.games" },
package/dist/index.js CHANGED
@@ -42,7 +42,7 @@ import {
42
42
  writeProject,
43
43
  writeUserToken,
44
44
  writeWorkspace
45
- } from "./chunk-OJAXYQ5L.js";
45
+ } from "./chunk-2COG4P3T.js";
46
46
  import {
47
47
  CLI_CHANNEL,
48
48
  DEFAULT_API_URL,
@@ -59,7 +59,7 @@ import {
59
59
  getGenexEnvPath,
60
60
  getTemplatesDir,
61
61
  resolveAgentTargets
62
- } from "./chunk-5FA2WLM7.js";
62
+ } from "./chunk-HYCSNWYX.js";
63
63
 
64
64
  // src/instrument.ts
65
65
  import * as Sentry from "@sentry/node";
@@ -8489,6 +8489,7 @@ function buildGenOptions(kind, opts) {
8489
8489
  }
8490
8490
  if (kind === "texture" && opts.terrain) options.terrain = true;
8491
8491
  if ((kind === "sfx" || kind === "music") && opts.duration) options.durationSeconds = opts.duration;
8492
+ if (kind === "sfx" && opts.loop) options.loop = true;
8492
8493
  if (kind === "voice") {
8493
8494
  if (opts.voice) options.voice = opts.voice;
8494
8495
  if (opts.voiceId) options.voiceId = opts.voiceId;
@@ -22296,7 +22297,7 @@ async function runBlender(opts) {
22296
22297
  return 1;
22297
22298
  }
22298
22299
  if (sub === "serve") {
22299
- const { serveLocalBlender } = await import("./blender-serve-PVVCH3S6.js");
22300
+ const { serveLocalBlender } = await import("./blender-serve-BF4FZ55Z.js");
22300
22301
  const port = Number(process.env.GENEX_BLENDER_PORT ?? 8088);
22301
22302
  log.step(`Starting a local Blender service on port ${port}`);
22302
22303
  log.plain(
@@ -22305,7 +22306,7 @@ async function runBlender(opts) {
22305
22306
  return serveLocalBlender({ port, log });
22306
22307
  }
22307
22308
  if (sub === "mcp") {
22308
- const { runBlenderMcp } = await import("./blender-mcp-X66ZZ4TN.js");
22309
+ const { runBlenderMcp } = await import("./blender-mcp-Q6PSFYSE.js");
22309
22310
  return runBlenderMcp();
22310
22311
  }
22311
22312
  if (sub === "seat") {
@@ -23203,7 +23204,7 @@ import path34 from "path";
23203
23204
  var BUDGET_SOURCE_LINE = "Live from your account; prices can change without a deploy.";
23204
23205
  var BUDGET_APPROVAL_REQUIRED = "STOP: raising the asset allowance requires the player's explicit approval. Re-run with --user-approved only after they agreed to the number.";
23205
23206
  function internalKind(kind) {
23206
- return kind === "agent_session" || kind === "blender_seat" || kind === "avatar_look" || kind.startsWith("outfit") || kind.startsWith("cover_");
23207
+ return kind === "agent_session" || kind === "blender_seat" || kind === "avatar_look" || kind.startsWith("cover_");
23207
23208
  }
23208
23209
  async function isGenexProject(cwd) {
23209
23210
  try {
@@ -23359,9 +23360,10 @@ async function runBudget(opts = {}) {
23359
23360
  var TYPICAL_CREDITS = {
23360
23361
  model: 35,
23361
23362
  // 46 from a reference image; --texture standard 23, --no-texture 12, --geometry detailed 58, --quad 41, --low-poly 46, --parts 58 quote off the estimate
23362
- image: 4,
23363
- // gpt-image-2 tiers (--transparent, --quality high, --edit, 4K) quote higher
23364
- texture: 5,
23363
+ image: 7,
23364
+ // GPT Image 2.5 at high, the default; --quality xhigh/max, --candidates, --edit and 4K quote higher, --quality low/medium and --transparent quote lower
23365
+ texture: 9,
23366
+ // gemini-3.1-flash-image, 1K square
23365
23367
  sfx: 2,
23366
23368
  music: 27,
23367
23369
  // 90 s; up to 87 for a 300 s track
@@ -23635,7 +23637,8 @@ ${c.bold("Options for the generators (`model` `sfx` `music` `voice` `texture` `i
23635
23637
  --open (image/video) open the finished asset in the user's browser +
23636
23638
  print a link \u2014 show them the concept frame / anything they approve.
23637
23639
  --aspect <ratio> (image) aspect preset (e.g. square, landscape, portrait).
23638
- --quality <q> (image) quality preset: low | medium | high.
23640
+ --quality <q> (image) quality preset: low | medium | high | xhigh | max
23641
+ (xhigh and max: hero art \u2014 slower and dearer).
23639
23642
  --candidates <n> (image) generate 2-4 variants in ONE call and print every
23640
23643
  URL \u2014 pick the best instead of re-rolling. Needs
23641
23644
  --quality or --size; not with --remove-bg/--transparent.
@@ -23655,7 +23658,8 @@ ${c.bold("Options for the generators (`model` `sfx` `music` `voice` `texture` `i
23655
23658
  --remove-bg (image) chain ML background removal after the gen/edit.
23656
23659
  --bg-mode <mode> (image) background-removal model: sprite | glyph | sheet |
23657
23660
  matte (BiRefNet soft alpha \u2014 hair/glow/smoke edges).
23658
- --loop (video) generate a seamless loop.
23661
+ --loop (video) generate a seamless loop; (sfx) an ambient bed
23662
+ generated to close on itself, for setLoop(true).
23659
23663
  --resolution <r> (video) 480p | 768p | 2k | 4k (default 768p \u2014 the top
23660
23664
  native mode; 2k/4k are upscales of the same base and
23661
23665
  cost more; 480p is the cost opt-down; loop clips ignore
@@ -23984,7 +23988,7 @@ resumes it without creating another project. Existing source credits/licenses re
23984
23988
  Use the dev CLI channel for dev.genex.games links. After setup, work in the returned
23985
23989
  folder and follow the user's request to decide what to reuse, change or replace.
23986
23990
  `,
23987
- video: `${c.bold("genex video")} \u2014 generate a video clip (mp4, MiniMax H3 Max \u2014 the flagship; plain H3 for seamless loops and 2k/4k; native stereo audio on every non-loop clip).
23991
+ video: `${c.bold("genex video")} \u2014 generate a video clip (mp4, MiniMax H3 Max Turbo by default; H3 Max for --ref; plain H3 for seamless loops and 2k/4k; native stereo audio on every non-loop clip).
23988
23992
 
23989
23993
  ${c.bold("Modes")}
23990
23994
  genex video "<prompt>" text-to-video (16:9).
@@ -24595,8 +24599,8 @@ function applyValueFlag(options, flag, value) {
24595
24599
  options.aspect = value;
24596
24600
  break;
24597
24601
  case "--quality":
24598
- if (!["low", "medium", "high"].includes(value)) {
24599
- throw new Error(`Invalid --quality value: ${value} (expected low|medium|high)`);
24602
+ if (!["low", "medium", "high", "xhigh", "max"].includes(value)) {
24603
+ throw new Error(`Invalid --quality value: ${value} (expected low|medium|high|xhigh|max)`);
24600
24604
  }
24601
24605
  options.quality = value;
24602
24606
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genex-ai/cli-demo",
3
- "version": "1.32.3",
3
+ "version": "1.33.0-dev.684",
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": {
@@ -272,8 +272,8 @@ to the same standard.
272
272
  # Stage 1 — the HUD mockup: this game's full HUD over its own scene.
273
273
  # TEXT-described; add `--edit <url-or-local-file>` to anchor it to an
274
274
  # existing reference image so the HUD inherits its exact style.
275
- # ONE mockup; save its URL:
276
- npx genex image "<filled stage-1 prompt>" --size 2560x1440 --quality high
275
+ # ONE mockup; save its URL (xhigh: the mockup is the reference every sprite is cut from):
276
+ npx genex image "<filled stage-1 prompt>" --size 2560x1440 --quality xhigh
277
277
 
278
278
  # Stage 2 — deconstruct the mockup into an asset sheet on white:
279
279
  npx genex image "<filled stage-2 prompt>" --edit <mockup-url> --quality high
@@ -311,7 +311,7 @@ you verify the final HUD against.
311
311
  To fix ONE sprite, don't re-run the pipeline:
312
312
 
313
313
  - **Regenerate it** in the house style:
314
- `npx genex image "<style brief + sprite subject>" --quality medium --remove-bg`
314
+ `npx genex image "<style brief + sprite subject>" --quality high --remove-bg`
315
315
  — add `--bg-mode glyph` for digits and closed shapes (an `8` or `$` otherwise
316
316
  comes back with its loops hollowed out). Use the mandatory cutout sentence.
317
317
  - **Or region-edit the sheet**: `npx genex image "<targeted change>" --edit <sheet-url>`
@@ -336,7 +336,7 @@ To fix ONE sprite, don't re-run the pipeline:
336
336
  whitespace between the STACKED meter cells specifically (measured on a
337
337
  live run: the tools hard-refuse the resulting neighbor-in-crop defect, so
338
338
  spacing up front saves a sheet re-roll).
339
- - **gpt-image-2 silently squashes past 3:1** — never request a canvas with
339
+ - **GPT Image 2.5 silently squashes past 3:1** — never request a canvas with
340
340
  aspect beyond 3:1. For thin strips (a wide bar frame), generate inside a
341
341
  ≤3:1 canvas with margins, then `genex ui trim` down to the art.
342
342
  - **Fix-up recrop, never a Stage-2 re-run for one sprite.** One bad crop:
@@ -654,8 +654,9 @@ stages land, and never sit in a foreground wait.
654
654
  ## Options
655
655
 
656
656
  - `npx genex image` — `--size <WxH>` exact pixels (multiples of 16, each side
657
- ≤ 3840, aspect at most 3:1); `--quality <low|medium|high>` (high for the
658
- mockup/sheet, medium for single sprites); `--candidates <2|3|4>` several
657
+ ≤ 3840, aspect at most 3:1); `--quality <low|medium|high|xhigh|max>` (xhigh for
658
+ the stage-1 mockup, high for the stage-2 sheet and for single sprites; max is
659
+ a hero-art tier the HUD pipeline does not need); `--candidates <2|3|4>` several
659
660
  variants in ONE call (one mockup is the default; use candidates when the
660
661
  player asks for variants or you genuinely want options to judge); `--edit <url|file>` image-to-image edit of an
661
662
  R2 URL or a local image file (≤4 MB, inlined); `--clean <url>`
@@ -1,7 +1,7 @@
1
1
  # Stage 1 prompt template — the full-HUD mockup
2
2
 
3
3
  Fill the placeholders, then pass the whole text as the prompt to
4
- `npx genex image "<filled prompt>" --size 2560x1440 --quality high`.
4
+ `npx genex image "<filled prompt>" --size 2560x1440 --quality xhigh`.
5
5
  One mockup is the default; generate candidate variants when the player asks
6
6
  for them or you genuinely want options to judge. Every
7
7
  sprite the HUD ships is cut out of this frame, so the scene half deserves the
@@ -209,7 +209,9 @@ See `$genex-threejs-multiplayer` for the `shared` channel rules and the room API
209
209
  generation and that is billed per image, so generate candidates with
210
210
  `--quality`/`--size`, pick one, then cut it with `--clean <url>`.
211
211
  - `--aspect <ratio>` — image shape (e.g. `square`, `16:9`, `9:16`); default is square.
212
- - `--quality <low|medium|high>` — quality preset; higher costs more and takes longer.
212
+ - `--quality <low|medium|high|xhigh|max>` — GPT Image 2.5 quality preset; higher
213
+ costs more and takes longer. `xhigh` and `max` are for hero art (a title
214
+ wordmark, a key-art backdrop), not for sprites and icons.
213
215
  - `--size <WxH>` — exact pixel size (multiples of 16, each side ≤ 3840, aspect ≤ 3:1).
214
216
  - `--edit <url>` — edit THAT generated image with the prompt (image-to-image).
215
217
  - `--inpaint <mask.png|url>` — with `--edit`: a region mask (local PNG or
@@ -37,7 +37,9 @@ hard rules for the frame prompt:
37
37
 
38
38
  - **Full-bleed cinematic 16:9.** The frame is a filmic establishing shot,
39
39
  edge to edge. End the prompt with: `Edge-to-edge cinematic composition.
40
- Full-bleed 16:9 frame. No UI elements, no text, no buttons in the frame.`
40
+ Full-bleed 16:9 frame. The frame is pure scenery: no UI elements, no text,
41
+ no buttons in the frame.` Ask for `--quality xhigh`: a still the player
42
+ stares at every time the menu opens earns the top tier.
41
43
  - **NO UI in the frame — ever.** No buttons, no title text, no logos, no
42
44
  menus baked into the image. All of that is DOM on top. If the image model
43
45
  draws UI into the frame, the prompt was wrong — rewrite and regenerate.
@@ -123,7 +125,7 @@ references/style-capsules.md) — a lean, not a rule.
123
125
  # If the menu should match an image that already exists, add --edit <url> so
124
126
  # the two share one palette and light. The still stays UI-free — an image
125
127
  # with interface in it is never the video frame:
126
- npx genex image "windswept alpine meadow at golden hour, wildflowers leaning in the gusts, painterly light, cinematic wide shot. Edge-to-edge cinematic composition. Full-bleed 16:9 frame. No UI elements, no text, no buttons in the frame." --aspect 16:9 --quality high
128
+ npx genex image "windswept alpine meadow at golden hour, wildflowers leaning in the gusts, painterly light, cinematic wide shot. Edge-to-edge cinematic composition. Full-bleed 16:9 frame. The frame is pure scenery: no UI elements, no text, no buttons in the frame." --aspect 16:9 --quality xhigh
127
129
  # -> https://assets.genex.technology/generations/<id>/image-main
128
130
 
129
131
  # 2. Animate it into a seamless loop (same image as first AND last frame).
@@ -42,14 +42,19 @@ dev, published game, and remixes alike).
42
42
 
43
43
  ## Prompt recipe for loopable game music
44
44
 
45
- Mood + instrumentation + energy + loop wording:
45
+ Genre + mood + instrumentation + tempo + loop wording:
46
46
 
47
47
  - Name the game's emotional register and 2–3 instruments ("brooding synthwave,
48
48
  analog pads and arpeggio", "cozy acoustic folk, fingerpicked guitar and soft
49
49
  strings").
50
+ - Give it a tempo, and a key when the mood needs one ("96 BPM, in D minor"):
51
+ the model reads musical terms as exactly as words, and a stated tempo holds
52
+ every bar of a loop at the same pace. Keep the whole prompt short; more
53
+ adjectives do not buy a better track.
50
54
  - Always end with: **"seamless loop, consistent energy, no intro, no outro"** —
51
- there is no API loop flag; consistent energy at both ends is what makes
52
- `setLoop(true)` inaudible. A track with a big intro pops every cycle.
55
+ the music API has no loop flag (the sfx lane does; music is prompt-shaped);
56
+ consistent energy at both ends is what makes `setLoop(true)` inaudible. A
57
+ track with a big intro pops every cycle.
53
58
  - Don't ask for vocals — the lane forces instrumental regardless.
54
59
 
55
60
  ## Wire it in Three.js
@@ -15,6 +15,13 @@ npx genex sfx "punchy laser zap, short and dry" --duration 2
15
15
  ```
16
16
 
17
17
  `--duration <sec>` (0.5–22) sets a target length; omit it to let the model pick.
18
+ Describe ONE sound, concretely, in the vendor's own vocabulary where it fits:
19
+ "impact" for a hit, "whoosh" for movement through air, "ambience" for a room
20
+ or weather bed, "drone" for a continuous suspense texture. A sequence is
21
+ written in order: "footsteps on gravel, then a metal door opens".
22
+ For an ambient bed the game will play on repeat (rain, a crowd, a machine
23
+ hum), pass `--loop`: the clip is generated to close on itself, so
24
+ `setLoop(true)` has no pop at the wrap. Never on a one-shot.
18
25
  Blocks until ready, then prints its public URL:
19
26
 
20
27
  ```
@@ -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@latest init` first (it writes your `GENEX_TOKEN`).
228
+ - **"Not authorized"** — run `npx genex init` first (in the project — it resolves this project's own CLI; 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
@@ -203,7 +203,7 @@ evidence detective game, a video-book. The pattern that makes it hold together:
203
203
 
204
204
  ## Troubleshooting
205
205
 
206
- - **"Not authorized"** — run `npx @genex-ai/cli-demo@latest init` first (it writes your `GENEX_TOKEN`).
206
+ - **"Not authorized"** — run `npx genex init` first (in the project — it resolves this project's own CLI; it writes your `GENEX_TOKEN`).
207
207
  - **"Prompt rejected"** — the provider's content-safety filter blocked the prompt.
208
208
  This is non-retryable; retrying the same wording fails again. Rewrite the prompt.
209
209
  The measured false-positive class is anatomy being pierced or entered
@@ -58,8 +58,11 @@ voice id (overrides `--voice`) — for when the user has a specific voice in
58
58
  mind. The cast covers the normal cases; don't browse ids speculatively.
59
59
 
60
60
  Pick ONE voice per character and stay with it — a guard who changes voice
61
- between barks breaks the character. The model is multilingual: text in the
62
- game's language comes back spoken in that language.
61
+ between barks breaks the character. The model (ElevenLabs v3) is multilingual:
62
+ text in the game's language comes back spoken in that language. It also reads
63
+ stage directions in square brackets and punctuation for pacing: `[whispers]
64
+ Stay close.`, `[sighs] Not again...`, an ellipsis for a pause, CAPITALS for
65
+ emphasis. Use them sparingly; a bark rarely needs more than one.
63
66
 
64
67
  ## Limits
65
68
 
@@ -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
@@ -15,7 +15,11 @@ npx genex sfx "heavy wooden door creaking open" --duration 3
15
15
  ```
16
16
 
17
17
  `--duration <sec>` targets a clip length; leave it off and the model decides.
18
- Generate each sound separately — one prompt, one sound.
18
+ Generate each sound separately — one prompt, one sound, in the vendor's own
19
+ vocabulary where it fits ("impact", "whoosh", "ambience", "drone"); a sequence
20
+ is written in order ("footsteps on gravel, then a metal door opens"). For an
21
+ ambient bed the game plays on repeat, add `--loop`: the clip is generated to
22
+ close on itself, so it wraps without a pop.
19
23
 
20
24
  ## Music
21
25
 
@@ -34,7 +34,7 @@ Wire the **local path**. The URL is provenance — never fetch it at runtime.
34
34
  - `--bg-mode <sprite|glyph|sheet|matte>` — which removal model. `matte` gives soft alpha for hair, glow and smoke edges.
35
35
  - `--clean <url>` — remove the background of an existing image, no generation.
36
36
  - `--upscale <url>` — 2× an existing image.
37
- - `--aspect <ratio>` · `--size <WxH>` · `--quality <low|medium|high>` — framing and fidelity.
37
+ - `--aspect <ratio>` · `--size <WxH>` · `--quality <low|medium|high|xhigh|max>` — framing and fidelity (GPT Image 2.5 tiers; `xhigh` and `max` are for hero art and cost the most).
38
38
  - `--candidates <2-4>` — several variants in ONE call, so you pick instead of re-rolling. Needs `--quality` or `--size`.
39
39
  - `--open` — also open it in a browser, for something the user must look at and approve.
40
40
  - `--out-dir <dir>` — where the file lands (default `./assets`).
@@ -43,10 +43,11 @@ Wire the **local path**. The URL is provenance — never fetch it at runtime.
43
43
 
44
44
  ## Cost
45
45
 
46
- From **4 credits** per image at default quality (1 credit = $0.01);
47
- `--transparent`, `--quality high`, `--edit` and 4K canvases cost more, and
48
- `--candidates` bills per variant - the command prints the exact quote. Live
49
- prices and your balance: `npx genex doctor`.
46
+ From **7 credits** per image at the default high quality (1 credit = $0.01);
47
+ `--quality xhigh`, `--quality max` and 4K canvases cost more, `--quality low`,
48
+ `--quality medium` and `--transparent` cost less, and `--candidates` bills per
49
+ variant - the command prints the exact quote. Live prices and your balance:
50
+ `npx genex doctor`.
50
51
 
51
52
  ## Waiting
52
53
 
@@ -59,4 +60,4 @@ prices and your balance: `npx genex doctor`.
59
60
  - **Out of credits** — the error prints your balance, the price, and when credits refill. Say that plainly to the user; don't retry.
60
61
  - **"Email not verified"** — the printed link unlocks the free credits; generation works right after.
61
62
  - **Anything else** — `npx genex doctor` reports sign-in, credits, and whether the image lane is live on this account.
62
- - A prompt that keeps producing the wrong thing is a prompt problem, not a lane problem — name the subject, the medium and the framing concretely ("vintage travel poster, screen-printed, three flat colours"), rather than adding adjectives.
63
+ - A prompt that keeps producing the wrong thing is a prompt problem, not a lane problem — name the subject, the medium and the framing concretely ("vintage travel poster, screen-printed, three flat colours"), rather than adding adjectives. Put the subject first and say what you want, never what to leave out: the image model reads the opening words hardest and does not take negative prompts.
@@ -39,7 +39,7 @@ repeat — the file names carry the role, so the mapping is unambiguous.
39
39
 
40
40
  ## Cost
41
41
 
42
- From **5 credits** for the whole set (1 credit = $0.01). Live prices and
42
+ From **9 credits** for the whole set (1 credit = $0.01). Live prices and
43
43
  your balance: `npx genex doctor`.
44
44
 
45
45
  ## Waiting
@@ -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
  ```