@bitmagic/cli 0.1.52-dev.1 → 0.1.52-dev.3

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 (56) hide show
  1. package/README.md +63 -0
  2. package/dist/assets/add.d.ts +66 -0
  3. package/dist/assets/add.js +274 -0
  4. package/dist/assets/add.js.map +1 -0
  5. package/dist/assets/entry.d.ts +44 -0
  6. package/dist/assets/entry.js +71 -0
  7. package/dist/assets/entry.js.map +1 -0
  8. package/dist/assets/file-kind.d.ts +53 -0
  9. package/dist/assets/file-kind.js +180 -0
  10. package/dist/assets/file-kind.js.map +1 -0
  11. package/dist/assets/list.d.ts +27 -0
  12. package/dist/assets/list.js +50 -0
  13. package/dist/assets/list.js.map +1 -0
  14. package/dist/assets/remove.d.ts +50 -0
  15. package/dist/assets/remove.js +91 -0
  16. package/dist/assets/remove.js.map +1 -0
  17. package/dist/assets/vxl-summary.d.ts +23 -0
  18. package/dist/assets/vxl-summary.js +103 -0
  19. package/dist/assets/vxl-summary.js.map +1 -0
  20. package/dist/cli.d.ts +1 -0
  21. package/dist/cli.js +2 -0
  22. package/dist/cli.js.map +1 -1
  23. package/dist/commands/assets.d.ts +62 -0
  24. package/dist/commands/assets.js +359 -0
  25. package/dist/commands/assets.js.map +1 -0
  26. package/dist/commands/judge.js +24 -16
  27. package/dist/commands/judge.js.map +1 -1
  28. package/dist/editor/previews.d.ts +6 -0
  29. package/dist/editor/previews.js +16 -0
  30. package/dist/editor/previews.js.map +1 -1
  31. package/dist/editor/server.js +2 -2
  32. package/dist/editor/server.js.map +1 -1
  33. package/dist/forge/apply-modifications.d.ts +9 -1
  34. package/dist/forge/apply-modifications.js +3 -14
  35. package/dist/forge/apply-modifications.js.map +1 -1
  36. package/dist/forge/browser-host.js +9 -4
  37. package/dist/forge/browser-host.js.map +1 -1
  38. package/dist/forge/voxelize-session.d.ts +24 -0
  39. package/dist/forge/voxelize-session.js +137 -0
  40. package/dist/forge/voxelize-session.js.map +1 -0
  41. package/dist/generate/prop.js +9 -63
  42. package/dist/generate/prop.js.map +1 -1
  43. package/dist/generate/vehicle.js +5 -85
  44. package/dist/generate/vehicle.js.map +1 -1
  45. package/dist/http/signed-upload.d.ts +55 -0
  46. package/dist/http/signed-upload.js +168 -0
  47. package/dist/http/signed-upload.js.map +1 -0
  48. package/dist/judge/facts.js +72 -57
  49. package/dist/judge/facts.js.map +1 -1
  50. package/dist/project/jobs.d.ts +1 -1
  51. package/dist/project/jobs.js.map +1 -1
  52. package/dist/publish/client.js +13 -34
  53. package/dist/publish/client.js.map +1 -1
  54. package/dist/scaffold/project-files.js +21 -8
  55. package/dist/scaffold/project-files.js.map +1 -1
  56. package/package.json +4 -4
