@bitmagic/cli 0.1.64-dev.9 → 0.1.64

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.
Files changed (48) hide show
  1. package/README.md +28 -15
  2. package/assets/blender-level/README.md +6 -1
  3. package/assets/blender-level/bmlevel/core.py +78 -1
  4. package/assets/blender-level/review.py +106 -11
  5. package/assets/blender-level/tests/test_core.py +49 -0
  6. package/dist/cli.d.ts +8 -0
  7. package/dist/commands/forge.d.ts +8 -2
  8. package/dist/commands/forge.js +10 -4
  9. package/dist/commands/forge.js.map +1 -1
  10. package/dist/commands/generate.js +1 -1
  11. package/dist/commands/generate.js.map +1 -1
  12. package/dist/commands/publish.d.ts +5 -0
  13. package/dist/commands/publish.js +29 -3
  14. package/dist/commands/publish.js.map +1 -1
  15. package/dist/editor/design.d.ts +1 -0
  16. package/dist/editor/design.js +7 -3
  17. package/dist/editor/design.js.map +1 -1
  18. package/dist/editor/game-info-panel.d.ts +33 -0
  19. package/dist/editor/game-info-panel.js +179 -0
  20. package/dist/editor/game-info-panel.js.map +1 -0
  21. package/dist/editor/game-info.d.ts +55 -0
  22. package/dist/editor/game-info.js +126 -0
  23. package/dist/editor/game-info.js.map +1 -0
  24. package/dist/editor/server.js +59 -3
  25. package/dist/editor/server.js.map +1 -1
  26. package/dist/editor/shell-page.js +196 -11
  27. package/dist/editor/shell-page.js.map +1 -1
  28. package/dist/forge/two-d-gate.d.ts +10 -0
  29. package/dist/forge/two-d-gate.js +35 -1
  30. package/dist/forge/two-d-gate.js.map +1 -1
  31. package/dist/ios/collect-urls.d.ts +2 -0
  32. package/dist/ios/collect-urls.js +2 -2
  33. package/dist/ios/collect-urls.js.map +1 -1
  34. package/dist/publish/client.d.ts +18 -0
  35. package/dist/publish/client.js.map +1 -1
  36. package/dist/publish/record.d.ts +9 -1
  37. package/dist/publish/record.js +2 -0
  38. package/dist/publish/record.js.map +1 -1
  39. package/dist/publish/urls.d.ts +29 -0
  40. package/dist/publish/urls.js +39 -0
  41. package/dist/publish/urls.js.map +1 -0
  42. package/dist/scaffold/blender-level-skill-files.d.ts +7 -0
  43. package/dist/scaffold/blender-level-skill-files.js +129 -21
  44. package/dist/scaffold/blender-level-skill-files.js.map +1 -1
  45. package/dist/scaffold/project-files.js +2 -2
  46. package/dist/scaffold/skill-files.js +18 -1
  47. package/dist/scaffold/skill-files.js.map +1 -1
  48. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"collect-urls.js","sourceRoot":"","sources":["../../src/ios/collect-urls.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collect-urls.js","sourceRoot":"","sources":["../../src/ios/collect-urls.ts"],"names":[],"mappings":"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"}
@@ -150,7 +150,25 @@ export interface SourceCheckResult {
150
150
  warnings?: string[];
151
151
  }
