@genex-ai/cli-demo 0.84.0-dev.215 → 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 +2110 -1871
- package/package.json +1 -1
- package/templates/skills/genex-ai-hud/SKILL.md +45 -27
- package/templates/skills/genex-ai-hud/references/stage1-prompt-template.md +42 -5
- package/templates/skills/genex-ai-hud/references/stage2-prompt-template.md +5 -1
- package/templates/skills/genex-ai-menu/SKILL.md +12 -5
- package/templates/skills/genex-game-director/SKILL.md +56 -15
- package/templates/skills/genex-game-director/references/design-contract.md +33 -8
- package/templates/skills/genex-game-director/references/routing-map.md +40 -28
- package/templates/skills/genex-threejs-character-controller/SKILL.md +19 -0
- package/templates/skills/genex-threejs-creatures/SKILL.md +8 -0
- package/templates/skills/genex-threejs-game-ui/SKILL.md +74 -70
- package/templates/skills/genex-threejs-visual-validation/SKILL.md +9 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genex-ai/cli-demo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.85.0-dev.216",
|
|
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": {
|
|
@@ -122,6 +122,15 @@ The HUD overlays a **live 3D scene**. The pixels between widgets show the game.
|
|
|
122
122
|
their opaque chrome (frame, brackets, ornament); the plate itself is
|
|
123
123
|
rebuilt at runtime in CSS matching the mockup's tint (see the three layers
|
|
124
124
|
above).
|
|
125
|
+
- **No rectangular backing plates behind bars, digits, or icons — in the
|
|
126
|
+
mockup, in sprites, or in CSS.** The Stage-1 template's widget-construction
|
|
127
|
+
paragraph forbids them at the source (widgets are shaped silhouettes drawn
|
|
128
|
+
over the scene — never delete that paragraph), and the runtime never adds
|
|
129
|
+
one back: ornament lives on the widget's own silhouette. A screen that
|
|
130
|
+
truly needs a plate (a menu sheet, an inventory panel) shapes it from the
|
|
131
|
+
art's real interior with `npx genex ui plate` — never a bare rounded
|
|
132
|
+
rectangle. Measured across 7 genres: without this rule every genre grows
|
|
133
|
+
heavy generic plates behind its bars and digits.
|
|
125
134
|
- **4–7 widgets.** Fewer doesn't read as a HUD; more clutters the screen and
|
|
126
135
|
burns generations.
|
|
127
136
|
- **Every widget needs internal contrast** — a panel fill, outline stroke, or
|
|
@@ -225,22 +234,29 @@ and [references/stage2-prompt-template.md](references/stage2-prompt-template.md)
|
|
|
225
234
|
|
|
226
235
|
**Order of work: kick Stage 1 off as your FIRST action at the UI plan
|
|
227
236
|
gate — the Stage-1 mockup IS the game concept.** There is no separate
|
|
228
|
-
UI-free concept image before it: this
|
|
229
|
-
serves as the user's style
|
|
230
|
-
(`$genex-threejs-game-ui` owns the
|
|
231
|
-
|
|
232
|
-
|
|
237
|
+
UI-free concept image before it: this ONE generation (no candidate variants
|
|
238
|
+
unless the player asks) carries scene + HUD, serves as the user's style
|
|
239
|
+
checkpoint, and anchors all later art (`$genex-threejs-game-ui` owns the
|
|
240
|
+
checkpoint choreography). **The moment the mockup lands, enqueue Stage 2 +
|
|
241
|
+
the menu still + the logotype `--no-wait` IMMEDIATELY — THEN show the
|
|
242
|
+
player the frame and ask keep/change as information, never as a gate.**
|
|
243
|
+
Silence = the concept stands; a "change" answer loops the concept with the
|
|
244
|
+
player's notes and the chain re-runs from the new frame — image-priced,
|
|
245
|
+
cheap by design, so say so in one line and do it. Only the menu VIDEO waits
|
|
246
|
+
(`$genex-ai-menu` owns its event triple). The scene half
|
|
233
247
|
of the prompt is written in TEXT from the game plan — `[GAME_SCENE]` in the
|
|
234
248
|
Stage-1 template: setting, the moment, what the player is doing, lighting.
|
|
235
249
|
**If a concept/reference image already exists — the user's own concept art, or
|
|
236
250
|
a look frame you generated and they approved — anchor Stage 1 to it with
|
|
237
|
-
`--edit <that-url>` so the HUD inherits its exact palette, materials,
|
|
238
|
-
lighting; that anchoring is what makes the final HUD actually match the
|
|
251
|
+
`--edit <that-url-or-file>` so the HUD inherits its exact palette, materials,
|
|
252
|
+
and lighting; that anchoring is what makes the final HUD actually match the
|
|
239
253
|
concept, and skipping it is why a text-only mockup drifts.** A text-only
|
|
240
|
-
Stage 1 is the fallback for when no reference exists.
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
254
|
+
Stage 1 is the fallback for when no reference exists. A user-supplied
|
|
255
|
+
reference needs no upload step: `--edit` takes a local file path directly
|
|
256
|
+
(`--edit ./reference.png`, ≤4 MB inlined) — a chat attachment saved to disk
|
|
257
|
+
is a perfectly good anchor, and "I can't feed the local screenshot into the
|
|
258
|
+
art chain" is never true and never a reason to reach for another tool.
|
|
259
|
+
Then write the
|
|
244
260
|
widget layout and wiring code (placement, masked-fill scaffolding,
|
|
245
261
|
plain-CSS placeholder bars) while it renders — the CSS HUD keeps
|
|
246
262
|
the game playable until the sprites land. When a sprite lands it REPLACES
|
|
@@ -250,19 +266,14 @@ is the black-box defect. The mockup is a STYLE anchor
|
|
|
250
266
|
only: the widget set and
|
|
251
267
|
layout come from the element inventory and the game contract — a mechanic
|
|
252
268
|
the mockup invented (a lap counter, a stamina orb) does not enter the HUD,
|
|
253
|
-
and a mechanic it failed to show still does.
|
|
254
|
-
call (`--candidates 2`) and pick the better one: a re-roll costs the whole
|
|
255
|
-
serial chain, a second candidate costs nothing extra in wall-clock. If the
|
|
256
|
-
user's concept-loop feedback rejects the style after Stage 2+ ran,
|
|
257
|
-
re-run from Stage 1 with their notes — cheaper than it sounds (one image
|
|
258
|
-
is the whole concept now), so say so in one line and do it.
|
|
269
|
+
and a mechanic it failed to show still does.
|
|
259
270
|
|
|
260
271
|
```bash
|
|
261
272
|
# Stage 1 — the game CONCEPT: full HUD composited over the game's own scene.
|
|
262
|
-
# TEXT-described; add `--edit <concept-url>` to anchor it to an
|
|
263
|
-
# concept/reference image so the HUD inherits its exact style.
|
|
264
|
-
#
|
|
265
|
-
npx genex image "<filled stage-1 prompt>" --size 2560x1440 --quality high
|
|
273
|
+
# TEXT-described; add `--edit <concept-url-or-local-file>` to anchor it to an
|
|
274
|
+
# existing concept/reference image so the HUD inherits its exact style.
|
|
275
|
+
# ONE concept image; save its URL:
|
|
276
|
+
npx genex image "<filled stage-1 prompt>" --size 2560x1440 --quality high
|
|
266
277
|
|
|
267
278
|
# Stage 2 — deconstruct the mockup into an asset sheet on white:
|
|
268
279
|
npx genex image "<filled stage-2 prompt>" --edit <mockup-url> --quality high
|
|
@@ -319,6 +330,12 @@ To fix ONE sprite, don't re-run the pipeline:
|
|
|
319
330
|
(the canvas sliced it — regenerate the sheet with more margin around every
|
|
320
331
|
element) or looks like a fragment (extreme aspect / near-empty box — try
|
|
321
332
|
`--dilate` to glue split pieces).
|
|
333
|
+
- **Stacked meters cluster.** Meters that sit adjacent/stacked in the mockup
|
|
334
|
+
(HP directly over stamina) tend to come back as one clustered crop on the
|
|
335
|
+
sheet — when your mockup stacks meters, ask the Stage-2 sheet for extra
|
|
336
|
+
whitespace between the STACKED meter cells specifically (measured on a
|
|
337
|
+
live run: the tools hard-refuse the resulting neighbor-in-crop defect, so
|
|
338
|
+
spacing up front saves a sheet re-roll).
|
|
322
339
|
- **gpt-image-2 silently squashes past 3:1** — never request a canvas with
|
|
323
340
|
aspect beyond 3:1. For thin strips (a wide bar frame), generate inside a
|
|
324
341
|
≤3:1 canvas with margins, then `genex ui trim` down to the art.
|
|
@@ -619,10 +636,10 @@ separate concept spend), a couple of minutes each at high quality — budget an
|
|
|
619
636
|
hour end to end, not five minutes. That fits comfortably inside the image rate
|
|
620
637
|
limit; local `genex ui` steps are free and instant. Two rules keep the clock
|
|
621
638
|
honest: the sprite pipeline runs WHILE you build (kick Stage 1 first, code
|
|
622
|
-
against CSS placeholders, swap sprites in as stages land
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
639
|
+
against CSS placeholders, swap sprites in as stages land), and the chain
|
|
640
|
+
never parks behind the keep/change answer — Stage 2, the menu still, and the
|
|
641
|
+
logotype enqueue the moment the mockup lands (the order-of-work rule above);
|
|
642
|
+
a later "change" loops the concept at image prices.
|
|
626
643
|
|
|
627
644
|
## Publish checklist
|
|
628
645
|
|
|
@@ -641,8 +658,9 @@ after a bad single costs the whole chain).
|
|
|
641
658
|
- `npx genex image` — `--size <WxH>` exact pixels (multiples of 16, each side
|
|
642
659
|
≤ 3840, aspect at most 3:1); `--quality <low|medium|high>` (high for the
|
|
643
660
|
mockup/sheet, medium for single sprites); `--candidates <2|3|4>` several
|
|
644
|
-
variants in ONE call (
|
|
645
|
-
|
|
661
|
+
variants in ONE call (only when the player asks for variants — the
|
|
662
|
+
doctrine is ONE concept); `--edit <url|file>` image-to-image edit of an
|
|
663
|
+
R2 URL or a local image file (≤4 MB, inlined); `--clean <url>`
|
|
646
664
|
background removal only; `--remove-bg` chains removal after a
|
|
647
665
|
generation/edit; `--bg-mode <sprite|glyph|sheet>` picks the removal model
|
|
648
666
|
(`glyph` for digits/closed shapes; `--clean` defaults to `sheet`; `matte`
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# Stage 1 prompt template — the game concept: full-HUD mockup
|
|
2
2
|
|
|
3
|
-
Fill the
|
|
4
|
-
`npx genex image "<filled prompt>" --size 2560x1440 --quality high
|
|
3
|
+
Fill the placeholders, then pass the whole text as the prompt to
|
|
4
|
+
`npx genex image "<filled prompt>" --size 2560x1440 --quality high`.
|
|
5
|
+
ONE concept image — no candidate variants unless the player asks for them.
|
|
5
6
|
This image IS the game concept — the user's style checkpoint and the anchor
|
|
6
7
|
for all later art — so the scene half deserves the same care as the HUD half.
|
|
7
8
|
|
|
@@ -26,11 +27,35 @@ Placeholders:
|
|
|
26
27
|
rival truck closing on the left, late-afternoon glare"
|
|
27
28
|
- `[STYLE_BRIEF]` — your full 3–5 sentence style brief with the named 4–5 hue
|
|
28
29
|
palette. Do NOT append the per-sprite cutout sentence here — this is a full
|
|
29
|
-
frame, not a cutout.
|
|
30
|
+
frame, not a cutout. **End the brief with a named register anchor**: "in
|
|
31
|
+
the register of <2–3 real games>" from the table below. Anchors set the
|
|
32
|
+
REGISTER (stroke weight, ornament budget, composure) — never copy their
|
|
33
|
+
assets, and never show their names in-game. Pick 2–3; genres between rows
|
|
34
|
+
blend the neighbors.
|
|
35
|
+
|
|
36
|
+
| Genre register | Anchor games (2–3) |
|
|
37
|
+
|---|---|
|
|
38
|
+
| Gothic / soulslike | Bloodborne, Elden Ring |
|
|
39
|
+
| Clean sci-fi / arena shooter | Destiny 2, Titanfall 2 |
|
|
40
|
+
| Arcade racing / rally | Forza Horizon, vintage Baja rally decals |
|
|
41
|
+
| Cozy / farming / life sim | Stardew Valley, Spiritfarer |
|
|
42
|
+
| Analog survival horror | Resident Evil 7, Signalis |
|
|
43
|
+
| Retro pixel | Shovel Knight |
|
|
44
|
+
| Ornate high fantasy RPG | Diablo IV |
|
|
45
|
+
|
|
46
|
+
- `[N]` — the exact count of elements in `[ELEMENT_LIST]`, spelled out in
|
|
47
|
+
the ONLY-these line. The bans in that line are load-bearing: without them
|
|
48
|
+
the model completes the genre's canonical HUD past your list (invented
|
|
49
|
+
kill feeds, leaderboards, timers, extra slots — measured in 5/7 genres).
|
|
30
50
|
- `[ELEMENT_LIST]` — a bullet list of your 4–7 chosen widgets with one-line
|
|
31
51
|
descriptions. List only asset-backed widgets; pure-geometry elements
|
|
32
52
|
(crosshairs, tick rails, plain shapes) are built in code and stay off the
|
|
33
|
-
list.
|
|
53
|
+
list. **Name each element as the shaped object it is** — "bare glowing
|
|
54
|
+
digits with a pip row", "an etched line silhouette", "stencil digits held
|
|
55
|
+
by two rivet brackets". Never "panel" or "plate" unless a physical plate
|
|
56
|
+
IS the art (a diegetic device, a pinned note). **State exact counts**
|
|
57
|
+
("exactly one tool slot", "exactly three gem sockets") — the model honors
|
|
58
|
+
them.
|
|
34
59
|
|
|
35
60
|
## The template
|
|
36
61
|
|
|
@@ -39,10 +64,12 @@ A screenshot of a complete game HUD for [GENRE_BRIEF]. The HUD is composited ove
|
|
|
39
64
|
|
|
40
65
|
Visual style: [STYLE_BRIEF]
|
|
41
66
|
|
|
42
|
-
The HUD includes these elements,
|
|
67
|
+
The HUD includes ONLY these [N] elements and nothing else — do not add any other UI: no kill feed, no leaderboard, no map, no timer, no chat, no crosshair, no extra slots, no duplicates. Arrange them naturally as a real game would lay them out (you decide the layout — do not force a grid, place each element where it makes the HUD readable and combat-ready):
|
|
43
68
|
|
|
44
69
|
[ELEMENT_LIST]
|
|
45
70
|
|
|
71
|
+
Widget construction rules: every widget is a shaped object with its own silhouette — an ornamented frame or emblem drawn directly over the game scene. NO rectangular backing panels behind bars, digits, or icons; no dark filler boxes; the game scene stays visible right up to each widget's frame edge. All ornament and material character lives ON the frame outline itself. Keep the frames detailed and characterful — confident AAA game UI, not a sterile minimal overlay. Size widgets like a shipped game: the HUD hugs the screen edges and no single widget exceeds about one eighth of the frame width. Every meter channel interior reads visibly darker than both its fill and its surrounding frame.
|
|
72
|
+
|
|
46
73
|
This is a real in-game screenshot. Sharp detail on every UI element. No motion blur on the HUD. The HUD is clear and combat-readable. No watermarks. No external annotations.
|
|
47
74
|
|
|
48
75
|
CRITICAL — flat HUD framing: draw every HUD element flat and head-on, parallel to the screen plane, like a 2D overlay painted directly onto the display (orthographic / screen-space UI). The HUD must NOT be tilted, angled, skewed, rotated in 3D, shown in perspective, or made to recede into depth — no isometric interface, no vanishing point on the panels, no 3D-extruded or floating-at-an-angle widgets, no curved/wrapped screen. ONLY the game scene behind the HUD may show 3D depth and perspective; the HUD layer itself is a flat 2D plane with square-on, axis-aligned edges, so each widget can be cleanly cut out as a flat sprite.
|
|
@@ -53,6 +80,16 @@ not deconstruct cleanly (angled panel edges have no clean silhouette, so
|
|
|
53
80
|
Stage 2 produces sliced, skewed cutouts). If the mockup comes back tilted,
|
|
54
81
|
regenerate it before proceeding; do not try to salvage it downstream.
|
|
55
82
|
|
|
83
|
+
**Never delete the widget-construction paragraph either** — it is what keeps
|
|
84
|
+
the mockup from coming back as generic rectangles: without it, every genre
|
|
85
|
+
grows heavy rectangular backing plates behind its bars and digits, and the
|
|
86
|
+
lane's whole value (shaped, characterful chrome) is lost. The channel-contrast
|
|
87
|
+
sentence in it is deliberate phrasing: channels read "visibly darker than
|
|
88
|
+
both their fill and their frame" — a RELATIVE rule that works on light
|
|
89
|
+
palettes too (an absolute "dark" trough fought cozy/pale briefs). Stage 2's
|
|
90
|
+
EMPTY-state law (dark empty tracks on the sheet) is separate and stays
|
|
91
|
+
absolute.
|
|
92
|
+
|
|
56
93
|
One more Stage-1 rule that pays off at mask time: **meter channels must be
|
|
57
94
|
continuous** — never place a label or ornament in the MIDDLE of a fill
|
|
58
95
|
channel (it splits the mask and the fill into fragments); labels sit above or
|
|
@@ -25,7 +25,11 @@ Fill `[ASSET_LIST]`, then pass the whole text as the prompt to
|
|
|
25
25
|
- **requests variant cells for discrete icon counters** — hearts, ammo
|
|
26
26
|
pips, stars ship as repeated sprites, not masks, so their item asks for
|
|
27
27
|
the states as SEPARATE same-size cells ("the heart icon: one full, one
|
|
28
|
-
half, one empty cell") instead of an annotated pair
|
|
28
|
+
half, one empty cell") instead of an annotated pair;
|
|
29
|
+
- **asks for extra whitespace between meters that were STACKED in the
|
|
30
|
+
mockup** ("place the health-bar cells and the stamina-bar cells in
|
|
31
|
+
separate rows with generous spacing") — adjacent meters otherwise cluster
|
|
32
|
+
into one crop and the extraction tools refuse the pair.
|
|
29
33
|
|
|
30
34
|
## The template
|
|
31
35
|
|
|
@@ -180,11 +180,18 @@ cycle watched AS RENDERED. A metadata probe (ffprobe) can't see a seam, a
|
|
|
180
180
|
panel covering the video, or a video that never plays — only watching can.
|
|
181
181
|
|
|
182
182
|
**Work async — the menu must never block the game.** The still is
|
|
183
|
-
`--edit`-anchored to the concept mockup, so it's style-dependent:
|
|
184
|
-
the moment the
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
183
|
+
`--edit`-anchored to the concept mockup, so it's style-dependent: enqueue it
|
|
184
|
+
`--no-wait` **the moment the concept mockup LANDS** — it rides the same
|
|
185
|
+
immediate chain as the HUD Stage-2 sheet and the logotype; the user's
|
|
186
|
+
keep/change answer never gates it (a later "change" just re-edits it against
|
|
187
|
+
the new frame, image-priced). **Only the VIDEO — the expensive item — waits,
|
|
188
|
+
and its trigger is an event, never a clock: fire it at the FIRST of (a) the
|
|
189
|
+
user's yes to the concept, (b) the next `genex preview` push after the still
|
|
190
|
+
has landed (a shipped milestone with the user silent = the pick stands), or
|
|
191
|
+
(c) style art being the only work left. Never fire it while a user objection
|
|
192
|
+
is open** ("change the colors" blocks it until the loop resolves). Ship the
|
|
193
|
+
CSS menu (buttons + title over the frame IMAGE as a static backdrop) and
|
|
194
|
+
swap the `<video>` in when `genex wait` prints the URL. The frame image doubles as the
|
|
188
195
|
**loading screen background** — it exists minutes before the video does (see
|
|
189
196
|
`$genex-threejs-game-ui`'s loader spec). Both assets live in Genex storage
|
|
190
197
|
(R2) — permanent, public, CORS-open; you load them straight from the printed
|
|
@@ -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
|
|
@@ -58,7 +71,10 @@ for the user. Ask only what genuinely forks the build:
|
|
|
58
71
|
- any real ambiguity in the request itself.
|
|
59
72
|
|
|
60
73
|
Never ask about SDKs, engines, renderers, file layout, or anything
|
|
61
|
-
technical — those are your decisions.
|
|
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
|
|
62
78
|
to answer, proceed on your own stated assumptions and write each one into
|
|
63
79
|
DESIGN.md → Decisions as "assumed — player didn't answer"; the build never
|
|
64
80
|
stalls on the interview.
|
|
@@ -132,7 +148,7 @@ game that needs concrete objects or surfaces, decide a small core set from the
|
|
|
132
148
|
game IDEA — and from the Content lines when there are any (locations and the
|
|
133
149
|
enemy roster name the set) — and put it in the Assets table up front. This set
|
|
134
150
|
is concept-INDEPENDENT (prompted from the idea, not the concept image, and it
|
|
135
|
-
mostly survives a style change), so it
|
|
151
|
+
mostly survives a style change), so it never waits on the concept at all. Each
|
|
136
152
|
`npx genex` job is an independent ~1-minute render: launch them concurrently
|
|
137
153
|
in the background (`--no-wait`), scaffold the scene while they run, and wire
|
|
138
154
|
each in as it lands, with a procedural placeholder until then:
|
|
@@ -164,11 +180,18 @@ The mandatory rows, in order, each with its one "done when" line:
|
|
|
164
180
|
shows; the tier is what keeps a phone boot alive.
|
|
165
181
|
3. **UI plan gate** — `$genex-threejs-game-ui`, every game: the screen
|
|
166
182
|
inventory, one shared style brief, 2–3 AAA references, the menu archetype,
|
|
167
|
-
then
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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.
|
|
172
195
|
4. **Content contract when the request names plural content** — quests,
|
|
173
196
|
enemies, bosses, locations, spells, items, or a content genre (an RPG, an
|
|
174
197
|
adventure, an open world, a story game) — `$genex-threejs-game-content`.
|
|
@@ -188,10 +211,26 @@ The mandatory rows, in order, each with its one "done when" line:
|
|
|
188
211
|
declares its `genex.matchmaking` block before preview. Done when: the
|
|
189
212
|
model, start rule, and late-join behavior are stated in DESIGN.md and the
|
|
190
213
|
netcode feel gate ran before handoff.
|
|
191
|
-
7. **Ship the
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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.
|
|
195
234
|
|
|
196
235
|
Two rules for every game that moves (decide both before building, state them
|
|
197
236
|
in DESIGN.md):
|
|
@@ -227,10 +266,12 @@ agent: you stay the director.
|
|
|
227
266
|
rule is anti-collision, never a reason to serialize work.
|
|
228
267
|
- You stay the integrator and the only writer of shared files (boot, main
|
|
229
268
|
loop, netcode). Workers never spawn workers — one level deep, always.
|
|
230
|
-
- Concept-DEPENDENT rows (the HUD chain, style-matched art)
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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.
|
|
234
275
|
- Give each worker everything by path: the `DESIGN.md` path, its Modules row,
|
|
235
276
|
and the skill files it needs (skills live in this project —
|
|
236
277
|
`.claude/skills/<name>/SKILL.md`, `.codex/skills/…`, or `.cursor/skills/…`,
|
|
@@ -40,8 +40,8 @@ the bottom._
|
|
|
40
40
|
|
|
41
41
|
## Concept
|
|
42
42
|
One paragraph: what the game is, what playing it feels like.
|
|
43
|
-
Concept image: <asset URL> (
|
|
44
|
-
|
|
43
|
+
Concept image: <asset URL> (standing — shown <date>; player said
|
|
44
|
+
<yes | nothing — pick stands | change → looped>)
|
|
45
45
|
|
|
46
46
|
## Core loop
|
|
47
47
|
- **You do:** <primary verb — drive, shoot, build…>
|
|
@@ -61,19 +61,35 @@ Every plural noun from the request becomes a countable line:
|
|
|
61
61
|
## Screens & UI
|
|
62
62
|
Screens: <loader, menu, HUD, pause, win/lose…> · Style brief: <one line>
|
|
63
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)>
|
|
64
67
|
|
|
65
68
|
## Assets — the generation plan AND the budget
|
|
66
69
|
| Asset | Kind | Status | Wired? |
|
|
67
70
|
|------------------|-------------|---------------------------------|--------|
|
|
68
|
-
| Concept + HUD | image | landed → <URL>
|
|
71
|
+
| Concept + HUD | image | landed → <URL> | n/a |
|
|
69
72
|
| <main surface> | texture | generating (<id>) | — |
|
|
70
73
|
| <hero model> | model | planned | — |
|
|
71
74
|
| Background music | music | planned (one ~90s looping track)| — |
|
|
72
|
-
| Menu still
|
|
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>) | — |
|
|
73
78
|
Status flow: proposed → planned → generating (id) → landed (URL) → wired.
|
|
74
79
|
(Optionally note the prompt gist per row — it makes style-change re-rolls one
|
|
75
80
|
command.)
|
|
76
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
|
+
|
|
77
93
|
## World & scale
|
|
78
94
|
<Size in numbers if open world; arena bounds otherwise. Streamed terrain? y/n>
|
|
79
95
|
|
|
@@ -89,7 +105,7 @@ click (when a Play screen exists).
|
|
|
89
105
|
| World/terrain | src/world/** | sub-agent when available | walkable, matches World & scale |
|
|
90
106
|
| Quests & dialogue data | src/content/** | sub-agent when available | counts match Content lines |
|
|
91
107
|
| Enemies/AI | src/enemies/** | sub-agent when available | roster matches Content |
|
|
92
|
-
| HUD chain (style-dependent) | src/ui/** | sub-agent
|
|
108
|
+
| HUD chain (style-dependent) | src/ui/** | sub-agent on concept landing | all screens from Screens & UI |
|
|
93
109
|
|
|
94
110
|
## Decisions & changes
|
|
95
111
|
- <date> — <one-liner per decision, including anything the player said no or
|
|
@@ -106,7 +122,7 @@ A scrap-robot arena shooter: you skate a magnetized junkyard bot around a
|
|
|
106
122
|
crusher pit, blasting rival bots into spare parts before the magnet cycle
|
|
107
123
|
pulls everything in. Fast, crunchy, thirty-second lives.
|
|
108
124
|
Concept image: https://assets.genex.technology/g/rustyard/concept.png
|
|
109
|
-
(
|
|
125
|
+
(standing — shown 2026-07-20; player said yes)
|
|
110
126
|
|
|
111
127
|
## Core loop
|
|
112
128
|
- **You do:** skate + shoot
|
|
@@ -121,17 +137,26 @@ Concept image: https://assets.genex.technology/g/rustyard/concept.png
|
|
|
121
137
|
Screens: loader, title menu, HUD (health, scrap, cycle timer), pause,
|
|
122
138
|
win/lose. Style brief: oily metal, warning-stripe accents, stencil type.
|
|
123
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
|
|
124
143
|
|
|
125
144
|
## Assets
|
|
126
145
|
| Asset | Kind | Status | Wired? |
|
|
127
146
|
|------------------|---------|----------------------------|--------|
|
|
128
|
-
| Concept + HUD | image | landed → <URL>
|
|
147
|
+
| Concept + HUD | image | landed → <URL> | n/a |
|
|
129
148
|
| Junkyard ground | texture | landed → <URL> | yes |
|
|
130
149
|
| Player bot | model | generating (gen_8f2k) | — |
|
|
131
150
|
| Rival bot | model | planned | — |
|
|
132
151
|
| Overcast sky | skybox | landed → <URL> | yes |
|
|
133
152
|
| Blaster zap | sfx | landed → <URL> | yes |
|
|
134
|
-
| 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
|
|
135
160
|
|
|
136
161
|
## World & scale
|
|
137
162
|
One 60×60 m arena, walled; no streaming.
|
|
@@ -88,24 +88,28 @@ Three.js release or branch, and do not blindly copy demo architecture.
|
|
|
88
88
|
decided silently. FIRST of all art, generate the gate's **concept mockup** —
|
|
89
89
|
a playable-moment shot (verb + threat + objective in frame, per the
|
|
90
90
|
game-ui gate) WITH the full HUD composited over it: the `$genex-ai-hud`
|
|
91
|
-
Stage-1 image,
|
|
92
|
-
HUD blueprint (never a separate UI-free concept first
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
91
|
+
Stage-1 image, ONE generation serving as concept, style checkpoint, and
|
|
92
|
+
HUD blueprint (never a separate UI-free concept first, and no candidate
|
|
93
|
+
variants unless the player asks for them). **The moment it lands, the
|
|
94
|
+
cheap style chain fires — nothing waits for the player here**: decide the
|
|
95
|
+
HUD lane as art director and record the `HUD lane:` line in DESIGN.md
|
|
96
|
+
(director §5), then enqueue with `--no-wait` the `$genex-ai-hud` Stage-2
|
|
97
|
+
sheet, the `$genex-ai-menu` still (the menu is the default for every
|
|
98
|
+
game — "it's only a draft" is not a reason to decide no), and the
|
|
99
|
+
logotype. THEN show the player the frame and ask keep-or-change through
|
|
100
|
+
your question tool (a short numbered list in chat when you have none) —
|
|
101
|
+
the answer is INFORMATION, never a gate: silence means the concept
|
|
102
|
+
stands; "change" loops the concept with their notes and the chain re-runs
|
|
103
|
+
from the new frame (image-priced — cheap by design; the game-ui skill
|
|
104
|
+
owns the re-anchor loop). Only the menu VIDEO waits, for the FIRST of:
|
|
105
|
+
the player's yes · the next `genex preview` after the menu still landed ·
|
|
106
|
+
style work being the only work left — and never while a player objection
|
|
107
|
+
is open (two failed videos → ship the still). Later `--edit`-able
|
|
108
|
+
generations anchor to the standing frame for STYLE while the game
|
|
109
|
+
contract owns content. Everything concept-independent — scaffold, boot
|
|
110
|
+
wiring, the core loop, the worker lanes — keeps building in parallel.
|
|
111
|
+
Skipping this enqueue is the #1 way a finished game ships an ugly HUD —
|
|
112
|
+
by step 12 there is nothing to swap in.
|
|
109
113
|
4. Lock the visual direction — the same plan-first logic as the UI gate, in
|
|
110
114
|
the same plan block, before any rendering code:
|
|
111
115
|
- **camera**: the rig type and the pointer bucket
|
|
@@ -250,12 +254,15 @@ Three.js release or branch, and do not blindly copy demo architecture.
|
|
|
250
254
|
`$genex-threejs-game-ui` (HUD, pause on Escape, fail/retry, win, and the
|
|
251
255
|
full loading state grown from the step-6 loader), then `npx genex wait`
|
|
252
256
|
the step-3 UI generations and wire them in — the sprite HUD replaces the
|
|
253
|
-
placeholder CSS
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
257
|
+
placeholder CSS (or the recorded `HUD lane: CSS` build lands finished to
|
|
258
|
+
its brief), the menu video replaces the still frame (wired with the menu
|
|
259
|
+
skill's loop crossfade), the logotype lands on the menu and loader, and
|
|
260
|
+
the scene's planned generated models replace their placeholder
|
|
261
|
+
primitives — a shipped wave of enemies may not be untextured boxes. This
|
|
262
|
+
swap is a completion gate, not an option: a game still on the
|
|
263
|
+
placeholder CSS HUD (with no recorded CSS lane), without the menu video
|
|
264
|
+
playing (or its recorded still fallback), or without a working Escape
|
|
265
|
+
pause, is not done. Then run a feel pass via
|
|
259
266
|
`$genex-threejs-game-feel` (input response, camera, impact feedback,
|
|
260
267
|
retry speed).
|
|
261
268
|
13. Validate in a real browser with fixed seeds, captures, interaction checks,
|
|
@@ -264,8 +271,9 @@ Three.js release or branch, and do not blindly copy demo architecture.
|
|
|
264
271
|
## Delegation
|
|
265
272
|
|
|
266
273
|
Fan-out is owned by the director: sub-agents own DESIGN.md Modules rows,
|
|
267
|
-
concept-DEPENDENT lanes
|
|
268
|
-
|
|
274
|
+
concept-DEPENDENT lanes launch the moment the concept lands (only the menu
|
|
275
|
+
video waits for its event triple — step 3), one writer per file, workers
|
|
276
|
+
never spawn workers, and the Assets table is the budget —
|
|
269
277
|
the full rules and the worker prompt shape live in the Delegate section of
|
|
270
278
|
`$genex-game-director`. This map adds no separate delegation rules; it is the
|
|
271
279
|
routing source the director and its workers read.
|
|
@@ -285,7 +293,9 @@ routing source the director and its workers read.
|
|
|
285
293
|
done = a screenshot plus an interaction smoke check (load the page, press each
|
|
286
294
|
control, assert a visible response in its labeled direction — `$genex-threejs-visual-validation` has the
|
|
287
295
|
procedure), **plus the UI floor from `$genex-threejs-game-ui` (the generated
|
|
288
|
-
sprite HUD wired in — not the CSS placeholder —
|
|
296
|
+
sprite HUD wired in — not the CSS placeholder — or the DESIGN.md-recorded
|
|
297
|
+
`HUD lane: CSS` build finished to its brief; the menu video playing, or its
|
|
298
|
+
recorded still fallback; the logotype placed; pause on Escape, the branded
|
|
289
299
|
loader with its key-art background, the brief's font pair actually loaded)
|
|
290
300
|
and the look floor (the step-4 renderer baseline + named post stack actually
|
|
291
301
|
built; every placed 2D/media piece — decals, posters, in-world screens —
|
|
@@ -323,7 +333,9 @@ A routed Genex scene is incomplete until it exposes:
|
|
|
323
333
|
## Publish and multiplayer awareness
|
|
324
334
|
|
|
325
335
|
**Publishing IS calling it done.** Before `npx genex publish`, every completion
|
|
326
|
-
gate above must pass — sprite HUD wired
|
|
336
|
+
gate above must pass — sprite HUD wired (or the recorded CSS lane finished),
|
|
337
|
+
the menu video playing (or its recorded still fallback), the logotype placed,
|
|
338
|
+
Escape pause working, branded loader
|
|
327
339
|
with its key art, fonts loaded, renderer baseline + one built post effect
|
|
328
340
|
(tier-aware), the adaptive-quality tier wired at boot, world dressing placed
|
|
329
341
|
or validly waived, and the content contract's countables present or
|
|
@@ -339,6 +339,25 @@ exempt — the local player may be invisible to themselves
|
|
|
339
339
|
- Load `$genex-threejs-multiplayer` before writing any networking code; it is
|
|
340
340
|
mandatory for any 2+ player game.
|
|
341
341
|
|
|
342
|
+
## Placing rigs outside the controller — facing is explicit
|
|
343
|
+
|
|
344
|
+
The vendored controller owns the local player's facing. Any rig you place
|
|
345
|
+
YOURSELF — a duel opponent, an NPC, a fighter in a side-view game — obeys
|
|
346
|
+
three hard rules:
|
|
347
|
+
|
|
348
|
+
- **Meshy / Mixamo / VRM rigs rest facing +Z** — from a side camera that
|
|
349
|
+
means straight at the lens. Set the yaw explicitly from the character's
|
|
350
|
+
ROLE the moment you place it (`model.rotation.y = …`); never leave the
|
|
351
|
+
rest pose and assume it reads right.
|
|
352
|
+
- **Never mirror a SkinnedMesh with negative scale.** `scale.x = -1` is a
|
|
353
|
+
2D-sprite trick: on a 3D rig it flips triangle winding and normals
|
|
354
|
+
(broken lighting and culling) and does NOT turn the character. Turning is
|
|
355
|
+
always a yaw rotation.
|
|
356
|
+
- **Duel / side-view / two-character scenes: the combatants face EACH
|
|
357
|
+
OTHER along the duel axis.** Two fighters staring into the camera is a
|
|
358
|
+
bug, not a pose — verify it in the milestone smoke capture (an enemy in
|
|
359
|
+
frame facing the player's CHARACTER, never the lens).
|
|
360
|
+
|
|
342
361
|
## If the user asks for ecctrl
|
|
343
362
|
|
|
344
363
|
ecctrl is a React / React Three Fiber component; a Genex game is plain
|
|
@@ -140,6 +140,14 @@ front of it once — it must face you. This is part of the milestone smoke
|
|
|
140
140
|
pass once enemies exist (an enemy in frame, facing the player). Set the
|
|
141
141
|
`yawCorrection` constant per model and move on.
|
|
142
142
|
|
|
143
|
+
Two hard rules alongside it: **never mirror a rig with negative scale** —
|
|
144
|
+
`scale.x = -1` is a 2D-sprite trick that flips winding and normals on a
|
|
145
|
+
SkinnedMesh and does NOT turn a 3D body; turning is always a yaw
|
|
146
|
+
(`rotation.y`), set explicitly from the creature's role. And in any
|
|
147
|
+
**duel / side-view / two-character scene**, the combatants face EACH OTHER
|
|
148
|
+
along the duel axis — a fighter staring into the camera is a bug, not a
|
|
149
|
+
pose, and the smoke capture is where it gets caught.
|
|
150
|
+
|
|
143
151
|
### 3. Hit reaction — damage reads on the body
|
|
144
152
|
|
|
145
153
|
Rigged: the `hit` clip above. Procedural: a 100–150 ms flinch — scale pulse
|