@genex-ai/cli-demo 0.81.0-dev.214 → 0.85.0-dev.216
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 +9 -7
- package/dist/index.js +2623 -1684
- package/package.json +1 -1
- package/templates/controllers/character/first-person.ts +54 -0
- package/templates/controllers/character/follow-camera.ts +35 -1
- package/templates/skills/genex-ai-character/SKILL.md +25 -5
- package/templates/skills/genex-ai-hud/SKILL.md +175 -63
- package/templates/skills/genex-ai-hud/references/masked-fill.md +19 -13
- package/templates/skills/genex-ai-hud/references/stage1-prompt-template.md +42 -5
- package/templates/skills/genex-ai-hud/references/stage2-prompt-template.md +7 -3
- package/templates/skills/genex-ai-image/SKILL.md +40 -2
- package/templates/skills/genex-ai-menu/SKILL.md +47 -22
- package/templates/skills/genex-ai-model/SKILL.md +8 -0
- package/templates/skills/genex-ai-music/SKILL.md +142 -0
- package/templates/skills/genex-ai-skybox/SKILL.md +21 -5
- package/templates/skills/genex-ai-video/SKILL.md +13 -7
- package/templates/skills/genex-ai-voice/SKILL.md +151 -0
- package/templates/skills/genex-game-director/SKILL.md +183 -58
- package/templates/skills/genex-game-director/references/design-contract.md +40 -10
- package/templates/skills/genex-game-director/references/routing-map.md +44 -29
- package/templates/skills/genex-threejs-camera-direction/SKILL.md +4 -1
- package/templates/skills/genex-threejs-character-controller/SKILL.md +25 -1
- package/templates/skills/genex-threejs-character-controller/references/wiring.md +13 -2
- package/templates/skills/genex-threejs-creatures/SKILL.md +201 -0
- package/templates/skills/genex-threejs-game-ui/SKILL.md +79 -71
- package/templates/skills/genex-threejs-multiplayer/SKILL.md +6 -1
- package/templates/skills/genex-threejs-visual-validation/SKILL.md +9 -4
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: genex-ai-voice
|
|
3
|
+
description: Generate a short spoken voice line (mp3) from text with `npx genex voice` — NPC barks, narrator beats, tutorial VO, announcer calls — picking a voice from the curated cast (`--voice narrator|heroine|gruff|elder|robot|imp`) or any raw ElevenLabs voice id (`--voice-id`). Billed per character, hard-capped at 1000 chars per line. Voice lines are content — keep them short, subtitled, and skippable.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Genex AI · Voice
|
|
7
|
+
|
|
8
|
+
Turn a line of text into a real spoken **mp3** and play it in the game. A
|
|
9
|
+
guard that actually says "Halt! Who goes there?", a narrator that opens the
|
|
10
|
+
run, a tutorial voice over the first jump — one or two spoken lines move a
|
|
11
|
+
game from "asset flip" to "authored" faster than almost any other audio spend.
|
|
12
|
+
|
|
13
|
+
## When to use this vs. music / sfx
|
|
14
|
+
|
|
15
|
+
- **Use `npx genex voice`** for SPEECH: NPC barks, narrator lines, tutorial
|
|
16
|
+
VO, announcer calls, boss taunts. The text you pass IS what gets spoken —
|
|
17
|
+
write the line, not a description of it.
|
|
18
|
+
- **Use `$genex-ai-music`** for the continuous instrumental bed and
|
|
19
|
+
**`$genex-ai-sfx`** for event sounds — impacts, pickups, UI ticks. A
|
|
20
|
+
scream, grunt, or monster roar is an SFX (describe it), not a voice line.
|
|
21
|
+
|
|
22
|
+
**Voice lines are content, not chrome: keep them SHORT, show a SUBTITLE for
|
|
23
|
+
every line, and let the player skip or interrupt.** A game that talks over
|
|
24
|
+
itself un-skippably reads worse than a silent one.
|
|
25
|
+
|
|
26
|
+
## Run
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npx genex voice "Halt! Who goes there?" --voice gruff
|
|
30
|
+
npx genex voice "Level up! New ability unlocked." --voice robot --no-wait
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Prints:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
https://assets.genex.technology/generations/<id>/audio-voice
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The mp3 lives in Genex storage (R2) and loads straight from that URL — you
|
|
40
|
+
don't download it and nothing is committed to your repo. The URL is permanent
|
|
41
|
+
(local dev, published game, and remixes alike).
|
|
42
|
+
|
|
43
|
+
## The cast
|
|
44
|
+
|
|
45
|
+
Six curated archetypes — pick by gameplay role, not by auditioning ids:
|
|
46
|
+
|
|
47
|
+
| `--voice` | Reads as | Use for |
|
|
48
|
+
| --- | --- | --- |
|
|
49
|
+
| `narrator` (default) | warm storyteller | intros, quest text, tutorials |
|
|
50
|
+
| `heroine` | confident young female lead | player character, guide |
|
|
51
|
+
| `gruff` | fierce warrior | guards, bosses, drill sergeants |
|
|
52
|
+
| `elder` | wise old mentor | sages, shopkeepers, lore |
|
|
53
|
+
| `robot` | calm neutral synthetic | AI companions, announcers, computers |
|
|
54
|
+
| `imp` | husky trickster | goblins, sidekicks, comic relief |
|
|
55
|
+
|
|
56
|
+
**Escape hatch:** `--voice-id <ElevenLabsVoiceId>` uses any raw ElevenLabs
|
|
57
|
+
voice id (overrides `--voice`) — for when the user has a specific voice in
|
|
58
|
+
mind. The cast covers the normal cases; don't browse ids speculatively.
|
|
59
|
+
|
|
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.
|
|
63
|
+
|
|
64
|
+
## Cost honesty
|
|
65
|
+
|
|
66
|
+
Voice is billed **per character of the submitted text**, hard-capped at
|
|
67
|
+
**1000 characters** per line (longer text is clamped, and the clamp is what
|
|
68
|
+
bills). A one-sentence bark costs a fraction of a credit-priced generation —
|
|
69
|
+
but 30 speculative barks are 30 paid calls. Write the script first, generate
|
|
70
|
+
once per line, and reuse lines (the same "Halt!" serves every guard).
|
|
71
|
+
|
|
72
|
+
## Wire it in Three.js
|
|
73
|
+
|
|
74
|
+
Same machinery as sfx — one `AudioListener` on the camera serves everything.
|
|
75
|
+
Non-positional (`THREE.Audio`) for narrator/announcer voices; positional
|
|
76
|
+
(`THREE.PositionalAudio`) when a CHARACTER in the world speaks:
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
import * as THREE from "three";
|
|
80
|
+
|
|
81
|
+
const listener = new THREE.AudioListener();
|
|
82
|
+
camera.add(listener); // ONE listener serves music, sfx, and voice
|
|
83
|
+
|
|
84
|
+
const VOICE_URL = "https://assets.genex.technology/generations/<id>/audio-voice";
|
|
85
|
+
const line = new THREE.Audio(listener); // PositionalAudio(listener) at the speaker's mesh for world speech
|
|
86
|
+
const subtitles = document.getElementById("subtitles")!;
|
|
87
|
+
|
|
88
|
+
new THREE.AudioLoader().loadAsync(VOICE_URL).then((buffer) => {
|
|
89
|
+
line.setBuffer(buffer);
|
|
90
|
+
line.setVolume(0.9);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
function sayLine(text: string): void {
|
|
94
|
+
if (line.isPlaying) line.stop(); // a new line interrupts the old — never overlap voices
|
|
95
|
+
line.play();
|
|
96
|
+
subtitles.textContent = text; // SUBTITLE every voice line, always
|
|
97
|
+
subtitles.classList.add("visible");
|
|
98
|
+
line.onEnded = () => subtitles.classList.remove("visible");
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
- **Subtitles are mandatory** — the same text you generated from, shown while
|
|
103
|
+
the line plays. Muted players and streamers still get the content.
|
|
104
|
+
- **Route voice volume through the SFX slider** (or its own Voice slider in a
|
|
105
|
+
dialogue-heavy game) — `$genex-threejs-game-ui`'s settings rule; an
|
|
106
|
+
uncontrollable voice is worse than none.
|
|
107
|
+
- **Duck the music** while a line plays (`music.setVolume(0.15)`, restore on
|
|
108
|
+
`onEnded`) so speech never fights the bed.
|
|
109
|
+
- Browsers block autoplay: no voice before the first user gesture (the menu's
|
|
110
|
+
PLAY click).
|
|
111
|
+
|
|
112
|
+
## Publish checklist
|
|
113
|
+
|
|
114
|
+
- Load from the **URL** the command printed — permanent, nothing to commit.
|
|
115
|
+
- Every generated line is WIRED and subtitled — an unwired paid line is
|
|
116
|
+
flagged at preview/publish (the wiring audit).
|
|
117
|
+
- Lines are skippable/interruptible and respect the volume sliders.
|
|
118
|
+
|
|
119
|
+
## Options
|
|
120
|
+
|
|
121
|
+
- `--voice <cast>` — `narrator|heroine|gruff|elder|robot|imp` (default
|
|
122
|
+
`narrator`).
|
|
123
|
+
- `--voice-id <id>` — any raw ElevenLabs voice id (overrides `--voice`).
|
|
124
|
+
- `--no-wait` — enqueue and return immediately with the generation id; pick
|
|
125
|
+
it up later with `npx genex wait <id>` (safe to re-run — it attaches to the
|
|
126
|
+
SAME generation).
|
|
127
|
+
- `--api-url <url>` — override the API base (local dev).
|
|
128
|
+
|
|
129
|
+
## Troubleshooting
|
|
130
|
+
|
|
131
|
+
- **"Not authorized"** — run `npx genex init` first (in the project — it resolves this project's own CLI) (it writes your `GENEX_TOKEN`).
|
|
132
|
+
- **"Out of credits" (`insufficient_credits`)** — the account has no credits
|
|
133
|
+
left for this voice generation. Tell the user the facts the CLI printed:
|
|
134
|
+
their balance, this generation's cost, and when their credits refill. Then
|
|
135
|
+
continue the build with the subtitle alone (the game must read fine silent
|
|
136
|
+
anyway) and mark the spot with `// TODO(genex): regenerate when credits refill`
|
|
137
|
+
so the real line is one command away later. Do not stop the session
|
|
138
|
+
over this.
|
|
139
|
+
- **"Email not verified" (`email_verification_required`)** — generation
|
|
140
|
+
credits unlock after the account's email is verified. Give the user the
|
|
141
|
+
verify link the CLI printed, wait for them to confirm, then re-run the
|
|
142
|
+
command.
|
|
143
|
+
- **The line got cut off** — text past 1000 characters is clamped (the CLI
|
|
144
|
+
warns). Split long copy into separate lines — narration beats work better
|
|
145
|
+
as short lines anyway.
|
|
146
|
+
- **Wrong language/accent** — the model speaks the language of the TEXT; for
|
|
147
|
+
an accent, pick a different cast voice (or a specific `--voice-id`) rather
|
|
148
|
+
than describing the accent in the text.
|
|
149
|
+
- **No sound** — the `AudioContext` is suspended until a user gesture; confirm
|
|
150
|
+
the camera has an `AudioListener` and the first play comes from a
|
|
151
|
+
click/keydown.
|
|
@@ -10,6 +10,12 @@ tech demo that boots. You are the director; the other Genex skills are your
|
|
|
10
10
|
specialists. Load only the skills that change the result; never the whole
|
|
11
11
|
pack by default.
|
|
12
12
|
|
|
13
|
+
**After ANY context compaction or session resume**, re-read the game's
|
|
14
|
+
`AGENTS.md` (the Genex build contract block), `DESIGN.md`, and the skill for
|
|
15
|
+
the stage you are executing — never keep building from memory alone. A
|
|
16
|
+
compaction that eats the conversation does not release you from the
|
|
17
|
+
pipeline; those two files are how it comes back.
|
|
18
|
+
|
|
13
19
|
## 1. Check what you can do (once, before planning)
|
|
14
20
|
|
|
15
21
|
Look at your own tool list and note the answers — the rest of this workflow
|
|
@@ -27,6 +33,13 @@ uses them:
|
|
|
27
33
|
Never claim a capability you didn't find, and never stall because one is
|
|
28
34
|
missing.
|
|
29
35
|
|
|
36
|
+
One more thing to note while you're looking: your platform may bundle its own
|
|
37
|
+
image / video / site generation workflows. **They are not part of any Genex
|
|
38
|
+
lane.** All generated art, audio, video, characters, and UI come from `genex`
|
|
39
|
+
commands, unless the player explicitly asks for another tool by name — and a
|
|
40
|
+
local reference image is never a reason to switch tools: `genex image --edit`
|
|
41
|
+
and `--inpaint` take a local file path directly.
|
|
42
|
+
|
|
30
43
|
## 2. Scope check — what is this?
|
|
31
44
|
|
|
32
45
|
- **A new game** → the full flow: contract (§3), teams menu (§4), build order
|
|
@@ -45,10 +58,34 @@ missing.
|
|
|
45
58
|
|
|
46
59
|
## 3. The design contract — DESIGN.md
|
|
47
60
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
61
|
+
**First, the design interview — before DESIGN.md is written.** Ask the
|
|
62
|
+
player 2–4 build-forking questions, batched in ONE round — use your
|
|
63
|
+
structured question / ask tool if your harness has one, with answer options
|
|
64
|
+
for the user. Ask only what genuinely forks the build:
|
|
65
|
+
|
|
66
|
+
- the one-line pitch, confirmed or corrected ("a co-op scythe hunt in a
|
|
67
|
+
ruined cathedral — right?");
|
|
68
|
+
- the solo / co-op / versus shape (it decides netcode and scope);
|
|
69
|
+
- scope ambition, when the request could honestly be read small or large
|
|
70
|
+
(compact arena vs. open world);
|
|
71
|
+
- any real ambiguity in the request itself.
|
|
72
|
+
|
|
73
|
+
Never ask about SDKs, engines, renderers, file layout, or anything
|
|
74
|
+
technical — those are your decisions. **The silence fallback applies only
|
|
75
|
+
AFTER the questions have been posted in chat.** A request that already names
|
|
76
|
+
the game does not skip the interview — then it's the confirm-pitch round.
|
|
77
|
+
Asking is never optional; waiting is: if the player is silent or has no way
|
|
78
|
+
to answer, proceed on your own stated assumptions and write each one into
|
|
79
|
+
DESIGN.md → Decisions as "assumed — player didn't answer"; the build never
|
|
80
|
+
stalls on the interview.
|
|
81
|
+
|
|
82
|
+
Then, before rendering code, write `DESIGN.md` at the project root from
|
|
83
|
+
[references/design-contract.md](references/design-contract.md). The moment
|
|
84
|
+
the file lands, post a 5–6 line summary of the contract in chat — pitch,
|
|
85
|
+
core loop, content counts, screens, multiplayer shape, what you build
|
|
86
|
+
first — and keep building immediately: the summary is information, not a
|
|
87
|
+
gate (the plan-message duties from `$genex-threejs-game-ui` fold into this
|
|
88
|
+
file plus that summary). The file is the single source of truth:
|
|
52
89
|
sub-agents build against it, and after any long break it is how work resumes.
|
|
53
90
|
Keep it current — decisions land in its log the moment they're made.
|
|
54
91
|
|
|
@@ -65,13 +102,24 @@ steps live in each owning skill — load it when its lane fires:
|
|
|
65
102
|
outdoors → `$genex-ai-skybox`
|
|
66
103
|
- `npx genex sfx "<prompt>"` — the core verb and every impact →
|
|
67
104
|
`$genex-ai-sfx`
|
|
105
|
+
- `npx genex music "<prompt>"` — ONE looping instrumental gameplay track
|
|
106
|
+
(~90 s default; the menu reuses it quieter; settings gets Music + SFX
|
|
107
|
+
sliders) → `$genex-ai-music`
|
|
108
|
+
- `npx genex voice "<line>"` — short spoken lines: NPC barks, narrator
|
|
109
|
+
beats, tutorial VO (curated cast via `--voice`; keep lines short,
|
|
110
|
+
subtitled, skippable) → `$genex-ai-voice`
|
|
68
111
|
- `npx genex image "<prompt>"` — posters, signs, sprites, decals, HUD art
|
|
69
|
-
(`--transparent` for anything laid on a surface
|
|
112
|
+
(`--transparent` for anything laid on a surface; `--glass` for real-
|
|
113
|
+
translucency glass panels) → `$genex-ai-image`,
|
|
70
114
|
`$genex-ai-hud`
|
|
71
|
-
- `npx genex video "<prompt>"` — in-world screens
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
115
|
+
- `npx genex video "<prompt>"` — in-world screens and billboards (`--loop`
|
|
116
|
+
for a seamless in-world loop) → `$genex-ai-video`; the animated menu
|
|
117
|
+
backdrop is its own lane — `$genex-ai-menu`'s `--frame` flow, never `--loop`
|
|
118
|
+
- `npx genex character "<prompt>"` — the game's themed character (approval
|
|
119
|
+
flow — §7) → `$genex-ai-character`
|
|
120
|
+
- `npx genex creature "<desc>"` — a rigged enemy/creature in one shot
|
|
121
|
+
(biped-shaped bodies only — the creatures skill routes the rest to
|
|
122
|
+
static + procedural) → `$genex-threejs-creatures`
|
|
75
123
|
- `npx genex controller character|car|drone|touch|quality` and
|
|
76
124
|
`npx genex animations search "<intent>"` — ready-made, tuned movement and
|
|
77
125
|
motion; never write movement physics from scratch →
|
|
@@ -89,12 +137,18 @@ variation); prefer these generators for concrete, describable, photoreal
|
|
|
89
137
|
assets — they complement each other. Assets you didn't plan don't exist: if
|
|
90
138
|
the menu has a lane this game needs, put a row in the Assets table.
|
|
91
139
|
|
|
140
|
+
**No eternal `proposed`.** At every preview and publish, walk the Assets
|
|
141
|
+
table and resolve every `proposed` row — promote it to `planned` (and
|
|
142
|
+
enqueue it when its turn comes) or cancel it, saying which in one visible
|
|
143
|
+
line ("cancelled: UI hover sfx — out of scope for v1"). A row parked at
|
|
144
|
+
`proposed` across a whole session is a decision you didn't make.
|
|
145
|
+
|
|
92
146
|
**Generate a core asset set by default — don't wait to be asked.** For any
|
|
93
147
|
game that needs concrete objects or surfaces, decide a small core set from the
|
|
94
148
|
game IDEA — and from the Content lines when there are any (locations and the
|
|
95
149
|
enemy roster name the set) — and put it in the Assets table up front. This set
|
|
96
150
|
is concept-INDEPENDENT (prompted from the idea, not the concept image, and it
|
|
97
|
-
mostly survives a style change), so it
|
|
151
|
+
mostly survives a style change), so it never waits on the concept at all. Each
|
|
98
152
|
`npx genex` job is an independent ~1-minute render: launch them concurrently
|
|
99
153
|
in the background (`--no-wait`), scaffold the scene while they run, and wire
|
|
100
154
|
each in as it lands, with a procedural placeholder until then:
|
|
@@ -102,7 +156,9 @@ each in as it lands, with a procedural placeholder until then:
|
|
|
102
156
|
- the **hero model** the player controls or chases (`npx genex model`),
|
|
103
157
|
- one key **texture** for the ground/main surface (`--terrain` for ground),
|
|
104
158
|
- a **skybox** when the scene is outdoors,
|
|
105
|
-
- a **sfx** or two for the core action and its feedback
|
|
159
|
+
- a **sfx** or two for the core action and its feedback,
|
|
160
|
+
- one looping **music** track for the gameplay bed (`npx genex music`,
|
|
161
|
+
~90 s; the menu reuses it at lower volume).
|
|
106
162
|
|
|
107
163
|
Skip generation only for purely abstract/geometric games. For three.js
|
|
108
164
|
questions no skill covers, use the official three.js documentation
|
|
@@ -124,11 +180,18 @@ The mandatory rows, in order, each with its one "done when" line:
|
|
|
124
180
|
shows; the tier is what keeps a phone boot alive.
|
|
125
181
|
3. **UI plan gate** — `$genex-threejs-game-ui`, every game: the screen
|
|
126
182
|
inventory, one shared style brief, 2–3 AAA references, the menu archetype,
|
|
127
|
-
then
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
183
|
+
then ONE concept image with its full HUD already on it (no candidate
|
|
184
|
+
variants unless the player asks). **The moment it lands: decide the HUD
|
|
185
|
+
lane (the lane beat below), enqueue the Stage-2 sheet + the menu still +
|
|
186
|
+
the logotype `--no-wait` IMMEDIATELY, and only THEN show the player the
|
|
187
|
+
frame and ask keep-or-change with your question tool — as information,
|
|
188
|
+
never as a gate.** Silence = the concept stands; a "change" answer loops
|
|
189
|
+
the concept with the player's notes and the chain re-runs from the new
|
|
190
|
+
frame (image-priced — cheap by design). Only the menu VIDEO waits, for
|
|
191
|
+
the FIRST of: the player's yes · the next `genex preview` after the menu
|
|
192
|
+
still landed · style work being the only work left — and it never fires
|
|
193
|
+
while a player objection is open. Done when: the sheet, still, and
|
|
194
|
+
logotype are enqueued and the frame is in front of the player.
|
|
132
195
|
4. **Content contract when the request names plural content** — quests,
|
|
133
196
|
enemies, bosses, locations, spells, items, or a content genre (an RPG, an
|
|
134
197
|
adventure, an open world, a story game) — `$genex-threejs-game-content`.
|
|
@@ -148,10 +211,26 @@ The mandatory rows, in order, each with its one "done when" line:
|
|
|
148
211
|
declares its `genex.matchmaking` block before preview. Done when: the
|
|
149
212
|
model, start rule, and late-join behavior are stated in DESIGN.md and the
|
|
150
213
|
netcode feel gate ran before handoff.
|
|
151
|
-
7. **Ship the
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
214
|
+
7. **Ship the playable v0 and preview it.** The scaffold prompt owns the
|
|
215
|
+
player-facing milestones and links — don't restate them; obey them. Done
|
|
216
|
+
when: the v0 loop is genuinely playable and the player has their draft
|
|
217
|
+
page link.
|
|
218
|
+
|
|
219
|
+
**The HUD lane — the concept decides it, and DESIGN.md records it.** You
|
|
220
|
+
make this call as the art director the moment the mockup lands: ornate /
|
|
221
|
+
painterly / material widget chrome (carved bone, etched metal, glowing
|
|
222
|
+
runes, brushed gold) → **sprites** — the `$genex-ai-hud` pipeline is
|
|
223
|
+
mandatory. Chrome that is flat geometry + typography, where a CSS rebuild
|
|
224
|
+
would be screenshot-indistinguishable from the mockup → **CSS allowed**,
|
|
225
|
+
styled from the brief. The litmus test: would a screenshot of the CSS
|
|
226
|
+
rebuild pass for the mockup at a glance? Unsure or ambiguous → sprites.
|
|
227
|
+
Record it as one DESIGN.md line — `HUD lane: sprites (…)` or
|
|
228
|
+
`HUD lane: CSS (…, one-line justification)` — the preview preflight checks
|
|
229
|
+
for it. In BOTH lanes: micro-text (damage numbers, timers, ammo digits)
|
|
230
|
+
stays HTML text in the brief's font, and no rectangular backing plates
|
|
231
|
+
behind bars, digits, or icons — ever (a truly needed shaped plate comes
|
|
232
|
+
from `npx genex ui plate`). Only the player may decline the generated HUD,
|
|
233
|
+
and the player's explicit lane request wins in both directions.
|
|
155
234
|
|
|
156
235
|
Two rules for every game that moves (decide both before building, state them
|
|
157
236
|
in DESIGN.md):
|
|
@@ -187,10 +266,12 @@ agent: you stay the director.
|
|
|
187
266
|
rule is anti-collision, never a reason to serialize work.
|
|
188
267
|
- You stay the integrator and the only writer of shared files (boot, main
|
|
189
268
|
loop, netcode). Workers never spawn workers — one level deep, always.
|
|
190
|
-
- Concept-DEPENDENT rows (the HUD chain, style-matched art)
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
269
|
+
- Concept-DEPENDENT rows (the HUD chain, style-matched art) launch the
|
|
270
|
+
moment the concept LANDS — the Stage-2 chain enqueues immediately (§5.3);
|
|
271
|
+
only the menu video waits for its event triple. Concept-INDEPENDENT rows
|
|
272
|
+
(world/terrain, content data, enemies, asset wiring) launch immediately
|
|
273
|
+
either way. Typing a big game alone, line by line, is how sessions run
|
|
274
|
+
out before the world exists.
|
|
194
275
|
- Give each worker everything by path: the `DESIGN.md` path, its Modules row,
|
|
195
276
|
and the skill files it needs (skills live in this project —
|
|
196
277
|
`.claude/skills/<name>/SKILL.md`, `.codex/skills/…`, or `.cursor/skills/…`,
|
|
@@ -207,36 +288,59 @@ agent: you stay the director.
|
|
|
207
288
|
enqueues. (Whoever wires the HUD after a worker finishes follows
|
|
208
289
|
`$genex-ai-hud`'s handoff rule: read the produced mask/bbox JSON from disk,
|
|
209
290
|
never wire from a prose summary.)
|
|
210
|
-
- Do NOT spawn workers to write extra test suites
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
291
|
+
- Do NOT spawn workers to write extra test suites, audits, or verification
|
|
292
|
+
passes — the per-milestone smoke pass is yours, the director's, and it is
|
|
293
|
+
ONE pass (§8; the scaffold prompt owns the ceilings).
|
|
294
|
+
- If you build a module the table planned for a sub-agent inline, say why in
|
|
295
|
+
one line in chat ("built enemies inline — the arena worker was still
|
|
296
|
+
holding the only free slot"). The table is accountability, not ceremony —
|
|
297
|
+
inline can be the right call.
|
|
298
|
+
|
|
299
|
+
## 7. The game's character (Meshy) — themed by default
|
|
300
|
+
|
|
301
|
+
**A themed character is the DEFAULT for any game whose protagonist is
|
|
302
|
+
VISIBLE** — third-person, or first-person with co-op/remote players who see
|
|
303
|
+
each other. Put its row in the Assets table up front and install the
|
|
304
|
+
VRM + UAL controller (`npx genex controller character`) as the instant
|
|
305
|
+
placeholder. The VRM stays the FINAL character only for games with no
|
|
306
|
+
themed protagonist to sell (a generic exploration toy, a faceless solo
|
|
307
|
+
first-person game — say which in one line). A capsule or hand-built
|
|
308
|
+
primitive standing in for a person is never a shipped state, for the local
|
|
309
|
+
player or a remote one.
|
|
310
|
+
|
|
311
|
+
**The default lane has ONE user stop, and it rides the concept review.**
|
|
312
|
+
When the user names a visual reference, inspect references before writing
|
|
313
|
+
the concept prompt. Generate exactly three concepts, all neutral A-pose;
|
|
314
|
+
never use a dynamic concept pose or silently fall back to T-pose. Warn that
|
|
315
|
+
held, slung, or overlapping props and straps can fuse into the body or
|
|
316
|
+
obscure limbs, and recommend separate gameplay props. Show the actual
|
|
317
|
+
images in the SAME beat as the game-concept keep-or-change question — one
|
|
318
|
+
review, two picks. The player's pick carries the lane end to end:
|
|
319
|
+
`npx genex character preview <concept-id> --candidate <1|2|3> --user-approved`,
|
|
320
|
+
then finalize below. **If the player hasn't picked by the time the
|
|
321
|
+
character blocks progress (or ~10 minutes), pick the strongest candidate
|
|
322
|
+
yourself, say which and why in chat, and proceed** — this auto-proceed is
|
|
323
|
+
owner-ratified platform policy (2026-07-23), not an agent liberty; record
|
|
324
|
+
it in DESIGN.md → Decisions ("auto-picked candidate 2 — cleanest
|
|
325
|
+
silhouette; player away").
|
|
230
326
|
|
|
231
327
|
Meshy Image-to-3D first produces an unremeshed high-detail model. Show its
|
|
232
|
-
front, back, left, and right views and report its measured face count.
|
|
233
|
-
that model in R2.
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
328
|
+
front, back, left, and right views and report its measured face count.
|
|
329
|
+
Preserve that model in R2. The 10,000-face triangle remesh—not the
|
|
330
|
+
high-detail source—is rigged and animated. In the default lane the remesh
|
|
331
|
+
proceeds on the same authorization as the pick (say it plainly: "building
|
|
332
|
+
the 10,000-face rigging copy now"):
|
|
237
333
|
`npx genex character finalize <preview-id> --user-approved --approve-remesh 10000 [--animation <action-id>…]`.
|
|
238
|
-
|
|
239
|
-
|
|
334
|
+
Keep every pre-animation generation in the selected neutral A-pose.
|
|
335
|
+
|
|
336
|
+
**When the user themselves asked for a custom character** (an explicit
|
|
337
|
+
custom-character request, not the game default), the ceremony is two
|
|
338
|
+
separate stops and the approvals are the product: do not start Image-to-3D
|
|
339
|
+
until they explicitly select a candidate, and before rigging ask them to
|
|
340
|
+
approve the separate 10,000-face triangle remesh — wait for that explicit
|
|
341
|
+
approval before finalize. (`npx genex character "<prompt>" --direct-text`
|
|
342
|
+
is the explicit legacy one-shot path, not a substitute for these
|
|
343
|
+
approvals.)
|
|
240
344
|
|
|
241
345
|
Load `$genex-ai-character`, search Meshy actions first with
|
|
242
346
|
`npx genex animations search "<intent>" --json`, and use returned action IDs;
|
|
@@ -248,13 +352,34 @@ Before handoff, visibly check idle, walk, run, crouch-idle, crouch-move, and
|
|
|
248
352
|
jump — shoulders, elbows, wrists, hands, both leg cycles, and feet — and press
|
|
249
353
|
every control the HUD advertises.
|
|
250
354
|
|
|
251
|
-
## 8.
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
355
|
+
## 8. Verification — the smoke pass's captures grow with the build
|
|
356
|
+
|
|
357
|
+
The per-milestone smoke pass and its ceilings belong to the scaffold prompt
|
|
358
|
+
(ONE pass per milestone, never test suites, never re-verify after cosmetic
|
|
359
|
+
tweaks) — this section only defines WHAT that one pass captures once the
|
|
360
|
+
relevant piece exists:
|
|
361
|
+
|
|
362
|
+
- **Always:** the gameplay screenshot + the main controls responding the
|
|
363
|
+
right way (the scaffold prompt's baseline).
|
|
364
|
+
- **Once the generated HUD is wired:** take the gameplay screenshot AFTER
|
|
365
|
+
taking damage once, with an enemy in frame facing the player. A full-HP
|
|
366
|
+
shot cannot show a broken meter (a painted trough hides behind a 100%
|
|
367
|
+
fill), and an enemy you never faced head-on may be looking sideways at
|
|
368
|
+
everyone.
|
|
369
|
+
- **Once the menu video is wired:** watch one full loop cycle as rendered
|
|
370
|
+
(`$genex-ai-menu`'s seam check). A metadata probe can't see a seam, a
|
|
371
|
+
hidden video, or a leftover panel covering it.
|
|
372
|
+
|
|
373
|
+
Judge each capture against DESIGN.md once, fix only what is visibly broken,
|
|
374
|
+
and move on — the captures are eyes, not a test suite.
|
|
375
|
+
|
|
376
|
+
**Fresh eyes before publish.** The pre-publish check is just the last
|
|
377
|
+
milestone's pass, plus this: take the game's current screenshots (desktop
|
|
378
|
+
and phone sizes) and hand them, with DESIGN.md only, to a fresh reviewer —
|
|
379
|
+
a sub-agent if you have one, otherwise re-read them yourself adversarially,
|
|
380
|
+
looking to refute "it's done": untextured surfaces, a bare HUD, missing
|
|
381
|
+
screens, Content lines not in the game, Assets rows never flipped to
|
|
382
|
+
`wired`, `proposed` rows never resolved. Fix or honestly report what it
|
|
258
383
|
finds; never publish over an unacknowledged gap.
|
|
259
384
|
|
|
260
385
|
## 9. Say it straight
|
|
@@ -13,7 +13,10 @@ Rules the director enforces about this file:
|
|
|
13
13
|
sections as decisions land and keep it current (stale is worse than short).
|
|
14
14
|
- **The Modules table is the delegation contract**: one row per independent
|
|
15
15
|
lane, and a row's "Owns files" set never overlaps another row's. One writer
|
|
16
|
-
per file.
|
|
16
|
+
per file. "Sub-agent when available" stays flexible — but if a
|
|
17
|
+
planned-sub-agent module gets built inline, the agent says why in one line.
|
|
18
|
+
Verification is never a module row: the milestone smoke pass belongs to the
|
|
19
|
+
director (the scaffold prompt owns its ceilings).
|
|
17
20
|
- **The Assets table is the budget**: the asset list falls out of Content
|
|
18
21
|
(enemies → models, an arena → a ground texture, outdoors → a skybox).
|
|
19
22
|
Status flow per row: `proposed → planned → generating (id) → landed (URL) →
|
|
@@ -22,6 +25,8 @@ Rules the director enforces about this file:
|
|
|
22
25
|
flips statuses and never enqueues. Re-rolls follow the player's notes only.
|
|
23
26
|
The `Wired?` column exists because "generated but never wired in" is the
|
|
24
27
|
most common way finished art gets lost — a row isn't done at `landed`.
|
|
28
|
+
And no eternal `proposed`: at every preview/publish, every `proposed` row
|
|
29
|
+
gets promoted or cancelled with one visible line — never silently parked.
|
|
25
30
|
- Shrinking any Content line is a question to the player first, never a
|
|
26
31
|
silent cut.
|
|
27
32
|
|
|
@@ -35,8 +40,8 @@ the bottom._
|
|
|
35
40
|
|
|
36
41
|
## Concept
|
|
37
42
|
One paragraph: what the game is, what playing it feels like.
|
|
38
|
-
Concept image: <asset URL> (
|
|
39
|
-
|
|
43
|
+
Concept image: <asset URL> (standing — shown <date>; player said
|
|
44
|
+
<yes | nothing — pick stands | change → looped>)
|
|
40
45
|
|
|
41
46
|
## Core loop
|
|
42
47
|
- **You do:** <primary verb — drive, shoot, build…>
|
|
@@ -56,18 +61,35 @@ Every plural noun from the request becomes a countable line:
|
|
|
56
61
|
## Screens & UI
|
|
57
62
|
Screens: <loader, menu, HUD, pause, win/lose…> · Style brief: <one line>
|
|
58
63
|
References: <2–3 named games> · Menu archetype: <name>
|
|
64
|
+
HUD lane: <sprites (…) | CSS (…, one-line justification)> — mandatory line;
|
|
65
|
+
the concept decides it (director §5) and the preview preflight checks for it
|
|
66
|
+
Menu video: <yes (the default for every game) | declined (player's reason)>
|
|
59
67
|
|
|
60
68
|
## Assets — the generation plan AND the budget
|
|
61
69
|
| Asset | Kind | Status | Wired? |
|
|
62
70
|
|------------------|-------------|---------------------------------|--------|
|
|
63
|
-
| Concept + HUD | image | landed → <URL>
|
|
71
|
+
| Concept + HUD | image | landed → <URL> | n/a |
|
|
64
72
|
| <main surface> | texture | generating (<id>) | — |
|
|
65
73
|
| <hero model> | model | planned | — |
|
|
66
|
-
|
|
|
74
|
+
| Background music | music | planned (one ~90s looping track)| — |
|
|
75
|
+
| Menu still | image | enqueued on concept landing (<id>) | — |
|
|
76
|
+
| Menu video | video | waits: yes / next preview after still / style-only-left | — |
|
|
77
|
+
| Logotype | image | enqueued on concept landing (<id>) | — |
|
|
67
78
|
Status flow: proposed → planned → generating (id) → landed (URL) → wired.
|
|
68
79
|
(Optionally note the prompt gist per row — it makes style-change re-rolls one
|
|
69
80
|
command.)
|
|
70
81
|
|
|
82
|
+
**HUD pipeline state (sprites lane) — keep this current; it is how the
|
|
83
|
+
pipeline survives a context compaction.** One row per stage with its
|
|
84
|
+
generation id / output path, so a resumed session knows exactly where the
|
|
85
|
+
chain stopped and what fires next:
|
|
86
|
+
- Stage-1 mockup: <id → URL>
|
|
87
|
+
- Stage-2 sheet: <id → URL>
|
|
88
|
+
- Cleaned sheet: <id → URL>
|
|
89
|
+
- Extracted sprites: <public/assets/hud/…>
|
|
90
|
+
- Masks: <public/assets/hud/…-mask.png + sidecars>
|
|
91
|
+
- Next stage: <what fires next, one line>
|
|
92
|
+
|
|
71
93
|
## World & scale
|
|
72
94
|
<Size in numbers if open world; arena bounds otherwise. Streamed terrain? y/n>
|
|
73
95
|
|
|
@@ -83,8 +105,7 @@ click (when a Play screen exists).
|
|
|
83
105
|
| World/terrain | src/world/** | sub-agent when available | walkable, matches World & scale |
|
|
84
106
|
| Quests & dialogue data | src/content/** | sub-agent when available | counts match Content lines |
|
|
85
107
|
| Enemies/AI | src/enemies/** | sub-agent when available | roster matches Content |
|
|
86
|
-
| HUD chain (style-dependent) | src/ui/** | sub-agent
|
|
87
|
-
| Verification | (no source files) | one sub-agent max | smoke check notes per milestone |
|
|
108
|
+
| HUD chain (style-dependent) | src/ui/** | sub-agent on concept landing | all screens from Screens & UI |
|
|
88
109
|
|
|
89
110
|
## Decisions & changes
|
|
90
111
|
- <date> — <one-liner per decision, including anything the player said no or
|
|
@@ -101,7 +122,7 @@ A scrap-robot arena shooter: you skate a magnetized junkyard bot around a
|
|
|
101
122
|
crusher pit, blasting rival bots into spare parts before the magnet cycle
|
|
102
123
|
pulls everything in. Fast, crunchy, thirty-second lives.
|
|
103
124
|
Concept image: https://assets.genex.technology/g/rustyard/concept.png
|
|
104
|
-
(
|
|
125
|
+
(standing — shown 2026-07-20; player said yes)
|
|
105
126
|
|
|
106
127
|
## Core loop
|
|
107
128
|
- **You do:** skate + shoot
|
|
@@ -116,17 +137,26 @@ Concept image: https://assets.genex.technology/g/rustyard/concept.png
|
|
|
116
137
|
Screens: loader, title menu, HUD (health, scrap, cycle timer), pause,
|
|
117
138
|
win/lose. Style brief: oily metal, warning-stripe accents, stencil type.
|
|
118
139
|
References: <three named AAA games>. Menu archetype: hangar pan.
|
|
140
|
+
HUD lane: sprites (stencil-cut metal meters + riveted scrap counter — ornate
|
|
141
|
+
material chrome, CSS can't pass for it)
|
|
142
|
+
Menu video: yes
|
|
119
143
|
|
|
120
144
|
## Assets
|
|
121
145
|
| Asset | Kind | Status | Wired? |
|
|
122
146
|
|------------------|---------|----------------------------|--------|
|
|
123
|
-
| Concept + HUD | image | landed → <URL>
|
|
147
|
+
| Concept + HUD | image | landed → <URL> | n/a |
|
|
124
148
|
| Junkyard ground | texture | landed → <URL> | yes |
|
|
125
149
|
| Player bot | model | generating (gen_8f2k) | — |
|
|
126
150
|
| Rival bot | model | planned | — |
|
|
127
151
|
| Overcast sky | skybox | landed → <URL> | yes |
|
|
128
152
|
| Blaster zap | sfx | landed → <URL> | yes |
|
|
129
|
-
| Menu still
|
|
153
|
+
| Menu still | image | landed → <URL> | — |
|
|
154
|
+
| Menu video | video | waiting (still landed — fires at yes / next preview / style-only-left) | — |
|
|
155
|
+
| Logotype | image | generating (gen_9t3m) | — |
|
|
156
|
+
|
|
157
|
+
HUD pipeline state: Stage-1 mockup gen_7a1x → URL · Stage-2 sheet gen_7b2y →
|
|
158
|
+
URL · cleaned gen_7c3z → URL · extracted public/assets/hud/ · masks derived ·
|
|
159
|
+
next: wire masked fills
|
|
130
160
|
|
|
131
161
|
## World & scale
|
|
132
162
|
One 60×60 m arena, walled; no streaming.
|