152
152
  export interface CompletePublishResponse {
153
+ /**
154
+ * The VERSIONED key this publish wrote — `games/<id>/indexN.html`. The one URL that names
155
+ * these exact bytes, which is why the smoke check loads it; a poor thing to share, because
156
+ * the next publish writes `indexN+1.html` and a link handed out today freezes on today's
157
+ * build. `promotedPublishUrl` (publish/urls.ts) decides what the creator actually sees.
158
+ */
153
159
  url: string;
160
+ /**
161
+ * The directory form `games/<id>/`, which always resolves to the newest publish. Correct for
162
+ * every game, listed or not. Absent from an older server, which `promotedPublishUrl` recovers
163
+ * from `url`.
164
+ */
165
+ latestUrl?: string;
166
+ /**
167
+ * The player-facing `/play/` page, at the game's vanity slug when it has one. Sent only for a
168
+ * public publish whose page bake actually landed — and absent from an older server — so its
169
+ * presence is the server saying there IS a page to send someone to.
170
+ */
171
+ playUrl?: string;
154
172
  publishVersion: number;
155
173
  /** The EFFECTIVE visibility the publish landed on — set even when the request omitted it. */
156
174
  visibility: 'public' | 'private';
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/publish/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/publish/client.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,15 @@
1
1
  export declare function publishRecordPath(root: string): string;
2
2
  export interface PublishRecord {
3
- /** The public URL of the game, exactly as api-server issued it. */
3
+ /** The versioned URL of this exact publish, exactly as api-server issued it. */
4
4
  url: string;
5
+ /**
6
+ * The directory form that always resolves to the newest publish, and the `/play/` page when
7
+ * the game is public and has one. Both absent from a record written by an older CLI, or
8
+ * against an older api-server — readers fall back to `url`, which is what that record knew.
9
+ * See `promotedPublishUrl` for which one a reader should show.
10
+ */
11
+ latestUrl?: string;
12
+ playUrl?: string;
5
13
  visibility: string;
6
14
  publishVersion: number;
7
15
  gameId: string;
@@ -55,6 +55,8 @@ export function readPublishRecord(root) {
55
55
  publishVersion: record.publishVersion,
56
56
  gameId: record.gameId,
57
57
  at: record.at,
58
+ ...(typeof record.latestUrl === 'string' ? { latestUrl: record.latestUrl } : {}),
59
+ ...(typeof record.playUrl === 'string' ? { playUrl: record.playUrl } : {}),
58
60
  ...(typeof record.manageUrl === 'string' ? { manageUrl: record.manageUrl } : {}),
59
61
  ...(typeof record.name === 'string' ? { name: record.name } : {}),
60
62
  };
@@ -1 +1 @@
1
- {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/publish/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAE3E,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;AAC9C,CAAC;AAgBD,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,MAAqB;IACpE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACpF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,IACE,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;WAC3B,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;WACrC,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ;WACzC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;WACjC,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,EAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,GAAG,CAAC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/publish/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAE3E,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;AAC9C,CAAC;AAwBD,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,MAAqB;IACpE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACpF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,IACE,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;WAC3B,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;WACrC,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ;WACzC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;WACjC,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,EAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,GAAG,CAAC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Which of a publish's URLs to put in front of the creator.
3
+ *
4
+ * `complete` hands back three (see `CompletePublishResponse`), and the one that used to be
5
+ * printed — the versioned `games/<id>/indexN.html` key — is the one least worth sharing: the
6
+ * next publish writes `indexN+1.html`, so a link handed out today is frozen on today's build.
7
+ * The other two are both stable, and the choice between them is exactly the choice the portal's
8
+ * own My Games page makes (`playPath` vs `directPlayUrl` in `portal/src/my-games-helpers.ts`).
9
+ */
10
+ /** The fields of a completed publish this decision needs. */
11
+ export interface PromotableUrls {
12
+ url: string;
13
+ visibility: string;
14
+ latestUrl?: string;
15
+ playUrl?: string;
16
+ }
17
+ /**
18
+ * The URL the creator should see and share.
19
+ *
20
+ * A public game gets its `/play/` page: that is the address with the game's name, cover and
21
+ * comments on it, and the one every other Bitmagic surface links to. A private game has no such
22
+ * page — `publishComplete` deliberately takes it down — so it gets the directory form, which is
23
+ * what "private" actually means here: world-readable at its own URL, simply not listed.
24
+ *
25
+ * `playUrl` is honoured only for a public publish. A game that was public a moment ago can be
26
+ * published private in the same breath, and a server that still sent a page URL alongside a
27
+ * private verdict must not talk this into linking a page that was just unlisted.
28
+ */
29
+ export declare function promotedPublishUrl(done: PromotableUrls): string;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Which of a publish's URLs to put in front of the creator.
3
+ *
4
+ * `complete` hands back three (see `CompletePublishResponse`), and the one that used to be
5
+ * printed — the versioned `games/<id>/indexN.html` key — is the one least worth sharing: the
6
+ * next publish writes `indexN+1.html`, so a link handed out today is frozen on today's build.
7
+ * The other two are both stable, and the choice between them is exactly the choice the portal's
8
+ * own My Games page makes (`playPath` vs `directPlayUrl` in `portal/src/my-games-helpers.ts`).
9
+ */
10
+ /**
11
+ * The directory form of a versioned publish URL — `.../games/<id>/index7.html` becomes
12
+ * `.../games/<id>/`, which GCS resolves to the alias `publishComplete` keeps pointing at the
13
+ * newest publish.
14
+ *
15
+ * Only reached against an api-server too old to send `latestUrl`. Safe because `url` is already
16
+ * built from the server's own `PORTAL_URL`: this changes a path within a base the server chose,
17
+ * it does not guess a base. A URL that does not end in an index filename is returned unchanged —
18
+ * printing something real beats printing nothing.
19
+ */
20
+ function directoryForm(url) {
21
+ return url.replace(/\/index\d*\.html$/, '/');
22
+ }
23
+ /**
24
+ * The URL the creator should see and share.
25
+ *
26
+ * A public game gets its `/play/` page: that is the address with the game's name, cover and
27
+ * comments on it, and the one every other Bitmagic surface links to. A private game has no such
28
+ * page — `publishComplete` deliberately takes it down — so it gets the directory form, which is
29
+ * what "private" actually means here: world-readable at its own URL, simply not listed.
30
+ *
31
+ * `playUrl` is honoured only for a public publish. A game that was public a moment ago can be
32
+ * published private in the same breath, and a server that still sent a page URL alongside a
33
+ * private verdict must not talk this into linking a page that was just unlisted.
34
+ */
35
+ export function promotedPublishUrl(done) {
36
+ const latest = done.latestUrl ?? directoryForm(done.url);
37
+ return done.visibility === 'public' ? done.playUrl ?? latest : latest;
38
+ }
39
+ //# sourceMappingURL=urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/publish/urls.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAoB;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AACxE,CAAC"}
@@ -16,6 +16,13 @@
16
16
  * and everything else goes to `bitmagic forge`. The CLI cannot tell which model drives it, so the
17
17
  * gate is the agent's own call — stated once, plainly, where the planning skill sends it.
18
18
  *
19
+ * Steps 4-9 are shaped around two loops, because the first creator to use this took the whole
20
+ * chain — build, upload, verify, judge — round on every edit, and the costs are nothing alike: a
21
+ * Blender build, render and ray audit are seconds and local, while `assets add` uploads, `verify`
22
+ * type-checks and drives real Chrome, and `judge` spends sparks. So the geometry loop is named as
23
+ * the inner one, the engine handoff is gated on it being clean, and `review.py --lighting game`
24
+ * exists so even the lighting pass can stay inside it.
25
+ *
19
26
  * Backticks and `${` are escaped for the template literal; `project-files.test.ts` checks the
20
27
  * rendered frontmatter and that no escape leaks into the output.
21
28
  */
@@ -16,6 +16,13 @@
16
16
  * and everything else goes to `bitmagic forge`. The CLI cannot tell which model drives it, so the
17
17
  * gate is the agent's own call — stated once, plainly, where the planning skill sends it.
18
18
  *
19
+ * Steps 4-9 are shaped around two loops, because the first creator to use this took the whole
20
+ * chain — build, upload, verify, judge — round on every edit, and the costs are nothing alike: a
21
+ * Blender build, render and ray audit are seconds and local, while `assets add` uploads, `verify`
22
+ * type-checks and drives real Chrome, and `judge` spends sparks. So the geometry loop is named as
23
+ * the inner one, the engine handoff is gated on it being clean, and `review.py --lighting game`
24
+ * exists so even the lighting pass can stay inside it.
25
+ *
19
26
  * Backticks and `${` are escaped for the template literal; `project-files.test.ts` checks the
20
27
  * rendered frontmatter and that no escape leaks into the output.
21
28
  */
@@ -78,6 +85,10 @@ grep -qx 'build/' .gitignore || echo 'build/' >> .gitignore
78
85
  \`tools/blender-level/README.md\` lists what each file does. Level scripts go in \`tools/level/\`,
79
86
  outputs in \`build/level/\`.
80
87
 
88
+ Run that install line again on an existing project too. It overwrites, and \`bitmagic upgrade\`
89
+ re-renders this skill but NOT the scripts — so a flag named below that your copy does not
90
+ recognise means the copy is old, not that the skill is wrong.
91
+
81
92
  ## 2. Plan the place in words, then as a table
82
93
 
83
94
  Write the \`## Art direction\` of \`GAME-DESIGN.md\` first — \`bitmagic judge\` scores against it, and a
@@ -128,7 +139,34 @@ Rules that are not style:
128
139
  - **Doors are records, not meshes.** \`door()\` writes a \`DoorDefinition\`; the engine builds and
129
140
  animates the leaf. \`jamb=\` adds solid jambs and a header so the wall reads as a doorway.
130
141
 
131
- ## 4. Build
142
+ ## The two loops
143
+
144
+ Everything below runs in one of two loops, and knowing which one you are in is the difference
145
+ between building a level in a morning and building it in a day.
146
+
147
+ **The Blender loop** — edit \`tools/level/<name>.py\` → build → look → audit. Seconds each, all
148
+ local: nothing uploaded, no browser, no sparks. This is where the level is actually made, and you
149
+ should go round it tens of times.
150
+
151
+ **The engine handoff** — register the GLB → sync world.json → \`check\` → \`verify\` → \`judge\` →
152
+ walk it in \`bitmagic dev\`. \`assets add\` uploads to the CDN, \`verify\` type-checks the project and
153
+ drives a real Chrome through a settle loop, \`judge\` spends sparks and must not be run twice on
154
+ one milestone. Run it at the END of a pass — never after an edit.
155
+
156
+ **The gate: do not hand the level to the engine until the contact sheet has nothing wrong on it
157
+ and both audit modes exit 0.** Every build writes \`build/level/<name>.glb\` already; that is free.
158
+ Publishing it is what costs. A round trip through the engine to discover a hole in a floor is a
159
+ round trip the audit would have made for nothing, and the station lost a day to exactly that.
160
+
161
+ | The level is wrong like this | Found in |
162
+ |---|---|
163
+ | a hole in a floor, a doorway you cannot walk through, a route blocked by a prop, a room that is not sealed | the Blender loop — \`audit.py\`, both modes |
164
+ | z-fighting, a blank wall, a sign that reads backwards, a missing ceiling, stairs ending in air, a wedge of sky beside a junction, the wrong footprint | the Blender loop — the contact sheet |
165
+ | the level washed out or black, an empty published game, doors animating inside walls, no NPCs, the framerate | the engine handoff — nothing in Blender can see these |
166
+
167
+ ## The Blender loop
168
+
169
+ ### 4. Build
132
170
 
133
171
  \`\`\`
134
172
  "$BLENDER" -b --python tools/level/<name>.py
@@ -140,7 +178,7 @@ line to keep for step 7. Outputs: \`build/level/<name>.glb\` (one draw call per
140
178
  or geometry error prints a Python traceback naming the helper and the object — fix and rebuild;
141
179
  builds take seconds. \`python3 tools/level/<name>.py --dry-run\` gives the counts without Blender.
142
180
 
143
- ## 5. Render and look
181
+ ### 5. Render and look
144
182
 
145
183
  \`\`\`
146
184
  "$BLENDER" -b --python tools/blender-level/review.py -- build/level/<name>.blend build/level/<name>.mesh-level.json build/level/review/
@@ -152,7 +190,23 @@ is missing, stairs that end in the air, a sign that reads backwards, two surface
152
190
  one another. Fix the script, rebuild, re-render. Do not go on to the audit while the sheet is
153
191
  wrong; the audit finds holes, not ugliness.
154
192
 
155
- ## 6. Audit
193
+ The fixed set is what you read first. After that the flags turn it into a camera you can aim, so
194
+ a second look costs one render rather than a trip through the engine:
195
+
196
+ \`\`\`
197
+ … review.py -- <blend> <level json> <out dir> --shot 'landmark:spawn -> volume:hall' --only # just this frame
198
+ … review.py -- <blend> <level json> <out dir> --shot 'door:north door -> landmark:altar' --fov 50
199
+ … review.py -- <blend> <level json> <out dir> --lighting game # the lamps and spots you declared
200
+ \`\`\`
201
+
202
+ \`--shot 'FROM -> TO'\` takes \`landmark:<name>\`, \`volume:<name>\`, \`door:<id>\` or a raw \`x,y,z\`, and
203
+ repeats; \`--only\` renders those instead of the standard set. \`--lighting game\` swaps the review
204
+ fill for the engine's \`interior\` preset and the JSON's own \`lamp()\` / \`spot()\` records, which is
205
+ how you judge the lighting pass without a verify — dark under \`--lighting game\` is dark in the
206
+ game. Keep the default \`--lighting review\` while you are judging geometry: it is lit so that
207
+ nothing can hide.
208
+
209
+ ### 6. Audit
156
210
 
157
211
  \`\`\`
158
212
  "$BLENDER" -b --python tools/blender-level/audit.py -- build/level/<name>.mesh-level.json # doors open: floors, doorways, routes
@@ -166,7 +220,16 @@ on the line between two rooms, a step that ends short); a failed \`sealed_envelo
166
220
  roof or wall. \`coplanar_overlap\` is a warning: two faces on one plane, which flicker. Never
167
221
  answer a failure by removing the volume or the link that found it.
168
222
 
169
- ## 7. Register the GLB, sync world.json, write the game code
223
+ A failure sends you back to step 4, not on to step 7. Both modes exiting 0 with a clean contact
224
+ sheet is the whole gate; nothing below can be trusted until you have it.
225
+
226
+ ## The engine handoff — once per pass
227
+
228
+ Steps 7 and 8 are the expensive half: an upload, a type-check, a real browser. Do them when the
229
+ Blender loop has nothing left to say, and then do all of them — a partial handoff is what makes
230
+ \`verify\` pass on stale files.
231
+
232
+ ### 7. Register the GLB, sync world.json, write the game code
170
233
 
171
234
  \`\`\`
172
235
  bitmagic assets add build/level/<name>.glb --name <name> --keep-glb --asset-id level-<name> --height <native height> # the REGISTER line from step 4
@@ -197,7 +260,7 @@ this.playerController.configureFallRescue({ ...DEFAULT_FALL_RESCUE_OPTIONS, kill
197
260
  (\`npc.spawn(x, z, y)\` — pass the storey's Y for interiors), \`volumesAt(position)\` for room logic,
198
261
  the lighting modes, and \`samples/mesh-level-setup.ts\`.
199
262
 
200
- ## 8. Check, verify, walk it
263
+ ### 8. Check, verify, walk it
201
264
 
202
265
  \`bitmagic check\`, then \`bitmagic verify\`: the console must show one \`[MeshLevel] loaded …\` line
203
266
  with the collider and light counts you expect, and no \`404\` for the GLB. Then walk it in the
@@ -205,16 +268,24 @@ with the collider and light counts you expect, and no \`404\` for the GLB. Then
205
268
  proves geometry, not that the place is good to be in. \`bitmagic verify --platform mobile\` too if
206
269
  phones matter.
207
270
 
271
+ All three of step 7 again on every handoff — register with the SAME \`--asset-id\` (the entry is
272
+ replaced), re-run \`sync_world.py\`, re-copy the JSON. Skip one and \`verify\` grades the previous
273
+ build: the collider count in \`[MeshLevel] loaded …\` is how you catch it.
274
+
208
275
  ## 9. Judge, then iterate in passes
209
276
 
210
277
  \`bitmagic judge\` scores the verify screenshot against your art direction. Improve the level in
211
- passes, each one a full loop (edit script → build → review → audit → sync → verify):
278
+ passes — and a pass is **many turns of the Blender loop followed by one handoff**, not a handoff
279
+ per edit:
212
280
 
213
- 1. **Structure** — rooms, doors, routes, stairs, the spawn. Audit clean, walkable.
281
+ 1. **Structure** — rooms, doors, routes, stairs, the spawn. Audit clean in both modes; the one
282
+ verify is for walking it in \`bitmagic dev\`, which is the only thing Blender cannot tell you.
214
283
  2. **Detail** — cladding, casings, coffers, deck plates, signage, props. All \`decor()\` unless the
215
- player should bump into it; keep every travel clearance.
284
+ player should bump into it; keep every travel clearance. The sheet and the audit carry this
285
+ pass almost alone; the one verify is to confirm nothing regressed.
216
286
  3. **Surfaces and light** — materials, emissive strips, warm and cool lamps, a spot or two with
217
- shadows. Look at it in the real game, not only in the render.
287
+ shadows. Render with \`--lighting game\` (step 5) until the rooms read, then verify and judge
288
+ once against the real thing.
218
289
 
219
290
  \`references/level-design-passes.md\` says what each pass contains and when to stop.
220
291
 
@@ -328,6 +399,10 @@ the art, because decoration is exactly what must not be solid. The renders show
328
399
  .blend**, so a level can pass the audit and look wrong, or look right and fail. Do both, in that
329
400
  order: look first (cheap, catches design errors), audit second (catches the errors you cannot see).
330
401
 
402
+ Together they are the Blender loop, and they are the whole reason the engine handoff can wait:
403
+ between them they answer every geometric question about the level for the cost of a few seconds
404
+ and no upload. Go round them until neither has anything to say, and only then register the GLB.
405
+
331
406
  ## The checks
332
407
 
333
408
  | Check | Mode | What it fires | Failure means | Usual fix |
@@ -368,6 +443,28 @@ no volumes passes every check and holds no claim.
368
443
  \`volume-<name>\` (inside every room, from one end looking along it). Then \`contact-sheet.png\`,
369
444
  four per row in the order the log prints.
370
445
 
446
+ ## Aiming the camera, and the two lightings
447
+
448
+ The standard set is what you read first. After that, ask for what you want to see:
449
+
450
+ | Flag | Does |
451
+ |---|---|
452
+ | \`--shot 'FROM -> TO'\` | one extra frame. Both ends are \`landmark:<name>\`, \`volume:<name>\`, \`door:<id>\` or a raw \`x,y,z\` (game coordinates). Repeats; each frame is named \`shot-1\`, \`shot-2\`, … |
453
+ | \`--shot 'FROM'\` | from that point, looking at the level's centre — enough for "what does it look like from the spawn" |
454
+ | \`--only\` | render just the \`--shot\`s and skip the standard set and the sheet: one render, one look |
455
+ | \`--fov <deg>\` | horizontal field of view for the perspective shots; default 24 mm ≈ 74° |
456
+ | \`--lighting review\` | default. A camera-mounted fill and a sun, so nothing can hide in shadow |
457
+ | \`--lighting game\` | the engine's \`interior\` preset — the sun at 8%, the hemisphere at 0.65, your \`lamp()\`s and \`spot()\`s as real lights, emissive materials glowing at their \`glow\` |
458
+
459
+ Judge geometry under \`--lighting review\`; judge the lighting pass under \`--lighting game\`. The
460
+ second is close enough to the engine that a room which is black there is black in the game, so
461
+ pass 3 no longer needs a verify to find an unlit corner — only to confirm the fixed one.
462
+
463
+ Where \`--lighting game\` and the engine still differ: EEVEE is not three.js, so exposure and
464
+ falloff are approximate, and the engine pools point lights (a room with eight lamps gets four of
465
+ them in game, all eight in the render). Treat "too dark" and "too bright" as real; treat an exact
466
+ colour match as a job for the verify screenshot.
467
+
371
468
  What to look for, frame by frame:
372
469
 
373
470
  - **overview** — the footprint matches the plan; nothing floats outside the walls; corridors meet
@@ -378,24 +475,24 @@ What to look for, frame by frame:
378
475
  - **stairs** — treads reach the landing; the rail follows the slope; nothing pokes through a step.
379
476
  - **volumes** — a ceiling; walls meeting at the corners; props sitting on the floor, not in it.
380
477
 
381
- The renderer adds its own fill light so interiors are legible; it shows geometry, not the game's
382
- lighting. Judge the lighting in \`bitmagic verify\`'s screenshot and in the dev browser.
383
-
384
478
  ## When a render is right and the game is wrong
385
479
 
386
- The two are the same geometry only if the GLB you registered is the one you just built. After
387
- every rebuild: register again (same \`--asset-id\`, the entry is replaced), re-run \`sync_world.py\`,
388
- copy the JSON into \`src/work/\`, and check \`[MeshLevel] loaded\` in the verify console reports the
389
- new collider count. A verify that passes on stale files is the trap the station fell into three
390
- times.
480
+ The two are the same geometry only if the GLB you registered is the one you just built. That is
481
+ the whole content of the engine handoff, and it is all-or-nothing: register again (same
482
+ \`--asset-id\`, the entry is replaced), re-run \`sync_world.py\`, copy the JSON into \`src/work/\`, and
483
+ check \`[MeshLevel] loaded\` in the verify console reports the new collider count. A verify that
484
+ passes on stale files is the trap the station fell into three times — and the reason to hand off
485
+ rarely and completely rather than often and in pieces.
391
486
  `;
392
487
  }
393
488
  export function renderBlenderPassesReference() {
394
489
  return `# Level design in passes
395
490
 
396
491
  A level that is only walls and floors is walkable and dead. The station that taught this skill
397
- went from boxes to a place people wanted to screenshot in four passes, each a full loop of edit →
398
- build → review → audit → sync → verify. The passes, what goes in each, and when to stop.
492
+ went from boxes to a place people wanted to screenshot in four passes. A pass is many turns of the
493
+ Blender loop — edit → build → review → audit — ended by one engine handoff; each pass's "Stop
494
+ when" below is the condition for that handoff, not a checkpoint you take on the way. The passes,
495
+ what goes in each, and when to stop.
399
496
 
400
497
  ## Pass 1 — structure
401
498
 
@@ -441,8 +538,13 @@ clean (detail is the pass that breaks clearances — a casing 20 cm into a doorw
441
538
  - **The engine's interior preset dims the sun for you**; a level that looks washed out in the game
442
539
  after looking fine in the render has an \`exterior\` mode set, or its own sun in \`lightingConfig\`.
443
540
 
444
- Stop when: \`bitmagic judge\` no longer names lighting or flat surfaces, and the level reads the same
445
- in the verify screenshot as in the reference image.
541
+ This is the pass where the default review render lies to you — its fill light makes every room
542
+ legible whatever your lamps do. Iterate under \`review.py --lighting game\`, which runs that same
543
+ interior preset and your own \`lamp()\`s and \`spot()\`s, and a dark room shows up dark.
544
+
545
+ Stop when: nothing is unlit or blown out under \`--lighting game\`, then hand off — \`bitmagic judge\`
546
+ no longer names lighting or flat surfaces, and the level reads the same in the verify screenshot
547
+ as in the reference image.
446
548
 
447
549
  ## Pass 4 — the reference image
448
550
 
@@ -466,6 +568,12 @@ The engine side is \`MeshLevel\` — \`engine/agent-docs/mesh-level.md\` is the
466
568
  \`engine/agent-docs/samples/mesh-level-setup.ts\` the compile-checked sample. This page is the
467
569
  seam: what the build wrote, what each command does with it, and the four ways it goes wrong.
468
570
 
571
+ **This is the outer loop — run it once per pass, and run all of it.** An upload, a type-check and
572
+ a real browser, against a level the contact sheet and both audit modes have already cleared. Every
573
+ question you can answer in Blender, answer in Blender; what is left here is what only the running
574
+ game knows: how it feels to walk, how it is lit on a phone, and whether the published bundle can
575
+ fetch what it needs.
576
+
469
577
  ## The files the build wrote
470
578
 
471
579
  | File | Goes | Carries |
@@ -1 +1 @@
1
- {"version":3,"file":"blender-level-skill-files.js","sourceRoot":"","sources":["../../src/scaffold/blender-level-skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8MR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmER,CAAC;AACF,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkER,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mCAAmC;IACjD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"blender-level-skill-files.js","sourceRoot":"","sources":["../../src/scaffold/blender-level-skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8QR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyER,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mCAAmC;IACjD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+GR,CAAC;AACF,CAAC"}
@@ -1115,8 +1115,8 @@ bitmagic forge --prompt "a ruined desert temple with a central courtyard"
1115
1115
  This designs a scene, builds its geometry, bakes it to voxels and writes the finished level —
1116
1116
  terrain, props, spawn points — into \`src/work/world.json\`. \`bitmagic levels list | add | rename
1117
1117
  | set-start | remove\` manages them afterwards (free, local; \`set-start\` picks the boot level). Add
1118
- \`--city\`, \`--dungeon\`, \`--platformer\` or \`--freeform\` (at most one) for a different kind of
1119
- place; omit them all for natural terrain. A place designed part by part — an interior, a station, a stylised set — can
1118
+ \`--city\`, \`--dungeon\`, \`--platformer\`, \`--freeform\` or \`--vessel\` (a ship as the level) — at most
1119
+ one — for a different kind of place; omit them all for natural terrain. A place designed part by part — an interior, a station, a stylised set — can
1120
1120
  instead be built in Blender from a script: \`${PRIMARY_SKILLS_DIR}/building-levels-in-blender/SKILL.md\`,
1121
1121
  whose first section says when that path is yours (a frontier model, Blender installable).
1122
1122
 
@@ -306,9 +306,26 @@ list it. Omit it on a later publish and the game goes back to private: its \`/pl
306
306
  serving too, so a public game re-published bare disappears from bitmagic.ai entirely until the next
307
307
  \`--visibility public\`.
308
308
 
309
+ ## The URL publish prints is the one to pass on
310
+
311
+ Publish prints the link worth sharing, and it is deliberately not the file it just uploaded:
312
+
313
+ - a **public** game gets \`bitmagic.ai/play/<ID>/\` — the game's page, with its name, cover art
314
+ and comments on it, and the address every other part of bitmagic.ai links to;
315
+ - a **private** game gets \`bitmagic.ai/games/<ID>/\` — the build on its own, reachable by anyone
316
+ with the link but listed nowhere.
317
+
318
+ Both always serve the newest publish, so a link the creator hands out today keeps working after
319
+ tomorrow's \`bitmagic publish\`. Pass on the line publish printed; do not build a URL yourself.
320
+
321
+ \`--version-url\` additionally prints \`.../indexN.html\`, the one build this call uploaded. That
322
+ one is frozen: useful for pinning a bug report to a specific publish, wrong for sharing. Under
323
+ \`--json\` you get all of them — \`playUrl\` and \`latestUrl\` are the shareable pair (prefer
324
+ \`playUrl\` when it is there), and \`url\` is the versioned one.
325
+
309
326
  ## Show the creator the QR code
310
327
 
311
- Publish turns the game's URL into a scannable image. Your output is a pipe, so it cannot be drawn
328
+ Publish turns the shareable URL into a scannable image. Your output is a pipe, so it cannot be drawn
312
329
  in the terminal: publish writes \`.bitmagic/publish-qr.png\` and names it (\`qrPath\` under
313
330
  \`--json\`). Surface that image like any artifact you made — scanning it opens the game on a phone,
314
331
  and a bare URL leaves your creator retyping a game id into a browser.
@@ -1 +1 @@
1
- {"version":3,"file":"skill-files.js","sourceRoot":"","sources":["../../src/scaffold/skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;CAkBR,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAsB;IAC7E,2FAA2F;IAC3F,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;IAC7F,6FAA6F;IAC7F,0EAA0E;IAC1E,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,8FAA8F;YAC9F,mEAAmE;YACnE,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,iFAAiF,CAAC;IAExF,OAAO;;sBAEa,SAAS,SAAS,iBAAiB,CAAC,SAAS,CAAC;;;EAGlE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BZ,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuJR,CAAC;AACF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8GR,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,+BAA+B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkER,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"skill-files.js","sourceRoot":"","sources":["../../src/scaffold/skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;CAkBR,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAsB;IAC7E,2FAA2F;IAC3F,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;IAC7F,6FAA6F;IAC7F,0EAA0E;IAC1E,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,8FAA8F;YAC9F,mEAAmE;YACnE,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,iFAAiF,CAAC;IAExF,OAAO;;sBAEa,SAAS,SAAS,iBAAiB,CAAC,SAAS,CAAC;;;EAGlE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BZ,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuJR,CAAC;AACF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+HR,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,+BAA+B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkER,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitmagic/cli",
3
- "version": "0.1.64-dev.9",
3
+ "version": "0.1.64",
4
4
  "description": "Build Bitmagic games from your own agent tool",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Bitmagic Oy",
@@ -25,9 +25,9 @@
25
25
  "playwright-core": "^1.59.1",
26
26
  "tar": "^7.4.3",
27
27
  "ws": "^8.21.3",
28
- "@bitmagic/animation-forger": "0.1.19-dev.9",
29
- "@bitmagic/asset-core": "0.2.19-dev.9",
30
- "@bitmagic/world-forger": "0.1.24-dev.9"
28
+ "@bitmagic/animation-forger": "0.1.19",
29
+ "@bitmagic/asset-core": "0.2.19",
30
+ "@bitmagic/world-forger": "0.1.24"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@eslint/js": "^9.38.0",