@homie-rocks/studio 0.48.4 → 0.50.0
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/CHANGELOG.md +46 -0
- package/app-starters/gathering/README.md +4 -0
- package/app-starters/gathering/app.json +162 -0
- package/app-starters/gathering/index.html +3 -0
- package/app-starters/gathering/map/main.json +1 -0
- package/app-starters/gathering/src/move.ts +3 -0
- package/app-starters/gathering/src/rules.ts +21 -0
- package/app-starters/gathering/src/view.ts +74 -0
- package/app-starters/giving/README.md +5 -0
- package/app-starters/giving/app.json +162 -0
- package/app-starters/giving/index.html +3 -0
- package/app-starters/giving/map/main.json +1 -0
- package/app-starters/giving/src/move.ts +3 -0
- package/app-starters/giving/src/rules.ts +21 -0
- package/app-starters/giving/src/view.ts +74 -0
- package/app-starters/jobs/README.md +4 -0
- package/app-starters/jobs/app.json +162 -0
- package/app-starters/jobs/index.html +3 -0
- package/app-starters/jobs/map/main.json +1 -0
- package/app-starters/jobs/src/move.ts +3 -0
- package/app-starters/jobs/src/rules.ts +21 -0
- package/app-starters/jobs/src/view.ts +74 -0
- package/app-starters/quiz/README.md +4 -0
- package/app-starters/quiz/app.json +162 -0
- package/app-starters/quiz/index.html +3 -0
- package/app-starters/quiz/map/main.json +1 -0
- package/app-starters/quiz/src/move.ts +3 -0
- package/app-starters/quiz/src/rules.ts +21 -0
- package/app-starters/quiz/src/view.ts +74 -0
- package/app-starters/welcome/app.json +25 -2
- package/app-starters/welcome/index.html +1 -1
- package/app-starters/welcome/src/view.ts +20 -8
- package/bin/homie-studio.mjs +20 -16
- package/functions/FUNCTIONS.md +1 -1
- package/guides/app/SKILL.md +178 -0
- package/guides/art/SKILL.md +154 -0
- package/guides/art/references/RIGHTS.md +20 -0
- package/guides/art/scripts/art.mjs +308 -0
- package/guides/models/SKILL.md +198 -0
- package/guides/models/references/RIGHTS.md +46 -0
- package/guides/models/references/models.json +175 -0
- package/guides/models/scripts/models.mjs +483 -0
- package/guides/music/SKILL.md +197 -0
- package/guides/music/references/COMPOSITION.md +59 -0
- package/guides/music/references/GAME-AUDIO.md +50 -0
- package/guides/music/references/RIGHTS.md +43 -0
- package/guides/music/scripts/lib/audio.mjs +258 -0
- package/guides/music/scripts/lib/eleven.mjs +260 -0
- package/guides/music/scripts/lib/studio.mjs +147 -0
- package/guides/music/scripts/music.mjs +644 -0
- package/guides/parts/SKILL.md +158 -0
- package/guides/plan/SKILL.md +126 -0
- package/guides/plan/references/CODEX.md +105 -0
- package/guides/plan/references/INTERVIEW.md +86 -0
- package/guides/playtest/SKILL.md +205 -0
- package/guides/playtest/references/METHOD.md +124 -0
- package/guides/playtest/references/REVIEWER.md +78 -0
- package/guides/playtest/scripts/lib/exit.mjs +31 -0
- package/guides/playtest/scripts/lib/judge.mjs +502 -0
- package/guides/playtest/scripts/lib/pixels.mjs +128 -0
- package/guides/playtest/scripts/lib/preflight.mjs +69 -0
- package/guides/playtest/scripts/playtest.mjs +870 -0
- package/guides/shop/SKILL.md +153 -0
- package/guides/sound/SKILL.md +156 -0
- package/guides/sound/references/GAME-SOUND.md +100 -0
- package/guides/sound/references/SCORE.md +131 -0
- package/guides/sound/references/TRAPS.md +93 -0
- package/guides/sound/scripts/lib/measure.mjs +252 -0
- package/guides/sound/scripts/lib/score.mjs +415 -0
- package/guides/sound/scripts/lib/sfx.mjs +222 -0
- package/guides/sound/scripts/lib/synth.mjs +509 -0
- package/guides/sound/scripts/sound.mjs +520 -0
- package/guides/studio-setup/SKILL.md +419 -0
- package/guides/style/SKILL.md +105 -0
- package/lib/app-needs.mjs +63 -0
- package/lib/authoring-guides.mjs +5 -4
- package/lib/build.mjs +5 -4
- package/lib/check-site.mjs +6 -6
- package/lib/check.mjs +18 -5
- package/lib/codex.mjs +95 -18
- package/lib/decisions.mjs +9 -7
- package/lib/dev.mjs +4 -2
- package/lib/doctor.mjs +1 -1
- package/lib/handoff.mjs +13 -8
- package/lib/mcp-tools.mjs +19 -17
- package/lib/mcp.mjs +1 -1
- package/lib/parts.mjs +6 -6
- package/lib/scaffold.mjs +45 -11
- package/lib/shop-links.mjs +2 -2
- package/lib/shop.mjs +5 -3
- package/lib/studio.mjs +7 -6
- package/lib/template-history.json +84 -0
- package/package.json +4 -4
- package/shop/SHOP.md +4 -0
- package/shop/shop.ts +4 -4
- package/worker/app-format.mjs +1 -1
- package/worker/build-id.mjs +1 -1
- package/worker/functions-schema.mjs +15 -0
- package/worker/index.mjs +2 -1
- package/worker/parts.mjs +4 -4
- package/worker/shop-page.mjs +22 -16
- package/worker/shop-rules.mjs +4 -3
- package/worker/shop.mjs +6 -2
- package/worker/site.mjs +4 -2
- package/worker/version.mjs +1 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: parts
|
|
3
|
+
description: Studios build on each other with parts from games, apps, music and video that their owners choose to share or sell (a creature, a level generator, a chase camera, a bot brain, a pickup mechanic, an audio pack). Use this when planning or making games, apps, music or video (look for pieces before writing one from scratch), when the person asks what parts exist, says "use the X from that game", "make this reusable" or "share this", and before a game that uses parts goes online.
|
|
4
|
+
compatibility: Node 22. Paid purchases need @homie-rocks/studio 0.37.2 or later. A studio made with @homie-rocks/studio; npm installs the packages a part builds on.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
**Apps:** For a business, venue, cause or customer app, follow the `app` skill: `apps/<id>/app.json`, one morphing screen, roles and parts. Reuse these engines and workflows; do not impose game rounds, scores, bots, a game demo or page navigation. The app check proves shared actions and reconnect; app stores use the same standalone command.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Studio parts: games, apps, music and video
|
|
11
|
+
|
|
12
|
+
A studio is the folder with `studio.json`. Studios build on each other with **parts**: reusable pieces of games, apps, music and video that their owners choose to share or sell. A creature from one game, a level from
|
|
13
|
+
another, a bot brain from a third. Without parts you would have to come up with everything on your own.
|
|
14
|
+
|
|
15
|
+
The rules, in full in `node_modules/@homie-rocks/studio/parts/PARTS.md`:
|
|
16
|
+
|
|
17
|
+
1. Game and app lifting extracts a piece, **never the whole experience**. App components can also be lifted from `apps/<id>/`; music loops or tracks and video may be authored directly in `parts/<id>/`; their licence controls permitted use, including venue use.
|
|
18
|
+
2. A part can take **any form** that suits the piece: code, assets, data, a JSON description, a tuned config, a mix.
|
|
19
|
+
3. **Private until shared**: on purpose, with a licence (an SPDX identifier) and an attribution. A part records the
|
|
20
|
+
game and studio it came from.
|
|
21
|
+
4. **Homie packages are not parts.** `@homie-rocks/*` packages are general mechanisms from npm. A part may say
|
|
22
|
+
which packages it builds on; npm installs them.
|
|
23
|
+
5. **The person works in chat** and never types a command. Four tools: `parts_find`, `part_add`, `part_new`,
|
|
24
|
+
`part_share`.
|
|
25
|
+
6. **You look for parts first.**
|
|
26
|
+
|
|
27
|
+
There is no mash-up command: mashing up is making a game with parts from several games.
|
|
28
|
+
|
|
29
|
+
## 1. Look first
|
|
30
|
+
|
|
31
|
+
When planning or making a game, app, music or video, for each system it needs (camera, movement, bots, pickups, effects, sound, UI,
|
|
32
|
+
environment, characters), before writing it from scratch:
|
|
33
|
+
|
|
34
|
+
1. Check the `@homie-rocks/*` packages the studio has for the general mechanism.
|
|
35
|
+
2. `parts_find` with the words for the piece (`"chase camera"`, `"cave"`, `"pickups"`), and `kind`, `tag`,
|
|
36
|
+
`license` or `builds` (a package or a skeleton it builds on) to narrow it.
|
|
37
|
+
3. Tell the person what you found, a line each, **naming the source work and studio each piece is from**, with your pick.
|
|
38
|
+
|
|
39
|
+
If the catalogue cannot be reached, the tool says so. That is not "nothing exists": say it could not be read, go on
|
|
40
|
+
with what the studio has, and look again later. If it answered and nothing fits, write the piece.
|
|
41
|
+
|
|
42
|
+
Record in the project notes or CODEX, under **Built from**, what came from where: the packages, each part with its game,
|
|
43
|
+
studio and licence, and what you wrote from scratch and why.
|
|
44
|
+
|
|
45
|
+
## 2. Use a part
|
|
46
|
+
|
|
47
|
+
`part_add` with `"<studio site>/<part id>"` (as `parts_find` gave it; `@1.2.0` for one version) and the `game` option (a game or app id; omit it for standalone media). It
|
|
48
|
+
fetches one exact version, checks every file's integrity before anything is written, copies it into the studio
|
|
49
|
+
(the studio's to tune from then on), records where it came from, adds the credit to the game, and lets npm install
|
|
50
|
+
the packages it builds on. Read what it answers:
|
|
51
|
+
|
|
52
|
+
- **The import line**: `import … from '@parts/<studio site>/<part id>'`. Its `part.json` says what the piece takes
|
|
53
|
+
(`contract`) and who decides in a room; its `tuning.json` holds the values to tune.
|
|
54
|
+
- **Packages**: npm's own words. If a package the studio already names does not fit, nothing was changed: tell the
|
|
55
|
+
person which part wants what.
|
|
56
|
+
- **Other parts it names**: each with what adds it.
|
|
57
|
+
- **Licences that cannot be combined** are said plainly. Tell the person before building on it.
|
|
58
|
+
- **The credit** in the game's `credits.json`: keep it, whatever else changes.
|
|
59
|
+
|
|
60
|
+
Adding the same part again later brings the newer version: it shows what changed and keeps `tuning.json`. A file
|
|
61
|
+
the studio edited is not replaced unless you pass `overwrite`: ask the person first.
|
|
62
|
+
|
|
63
|
+
Then build, and try it on two devices.
|
|
64
|
+
|
|
65
|
+
## 3. Make a part
|
|
66
|
+
|
|
67
|
+
After building a piece another game could use, offer it in one line: "The chase camera turned out reusable. Shall
|
|
68
|
+
I make it a part, so your next game can use it? It stays private unless you ask to share it."
|
|
69
|
+
|
|
70
|
+
`part_new` with `id`, `from` (the game or app) and `files` (the module or folder of that piece). The files are lifted out
|
|
71
|
+
into `parts/<id>/`, the game imports them from there, and **the game still builds and plays the same**: build it
|
|
72
|
+
and check. A file that reaches into the rest of the game is refused by name: pass what it needs in as an argument
|
|
73
|
+
(a collision function, a palette, the room), then lift it. The game's own entry cannot be lifted: a part is never
|
|
74
|
+
the whole game.
|
|
75
|
+
|
|
76
|
+
Then fill `parts/<id>/part.json`: a one-sentence `summary`, tags, what it takes from a game (`contract`), the
|
|
77
|
+
packages it builds on (`requires.packages`), its scale and skeleton if it has them, costs only if measured, a small
|
|
78
|
+
`preview/index.html` that shows it, and its tunables in `tuning.json`.
|
|
79
|
+
|
|
80
|
+
When the preview is something to play with, declare its shape in `preview`: `"aspect": "4:3"` and
|
|
81
|
+
`"phoneAspect": "3:4"` (whole numbers 1 to 32, no flatter than 3:1, no taller than 1:2). The default is 16:9, which
|
|
82
|
+
on a 390 px phone is a frame about 197 px tall: the controls fit and the demo under them is cut off, with no error.
|
|
83
|
+
|
|
84
|
+
## 4. Share a part, only when the person asks
|
|
85
|
+
|
|
86
|
+
Ask which licence (`CC-BY-4.0` for "use it, credit me", `CC0-1.0` for "no strings", `MIT` for code) and who to
|
|
87
|
+
credit. `part_share` with `share: true`, `license` and `attribution`. It refuses in plain words when there is no
|
|
88
|
+
SPDX licence, credit is owed and nobody is named, the part does not say where it came from, or the rights to a
|
|
89
|
+
file are unknown (for example a model the studio bought): leave that file out or replace it, never work around it.
|
|
90
|
+
`part_share` with no `share` only checks.
|
|
91
|
+
|
|
92
|
+
It is **live after the studio's next deploy** (`studio_deploy`), not before: say so. Then the studio's site lists
|
|
93
|
+
it and the catalogue on homie.rocks shows it if the studio is listed there. `share: false` stops it at the next
|
|
94
|
+
deploy. A shared version never changes: a change needs a new `version`, then share again.
|
|
95
|
+
|
|
96
|
+
## 5. Before a game that uses parts goes online
|
|
97
|
+
|
|
98
|
+
The deploy plan (`studio_deploy` with `plan: true`) and the listing (`studio_publish`, and its `before: true`)
|
|
99
|
+
show each part's licence and attribution and say plainly
|
|
100
|
+
when licences cannot be combined: two share-alike licences in one game, a non-commercial part in a studio with a
|
|
101
|
+
shop, a no-derivatives part that was edited. Tell the person, and settle it before deploying.
|
|
102
|
+
|
|
103
|
+
## Never
|
|
104
|
+
|
|
105
|
+
- Share a part the person did not ask to share, or pick its licence for them.
|
|
106
|
+
- Copy a piece from another studio by hand: `part_add` is what checks it and writes the credit.
|
|
107
|
+
- Remove or reword a credit a part wrote.
|
|
108
|
+
- Treat a package as a part, or a whole game as one.
|
|
109
|
+
|
|
110
|
+
## Paid parts: use the person's wallet
|
|
111
|
+
|
|
112
|
+
Needs studio **0.36.0** or later. Read the full settings and recovery procedure in
|
|
113
|
+
`node_modules/@homie-rocks/studio/parts/PARTS.md`.
|
|
114
|
+
|
|
115
|
+
Show the exact quote, currency, quantity, recurring interval, licence, refund and update
|
|
116
|
+
terms from `part_add`. Ask first. Spending authority means the person's yes to this price in this conversation,
|
|
117
|
+
or a standing instruction that names a spending limit and covers these terms. A quote for a new release must show its new price. Never approve a
|
|
118
|
+
hash beside an earlier purchase's price.
|
|
119
|
+
|
|
120
|
+
Use the person's installed open wallet client: `HOMIE_PARTS_WALLET=link-cli` or `purl`. `part_add` invokes it after exact-quote approval. Money goes directly to the
|
|
121
|
+
selling studio's Stripe account. Wallet authority and limits belong to that wallet;
|
|
122
|
+
never create another spending mechanism or disable its controls. Link currently requires
|
|
123
|
+
the person to approve each card spend in their wallet app. Give them the returned wallet
|
|
124
|
+
approval link, then retry `part_add` after approval. This is not a seller checkout page.
|
|
125
|
+
|
|
126
|
+
Checkout is the fallback when there is no compatible wallet, for recurring purchases,
|
|
127
|
+
and where the protocol cannot quote the final total. On this fallback the person must
|
|
128
|
+
accept the licence and operate Pay themselves. Never submit licence acceptance through
|
|
129
|
+
a browser tool. A base price before tax is not Stripe's final total.
|
|
130
|
+
|
|
131
|
+
Keep private purchase records and verified backups private. Never give a catalogue the
|
|
132
|
+
claim or download token. A proof is evidence, not a download credential. First delivery
|
|
133
|
+
and updates depend on the seller; an existing verified backup restores offline.
|
|
134
|
+
|
|
135
|
+
Use `parts refund` only when requested. Never pass `--receipt-verified` on the assistant's
|
|
136
|
+
own word: the seller must confirm matching the Stripe receipt and payer to the order.
|
|
137
|
+
Never approve an unknown buyer's test order. Test downloads require owner approval of
|
|
138
|
+
the exact claim, and do not become paid licences when the shop goes live.
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
Machine purchases use the seller's Stripe account. Only studios with paid releases need the
|
|
142
|
+
additional payment permissions. Connect and scheduled readiness use read-only provider calls;
|
|
143
|
+
readiness does not prove a funded settlement. Tempo is disabled; the offered methods are card
|
|
144
|
+
shared payment tokens and Base, subject to the seller's configuration and Stripe eligibility.
|
|
145
|
+
Respect the wallet owner's limits, including x402's default payment cap. A decline can use a
|
|
146
|
+
fresh approved token or the hosted fallback. An uncertain outcome must be reconciled first.
|
|
147
|
+
|
|
148
|
+
The office lists unresolved orders and their provider identifiers. Use Reconcile payments now;
|
|
149
|
+
a five-minute scheduled job also reads existing payments. After 23 hours it stops replaying
|
|
150
|
+
charges but continues reading. If paid files cannot be restored, the owner must refund manually.
|
|
151
|
+
For an unrecorded Base payment, send the exact refund from the seller address to the original
|
|
152
|
+
payer after the purchase, then record its hash with `shop refund <order> --manual-transaction
|
|
153
|
+
<hash>`. The chain must confirm the sender, recipient, amount and time before access ends.
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
For app, music and video parts, use `part_new` without `from`, choose any suitable kind label, put the licensed files in its folder, and supply the source as `{kind, id, studio}` in `from`. Preserve existing game manifests and imports. Hash and share through the usual tools. No new app build framework is implied.
|
|
157
|
+
|
|
158
|
+
Selling defaults to the keyless shop: `shop connect` uses the official Stripe CLI approval, creates Payment Links and the webhook, and installs the signing key privately. One approval if needed, zero for an already connected profile. Machine MPP/SPT and MCP charges and the Stripe-recorded x402 path need the fuller Worker credential. Read the payment-path table in PARTS.md before setup. With browser access, operate Stripe's key page for the owner, let them complete only provider verification prompts, click Copy, and run `shop connect --from-clipboard`. Never ask the owner to find or paste a key when this alternative is available. The command reads and clears the clipboard privately. Do not print its contents. No real-account verification is claimed by the release's stand-in tests.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan
|
|
3
|
+
description: Plan a game or app with the person before building it — sensible defaults from their request, with an interview only when requested that ends in the game's Game Codex, games/<id>/CODEX.md, drawn as a page in the game's own palette, fonts and art that anyone can read and steer (a Claude artifact where the app has artifacts, else a page in their browser, and a private page on the studio's site), kept true as decisions change, with the build's progress on it. Use for step 4 of a new studio, or when someone says "let's plan my game", "what should my game be", "make a design doc, a game bible or a codex", "show me the plan", or before a big change to a game.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
**One planning mechanism for games and apps.** For an app, use this workflow with `apps/<id>/CODEX.md`, created by `codex new <id> --kind app`. Its page, style decisions and build status use the same renderer as a game. Read the app skill's dream/scene/people/offers/needs instructions and fill those sections from the person's words; skip game-only sections and interviews. Build with the app skill, then prove its Codex needs on wall and phone. A starter is plumbing, never the planned scene. Choose engineering yourself and continue unless essential real-world information is missing.
|
|
7
|
+
|
|
8
|
+
# Plan a game: defaults and its Game Codex
|
|
9
|
+
|
|
10
|
+
You are in a Homie studio (a folder with `studio.json`) with a game in `games/<id>/`. The plan
|
|
11
|
+
comes out as the game's **Game Codex**: `games/<id>/CODEX.md` (the source of truth, in the studio's
|
|
12
|
+
repository) and a page drawn from it in the game's own look, with cards, tables and a Build status
|
|
13
|
+
tab. People who never read code see the game in it and steer it; you keep it true.
|
|
14
|
+
|
|
15
|
+
The implementation default is rules plus view on a server room, up to 32 seats.
|
|
16
|
+
Choose engineering details yourself; never ask the person to choose hosting, ownership,
|
|
17
|
+
tick rate or serialization. Capture the requested mechanic, controls, outcomes and visual
|
|
18
|
+
identity in the Codex. Read the game skill's RULES.md before implementing. A live app uses
|
|
19
|
+
the same transient rooms, without mandatory scores/bots/rounds, plus authorized records.
|
|
20
|
+
|
|
21
|
+
## 1. Decide from the request
|
|
22
|
+
|
|
23
|
+
Default to doing the planning yourself. Choose genre, controls, camera, palette, room size,
|
|
24
|
+
round length, bots and scope from the person's premise. Use phones and computers, a small first
|
|
25
|
+
version, CC0 art and local sound. Infer cloud saves for persistent characters and collections;
|
|
26
|
+
short standalone rounds need none. Record decisions in the codex and continue building.
|
|
27
|
+
Never route engineering or design questions to the person. A pub or charity may want an app;
|
|
28
|
+
do not force a game interview onto it. Ask only when the intended outcome is missing.
|
|
29
|
+
|
|
30
|
+
When the person explicitly asks to plan together, use references/INTERVIEW.md as an optional
|
|
31
|
+
conversation aid. Their earlier answers count. Paid media needs a budget; use local assets until then.
|
|
32
|
+
Run `style init <id> --prompt "<their words>"` with automatic defaults unless they requested hands-on styling.
|
|
33
|
+
|
|
34
|
+
### While planning: what already exists
|
|
35
|
+
|
|
36
|
+
Before the scope is fixed, look for what the game can be built from, two different things, and tell the person in a
|
|
37
|
+
line each:
|
|
38
|
+
|
|
39
|
+
- the `@homie-rocks/*` packages (npm) for the general mechanism: camera, input, audio, effects;
|
|
40
|
+
- `parts_find` for pieces other studios shared: a creature, a level generator, a bot brain. (With a shell and no
|
|
41
|
+
chat tools: `npx --no-install homie-studio parts find "<words>"`.)
|
|
42
|
+
|
|
43
|
+
Both go in the codex under **Built from**, with the game and studio each part came from and what will be written
|
|
44
|
+
from scratch (the `parts` skill).
|
|
45
|
+
|
|
46
|
+
## 2. Write the codex
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
npx --no-install homie-studio codex new <id> # games/<id>/CODEX.md with every section, in the studio's colours
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
A new studio has no game yet: its game is planned before it is made. With no game `<id>`, `codex new <id> --name
|
|
53
|
+
"<Name>"` starts the game's folder with only the codex in it, and once you have recorded the plan, `game new <id> --from
|
|
54
|
+
gem-rush --name "<Name>"` makes the game around it (the codex stays).
|
|
55
|
+
|
|
56
|
+
Never replace an existing codex: change it. Fill every section from the request and your defaults (the format, with an
|
|
57
|
+
example: `references/CODEX.md`):
|
|
58
|
+
|
|
59
|
+
- **The look in the frontmatter**: the game's own `palette` (`bg`, `ink`, `accent` for headings,
|
|
60
|
+
`accent2`, `danger`, `good`), `fonts` (a Google Fonts family that fits: "Press Start 2P" or "Silkscreen"
|
|
61
|
+
for pixel games, a font file from the game's folder, or none), `pixel: true` for pixel art, a `cover`
|
|
62
|
+
from the game's folder, an `eyebrow` and a `tagline`.
|
|
63
|
+
- **Cards, not prose**, wherever there are several of a thing: characters, creatures, classes, items,
|
|
64
|
+
places, levels. Each `### Name` has its picture, a chip line (`` `C-01` `good: Ally` `danger: Boss` ``),
|
|
65
|
+
an italic one-line subtitle, a sentence, and `**Key:** value` stats.
|
|
66
|
+
- **Controls** as a table with a column per device; **Milestones** as a checklist (`- [x]` done) that
|
|
67
|
+
matches the scope; **Latest** as dated decisions (`- 2026-10-01: ...`); **Open questions** as a list.
|
|
68
|
+
- **Pictures** only from the studio's folder (a real frame of the game, its sprites, its cover, art the
|
|
69
|
+
`art` skill made). Until the game has art, a card without a picture is fine; never present a mock-up
|
|
70
|
+
as the game.
|
|
71
|
+
|
|
72
|
+
## 3. Draw it and show it
|
|
73
|
+
|
|
74
|
+
```sh
|
|
75
|
+
npx --no-install homie-studio codex <id> # .studio/codex/<id>.html; says what is not decided yet
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
It reports the sections still empty (`missing`), the open questions and any picture it could not use.
|
|
79
|
+
Then show it where the person is:
|
|
80
|
+
|
|
81
|
+
- **An app with artifacts** (Claude Code's Artifact tool, the Claude app): `codex <id> --artifact`
|
|
82
|
+
writes `.studio/codex/<id>.artifact.html`, one self-contained page made to be published as an
|
|
83
|
+
artifact. Publish it (private to the person until they share it), and update the same artifact each
|
|
84
|
+
time the codex changes.
|
|
85
|
+
- **Otherwise**: `codex <id> --open` opens the page in their browser. It redraws itself whenever the
|
|
86
|
+
build's progress changes, and refreshes by itself while a build runs.
|
|
87
|
+
- **On their phone or anywhere else**, after a deploy: the site has it at `/_studio/codex/<id>/` for the
|
|
88
|
+
owner only, never listed; `npx --no-install homie-studio codex link <id>` gives a one-time link.
|
|
89
|
+
|
|
90
|
+
In the chat, say what you chose in one line, show the page, and continue. They can change it by asking.
|
|
91
|
+
|
|
92
|
+
## 4. Keep it true
|
|
93
|
+
|
|
94
|
+
- **Every decision that changes the plan goes into CODEX.md in the same change**, with a dated line
|
|
95
|
+
under Latest, and the page is redrawn (and the artifact updated).
|
|
96
|
+
- Tick milestones as they land; move answered open questions into their section.
|
|
97
|
+
- "Where are we?" or "how far along is it?": the codex's Build status tab (or
|
|
98
|
+
`npx --no-install homie-studio progress show`), in a line or two.
|
|
99
|
+
|
|
100
|
+
## 5. Progress, baked in
|
|
101
|
+
|
|
102
|
+
Open a progress feed for every build, titled with the milestone it works on:
|
|
103
|
+
|
|
104
|
+
```sh
|
|
105
|
+
npx --no-install homie-studio progress start <id> --title "Milestone 2: the valley and hand-offs"
|
|
106
|
+
npx --no-install homie-studio progress stage plan done --note "<the plan in one line>"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`build`, `check` and `deploy` report into it; mark what only you know with `progress check`,
|
|
110
|
+
`progress spend` and `progress log`; end it with `progress end passed|failed|stopped`. The codex's
|
|
111
|
+
**Build status** tab shows it: a percentage, each step and check going green, a "Ready to try" box (the
|
|
112
|
+
address and the codex's `try:` line), and what was spent. In Claude Code the status line shows one line
|
|
113
|
+
of it (offered in the setup step: `homie-studio statusline --install`). Codex CLI has no command status
|
|
114
|
+
line (its `tui.status_line` takes only built-in items), and Homie installs none in Grok Build, so in both the
|
|
115
|
+
codex page is the progress view.
|
|
116
|
+
|
|
117
|
+
## 6. The look, before the first model
|
|
118
|
+
|
|
119
|
+
Before anything is made for the game's look, its decisions exist (`style init`, above): the automatic path says
|
|
120
|
+
one line ("Look: flat low-poly, autumn grove palette, golden hour, high three-quarter camera; open the codex to
|
|
121
|
+
change anything"); the hands-on path shows the style board (`style_explore`, or `style board <id>`) and lets them
|
|
122
|
+
pick, mix, steer and lock. Models then come from the `models` skill, free routes first.
|
|
123
|
+
|
|
124
|
+
## 7. Then build
|
|
125
|
+
|
|
126
|
+
Build with the `game` skill, one agent by default. Use parallel agents when the person requested them.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# The Game Codex: the format
|
|
2
|
+
|
|
3
|
+
`games/<id>/CODEX.md` is plain Markdown that reads well on GitHub, plus a few conventions that
|
|
4
|
+
`homie-studio codex <id>` turns into a page in the game's own look. Everything in it is shown as text:
|
|
5
|
+
HTML in it is escaped, and an HTML comment (`<!-- … -->`) is a note for you that never shows.
|
|
6
|
+
|
|
7
|
+
## Frontmatter: the look
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
---
|
|
11
|
+
eyebrow: The Ashen Reach # a small label over each section's heading
|
|
12
|
+
tagline: Outrun the fire. Carry the last ember home.
|
|
13
|
+
cover: hero/wide.jpg # behind the title: a picture in the game's folder
|
|
14
|
+
palette:
|
|
15
|
+
bg: "#120c0a" # the page
|
|
16
|
+
ink: "#f6e7d3" # the text
|
|
17
|
+
accent: "#f4b23c" # headings, the title
|
|
18
|
+
accent2: "#7ad38a" # eyebrows, links, the tab bar's Build tab
|
|
19
|
+
danger: "#ff5a4e" # danger tags
|
|
20
|
+
good: "#5fdc8b" # good tags, ticks
|
|
21
|
+
gold: "#f2c14e" # rare tags, the Ready to try box
|
|
22
|
+
fonts:
|
|
23
|
+
display: Press Start 2P # a Google Fonts family name, or a .woff2/.ttf in the game's folder
|
|
24
|
+
body: Inter
|
|
25
|
+
mono: JetBrains Mono
|
|
26
|
+
pixel: true # pictures keep hard pixel edges when scaled
|
|
27
|
+
try: Arrow keys or WASD to run, Space to dash. Open a second tab to see two runners in one room.
|
|
28
|
+
---
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Every key is optional. A colour that is missing comes from the game's landing theme (game.json
|
|
32
|
+
`landing.theme`), then the studio's `site/theme.json`. Colours are `#hex`, `rgb()` or `hsl()`; a font is a
|
|
33
|
+
family name of letters, digits and spaces, or a file; anything else is left out with a warning. A light
|
|
34
|
+
`bg` draws a light page.
|
|
35
|
+
|
|
36
|
+
## The body
|
|
37
|
+
|
|
38
|
+
- `# Name` is the title (else game.json's name). The paragraph under it is the pitch.
|
|
39
|
+
- Every `## Section` is a tab, in the order written. The usual ones, which `codex` counts as decided once
|
|
40
|
+
they have something in them: **Concept**, **World**, **Characters**, **Art direction**, **Controls**,
|
|
41
|
+
**Rooms and players**, **Music and sound**, **Milestones**, **Open questions**, with **Latest** first.
|
|
42
|
+
Name others freely (Items, Classes, Levels, Story, Death, Quests…); they are tabs too.
|
|
43
|
+
- The **Build status** tab is added by itself, from the game's progress feed.
|
|
44
|
+
|
|
45
|
+
## Cards: `### Name` under any section
|
|
46
|
+
|
|
47
|
+
```markdown
|
|
48
|
+
## Creatures
|
|
49
|
+
|
|
50
|
+
Wisps chase whoever holds the ember; moths only fight back.
|
|
51
|
+
|
|
52
|
+
### Cinder Wisp
|
|
53
|
+

|
|
54
|
+
`M-01` `danger: Aggressive · 6 tiles` `gold: Rare at night`
|
|
55
|
+
*Level 1–3 · the burning floor*
|
|
56
|
+
Drifts toward whoever holds the ember; touching it costs a spark.
|
|
57
|
+
- **Where:** everywhere the grass is burning
|
|
58
|
+
- **Health:** 2 hits
|
|
59
|
+
- **Drops:** a short speed boost
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- The first picture is the card's art (a sprite or a portrait; small pictures stay crisp with `pixel: true`).
|
|
63
|
+
- A line of only `` `code` `` chips: one like `M-01` or `C-12` is the card's id; the rest are tags. A tag's
|
|
64
|
+
colour comes from `good:`, `danger:`, `gold:` or `info:` in front, else from its words (aggressive,
|
|
65
|
+
boss, enemy are danger; passive, ally, player are good; rare, elite, legendary are gold).
|
|
66
|
+
- A line in italics is the card's subtitle (level, place, class).
|
|
67
|
+
- A list where every item is `**Key:** value` (or `Key: value`) is the card's stats, in the mono font.
|
|
68
|
+
- Anything else is the card's text.
|
|
69
|
+
|
|
70
|
+
Text before the first `###` of a section is its introduction.
|
|
71
|
+
|
|
72
|
+
## Tables, checklists, the decision log, pictures
|
|
73
|
+
|
|
74
|
+
```markdown
|
|
75
|
+
## Controls
|
|
76
|
+
|
|
77
|
+
| Action | Phone | Computer | TV and phones |
|
|
78
|
+
| --- | --- | --- | --- |
|
|
79
|
+
| Run | drag from the lower left | WASD or arrows | each phone is a pad |
|
|
80
|
+
| Dash | tap the right side | Space | the pad's A |
|
|
81
|
+
|
|
82
|
+
## Milestones
|
|
83
|
+
|
|
84
|
+
- [x] Step 1: a working copy of the starter plays in two browsers
|
|
85
|
+
- [ ] Step 2: the valley, the wisps and hand-offs, checked with two browsers
|
|
86
|
+
|
|
87
|
+
## Latest
|
|
88
|
+
|
|
89
|
+
- 2026-10-01: Rounds go to 90 seconds; the valley needs time to cross.
|
|
90
|
+
- 2026-09-30: Pixel art at 16 px, scaled 4x, no smoothing.
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- Under **Latest**, a list item that starts with a date is a decision; the page shows them newest first.
|
|
94
|
+
- A picture on a line of its own is a figure; several in a row are a gallery. Pictures come only from
|
|
95
|
+
inside the studio (a path from the game's folder, or from the studio's root) and are embedded in the
|
|
96
|
+
page: png, jpg, webp, gif or svg, up to 2.5 MB each and 10 MB in all. A web address is not loaded.
|
|
97
|
+
- **Open questions** are drawn as numbered question cards.
|
|
98
|
+
|
|
99
|
+
## Keeping it true
|
|
100
|
+
|
|
101
|
+
- One codex per game; change it, never replace it.
|
|
102
|
+
- A changed decision: change its section, add a dated line under Latest, redraw (`codex <id>`), and update
|
|
103
|
+
the artifact if there is one.
|
|
104
|
+
- The codex is the person's plan, not a public page: it is not served
|
|
105
|
+
with a game's files, and on the site only at `/_studio/codex/<id>/` for the owner.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Plan interview: questions with options
|
|
2
|
+
|
|
3
|
+
Only for a person who explicitly requests an interview. Otherwise infer these choices from the premise and continue building. Adapt the options to what the person has
|
|
4
|
+
said; these are starting points, not a script.
|
|
5
|
+
|
|
6
|
+
## 1. Game type and genre
|
|
7
|
+
|
|
8
|
+
- "What kind of game? A brawl in an arena, a race, a co-op survival, a puzzle versus, a party game of
|
|
9
|
+
quick rounds, an adventure with a world to explore? From what you changed, I'd guess a brawl."
|
|
10
|
+
- "What does a player do in the first ten seconds?" (move and grab, aim and shoot, draw, guess, build)
|
|
11
|
+
- "How does a round end? First to a score, last one standing, the most points when the clock runs out?"
|
|
12
|
+
- Multiplayer shape: "Everyone against everyone, two teams, or all together against the game?"
|
|
13
|
+
|
|
14
|
+
## 2. Style and art direction
|
|
15
|
+
|
|
16
|
+
- "Pixel art, painterly, low-poly 3D, clean vector shapes, neon on black, hand-drawn? For phones at a
|
|
17
|
+
glance I'd pick pixel or vector: they read small."
|
|
18
|
+
- "Name a game, film or picture it should feel like." (Two or three references are plenty.)
|
|
19
|
+
- "Day or night, cosy or tense, bright or moody?" Then propose a palette of four or five colours.
|
|
20
|
+
- Fonts: suggest one display font that fits (pixel: "Press Start 2P", "Silkscreen"; storybook: "Fraunces";
|
|
21
|
+
sci-fi: "Orbitron", "Exo 2"; clean: "Inter").
|
|
22
|
+
- If they want to discuss it: "Do you want to steer the look closely (I'll show you three directions, drawn by the game itself,
|
|
23
|
+
and you lock what you like), or should I pick and show you?" Hands-on: the `style` skill's board. Pick for me:
|
|
24
|
+
`style init` with their words, then one line about the look.
|
|
25
|
+
- And once: "Art budget: free only (the starter library and the engine), a small budget on your own fal account
|
|
26
|
+
(I'd suggest US$5 for a handful of generated props), or your own number?" Free only means no generated assets
|
|
27
|
+
at all; the number is a hard cap (the `models` skill's `budget`).
|
|
28
|
+
|
|
29
|
+
## 3. Devices
|
|
30
|
+
|
|
31
|
+
- "People will play on phones and computers. Should it also work on a TV with phones as controllers, so
|
|
32
|
+
friends on one couch play together?" (Say what that adds: the big screen view and each phone a pad.)
|
|
33
|
+
- Per device: "On a phone you steer from the lower left and press on the right; on a computer, keys.
|
|
34
|
+
Anything that needs more than that?"
|
|
35
|
+
|
|
36
|
+
## 4. Players and rooms
|
|
37
|
+
|
|
38
|
+
- "How many in a room: 2 to 4 for a duel feel, 6 to 8 for a party, larger rooms for a crowd?"
|
|
39
|
+
- "Rounds of 60 seconds, 90, or longer?" (Short rounds keep strangers.)
|
|
40
|
+
- "Bots fill empty seats. Should they be easy, or play to win?"
|
|
41
|
+
- "Someone who joins mid-round takes a bot's place. Do they keep the bot's score or start at zero?"
|
|
42
|
+
|
|
43
|
+
## 5. Progress and saves
|
|
44
|
+
|
|
45
|
+
For an explicitly requested interview only: **"Does progress need to persist across sessions or devices?"** Then, if it does:
|
|
46
|
+
|
|
47
|
+
- "What does a player keep between visits: a character and its level, an inventory, unlocks, a collection,
|
|
48
|
+
their settings? I'd keep the hero in one save, so it always saves whole."
|
|
49
|
+
- "Should it follow them to their phone and their laptop? Then they make an account with a passkey (Face ID or
|
|
50
|
+
a fingerprint, no password); until they do, they play as a guest and keep it on that device."
|
|
51
|
+
- "Lifetime numbers that never reset: kills, gold earned, time played, best level?"
|
|
52
|
+
- "Can a death be forever? A hardcore mode wipes the character and writes its name in a hall of the fallen."
|
|
53
|
+
- No persistence (a match is all there is): say so in one line and move on; nothing to wire.
|
|
54
|
+
|
|
55
|
+
## 6. Art and film
|
|
56
|
+
|
|
57
|
+
- "Who are the characters, creatures or pieces? Name them and I'll give each a card."
|
|
58
|
+
- "Places: one arena, or several levels or zones?"
|
|
59
|
+
- "A cover and a trailer come from the game itself, free. Painted art or generated video is on your own
|
|
60
|
+
fal account with a budget you set: want any of it, and how much at most?"
|
|
61
|
+
- For a 3D game: "Models come free from the engine and Homie's CC0 starter library first; a few signature props
|
|
62
|
+
can be generated in your locked style for about US$0.54 each. Any you already own to bring in?"
|
|
63
|
+
|
|
64
|
+
## 7. Music and sound
|
|
65
|
+
|
|
66
|
+
- "A theme that loops while you play: fast and driving, calm, spooky, heroic? About what tempo?"
|
|
67
|
+
- "Which moments need a sound you'd recognise with your eyes closed?" (pick-up, hit, win, countdown)
|
|
68
|
+
- "Synthesized here for free, or a song from ElevenLabs on your own plan (quoted first)?"
|
|
69
|
+
|
|
70
|
+
## 8. Scope
|
|
71
|
+
|
|
72
|
+
- "For the first playable version: the core loop, one place, two or three characters, bots. Then art,
|
|
73
|
+
sound and the landing page. Then more places or modes. Sound right?"
|
|
74
|
+
- "Anything that must be in the very first version?"
|
|
75
|
+
- "Anything you don't want at all?"
|
|
76
|
+
|
|
77
|
+
## Genre starters
|
|
78
|
+
|
|
79
|
+
| Genre | Ask about | A good default |
|
|
80
|
+
| --- | --- | --- |
|
|
81
|
+
| Arena brawl | knock-back, power-ups, the arena's hazards | 6–8 players, 60 s rounds, most knock-outs wins |
|
|
82
|
+
| Race | track shape, boosts, catch-up | 4–8 players, three laps or 90 s, first across wins |
|
|
83
|
+
| Co-op survival | waves, the enemies, reviving | 2–6 players, waves of 30 s, survive as many as you can |
|
|
84
|
+
| Party / quick rounds | the minigames, scoring across rounds | 4–8 players, 30 s rounds, five rounds a match |
|
|
85
|
+
| Puzzle versus | the board, sending trouble to others | 2–4 players, until one board fills |
|
|
86
|
+
| Adventure / RPG | classes, monsters, loot, zones, death, what persists | 2–8 players in a shared world, rounds as days or quests; the hero in cloud saves (start from the `ember-vale` starter) |
|