@bitmagic/cli 0.1.51-dev.0 → 0.1.51

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 (33) hide show
  1. package/README.md +79 -23
  2. package/dist/commands/init.js +17 -2
  3. package/dist/commands/init.js.map +1 -1
  4. package/dist/commands/login.js +6 -1
  5. package/dist/commands/login.js.map +1 -1
  6. package/dist/commands/upgrade.js +35 -2
  7. package/dist/commands/upgrade.js.map +1 -1
  8. package/dist/config/environments.d.ts +24 -19
  9. package/dist/config/environments.js +58 -30
  10. package/dist/config/environments.js.map +1 -1
  11. package/dist/config/folder-environment.d.ts +31 -0
  12. package/dist/config/folder-environment.js +83 -0
  13. package/dist/config/folder-environment.js.map +1 -0
  14. package/dist/editor/asset-viewer.js.map +1 -1
  15. package/dist/editor/shell-page.js +7 -5
  16. package/dist/editor/shell-page.js.map +1 -1
  17. package/dist/forge/apply-modifications.js +3 -24
  18. package/dist/forge/apply-modifications.js.map +1 -1
  19. package/dist/generate/apply-patches.js +4 -27
  20. package/dist/generate/apply-patches.js.map +1 -1
  21. package/dist/project/context.d.ts +12 -0
  22. package/dist/project/context.js +19 -5
  23. package/dist/project/context.js.map +1 -1
  24. package/dist/project/world-json.d.ts +25 -0
  25. package/dist/project/world-json.js +59 -0
  26. package/dist/project/world-json.js.map +1 -0
  27. package/dist/scaffold/legacy-default-assets.d.ts +79 -0
  28. package/dist/scaffold/legacy-default-assets.js +124 -0
  29. package/dist/scaffold/legacy-default-assets.js.map +1 -0
  30. package/dist/scaffold/upgrade-project.d.ts +22 -3
  31. package/dist/scaffold/upgrade-project.js +19 -3
  32. package/dist/scaffold/upgrade-project.js.map +1 -1
  33. package/package.json +4 -4
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The one way the CLI reads and writes a project's `src/work/world.json`.
3
+ *
4
+ * Three commands rewrite that file — `generate` (apply-patches), `forge` / the dev editor
5
+ * (apply-modifications) and `upgrade` (legacy default-asset repoint) — and each used to carry its
6
+ * own copy of the same read → parse → guard → temp-file → rename block. The temp file's NAME is a
7
+ * contract, not a detail: `editor/watch.ts` ignores `.world.json.*.tmp` so a half-written file
8
+ * never triggers a rebuild, and the two-space + trailing-newline form is what every reader and
9
+ * every reviewable diff expects. One module, so the next change to either lands once.
10
+ */
11
+ export type JsonObject = Record<string, unknown>;
12
+ export declare function isJsonObject(value: unknown): value is JsonObject;
13
+ /**
14
+ * Read and parse a world.json, throwing a CliError that names the file for every failure mode —
15
+ * missing, unreadable, not JSON, not an object. Every caller today wants exactly that: an
16
+ * operation on a world it cannot read must stop before it changes anything.
17
+ */
18
+ export declare function readWorldJson(worldPath: string): JsonObject;
19
+ /**
20
+ * Write the whole document, two-space indent, trailing newline, through a temp file in the same
21
+ * directory renamed over the original — so an interrupted write cannot leave a truncated
22
+ * world.json behind. If the write itself fails the temp file is removed rather than left as a
23
+ * stray dot-file the next `bitmagic upgrade`'s clean-tree gate would trip over.
24
+ */
25
+ export declare function writeWorldJsonAtomic(worldPath: string, world: JsonObject): void;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * The one way the CLI reads and writes a project's `src/work/world.json`.
3
+ *
4
+ * Three commands rewrite that file — `generate` (apply-patches), `forge` / the dev editor
5
+ * (apply-modifications) and `upgrade` (legacy default-asset repoint) — and each used to carry its
6
+ * own copy of the same read → parse → guard → temp-file → rename block. The temp file's NAME is a
7
+ * contract, not a detail: `editor/watch.ts` ignores `.world.json.*.tmp` so a half-written file
8
+ * never triggers a rebuild, and the two-space + trailing-newline form is what every reader and
9
+ * every reviewable diff expects. One module, so the next change to either lands once.
10
+ */
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import { CliError } from '../errors.js';
14
+ export function isJsonObject(value) {
15
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
16
+ }
17
+ /**
18
+ * Read and parse a world.json, throwing a CliError that names the file for every failure mode —
19
+ * missing, unreadable, not JSON, not an object. Every caller today wants exactly that: an
20
+ * operation on a world it cannot read must stop before it changes anything.
21
+ */
22
+ export function readWorldJson(worldPath) {
23
+ let raw;
24
+ try {
25
+ raw = fs.readFileSync(worldPath, 'utf-8');
26
+ }
27
+ catch {
28
+ throw new CliError(`Cannot read ${worldPath}. Is this a Bitmagic project?`);
29
+ }
30
+ let world;
31
+ try {
32
+ world = JSON.parse(raw);
33
+ }
34
+ catch {
35
+ throw new CliError(`${worldPath} is not valid JSON. Nothing has been changed.`);
36
+ }
37
+ if (!isJsonObject(world)) {
38
+ throw new CliError(`${worldPath} does not contain a world object. Nothing has been changed.`);
39
+ }
40
+ return world;
41
+ }
42
+ /**
43
+ * Write the whole document, two-space indent, trailing newline, through a temp file in the same
44
+ * directory renamed over the original — so an interrupted write cannot leave a truncated
45
+ * world.json behind. If the write itself fails the temp file is removed rather than left as a
46
+ * stray dot-file the next `bitmagic upgrade`'s clean-tree gate would trip over.
47
+ */
48
+ export function writeWorldJsonAtomic(worldPath, world) {
49
+ const temp = path.join(path.dirname(worldPath), `.world.json.${process.pid}.tmp`);
50
+ try {
51
+ fs.writeFileSync(temp, `${JSON.stringify(world, null, 2)}\n`);
52
+ fs.renameSync(temp, worldPath);
53
+ }
54
+ catch (error) {
55
+ fs.rmSync(temp, { force: true });
56
+ throw error;
57
+ }
58
+ }
59
+ //# sourceMappingURL=world-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-json.js","sourceRoot":"","sources":["../../src/project/world-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAIxC,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,eAAe,SAAS,+BAA+B,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,GAAG,SAAS,+CAA+C,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAAC,GAAG,SAAS,6DAA6D,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,KAAiB;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,eAAe,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;IAClF,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9D,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Repoints the platform's OWN default voxel assets from their legacy JSON `.vxl` files to the
3
+ * VXL3 re-encodings under `default-assets/voxel/v2/`.
4
+ *
5
+ * Every project scaffolded before engine 3.1056 got a `src/work/world.json` whose default trees
6
+ * and rocks (six generated variants plus three converted rocks) pointed at the pre-VXL3 files.
7
+ * Those files are still served, deliberately — games in the wild reference them by URL — but
8
+ * they are the legacy JSON layout: the engine converts each one in memory on EVERY load, logs a
9
+ * warning per asset per load, and the file carries no LOD trailer for mobile to drop. Nothing
10
+ * else ever rewrote the URLs: `bitmagic upgrade` replaces `engine/` and leaves the creator's
11
+ * `world.json` alone by contract, so an upgraded project kept warning forever.
12
+ *
13
+ * This is the one exception to that contract, and it is a narrow one. Only the nine URLs the
14
+ * platform itself put into `world.json` at scaffold time are touched — matched by their exact
15
+ * path under `worlds/v3/`, host preserved — and each is swapped for the same asset in the new
16
+ * encoding: the three rocks are literal re-encodings of those files, the six variants are the
17
+ * regenerated defaults every current template ships. Ids, names and every other field stay as
18
+ * they are, except `size`, which follows the bytes (the Assets tab shows it, and the old values
19
+ * overstate the new files by 10-20x). Assets the creator added, generated or forged are never
20
+ * looked at: their legacy files, if any, are unknown to this table and need a real re-save.
21
+ *
22
+ * The table is a snapshot of `templates/standard-3d/source/world.json` before and after the move
23
+ * (repo commit a9618f3c), so it is a fixed migration rather than a live lookup — a project must
24
+ * get the same result from every CLI that carries it. `legacy-default-assets.test.ts` holds each
25
+ * entry's `to` side to the template the repo ships, so a regenerated default cannot drift away
26
+ * from this table unnoticed. See docs/voxel-default-assets.md.
27
+ */
28
+ /** The URL path under `worlds/v3/` before the move, and the record fields it becomes. */
29
+ export interface LegacyDefaultAssetTarget {
30
+ /** Path under `worlds/v3/` of the VXL3 file. */
31
+ path: string;
32
+ /** Byte size of that file — `size` on the asset record follows it. */
33
+ size: number;
34
+ }
35
+ /**
36
+ * Keyed by the legacy path under `worlds/v3/`. Six generated variants keep their file name one
37
+ * directory down; the three converted rocks were per-game uploads and now live beside them.
38
+ */
39
+ export declare const LEGACY_DEFAULT_ASSET_TARGETS: Readonly<Record<string, LegacyDefaultAssetTarget>>;
40
+ /** The marker every asset URL on the CDN carries; the table's keys are the paths after it. */
41
+ export declare const WORLDS_ROOT = "/worlds/v3/";
42
+ /** One asset record that was repointed, for the upgrade report. Absent id/name are left absent. */
43
+ export interface RepointedAsset {
44
+ id?: string;
45
+ name?: string;
46
+ from: string;
47
+ to: string;
48
+ }
49
+ /** What the repoint did to the project, for the upgrade report. */
50
+ export interface RepointOutcome {
51
+ /** The records rewritten, in file order. Empty when there was nothing to rewrite. */
52
+ repointed: RepointedAsset[];
53
+ /**
54
+ * Why `world.json` was left alone when it could not even be inspected — missing, unreadable,
55
+ * not JSON, not a world object. Absent when the file was read; "read and nothing matched" is
56
+ * an empty `repointed`, not a skip. Reported so the creator knows the migration did not run
57
+ * rather than concluding their assets are already current.
58
+ */
59
+ skipped?: string;
60
+ }
61
+ /**
62
+ * The VXL3 URL a legacy default-asset URL maps to, or null when the URL is not one of the nine.
63
+ * The host is kept — the table matches on the path only, so a project pointed at another
64
+ * environment's CDN keeps pointing at it. Exported for the tests; the migration is the function
65
+ * below.
66
+ */
67
+ export declare function repointLegacyDefaultAssetUrl(url: string): {
68
+ url: string;
69
+ size: number;
70
+ } | null;
71
+ /**
72
+ * Rewrite the project's `src/work/world.json` in place and report what moved. Never throws for a
73
+ * file it cannot read: upgrading the engine must not be blocked by a world.json the creator is
74
+ * mid-edit on, so an unreadable or unparseable file is left exactly as it was and named in
75
+ * `skipped`. A write that fails DOES throw — by then the file was fine and the failure is the
76
+ * disk's, which the creator has to hear about — but `writeWorldJsonAtomic` leaves no partial
77
+ * file or stray temp behind.
78
+ */
79
+ export declare function repointLegacyDefaultAssets(root: string): RepointOutcome;
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Repoints the platform's OWN default voxel assets from their legacy JSON `.vxl` files to the
3
+ * VXL3 re-encodings under `default-assets/voxel/v2/`.
4
+ *
5
+ * Every project scaffolded before engine 3.1056 got a `src/work/world.json` whose default trees
6
+ * and rocks (six generated variants plus three converted rocks) pointed at the pre-VXL3 files.
7
+ * Those files are still served, deliberately — games in the wild reference them by URL — but
8
+ * they are the legacy JSON layout: the engine converts each one in memory on EVERY load, logs a
9
+ * warning per asset per load, and the file carries no LOD trailer for mobile to drop. Nothing
10
+ * else ever rewrote the URLs: `bitmagic upgrade` replaces `engine/` and leaves the creator's
11
+ * `world.json` alone by contract, so an upgraded project kept warning forever.
12
+ *
13
+ * This is the one exception to that contract, and it is a narrow one. Only the nine URLs the
14
+ * platform itself put into `world.json` at scaffold time are touched — matched by their exact
15
+ * path under `worlds/v3/`, host preserved — and each is swapped for the same asset in the new
16
+ * encoding: the three rocks are literal re-encodings of those files, the six variants are the
17
+ * regenerated defaults every current template ships. Ids, names and every other field stay as
18
+ * they are, except `size`, which follows the bytes (the Assets tab shows it, and the old values
19
+ * overstate the new files by 10-20x). Assets the creator added, generated or forged are never
20
+ * looked at: their legacy files, if any, are unknown to this table and need a real re-save.
21
+ *
22
+ * The table is a snapshot of `templates/standard-3d/source/world.json` before and after the move
23
+ * (repo commit a9618f3c), so it is a fixed migration rather than a live lookup — a project must
24
+ * get the same result from every CLI that carries it. `legacy-default-assets.test.ts` holds each
25
+ * entry's `to` side to the template the repo ships, so a regenerated default cannot drift away
26
+ * from this table unnoticed. See docs/voxel-default-assets.md.
27
+ */
28
+ import * as fs from 'fs';
29
+ import * as path from 'path';
30
+ import { aliasSourceDir } from './aliases.js';
31
+ import { isJsonObject, writeWorldJsonAtomic } from '../project/world-json.js';
32
+ /**
33
+ * Keyed by the legacy path under `worlds/v3/`. Six generated variants keep their file name one
34
+ * directory down; the three converted rocks were per-game uploads and now live beside them.
35
+ */
36
+ export const LEGACY_DEFAULT_ASSET_TARGETS = {
37
+ 'default-assets/voxel/tree-variant-1.vxl': { path: 'default-assets/voxel/v2/tree-variant-1.vxl', size: 249 },
38
+ 'default-assets/voxel/tree-variant-2.vxl': { path: 'default-assets/voxel/v2/tree-variant-2.vxl', size: 265 },
39
+ 'default-assets/voxel/tree-variant-3.vxl': { path: 'default-assets/voxel/v2/tree-variant-3.vxl', size: 217 },
40
+ 'default-assets/voxel/rock-variant-1.vxl': { path: 'default-assets/voxel/v2/rock-variant-1.vxl', size: 103 },
41
+ 'default-assets/voxel/rock-variant-2.vxl': { path: 'default-assets/voxel/v2/rock-variant-2.vxl', size: 106 },
42
+ 'default-assets/voxel/rock-variant-3.vxl': { path: 'default-assets/voxel/v2/rock-variant-3.vxl', size: 142 },
43
+ 'RY4XEVGD22FU/1770810580022-RY4XEVGD22FU-voxelRock1-1770810580858.vxl': {
44
+ path: 'default-assets/voxel/v2/voxel-rock-1.vxl', size: 130,
45
+ },
46
+ 'RY4XEVGD22FU/1770810580046-RY4XEVGD22FU-voxelRock2-1770810580863.vxl': {
47
+ path: 'default-assets/voxel/v2/voxel-rock-2.vxl', size: 169,
48
+ },
49
+ 'RY4XEVGD22FU/1770810580070-RY4XEVGD22FU-voxelRock3-1770810580870.vxl': {
50
+ path: 'default-assets/voxel/v2/voxel-rock-3.vxl', size: 209,
51
+ },
52
+ };
53
+ /** The marker every asset URL on the CDN carries; the table's keys are the paths after it. */
54
+ export const WORLDS_ROOT = '/worlds/v3/';
55
+ /**
56
+ * The VXL3 URL a legacy default-asset URL maps to, or null when the URL is not one of the nine.
57
+ * The host is kept — the table matches on the path only, so a project pointed at another
58
+ * environment's CDN keeps pointing at it. Exported for the tests; the migration is the function
59
+ * below.
60
+ */
61
+ export function repointLegacyDefaultAssetUrl(url) {
62
+ const at = url.indexOf(WORLDS_ROOT);
63
+ if (at < 0)
64
+ return null;
65
+ const legacyPath = url.slice(at + WORLDS_ROOT.length);
66
+ // hasOwn, not a bare index: the path comes from the file, and a path spelled like an
67
+ // Object.prototype member ('constructor', '__proto__', …) would otherwise "match".
68
+ if (!Object.hasOwn(LEGACY_DEFAULT_ASSET_TARGETS, legacyPath))
69
+ return null;
70
+ const target = LEGACY_DEFAULT_ASSET_TARGETS[legacyPath];
71
+ return { url: `${url.slice(0, at + WORLDS_ROOT.length)}${target.path}`, size: target.size };
72
+ }
73
+ /**
74
+ * Rewrite the project's `src/work/world.json` in place and report what moved. Never throws for a
75
+ * file it cannot read: upgrading the engine must not be blocked by a world.json the creator is
76
+ * mid-edit on, so an unreadable or unparseable file is left exactly as it was and named in
77
+ * `skipped`. A write that fails DOES throw — by then the file was fine and the failure is the
78
+ * disk's, which the creator has to hear about — but `writeWorldJsonAtomic` leaves no partial
79
+ * file or stray temp behind.
80
+ */
81
+ export function repointLegacyDefaultAssets(root) {
82
+ const worldRelative = path.join(aliasSourceDir('work'), 'world.json');
83
+ const worldPath = path.join(root, worldRelative);
84
+ if (!fs.existsSync(worldPath)) {
85
+ return { repointed: [], skipped: `${worldRelative} not found` };
86
+ }
87
+ let world;
88
+ try {
89
+ world = JSON.parse(fs.readFileSync(worldPath, 'utf-8'));
90
+ }
91
+ catch (error) {
92
+ const reason = error instanceof SyntaxError ? 'is not valid JSON' : 'could not be read';
93
+ return { repointed: [], skipped: `${worldRelative} ${reason}` };
94
+ }
95
+ if (!isJsonObject(world)) {
96
+ return { repointed: [], skipped: `${worldRelative} does not contain a world object` };
97
+ }
98
+ const assets = world.assets;
99
+ if (!Array.isArray(assets))
100
+ return { repointed: [] };
101
+ const repointed = [];
102
+ for (const asset of assets) {
103
+ if (!isJsonObject(asset))
104
+ continue;
105
+ if (typeof asset.url !== 'string')
106
+ continue;
107
+ const target = repointLegacyDefaultAssetUrl(asset.url);
108
+ if (target === null)
109
+ continue;
110
+ repointed.push({
111
+ ...(typeof asset.id === 'string' ? { id: asset.id } : {}),
112
+ ...(typeof asset.name === 'string' ? { name: asset.name } : {}),
113
+ from: asset.url,
114
+ to: target.url,
115
+ });
116
+ asset.url = target.url;
117
+ asset.size = target.size;
118
+ }
119
+ if (repointed.length === 0)
120
+ return { repointed };
121
+ writeWorldJsonAtomic(worldPath, world);
122
+ return { repointed };
123
+ }
124
+ //# sourceMappingURL=legacy-default-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-default-assets.js","sourceRoot":"","sources":["../../src/scaffold/legacy-default-assets.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type AgentsMdOutcome } from './agents-md.js';
2
+ import { type RepointedAsset } from './legacy-default-assets.js';
2
3
  export interface UpgradeOptions {
3
4
  root: string;
4
5
  /** Where extractEngine unpacked the new engine tree, same shape scaffoldProject reads from. */
@@ -32,15 +33,33 @@ export interface UpgradeResult {
32
33
  * never silent.
33
34
  */
34
35
  environmentPinned?: string;
36
+ /**
37
+ * The platform-owned default assets in `src/work/world.json` that were repointed from their
38
+ * legacy JSON files to the VXL3 ones. Empty when there was nothing to repoint. This is the one
39
+ * write this command makes to the creator's game, so it is reported per asset rather than
40
+ * folded into `replaced` — see scaffold/legacy-default-assets.ts.
41
+ */
42
+ legacyAssetsRepointed: RepointedAsset[];
43
+ /**
44
+ * Why world.json could not even be inspected for that repoint, when it could not be (missing,
45
+ * unreadable, not JSON). Absent when it was read. The creator is told rather than left to
46
+ * conclude their default assets are already current.
47
+ */
48
+ legacyAssetsSkipped?: string;
35
49
  }
36
50
  /**
37
51
  * Refreshes the platform-owned parts of a scaffolded project in place, and nothing else. This is
38
52
  * the file-boundary described in the task brief: `engine/` (every VENDORED_DIRS entry) and
39
53
  * sw-cache-buster.js are wholesale-replaced, the config files AND SHIPPED SKILLS in
40
54
  * PLATFORM_GENERATED_FILES are re-rendered, and bitmagic.json is read-modified-written so only its
41
- * engineVersion field changes. Everything else on disk — src/, world.json, game.json,
42
- * package.json, GAME-DESIGN.md, CLAUDE.md, .gitignore, and any skill the creator wrote themselves
43
- * — is never opened.
55
+ * engineVersion field changes. Everything else on disk — src/ (bar the one world.json case next),
56
+ * game.json, package.json, GAME-DESIGN.md, CLAUDE.md, .gitignore, and any skill the creator wrote
57
+ * themselves — is never opened.
58
+ *
59
+ * `src/work/world.json` is opened for exactly one thing: the platform's own default voxel assets,
60
+ * scaffolded before engine 3.1056 as legacy JSON `.vxl` URLs, are repointed to their VXL3 files
61
+ * (nine known URLs, matched exactly; every other asset and field is left as found — see
62
+ * scaffold/legacy-default-assets.ts). Nothing the creator put there is touched.
44
63
  *
45
64
  * AGENTS.md is the one conditional case, and never a destructive one: it is refreshed only when it
46
65
  * still hashes to what the CLI itself last wrote, and otherwise left untouched with a suggestion.
@@ -5,14 +5,20 @@ import { VENDORED_DIRS, PLATFORM_GENERATED_FILES, copyOptionalEngineEntries, cop
5
5
  import { isEnvironmentName } from '../config/environments.js';
6
6
  import { reconcileAgentsMd, AGENTS_MD_FILE } from './agents-md.js';
7
7
  import { CLAUDE_SETTINGS_FILE, mergeReloadHook } from './claude-settings.js';
8
+ import { repointLegacyDefaultAssets } from './legacy-default-assets.js';
8
9
  /**
9
10
  * Refreshes the platform-owned parts of a scaffolded project in place, and nothing else. This is
10
11
  * the file-boundary described in the task brief: `engine/` (every VENDORED_DIRS entry) and
11
12
  * sw-cache-buster.js are wholesale-replaced, the config files AND SHIPPED SKILLS in
12
13
  * PLATFORM_GENERATED_FILES are re-rendered, and bitmagic.json is read-modified-written so only its
13
- * engineVersion field changes. Everything else on disk — src/, world.json, game.json,
14
- * package.json, GAME-DESIGN.md, CLAUDE.md, .gitignore, and any skill the creator wrote themselves
15
- * — is never opened.
14
+ * engineVersion field changes. Everything else on disk — src/ (bar the one world.json case next),
15
+ * game.json, package.json, GAME-DESIGN.md, CLAUDE.md, .gitignore, and any skill the creator wrote
16
+ * themselves — is never opened.
17
+ *
18
+ * `src/work/world.json` is opened for exactly one thing: the platform's own default voxel assets,
19
+ * scaffolded before engine 3.1056 as legacy JSON `.vxl` URLs, are repointed to their VXL3 files
20
+ * (nine known URLs, matched exactly; every other asset and field is left as found — see
21
+ * scaffold/legacy-default-assets.ts). Nothing the creator put there is touched.
16
22
  *
17
23
  * AGENTS.md is the one conditional case, and never a destructive one: it is refreshed only when it
18
24
  * still hashes to what the CLI itself last wrote, and otherwise left untouched with a suggestion.
@@ -77,6 +83,14 @@ export function upgradeProject(options) {
77
83
  writeProjectFile(root, CLAUDE_SETTINGS_FILE, settings.contents);
78
84
  replaced.push(CLAUDE_SETTINGS_FILE);
79
85
  }
86
+ // The default trees and rocks a pre-3.1056 scaffold pointed at the legacy JSON files: swap the
87
+ // nine known URLs for the VXL3 ones. After the engine copy, since the engine that can now read
88
+ // both forms is what makes a partial swap safe; before bitmagic.json, so a project whose
89
+ // world.json is unreadable still gets its engine bump recorded (the repoint reports nothing).
90
+ const repoint = repointLegacyDefaultAssets(root);
91
+ if (repoint.repointed.length > 0) {
92
+ replaced.push('src/work/world.json');
93
+ }
80
94
  // Read-modify-write, not re-rendered from renderBitmagicJson: re-rendering would discard any
81
95
  // field a later CLI/engine version adds to the metadata that this version doesn't know about.
82
96
  const bitmagicJsonPath = path.join(root, 'bitmagic.json');
@@ -113,6 +127,8 @@ export function upgradeProject(options) {
113
127
  agentsMd,
114
128
  ...(settings.skipped === undefined ? {} : { claudeSettingsSkipped: settings.skipped }),
115
129
  ...(environmentPinned === undefined ? {} : { environmentPinned }),
130
+ legacyAssetsRepointed: repoint.repointed,
131
+ ...(repoint.skipped === undefined ? {} : { legacyAssetsSkipped: repoint.skipped }),
116
132
  };
117
133
  }
118
134
  //# sourceMappingURL=upgrade-project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-project.js","sourceRoot":"","sources":["../../src/scaffold/upgrade-project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upgrade-project.js","sourceRoot":"","sources":["../../src/scaffold/upgrade-project.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitmagic/cli",
3
- "version": "0.1.51-dev.0",
3
+ "version": "0.1.51",
4
4
  "description": "Build Bitmagic games from your own agent tool",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Bitmagic Oy",
@@ -23,9 +23,9 @@
23
23
  "fflate": "^0.8.2",
24
24
  "playwright-core": "^1.59.1",
25
25
  "tar": "^7.4.3",
26
- "@bitmagic/asset-core": "0.2.6-dev.0",
27
- "@bitmagic/world-forger": "0.1.11-dev.0",
28
- "@bitmagic/animation-forger": "0.1.6-dev.0"
26
+ "@bitmagic/animation-forger": "0.1.6",
27
+ "@bitmagic/asset-core": "0.2.6",
28
+ "@bitmagic/world-forger": "0.1.11"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@eslint/js": "^9.38.0",