@@ -0,0 +1,62 @@
1
+ import { type AddAssetResult, type VoxelizeGlb } from '../assets/add.js';
2
+ import { type AssetRow } from '../assets/list.js';
3
+ /** The Creator's voxelize-dialog defaults (assetsVoxelizeDialog.ts), so a plain `add` bakes the same way. */
4
+ export declare const DEFAULT_MIN_VOXEL_SIZE = 0.1;
5
+ export declare const DEFAULT_MAX_VOXEL_SIZE = 0.5;
6
+ export interface AssetsRunDeps {
7
+ fetch: typeof globalThis.fetch;
8
+ sleep: (ms: number) => Promise<void>;
9
+ now?: () => number;
10
+ /** Test-only override; production omits it and loadProjectContext walks up from process.cwd(). */
11
+ startDir?: string;
12
+ /** Test-only override; production omits it and getAccessToken/readDefaultEnvironment read ~/.bitmagic. */
13
+ baseDir?: string;
14
+ /** Test-only override for the headless bake, so the GLB path runs without Chrome. */
15
+ voxelize?: VoxelizeGlb;
16
+ log: (message: string) => void;
17
+ }
18
+ /**
19
+ * Whether to fill the model's interior with voxels.
20
+ *
21
+ * `--hollow` and `--solid` are explicit; otherwise this mirrors `generate prop`'s size rule
22
+ * (`shouldFillInterior`), which the web lane has always applied: prop-scale objects fill solid so
23
+ * nothing reads as a shell when the camera clips inside, while building-scale ones stay hollow
24
+ * because a solid-filled building is millions of wasted voxels. `assets add` has no `fitBox`, so
25
+ * the only size it knows is `--height` — enough to catch the case that actually hurts.
26
+ */
27
+ export declare const SOLID_FILL_MAX_HEIGHT_M = 6;
28
+ export interface AddOptions {
29
+ file: string;
30
+ name?: string;
31
+ assetId?: string;
32
+ keepGlb: boolean;
33
+ force: boolean;
34
+ voxelSize?: string;
35
+ maxVoxelSize?: string;
36
+ height?: string;
37
+ hollow: boolean;
38
+ solid: boolean;
39
+ json: boolean;
40
+ deps?: AssetsRunDeps;
41
+ }
42
+ export declare function runAssetsAdd(options: AddOptions): Promise<AddAssetResult>;
43
+ export declare function runAssetsList(options: {
44
+ json: boolean;
45
+ deps?: AssetsRunDeps;
46
+ }): Promise<AssetRow[]>;
47
+ export interface RemoveOptions {
48
+ assetId: string;
49
+ force: boolean;
50
+ json: boolean;
51
+ deps?: AssetsRunDeps;
52
+ }
53
+ export interface RemoveResult {
54
+ assetId: string;
55
+ name: string;
56
+ /** Placed instances removed alongside the asset (only ever non-zero under --force). */
57
+ instancesRemoved: number;
58
+ /** References that remain, by path — under --force only. */
59
+ remainingReferences: string[];
60
+ }
61
+ export declare function runAssetsRemove(options: RemoveOptions): Promise<RemoveResult>;
62
+ export declare const assetsCommand: import("citty").CommandDef<import("citty").ArgsDef>;
@@ -0,0 +1,359 @@
1
+ /**
2
+ * `bitmagic assets add | list | remove` — the game's asset registry, from the command line.
3
+ *
4
+ * `add` is the pro lane's answer to the Creator's Assets-tab upload: a creator's own `.glb`, `.vxl`,
5
+ * image, audio or JSON file goes into storage and into `src/work/world.json`. `list` and `remove`
6
+ * are local — they read and edit that file and talk to nobody.
7
+ *
8
+ * Same conventions as `bitmagic generate`: kebab-case flags, `--json` for the result document,
9
+ * prose through `log`, every pre-write failure ending "world.json is unchanged.", and the exit
10
+ * code / failure category of a CliError carried across untouched.
11
+ */
12
+ import { defineCommand } from 'citty';
13
+ import * as path from 'path';
14
+ import { CliError } from '../errors.js';
15
+ import { createOutput } from '../output.js';
16
+ import { loadProjectContext } from '../project/context.js';
17
+ import { withJobRecord } from '../project/jobs.js';
18
+ import { readWorldJson } from '../project/world-json.js';
19
+ import { resolveEnvironmentForCommand, resolveAuth0ClientId } from '../config/environments.js';
20
+ import { getAccessToken } from '../auth/session.js';
21
+ import { addAssetFile } from '../assets/add.js';
22
+ import { ACCEPTED_EXTENSIONS, classifyAssetFile, uploadFilename, validateAssetName } from '../assets/file-kind.js';
23
+ import { formatAssetTable, summarizeAssets } from '../assets/list.js';
24
+ import { planAssetRemoval } from '../assets/remove.js';
25
+ import { applyModificationsToWorld } from '../forge/apply-modifications.js';
26
+ import { projectWorldJsonPath } from '../forge/run-pipeline.js';
27
+ import { removePreview } from '../editor/previews.js';
28
+ /** The Creator's voxelize-dialog defaults (assetsVoxelizeDialog.ts), so a plain `add` bakes the same way. */
29
+ export const DEFAULT_MIN_VOXEL_SIZE = 0.1;
30
+ export const DEFAULT_MAX_VOXEL_SIZE = 0.5;
31
+ function defaultDeps(json) {
32
+ const output = createOutput(json);
33
+ return {
34
+ fetch: globalThis.fetch,
35
+ sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
36
+ log: output.info,
37
+ };
38
+ }
39
+ /**
40
+ * Whether to fill the model's interior with voxels.
41
+ *
42
+ * `--hollow` and `--solid` are explicit; otherwise this mirrors `generate prop`'s size rule
43
+ * (`shouldFillInterior`), which the web lane has always applied: prop-scale objects fill solid so
44
+ * nothing reads as a shell when the camera clips inside, while building-scale ones stay hollow
45
+ * because a solid-filled building is millions of wasted voxels. `assets add` has no `fitBox`, so
46
+ * the only size it knows is `--height` — enough to catch the case that actually hurts.
47
+ */
48
+ export const SOLID_FILL_MAX_HEIGHT_M = 6;
49
+ function resolveFillInterior(options, targetHeight) {
50
+ if (options.solid)
51
+ return true;
52
+ if (options.hollow)
53
+ return false;
54
+ return targetHeight === undefined || targetHeight <= SOLID_FILL_MAX_HEIGHT_M;
55
+ }
56
+ /** Same contract as generate.ts's: only the message changes, exit code and category survive. */
57
+ function decoratedError(error, decorate) {
58
+ return error instanceof CliError
59
+ ? new CliError(decorate(error.message), error.exitCode, error.code)
60
+ : error;
61
+ }
62
+ /**
63
+ * Resolve the project and read its world.json, with every failure carrying the lane's guarantee.
64
+ *
65
+ * Shared by all three subcommands: `list` and `remove` used to skip the decoration entirely, so a
66
+ * malformed world.json or a missing project answered them in different words than `add` — and
67
+ * `remove`'s schema-gate refusal, the one a caller most needs the guarantee on, carried none.
68
+ */
69
+ function readProject(runDeps) {
70
+ try {
71
+ const context = loadProjectContext(runDeps.startDir);
72
+ return { context, world: readWorldJson(projectWorldJsonPath(context.root)) };
73
+ }
74
+ catch (error) {
75
+ throw decoratedError(error, unchanged);
76
+ }
77
+ }
78
+ /** Appends the unchanged-world guarantee unless the message already makes it. */
79
+ function unchanged(message) {
80
+ return message.includes('world.json is unchanged') ? message : `${message} world.json is unchanged.`;
81
+ }
82
+ /**
83
+ * A decimal number and nothing else. `Number()` alone accepts `0x10` (16), `0b11`, `1e300`, `' 5 '`
84
+ * and `''` (0), so `--height 0x10` used to silently scale a model to 16 metres. Every rejection
85
+ * carries the unchanged-world guarantee, since these run before anything is read or uploaded.
86
+ */
87
+ const DECIMAL = /^-?\d+(\.\d+)?$/;
88
+ function parseNumberFlag(flagName, raw, options = {}) {
89
+ if (raw === undefined)
90
+ return undefined;
91
+ const trimmed = raw.trim();
92
+ if (!DECIMAL.test(trimmed)) {
93
+ throw new CliError(`--${flagName} must be a decimal number, got ${JSON.stringify(raw)}. world.json is unchanged.`);
94
+ }
95
+ const value = Number(trimmed);
96
+ if (!Number.isFinite(value)) {
97
+ throw new CliError(`--${flagName} must be a number, got ${JSON.stringify(raw)}. world.json is unchanged.`);
98
+ }
99
+ if (options.min !== undefined && value < options.min) {
100
+ throw new CliError(`--${flagName} must be at least ${options.min}, got ${value}. world.json is unchanged.`);
101
+ }
102
+ if (options.max !== undefined && value > options.max) {
103
+ throw new CliError(`--${flagName} must be at most ${options.max}, got ${value}. world.json is unchanged.`);
104
+ }
105
+ return value;
106
+ }
107
+ export async function runAssetsAdd(options) {
108
+ const output = createOutput(options.json);
109
+ const runDeps = options.deps ?? defaultDeps(options.json);
110
+ // Flags first: a typo costs nothing and names itself.
111
+ const minVoxelSize = parseNumberFlag('voxel-size', options.voxelSize, { min: 0.01, max: 1 }) ?? DEFAULT_MIN_VOXEL_SIZE;
112
+ const maxVoxelSize = parseNumberFlag('max-voxel-size', options.maxVoxelSize, { min: 0.01, max: 4 }) ?? DEFAULT_MAX_VOXEL_SIZE;
113
+ if (maxVoxelSize < minVoxelSize) {
114
+ throw new CliError(`--max-voxel-size (${maxVoxelSize}) must be at least --voxel-size (${minVoxelSize}). world.json is unchanged.`);
115
+ }
116
+ const targetHeight = parseNumberFlag('height', options.height, { min: 0.01, max: 1000 });
117
+ if (options.hollow && options.solid) {
118
+ throw new CliError('Pass either --hollow or --solid, not both. world.json is unchanged.');
119
+ }
120
+ if (options.assetId !== undefined && options.assetId.trim() === '') {
121
+ throw new CliError('--asset-id was given with an empty value. Pass a real asset id (see `bitmagic assets list`), '
122
+ + 'or omit the flag to mint a new one. world.json is unchanged.');
123
+ }
124
+ let context;
125
+ try {
126
+ context = loadProjectContext(runDeps.startDir);
127
+ }
128
+ catch (error) {
129
+ throw decoratedError(error, unchanged);
130
+ }
131
+ const environment = resolveEnvironmentForCommand({ cwd: context.root, baseDir: runDeps.baseDir });
132
+ let token;
133
+ try {
134
+ token = await getAccessToken(environment, resolveAuth0ClientId(environment), { fetch: runDeps.fetch, sleep: runDeps.sleep, now: runDeps.now }, runDeps.baseDir);
135
+ }
136
+ catch (error) {
137
+ throw decoratedError(error, unchanged);
138
+ }
139
+ // Refuse a format or name this lane cannot take BEFORE a job record exists: a `.gltf` typed by
140
+ // mistake should not leave a failed "upload" in `.bitmagic/jobs/` or nudge about `bitmagic dev`.
141
+ const filePath = path.resolve(options.file);
142
+ classifyAssetFile(filePath, { keepGlb: options.keepGlb });
143
+ uploadFilename(filePath);
144
+ if (options.name !== undefined)
145
+ validateAssetName(options.name);
146
+ const result = await withJobRecord({
147
+ root: context.root,
148
+ kind: 'upload',
149
+ label: path.basename(filePath),
150
+ ...(options.assetId !== undefined ? { assetId: options.assetId } : {}),
151
+ log: runDeps.log,
152
+ }, async (log) => {
153
+ try {
154
+ return await addAssetFile({
155
+ context,
156
+ environment,
157
+ token,
158
+ filePath,
159
+ ...(options.name !== undefined ? { name: options.name } : {}),
160
+ ...(options.assetId !== undefined ? { assetId: options.assetId } : {}),
161
+ keepGlb: options.keepGlb,
162
+ force: options.force,
163
+ voxel: {
164
+ minVoxelSize,
165
+ maxVoxelSize,
166
+ ...(targetHeight !== undefined ? { targetHeight } : {}),
167
+ fillInterior: resolveFillInterior(options, targetHeight),
168
+ },
169
+ fetchImpl: runDeps.fetch,
170
+ ...(runDeps.voxelize !== undefined ? { voxelize: runDeps.voxelize } : {}),
171
+ log,
172
+ });
173
+ }
174
+ catch (error) {
175
+ throw decoratedError(error, unchanged);
176
+ }
177
+ });
178
+ // A replacement reuses an id, and previews are keyed by id and never otherwise invalidated — so
179
+ // without this the dev view keeps drawing the OLD asset's thumbnail for the new one, forever.
180
+ // The same reason `assets remove` drops it.
181
+ if (result.replaced)
182
+ removePreview(context.root, result.assetId);
183
+ for (const note of result.notes)
184
+ runDeps.log(`note: ${note}`);
185
+ runDeps.log(`${result.replaced ? 'Replaced' : 'Added'} "${result.name}" (${result.type}, id ${result.assetId}) in world.json.`);
186
+ output.result({ ok: true, kind: 'asset', ...result });
187
+ runDeps.log('A running `bitmagic dev` reloads the browser by itself to show it.');
188
+ return result;
189
+ }
190
+ // ============================================================================
191
+ // list
192
+ // ============================================================================
193
+ export async function runAssetsList(options) {
194
+ const output = createOutput(options.json);
195
+ const runDeps = options.deps ?? defaultDeps(options.json);
196
+ // Read-only, but it still carries the guarantee: an agent greps for this sentence to know it
197
+ // does not have to go and diff world.json itself.
198
+ const { world } = readProject(runDeps);
199
+ const rows = summarizeAssets(world);
200
+ const assets = Array.isArray(world.assets) ? world.assets : [];
201
+ if (options.json) {
202
+ // The raw records, not the table's summary of them: an agent reading this wants every field
203
+ // the engine will see (boundingBox, vehicleFitment, production, ...), plus the two counts —
204
+ // `placed` and the full `references` the remove command refuses on.
205
+ output.result({
206
+ ok: true,
207
+ count: rows.length,
208
+ assets,
209
+ placed: Object.fromEntries(rows.map((row) => [row.id, row.placed])),
210
+ references: Object.fromEntries(rows.map((row) => [row.id, row.references])),
211
+ });
212
+ }
213
+ else {
214
+ runDeps.log(formatAssetTable(rows));
215
+ }
216
+ return rows;
217
+ }
218
+ export async function runAssetsRemove(options) {
219
+ const output = createOutput(options.json);
220
+ const runDeps = options.deps ?? defaultDeps(options.json);
221
+ const { context, world } = readProject(runDeps);
222
+ const worldPath = projectWorldJsonPath(context.root);
223
+ const plan = planAssetRemoval(world, options.assetId, options.force);
224
+ try {
225
+ applyModificationsToWorld(worldPath, plan.modifications, { subject: 'Removing the asset' });
226
+ }
227
+ catch (error) {
228
+ throw decoratedError(error, unchanged);
229
+ }
230
+ removePreview(context.root, options.assetId);
231
+ const name = typeof plan.asset.name === 'string' ? plan.asset.name : options.assetId;
232
+ const remaining = plan.otherReferences.map((ref) => ref.path);
233
+ runDeps.log(`Removed "${name}" (${options.assetId}) from world.json`
234
+ + (plan.placedInstances > 0
235
+ ? ` along with ${plan.placedInstances} placed instance${plan.placedInstances === 1 ? '' : 's'}`
236
+ : '')
237
+ + '. The uploaded file stays in storage.');
238
+ for (const ref of remaining)
239
+ runDeps.log(`warning: ${ref} still names this asset — fix it or the game will not find it.`);
240
+ const result = {
241
+ assetId: options.assetId, name, instancesRemoved: plan.placedInstances, remainingReferences: remaining,
242
+ };
243
+ output.result({ ok: true, kind: 'asset-removed', ...result });
244
+ runDeps.log('A running `bitmagic dev` reloads the browser by itself.');
245
+ return result;
246
+ }
247
+ // ============================================================================
248
+ // Subcommands
249
+ // ============================================================================
250
+ const JSON_FLAG = {
251
+ type: 'boolean',
252
+ description: 'Print the result as JSON on stdout; all progress goes to stderr.',
253
+ };
254
+ const addCommand = defineCommand({
255
+ meta: {
256
+ name: 'add',
257
+ description: `Upload one of your own files (${ACCEPTED_EXTENSIONS.map((e) => `.${e}`).join(' ')}) into the game's assets.`,
258
+ },
259
+ args: {
260
+ file: { type: 'positional', required: true, description: 'The file to add.' },
261
+ name: {
262
+ type: 'string',
263
+ description: 'Asset name; defaults to the filename without its extension.',
264
+ },
265
+ 'asset-id': {
266
+ type: 'string',
267
+ description: 'Store under this asset_… id instead of minting one; re-running with the same id replaces the asset.',
268
+ },
269
+ 'keep-glb': {
270
+ type: 'boolean',
271
+ description: 'Register a .glb as a polygon mesh instead of voxelizing it.',
272
+ },
273
+ 'voxel-size': {
274
+ type: 'string',
275
+ description: `Finest voxel size in metres when voxelizing a .glb (default ${DEFAULT_MIN_VOXEL_SIZE}).`,
276
+ },
277
+ 'max-voxel-size': {
278
+ type: 'string',
279
+ description: `Coarsest voxel size for flat areas (default ${DEFAULT_MAX_VOXEL_SIZE}; equal to --voxel-size for a uniform grid).`,
280
+ },
281
+ height: {
282
+ type: 'string',
283
+ description: 'Scale a .glb to this height in metres. Omit to keep its own size (2 m for --keep-glb).',
284
+ },
285
+ hollow: {
286
+ type: 'boolean',
287
+ description: 'Bake a .glb as a closed shell rather than filling its interior.',
288
+ },
289
+ solid: {
290
+ type: 'boolean',
291
+ description: `Fill a .glb's interior even when --height is over ${SOLID_FILL_MAX_HEIGHT_M} m (the default fills only below that).`,
292
+ },
293
+ force: {
294
+ type: 'boolean',
295
+ description: 'With --asset-id, replace a still-referenced asset even when the type changes.',
296
+ },
297
+ json: JSON_FLAG,
298
+ },
299
+ async run({ args }) {
300
+ await runAssetsAdd({
301
+ file: args.file,
302
+ // `!== undefined`, NOT truthiness. citty hands back `''` both for a flag given with no value
303
+ // and for one whose shell variable was empty (`--asset-id "$ID"` with ID unset), and a
304
+ // truthiness guard dropped the key entirely — so `--asset-id ''` silently minted a NEW id and
305
+ // ADDED a duplicate instead of replacing, and `--voxel-size ''` silently used the default.
306
+ // Passing `''` through lets the validators below reject it by name.
307
+ ...(args.name !== undefined ? { name: args.name } : {}),
308
+ ...(args['asset-id'] !== undefined ? { assetId: args['asset-id'] } : {}),
309
+ keepGlb: args['keep-glb'] === true,
310
+ force: args.force === true,
311
+ ...(args['voxel-size'] !== undefined ? { voxelSize: args['voxel-size'] } : {}),
312
+ ...(args['max-voxel-size'] !== undefined ? { maxVoxelSize: args['max-voxel-size'] } : {}),
313
+ ...(args.height !== undefined ? { height: args.height } : {}),
314
+ hollow: args.hollow === true,
315
+ solid: args.solid === true,
316
+ json: args.json === true,
317
+ });
318
+ },
319
+ });
320
+ const listCommand = defineCommand({
321
+ meta: { name: 'list', description: 'List the assets in world.json: id, name, type, size, placed count.' },
322
+ args: { json: JSON_FLAG },
323
+ async run({ args }) {
324
+ await runAssetsList({ json: args.json === true });
325
+ },
326
+ });
327
+ const removeCommand = defineCommand({
328
+ meta: {
329
+ name: 'remove',
330
+ description: 'Remove an asset from world.json. The uploaded file stays in storage.',
331
+ },
332
+ args: {
333
+ 'asset-id': { type: 'positional', required: true, description: 'The asset id (see `bitmagic assets list`).' },
334
+ force: {
335
+ type: 'boolean',
336
+ description: 'Remove even if the asset is still referenced; its placed instances are removed with it.',
337
+ },
338
+ json: JSON_FLAG,
339
+ },
340
+ async run({ args }) {
341
+ await runAssetsRemove({
342
+ assetId: args['asset-id'],
343
+ force: args.force === true,
344
+ json: args.json === true,
345
+ });
346
+ },
347
+ });
348
+ export const assetsCommand = defineCommand({
349
+ meta: {
350
+ name: 'assets',
351
+ description: 'Add your own files to the game\'s assets, list them, or remove one.',
352
+ },
353
+ subCommands: {
354
+ add: addCommand,
355
+ list: listCommand,
356
+ remove: removeCommand,
357
+ },
358
+ });
359
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/commands/assets.ts"],"names":[],"mappings":"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"}
@@ -54,14 +54,13 @@ function parseMinScoreArg(raw) {
54
54
  return value;
55
55
  }
56
56
  function readConsoleTail(artifactDir) {
57
- let raw;
58
57
  try {
59
- raw = fs.readFileSync(path.join(artifactDir, 'console.log'), 'utf-8');
58
+ const raw = fs.readFileSync(path.join(artifactDir, 'console.log'), 'utf-8');
59
+ return raw.split('\n').slice(-CONSOLE_TAIL_LINES).join('\n');
60
60
  }
61
61
  catch {
62
62
  return null;
63
63
  }
64
- return raw.split('\n').slice(-CONSOLE_TAIL_LINES).join('\n');
65
64
  }
66
65
  /** GAME-DESIGN.md's content, or empty — the rubric degrades gracefully without one. */
67
66
  function readDesignText(root) {
@@ -72,6 +71,21 @@ function readDesignText(root) {
72
71
  return '';
73
72
  }
74
73
  }
74
+ /**
75
+ * Engine ground truth from world.json, read fresh because it is shared ground
76
+ * with the human's editor (see AGENTS.md). Undefined when it is missing or
77
+ * unreadable: the judge then grades from pixels alone, as it did before scene
78
+ * facts existed.
79
+ */
80
+ function readSceneFacts(root) {
81
+ try {
82
+ const world = JSON.parse(fs.readFileSync(path.join(root, 'src', 'work', 'world.json'), 'utf-8'));
83
+ return buildSceneFacts(world) ?? undefined;
84
+ }
85
+ catch {
86
+ return undefined;
87
+ }
88
+ }
75
89
  function renderScorecard(scorecard, model, sparks, log) {
76
90
  log(`Judge verdict: ${scorecard.overall}/10 overall (${model}, ${sparks} sparks)`);
77
91
  for (const dimension of scorecard.dimensions) {
@@ -82,10 +96,10 @@ function renderScorecard(scorecard, model, sparks, log) {
82
96
  return;
83
97
  }
84
98
  log('Top findings:');
85
- scorecard.topFindings.forEach((finding, index) => {
99
+ for (const [index, finding] of scorecard.topFindings.entries()) {
86
100
  log(` ${index + 1}. [${finding.severity}] ${finding.title}`);
87
101
  log(` ${finding.detail}`);
88
- });
102
+ }
89
103
  }
90
104
  function defaultDeps(json) {
91
105
  const output = createOutput(json);
@@ -122,17 +136,11 @@ export async function runJudge(args, deps = defaultDeps(args.json === true)) {
122
136
  deps.log('The project has changed since this screenshot was taken — the verdict is about the older ' +
123
137
  'build. Re-run `bitmagic verify` first for a current one.');
124
138
  }
125
- // Re-read world.json fresh — it is shared ground with the human's editor (see AGENTS.md).
126
- // Unreadable is fine: the judge grades from pixels alone, as it did before scene facts existed.
127
- let sceneFacts;
128
- try {
129
- const world = JSON.parse(fs.readFileSync(path.join(root, 'src', 'work', 'world.json'), 'utf-8'));
130
- sceneFacts = buildSceneFacts(world) ?? undefined;
131
- }
132
- catch {
133
- sceneFacts = undefined;
134
- }
135
- const rubric = buildJudgeRubric({ designText: readDesignText(root), genre, sceneFacts });
139
+ const rubric = buildJudgeRubric({
140
+ designText: readDesignText(root),
141
+ genre,
142
+ sceneFacts: readSceneFacts(root),
143
+ });
136
144
  const verifyContext = buildVerifyContext(verifyRecord, readConsoleTail(artifactDir));
137
145
  const environment = resolveEnvironmentForCommand({ cwd: root, baseDir: deps.baseDir });
138
146
  const clientId = resolveAuth0ClientId(environment);
@@ -1 +1 @@
1
- {"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/commands/judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAuB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,+EAA+E;AAC/E,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED,kEAAkE;AAClE,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,QAAQ,CAAC,kDAAkD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,WAAmB;IAC1C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,uFAAuF;AACvF,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,SAAyB,EAAE,KAAa,EAAE,MAAc,EAAE,GAAwB;IACzG,GAAG,CAAC,kBAAkB,SAAS,CAAC,OAAO,iBAAiB,KAAK,KAAK,MAAM,UAAU,CAAC,CAAC;IACpF,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QAC7C,GAAG,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IACD,GAAG,CAAC,eAAe,CAAC,CAAC;IACrB,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAC/C,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9D,GAAG,CAAC,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAuBD,SAAS,WAAW,CAAC,IAAa;IAChC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtE,GAAG,EAAE,MAAM,CAAC,IAAI;QAChB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,YAAY;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAe,EACf,OAAqB,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;IAEpD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAE9C,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAChE,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAChB,2BAA2B,cAAc,mDAAmD;YAC1F,wFAAwF,CAC3F,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,2EAA2E;IAC3E,6BAA6B;IAC7B,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,gBAAgB,GAAG,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,WAAW,KAAK,WAAW,CAAC;IAC3F,IAAI,gBAAgB,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CACN,2FAA2F;YACzF,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IAED,0FAA0F;IAC1F,gGAAgG;IAChG,IAAI,UAA8B,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1G,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IACzF,MAAM,aAAa,GAAG,kBAAkB,CAAC,YAAY,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;IAErF,MAAM,WAAW,GAAG,4BAA4B,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,cAAc,CAChC,WAAW,EACX,QAAQ,EACR,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EACvD,IAAI,CAAC,OAAO,CACb,CAAC;IAEF,MAAM,IAAI,GAA4B;QACpC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM;QAC/B,MAAM;QACN,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;KAChF,CAAC;IAEF,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,kBAAkB,KAAK,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrI,GAAG,CAAC,gBAAgB,OAAO,CAAC,QAAQ,CAAC,MAAM,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,cAAc,KAAK,CAAC,CAAC;QAEhH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE;YAC3D,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QAED,gBAAgB,CAAC,IAAI,EAAE;YACrB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW;YACX,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;YACnD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAC;QAEH,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACvE,GAAG,CAAC,eAAe,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7C,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;YAC9D,wEAAwE;YACxE,uEAAuE;YACvE,mEAAmE;YACnE,MAAM,IAAI,QAAQ,CAChB,iBAAiB,OAAO,CAAC,SAAS,CAAC,OAAO,yBAAyB,QAAQ,IAAI;gBAC7E,8BAA8B,eAAe,CAAC,IAAI,CAAC,GAAG,EACxD,oBAAoB,CACrB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC;YACV,EAAE,EAAE,IAAI;YACR,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC;YAChC,gBAAgB;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,2EAA2E;KACzF;IACD,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,yFAAyF;SACvG;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,cAAc,oBAAoB,4FAA4F;SAC5I;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,kEAAkE;SAChF;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,QAAQ,CAAC;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;YAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/commands/judge.ts"],"names":[],"mappings":"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"}
@@ -21,3 +21,9 @@ export declare function readPreview(root: string, assetId: string): Buffer | nul
21
21
  * reporting a write that did not happen.
22
22
  */
23
23
  export declare function writePreview(root: string, assetId: string, data: string): boolean;
24
+ /**
25
+ * Drop an asset's thumbnail — what `bitmagic assets remove` does so the next asset minted under a
26
+ * reused id is not drawn with the old one's picture (previews are keyed by id and never otherwise
27
+ * invalidated). Best-effort: a missing or unremovable file is not a failed removal.
28
+ */
29
+ export declare function removePreview(root: string, assetId: string): void;
@@ -105,4 +105,20 @@ export function writePreview(root, assetId, data) {
105
105
  return false;
106
106
  }
107
107
  }
108
+ /**
109
+ * Drop an asset's thumbnail — what `bitmagic assets remove` does so the next asset minted under a
110
+ * reused id is not drawn with the old one's picture (previews are keyed by id and never otherwise
111
+ * invalidated). Best-effort: a missing or unremovable file is not a failed removal.
112
+ */
113
+ export function removePreview(root, assetId) {
114
+ const file = previewPath(root, assetId);
115
+ if (file === null)
116
+ return;
117
+ try {
118
+ fs.rmSync(file, { force: true });
119
+ }
120
+ catch {
121
+ // Nothing depends on the thumbnail being gone.
122
+ }
123
+ }
108
124
  //# sourceMappingURL=previews.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"previews.js","sourceRoot":"","sources":["../../src/editor/previews.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"previews.js","sourceRoot":"","sources":["../../src/editor/previews.ts"],"names":[],"mappings":"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"}
@@ -270,7 +270,7 @@ export async function startEditorServer(options) {
270
270
  return;
271
271
  }
272
272
  try {
273
- const outcome = applyModificationsToWorld(worldPath, modifications);
273
+ const outcome = applyModificationsToWorld(worldPath, modifications, { subject: 'Your edit' });
274
274
  recordOwnWrite();
275
275
  // Journalled AFTER the write lands, never before: an agent reading a `object.moved` line
276
276
  // must be able to trust that world.json already says so.
@@ -333,7 +333,7 @@ export async function startEditorServer(options) {
333
333
  // An updater, not a replacement: the asset carries fitBox, sourceGlbUrl and the rest, and
334
334
  // the generation the agent runs later depends on every one of them.
335
335
  value: (item) => ({ ...(isRecord(item) ? item : {}), description }),
336
- }]);
336
+ }], { subject: 'The description' });
337
337
  recordOwnWrite();
338
338
  }
339
339
  catch (error) {