@bitmagic/cli 0.1.52-dev.0 → 0.1.52-dev.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +178 -6
- package/dist/assets/add.d.ts +40 -0
- package/dist/assets/add.js +229 -0
- package/dist/assets/add.js.map +1 -0
- package/dist/assets/entry.d.ts +44 -0
- package/dist/assets/entry.js +71 -0
- package/dist/assets/entry.js.map +1 -0
- package/dist/assets/file-kind.d.ts +61 -0
- package/dist/assets/file-kind.js +195 -0
- package/dist/assets/file-kind.js.map +1 -0
- package/dist/assets/list.d.ts +27 -0
- package/dist/assets/list.js +50 -0
- package/dist/assets/list.js.map +1 -0
- package/dist/assets/remove.d.ts +50 -0
- package/dist/assets/remove.js +91 -0
- package/dist/assets/remove.js.map +1 -0
- package/dist/assets/voxelize-glb.d.ts +37 -0
- package/dist/assets/voxelize-glb.js +65 -0
- package/dist/assets/voxelize-glb.js.map +1 -0
- package/dist/assets/vxl-summary.d.ts +32 -0
- package/dist/assets/vxl-summary.js +118 -0
- package/dist/assets/vxl-summary.js.map +1 -0
- package/dist/bin.js +25 -0
- package/dist/bin.js.map +1 -1
- package/dist/browser-gl.d.ts +46 -8
- package/dist/browser-gl.js +54 -26
- package/dist/browser-gl.js.map +1 -1
- package/dist/cli.d.ts +22 -0
- package/dist/cli.js +17 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/assets.d.ts +56 -0
- package/dist/commands/assets.js +328 -0
- package/dist/commands/assets.js.map +1 -0
- package/dist/commands/cover.js +2 -3
- package/dist/commands/cover.js.map +1 -1
- package/dist/commands/forge.d.ts +7 -9
- package/dist/commands/forge.js +12 -14
- package/dist/commands/forge.js.map +1 -1
- package/dist/commands/generate.d.ts +41 -9
- package/dist/commands/generate.js +234 -54
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.js +19 -12
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/judge.d.ts +36 -0
- package/dist/commands/judge.js +216 -0
- package/dist/commands/judge.js.map +1 -0
- package/dist/commands/levels.d.ts +33 -0
- package/dist/commands/levels.js +241 -0
- package/dist/commands/levels.js.map +1 -0
- package/dist/commands/number-flag.d.ts +7 -0
- package/dist/commands/number-flag.js +38 -0
- package/dist/commands/number-flag.js.map +1 -0
- package/dist/commands/publish.js +13 -0
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/reset-account.js +2 -8
- package/dist/commands/reset-account.js.map +1 -1
- package/dist/commands/run-deps.d.ts +27 -0
- package/dist/commands/run-deps.js +43 -0
- package/dist/commands/run-deps.js.map +1 -0
- package/dist/commands/verify.js +3 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/editor/journal.d.ts +48 -1
- package/dist/editor/journal.js +44 -0
- package/dist/editor/journal.js.map +1 -1
- package/dist/editor/previews.d.ts +6 -0
- package/dist/editor/previews.js +16 -0
- package/dist/editor/previews.js.map +1 -1
- package/dist/editor/server.js +228 -53
- package/dist/editor/server.js.map +1 -1
- package/dist/editor/shell-page.js +221 -116
- package/dist/editor/shell-page.js.map +1 -1
- package/dist/editor/voxel-save.d.ts +47 -0
- package/dist/editor/voxel-save.js +49 -0
- package/dist/editor/voxel-save.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -1
- package/dist/forge/apply-modifications.d.ts +18 -1
- package/dist/forge/apply-modifications.js +15 -32
- package/dist/forge/apply-modifications.js.map +1 -1
- package/dist/forge/browser-host.js +9 -4
- package/dist/forge/browser-host.js.map +1 -1
- package/dist/forge/voxelize-session.d.ts +61 -0
- package/dist/forge/voxelize-session.js +137 -0
- package/dist/forge/voxelize-session.js.map +1 -0
- package/dist/generate/model.d.ts +36 -0
- package/dist/generate/model.js +90 -0
- package/dist/generate/model.js.map +1 -0
- package/dist/generate/prop.d.ts +52 -4
- package/dist/generate/prop.js +169 -102
- package/dist/generate/prop.js.map +1 -1
- package/dist/generate/stream.d.ts +7 -0
- package/dist/generate/stream.js +2 -1
- package/dist/generate/stream.js.map +1 -1
- package/dist/generate/vehicle.js +5 -85
- package/dist/generate/vehicle.js.map +1 -1
- package/dist/http/signed-upload.d.ts +55 -0
- package/dist/http/signed-upload.js +168 -0
- package/dist/http/signed-upload.js.map +1 -0
- package/dist/judge/facts.d.ts +18 -0
- package/dist/judge/facts.js +180 -0
- package/dist/judge/facts.js.map +1 -0
- package/dist/judge/record.d.ts +16 -0
- package/dist/judge/record.js +55 -0
- package/dist/judge/record.js.map +1 -0
- package/dist/judge/stream.d.ts +36 -0
- package/dist/judge/stream.js +122 -0
- package/dist/judge/stream.js.map +1 -0
- package/dist/levels/registry.d.ts +88 -0
- package/dist/levels/registry.js +309 -0
- package/dist/levels/registry.js.map +1 -0
- package/dist/messages/check.d.ts +30 -0
- package/dist/messages/check.js +119 -0
- package/dist/messages/check.js.map +1 -0
- package/dist/messages/notice.d.ts +58 -0
- package/dist/messages/notice.js +54 -0
- package/dist/messages/notice.js.map +1 -0
- package/dist/messages/refresh.d.ts +19 -0
- package/dist/messages/refresh.js +42 -0
- package/dist/messages/refresh.js.map +1 -0
- package/dist/project/jobs.d.ts +1 -1
- package/dist/project/jobs.js.map +1 -1
- package/dist/publish/client.d.ts +13 -0
- package/dist/publish/client.js +13 -34
- package/dist/publish/client.js.map +1 -1
- package/dist/publish/platform.d.ts +46 -0
- package/dist/publish/platform.js +92 -0
- package/dist/publish/platform.js.map +1 -0
- package/dist/scaffold/project-files.d.ts +8 -0
- package/dist/scaffold/project-files.js +192 -34
- package/dist/scaffold/project-files.js.map +1 -1
- package/dist/scaffold/project.js +2 -1
- package/dist/scaffold/project.js.map +1 -1
- package/dist/verify/browser.d.ts +11 -6
- package/dist/verify/browser.js +31 -15
- package/dist/verify/browser.js.map +1 -1
- package/dist/verify/iterate.js +3 -3
- package/dist/verify/iterate.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,YAAY,EAAe,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAExB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACvG,OAAO,EACL,mBAAmB,EACnB,gCAAgC,EAChC,iBAAiB,EACjB,eAAe,EACf,eAAe,GAEhB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGlE,MAAM,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { requestJudge } from '../judge/stream.js';
|
|
2
|
+
import { type CommandRunDeps } from './run-deps.js';
|
|
3
|
+
/**
|
|
4
|
+
* `--min-score` failing is exit 4: 1-3 and 5-7 are taken (see README's exit
|
|
5
|
+
* code table), and it needs its own code so an agent can tell "below the bar"
|
|
6
|
+
* from "the judge itself failed".
|
|
7
|
+
*/
|
|
8
|
+
export declare const EXIT_BELOW_MIN_SCORE = 4;
|
|
9
|
+
export interface JudgeArgs {
|
|
10
|
+
genre?: string;
|
|
11
|
+
'min-score'?: string;
|
|
12
|
+
json?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface JudgeRunDeps extends CommandRunDeps {
|
|
15
|
+
/** Test-only override; production omits it and loadProjectContext walks up from process.cwd(). */
|
|
16
|
+
/** Test-only override; production omits it and the credential helpers read ~/.bitmagic. */
|
|
17
|
+
/** The machine-readable result, emitted only under `--json`. */
|
|
18
|
+
result: (value: unknown) => void;
|
|
19
|
+
/** Seam over `requestJudge`, so a test can drive this without a network or a token. */
|
|
20
|
+
request: typeof requestJudge;
|
|
21
|
+
}
|
|
22
|
+
export declare function runJudge(args: JudgeArgs, deps?: JudgeRunDeps): Promise<void>;
|
|
23
|
+
export declare const judgeCommand: import("citty").CommandDef<{
|
|
24
|
+
readonly genre: {
|
|
25
|
+
readonly type: "string";
|
|
26
|
+
readonly description: "Genre hint for the rubric: platformer, racing, shooter, combat, driving, tower-defense.";
|
|
27
|
+
};
|
|
28
|
+
readonly 'min-score': {
|
|
29
|
+
readonly type: "string";
|
|
30
|
+
readonly description: "Fail (exit 4) when the overall score is below this 1-10 bar. Without it the judge informs and exits 0.";
|
|
31
|
+
};
|
|
32
|
+
readonly json: {
|
|
33
|
+
readonly type: "boolean";
|
|
34
|
+
readonly description: "Print the result as JSON on stdout; all progress goes to stderr.";
|
|
35
|
+
};
|
|
36
|
+
}>;
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `bitmagic judge` — a second pair of eyes on the running game.
|
|
3
|
+
*
|
|
4
|
+
* The builder must not grade its own work: this command sends the screenshot
|
|
5
|
+
* `bitmagic verify` already captured, plus a rubric composed from
|
|
6
|
+
* GAME-DESIGN.md and an optional genre hint, to one bounded vision call on the
|
|
7
|
+
* server's light model, and prints a scorecard with at most three actionable
|
|
8
|
+
* findings. It is deliberately cheap and deliberately explicit — run it after
|
|
9
|
+
* a milestone, fix the top findings, run it once more, then move on.
|
|
10
|
+
*
|
|
11
|
+
* It performs no browser pass of its own: the frame it judges is the one
|
|
12
|
+
* verify's black-frame and renderer checks have already vetted, which is what
|
|
13
|
+
* makes a single small vision call trustworthy. No screenshot means no run —
|
|
14
|
+
* with a message that says which command produces one.
|
|
15
|
+
*
|
|
16
|
+
* The judge informs; it does not gate. Exit is 0 whatever the score, unless
|
|
17
|
+
* `--min-score` asks for a machine-checkable bar (exit 4 when below it).
|
|
18
|
+
*/
|
|
19
|
+
import { defineCommand } from 'citty';
|
|
20
|
+
import * as fs from 'fs';
|
|
21
|
+
import * as path from 'path';
|
|
22
|
+
import { buildJudgeRubric } from '@bitmagic/asset-core';
|
|
23
|
+
import { CliError } from '../errors.js';
|
|
24
|
+
import { loadProjectContext } from '../project/context.js';
|
|
25
|
+
import { withJobRecord } from '../project/jobs.js';
|
|
26
|
+
import { resolveEnvironmentForCommand, resolveAuth0ClientId } from '../config/environments.js';
|
|
27
|
+
import { getAccessToken } from '../auth/session.js';
|
|
28
|
+
import { computeFingerprint } from '../publish/fingerprint.js';
|
|
29
|
+
import { readVerifyRecord } from '../verify/result.js';
|
|
30
|
+
import { requestJudge } from '../judge/stream.js';
|
|
31
|
+
import { buildSceneFacts, buildVerifyContext } from '../judge/facts.js';
|
|
32
|
+
import { judgeRecordPath, writeJudgeRecord } from '../judge/record.js';
|
|
33
|
+
import { GAME_DESIGN_FILE } from './cover.js';
|
|
34
|
+
import { createOutput } from '../output.js';
|
|
35
|
+
import { commandRunDeps } from './run-deps.js';
|
|
36
|
+
/** Where `bitmagic verify` writes its artifacts — see `commands/verify.ts`. */
|
|
37
|
+
function verifyArtifactDir(root) {
|
|
38
|
+
return path.join(root, '.bitmagic', 'verify');
|
|
39
|
+
}
|
|
40
|
+
/** How many trailing console lines reach the judge as context. */
|
|
41
|
+
const CONSOLE_TAIL_LINES = 50;
|
|
42
|
+
/**
|
|
43
|
+
* `--min-score` failing is exit 4: 1-3 and 5-7 are taken (see README's exit
|
|
44
|
+
* code table), and it needs its own code so an agent can tell "below the bar"
|
|
45
|
+
* from "the judge itself failed".
|
|
46
|
+
*/
|
|
47
|
+
export const EXIT_BELOW_MIN_SCORE = 4;
|
|
48
|
+
function parseMinScoreArg(raw) {
|
|
49
|
+
if (raw === undefined)
|
|
50
|
+
return null;
|
|
51
|
+
const value = Number(raw);
|
|
52
|
+
if (!Number.isFinite(value) || value < 1 || value > 10) {
|
|
53
|
+
throw new CliError(`--min-score must be a number from 1 to 10, got ${JSON.stringify(raw)}.`);
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
function readConsoleTail(artifactDir) {
|
|
58
|
+
try {
|
|
59
|
+
const raw = fs.readFileSync(path.join(artifactDir, 'console.log'), 'utf-8');
|
|
60
|
+
return raw.split('\n').slice(-CONSOLE_TAIL_LINES).join('\n');
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** GAME-DESIGN.md's content, or empty — the rubric degrades gracefully without one. */
|
|
67
|
+
function readDesignText(root) {
|
|
68
|
+
try {
|
|
69
|
+
return fs.readFileSync(path.join(root, GAME_DESIGN_FILE), 'utf-8');
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return '';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Engine ground truth from world.json, read fresh because it is shared ground
|
|
77
|
+
* with the human's editor (see AGENTS.md). Undefined when it is missing or
|
|
78
|
+
* unreadable: the judge then grades from pixels alone, as it did before scene
|
|
79
|
+
* facts existed.
|
|
80
|
+
*/
|
|
81
|
+
function readSceneFacts(root) {
|
|
82
|
+
try {
|
|
83
|
+
const world = JSON.parse(fs.readFileSync(path.join(root, 'src', 'work', 'world.json'), 'utf-8'));
|
|
84
|
+
return buildSceneFacts(world) ?? undefined;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function renderScorecard(scorecard, model, sparks, log) {
|
|
91
|
+
log(`Judge verdict: ${scorecard.overall}/10 overall (${model}, ${sparks} sparks)`);
|
|
92
|
+
for (const dimension of scorecard.dimensions) {
|
|
93
|
+
log(` ${dimension.name.padEnd(16)} ${String(dimension.score).padStart(2)}/10 — ${dimension.note}`);
|
|
94
|
+
}
|
|
95
|
+
if (scorecard.topFindings.length === 0) {
|
|
96
|
+
log('No findings — the judge had nothing actionable to point at.');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
log('Top findings:');
|
|
100
|
+
for (const [index, finding] of scorecard.topFindings.entries()) {
|
|
101
|
+
log(` ${index + 1}. [${finding.severity}] ${finding.title}`);
|
|
102
|
+
log(` ${finding.detail}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function defaultDeps(json) {
|
|
106
|
+
const output = createOutput(json);
|
|
107
|
+
return {
|
|
108
|
+
...commandRunDeps(json),
|
|
109
|
+
result: output.result,
|
|
110
|
+
request: requestJudge,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export async function runJudge(args, deps = defaultDeps(args.json === true)) {
|
|
114
|
+
const context = loadProjectContext(deps.startDir);
|
|
115
|
+
const root = context.root;
|
|
116
|
+
const minScore = parseMinScoreArg(args['min-score']);
|
|
117
|
+
const genre = args.genre?.trim() || undefined;
|
|
118
|
+
const artifactDir = verifyArtifactDir(root);
|
|
119
|
+
const screenshotFile = path.join(artifactDir, 'screenshot.png');
|
|
120
|
+
let screenshot;
|
|
121
|
+
try {
|
|
122
|
+
screenshot = fs.readFileSync(screenshotFile);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
throw new CliError(`No verify screenshot at ${screenshotFile}. The judge grades the frame \`bitmagic verify\` ` +
|
|
126
|
+
'captures, so run `bitmagic verify` first — without --fast, which skips the screenshot.');
|
|
127
|
+
}
|
|
128
|
+
// Staleness is a warning, not a refusal: judging yesterday's frame is
|
|
129
|
+
// sometimes exactly what was asked for, but it must never pass silently as
|
|
130
|
+
// a verdict on today's code.
|
|
131
|
+
const verifyRecord = readVerifyRecord(artifactDir);
|
|
132
|
+
const fingerprint = computeFingerprint(root);
|
|
133
|
+
const fingerprintStale = verifyRecord !== null && verifyRecord.fingerprint !== fingerprint;
|
|
134
|
+
if (fingerprintStale) {
|
|
135
|
+
deps.log('The project has changed since this screenshot was taken — the verdict is about the older ' +
|
|
136
|
+
'build. Re-run `bitmagic verify` first for a current one.');
|
|
137
|
+
}
|
|
138
|
+
const rubric = buildJudgeRubric({
|
|
139
|
+
designText: readDesignText(root),
|
|
140
|
+
genre,
|
|
141
|
+
sceneFacts: readSceneFacts(root),
|
|
142
|
+
});
|
|
143
|
+
const verifyContext = buildVerifyContext(verifyRecord, readConsoleTail(artifactDir));
|
|
144
|
+
const environment = resolveEnvironmentForCommand({ cwd: root, baseDir: deps.baseDir });
|
|
145
|
+
const clientId = resolveAuth0ClientId(environment);
|
|
146
|
+
const token = await getAccessToken(environment, clientId, { fetch: deps.fetch, sleep: deps.sleep, now: deps.now }, deps.baseDir);
|
|
147
|
+
const body = {
|
|
148
|
+
gameId: context.metadata.gameId,
|
|
149
|
+
rubric,
|
|
150
|
+
...(verifyContext !== null ? { verifyContext } : {}),
|
|
151
|
+
images: [{ dataBase64: screenshot.toString('base64'), mediaType: 'image/png' }],
|
|
152
|
+
};
|
|
153
|
+
await withJobRecord({ root, kind: 'judge', label: genre ? `Quality judge (${genre})` : 'Quality judge', log: deps.log }, async (log) => {
|
|
154
|
+
log(`Judging game ${context.metadata.gameId} from ${path.relative(root, screenshotFile) || screenshotFile}...`);
|
|
155
|
+
const outcome = await deps.request(environment, token, body, {
|
|
156
|
+
fetch: deps.fetch,
|
|
157
|
+
onProgress: log,
|
|
158
|
+
});
|
|
159
|
+
if (!outcome.success) {
|
|
160
|
+
throw new CliError(outcome.message);
|
|
161
|
+
}
|
|
162
|
+
writeJudgeRecord(root, {
|
|
163
|
+
scorecard: outcome.scorecard,
|
|
164
|
+
fingerprint,
|
|
165
|
+
at: new Date().toISOString(),
|
|
166
|
+
model: outcome.model,
|
|
167
|
+
screenshotPath: path.relative(root, screenshotFile),
|
|
168
|
+
...(genre !== undefined ? { genre } : {}),
|
|
169
|
+
});
|
|
170
|
+
renderScorecard(outcome.scorecard, outcome.model, outcome.sparks, log);
|
|
171
|
+
log(`Recorded in ${judgeRecordPath(root)}.`);
|
|
172
|
+
if (minScore !== null && outcome.scorecard.overall < minScore) {
|
|
173
|
+
// No `result` document first: under `--json` stdout carries exactly one
|
|
174
|
+
// document, and for a failed bar that is the wrapper's error document.
|
|
175
|
+
// The full scorecard is still on disk, and the message says where.
|
|
176
|
+
throw new CliError(`Overall score ${outcome.scorecard.overall} is below --min-score ${minScore}. ` +
|
|
177
|
+
`The findings to fix are in ${judgeRecordPath(root)}.`, EXIT_BELOW_MIN_SCORE);
|
|
178
|
+
}
|
|
179
|
+
deps.result({
|
|
180
|
+
ok: true,
|
|
181
|
+
scorecard: outcome.scorecard,
|
|
182
|
+
judgePath: judgeRecordPath(root),
|
|
183
|
+
fingerprintStale,
|
|
184
|
+
sparks: outcome.sparks,
|
|
185
|
+
model: outcome.model,
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
export const judgeCommand = defineCommand({
|
|
190
|
+
meta: {
|
|
191
|
+
name: 'judge',
|
|
192
|
+
description: 'Grade the verify screenshot against a quality rubric with a vision model.',
|
|
193
|
+
},
|
|
194
|
+
args: {
|
|
195
|
+
genre: {
|
|
196
|
+
type: 'string',
|
|
197
|
+
description: 'Genre hint for the rubric: platformer, racing, shooter, combat, driving, tower-defense.',
|
|
198
|
+
},
|
|
199
|
+
'min-score': {
|
|
200
|
+
type: 'string',
|
|
201
|
+
description: `Fail (exit ${EXIT_BELOW_MIN_SCORE}) when the overall score is below this 1-10 bar. Without it the judge informs and exits 0.`,
|
|
202
|
+
},
|
|
203
|
+
json: {
|
|
204
|
+
type: 'boolean',
|
|
205
|
+
description: 'Print the result as JSON on stdout; all progress goes to stderr.',
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
async run({ args }) {
|
|
209
|
+
await runJudge({
|
|
210
|
+
genre: args.genre,
|
|
211
|
+
'min-score': args['min-score'],
|
|
212
|
+
json: args.json,
|
|
213
|
+
});
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
//# sourceMappingURL=judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/commands/judge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type CommandRunDeps } from './run-deps.js';
|
|
2
|
+
import { type LevelRow } from '../levels/registry.js';
|
|
3
|
+
export interface LevelsRunDeps extends CommandRunDeps {
|
|
4
|
+
}
|
|
5
|
+
export declare function formatLevelTable(rows: LevelRow[]): string;
|
|
6
|
+
export declare function runLevelsList(options: {
|
|
7
|
+
json: boolean;
|
|
8
|
+
deps?: LevelsRunDeps;
|
|
9
|
+
}): Promise<LevelRow[]>;
|
|
10
|
+
export declare function runLevelsSetStart(options: {
|
|
11
|
+
levelId: string;
|
|
12
|
+
json: boolean;
|
|
13
|
+
deps?: LevelsRunDeps;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
export declare function runLevelsRename(options: {
|
|
16
|
+
levelId: string;
|
|
17
|
+
name: string;
|
|
18
|
+
json: boolean;
|
|
19
|
+
deps?: LevelsRunDeps;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
export declare function runLevelsAdd(options: {
|
|
22
|
+
vwldAssetId: string;
|
|
23
|
+
name?: string;
|
|
24
|
+
makeStart: boolean;
|
|
25
|
+
json: boolean;
|
|
26
|
+
deps?: LevelsRunDeps;
|
|
27
|
+
}): Promise<void>;
|
|
28
|
+
export declare function runLevelsRemove(options: {
|
|
29
|
+
levelId: string;
|
|
30
|
+
json: boolean;
|
|
31
|
+
deps?: LevelsRunDeps;
|
|
32
|
+
}): Promise<void>;
|
|
33
|
+
export declare const levelsCommand: import("citty").CommandDef<import("citty").ArgsDef>;
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `bitmagic levels list | add | rename | set-start | remove` — manage the levels `forge` creates.
|
|
3
|
+
*
|
|
4
|
+
* `forge` could make levels but not manage them, so fixing a wrong start level, renaming one, or
|
|
5
|
+
* deleting one meant opening the web Creator. The registry is a local file in the pro lane, so
|
|
6
|
+
* these are direct surgical `world.json` edits — no server call, no sparks, no login.
|
|
7
|
+
*
|
|
8
|
+
* The rules live in `levels/registry.ts`; this file is flags and output.
|
|
9
|
+
*/
|
|
10
|
+
import { defineCommand } from 'citty';
|
|
11
|
+
import { createOutput } from '../output.js';
|
|
12
|
+
import { commandRunDeps, decoratedError } from './run-deps.js';
|
|
13
|
+
import { loadProjectContext } from '../project/context.js';
|
|
14
|
+
import { readWorldJson } from '../project/world-json.js';
|
|
15
|
+
import { applyModificationsToWorld } from '../forge/apply-modifications.js';
|
|
16
|
+
import { projectWorldJsonPath } from '../forge/run-pipeline.js';
|
|
17
|
+
import { EditorJournal } from '../editor/journal.js';
|
|
18
|
+
import { listLevels, planAdd, planRemove, planRename, planSetStart, } from '../levels/registry.js';
|
|
19
|
+
const defaultDeps = (json) => commandRunDeps(json);
|
|
20
|
+
/** Appends the unchanged-world guarantee unless the message already makes it. */
|
|
21
|
+
function unchanged(message) {
|
|
22
|
+
return message.includes('world.json is unchanged') ? message : `${message} world.json is unchanged.`;
|
|
23
|
+
}
|
|
24
|
+
/** Resolve the project and read its world.json, with every failure carrying the guarantee. */
|
|
25
|
+
function readProject(runDeps) {
|
|
26
|
+
try {
|
|
27
|
+
const context = loadProjectContext(runDeps.startDir);
|
|
28
|
+
return { context, world: readWorldJson(projectWorldJsonPath(context.root)) };
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw decoratedError(error, unchanged);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Apply a plan, journal it, and report.
|
|
36
|
+
*
|
|
37
|
+
* The journal entry is what makes this visible to the creator's agent: a level change moves one id
|
|
38
|
+
* and a url, which is exactly the kind of edit a diff of placed objects cannot explain.
|
|
39
|
+
*/
|
|
40
|
+
function commit(context, plan, subject, journalLine, runDeps) {
|
|
41
|
+
const worldPath = projectWorldJsonPath(context.root);
|
|
42
|
+
let applied;
|
|
43
|
+
try {
|
|
44
|
+
applied = applyModificationsToWorld(worldPath, plan.modifications, { subject }).applied;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw decoratedError(error, unchanged);
|
|
48
|
+
}
|
|
49
|
+
// After the write, never before: an agent reading the line must be able to trust world.json.
|
|
50
|
+
new EditorJournal({ root: context.root }).append(journalLine);
|
|
51
|
+
for (const note of plan.notes)
|
|
52
|
+
runDeps.log(`note: ${note}`);
|
|
53
|
+
return applied;
|
|
54
|
+
}
|
|
55
|
+
function reloadHint(runDeps) {
|
|
56
|
+
runDeps.log('A running `bitmagic dev` reloads the browser by itself to show it.');
|
|
57
|
+
}
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// list
|
|
60
|
+
// ============================================================================
|
|
61
|
+
export function formatLevelTable(rows) {
|
|
62
|
+
if (rows.length === 0) {
|
|
63
|
+
return 'This game has no levels. `bitmagic forge` bakes one, or `bitmagic levels add <vwldAssetId>`\n'
|
|
64
|
+
+ 'registers a bake you already have.';
|
|
65
|
+
}
|
|
66
|
+
const header = { id: 'ID', name: 'NAME', start: '', spawns: 'SPAWNS', placed: 'PLACED', note: '' };
|
|
67
|
+
const cells = rows.map((row) => ({
|
|
68
|
+
id: row.id,
|
|
69
|
+
name: row.name,
|
|
70
|
+
start: row.start ? 'START' : '',
|
|
71
|
+
spawns: String(row.spawnPoints),
|
|
72
|
+
placed: String(row.placed),
|
|
73
|
+
note: row.missingAsset ? 'missing .vwld asset' : '',
|
|
74
|
+
}));
|
|
75
|
+
const width = (key) => Math.max(header[key].length, ...cells.map((cell) => cell[key].length));
|
|
76
|
+
const w = { id: width('id'), name: width('name'), start: width('start'), spawns: width('spawns'), placed: width('placed') };
|
|
77
|
+
const line = (cell) => `${cell.id.padEnd(w.id)} ${cell.name.padEnd(w.name)} ${cell.start.padEnd(w.start)} `
|
|
78
|
+
+ `${cell.spawns.padStart(w.spawns)} ${cell.placed.padStart(w.placed)} ${cell.note}`.trimEnd();
|
|
79
|
+
return [line(header), ...cells.map(line)].join('\n');
|
|
80
|
+
}
|
|
81
|
+
export async function runLevelsList(options) {
|
|
82
|
+
const output = createOutput(options.json);
|
|
83
|
+
const runDeps = options.deps ?? defaultDeps(options.json);
|
|
84
|
+
const { world } = readProject(runDeps);
|
|
85
|
+
const rows = listLevels(world);
|
|
86
|
+
if (options.json)
|
|
87
|
+
output.result({ ok: true, count: rows.length, levels: rows });
|
|
88
|
+
else
|
|
89
|
+
runDeps.log(formatLevelTable(rows));
|
|
90
|
+
return rows;
|
|
91
|
+
}
|
|
92
|
+
// ============================================================================
|
|
93
|
+
// the four writes
|
|
94
|
+
// ============================================================================
|
|
95
|
+
export async function runLevelsSetStart(options) {
|
|
96
|
+
const output = createOutput(options.json);
|
|
97
|
+
const runDeps = options.deps ?? defaultDeps(options.json);
|
|
98
|
+
const { context, world } = readProject(runDeps);
|
|
99
|
+
const plan = planSetStart(world, options.levelId);
|
|
100
|
+
const name = listLevels(world).find((row) => row.id === options.levelId)?.name ?? options.levelId;
|
|
101
|
+
commit(context, plan, 'The start level', {
|
|
102
|
+
event: 'levels.changed', action: 'set-start', levelId: options.levelId, name,
|
|
103
|
+
}, runDeps);
|
|
104
|
+
runDeps.log(`"${name}" is now the start level — the game boots into it.`);
|
|
105
|
+
output.result({ ok: true, kind: 'levels', action: 'set-start', levelId: options.levelId, name });
|
|
106
|
+
reloadHint(runDeps);
|
|
107
|
+
}
|
|
108
|
+
export async function runLevelsRename(options) {
|
|
109
|
+
const output = createOutput(options.json);
|
|
110
|
+
const runDeps = options.deps ?? defaultDeps(options.json);
|
|
111
|
+
const { context, world } = readProject(runDeps);
|
|
112
|
+
const plan = planRename(world, options.levelId, options.name);
|
|
113
|
+
const previous = listLevels(world).find((row) => row.id === options.levelId)?.name ?? options.levelId;
|
|
114
|
+
commit(context, plan, 'The level name', {
|
|
115
|
+
event: 'levels.changed', action: 'rename', levelId: options.levelId, name: options.name.trim(),
|
|
116
|
+
}, runDeps);
|
|
117
|
+
runDeps.log(`Renamed "${previous}" to "${options.name.trim()}".`);
|
|
118
|
+
output.result({
|
|
119
|
+
ok: true, kind: 'levels', action: 'rename', levelId: options.levelId, name: options.name.trim(), previous,
|
|
120
|
+
});
|
|
121
|
+
reloadHint(runDeps);
|
|
122
|
+
}
|
|
123
|
+
export async function runLevelsAdd(options) {
|
|
124
|
+
const output = createOutput(options.json);
|
|
125
|
+
const runDeps = options.deps ?? defaultDeps(options.json);
|
|
126
|
+
const { context, world } = readProject(runDeps);
|
|
127
|
+
const plan = planAdd(world, options.vwldAssetId, {
|
|
128
|
+
...(options.name !== undefined ? { name: options.name } : {}),
|
|
129
|
+
makeStart: options.makeStart,
|
|
130
|
+
});
|
|
131
|
+
commit(context, plan, 'The new level', {
|
|
132
|
+
event: 'levels.changed', action: 'add', levelId: plan.level.id, name: plan.level.name,
|
|
133
|
+
}, runDeps);
|
|
134
|
+
runDeps.log(`Added level "${plan.level.name}" (${plan.level.id}).`);
|
|
135
|
+
output.result({
|
|
136
|
+
ok: true, kind: 'levels', action: 'add', levelId: plan.level.id, name: plan.level.name,
|
|
137
|
+
vwldAssetId: options.vwldAssetId, converted: plan.converted,
|
|
138
|
+
});
|
|
139
|
+
reloadHint(runDeps);
|
|
140
|
+
}
|
|
141
|
+
export async function runLevelsRemove(options) {
|
|
142
|
+
const output = createOutput(options.json);
|
|
143
|
+
const runDeps = options.deps ?? defaultDeps(options.json);
|
|
144
|
+
const { context, world } = readProject(runDeps);
|
|
145
|
+
const plan = planRemove(world, options.levelId);
|
|
146
|
+
commit(context, plan, 'Removing the level', {
|
|
147
|
+
event: 'levels.changed', action: 'remove', levelId: options.levelId, name: plan.level.name,
|
|
148
|
+
}, runDeps);
|
|
149
|
+
runDeps.log(`Removed level "${plan.level.name}" (${options.levelId}). Its .vwld asset stays in the project.`);
|
|
150
|
+
output.result({
|
|
151
|
+
ok: true, kind: 'levels', action: 'remove', levelId: options.levelId, name: plan.level.name,
|
|
152
|
+
placedRemoved: plan.placedRemoved,
|
|
153
|
+
});
|
|
154
|
+
reloadHint(runDeps);
|
|
155
|
+
}
|
|
156
|
+
// ============================================================================
|
|
157
|
+
// Subcommands
|
|
158
|
+
// ============================================================================
|
|
159
|
+
const JSON_FLAG = {
|
|
160
|
+
type: 'boolean',
|
|
161
|
+
description: 'Print the result as JSON on stdout; all progress goes to stderr.',
|
|
162
|
+
};
|
|
163
|
+
const listCommand = defineCommand({
|
|
164
|
+
meta: { name: 'list', description: 'List the game\'s levels: id, name, which one boots, spawn and object counts.' },
|
|
165
|
+
args: { json: JSON_FLAG },
|
|
166
|
+
async run({ args }) {
|
|
167
|
+
await runLevelsList({ json: args.json === true });
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
const setStartCommand = defineCommand({
|
|
171
|
+
meta: { name: 'set-start', description: 'Make a level the one the game boots into.' },
|
|
172
|
+
args: {
|
|
173
|
+
'level-id': { type: 'positional', required: true, description: 'The level id (see `bitmagic levels list`).' },
|
|
174
|
+
json: JSON_FLAG,
|
|
175
|
+
},
|
|
176
|
+
async run({ args }) {
|
|
177
|
+
await runLevelsSetStart({ levelId: args['level-id'], json: args.json === true });
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
const renameCommand = defineCommand({
|
|
181
|
+
meta: { name: 'rename', description: 'Rename a level. Names are for humans; ids are what code uses.' },
|
|
182
|
+
args: {
|
|
183
|
+
'level-id': { type: 'positional', required: true, description: 'The level id (see `bitmagic levels list`).' },
|
|
184
|
+
name: { type: 'positional', required: true, description: 'The new name.' },
|
|
185
|
+
json: JSON_FLAG,
|
|
186
|
+
},
|
|
187
|
+
async run({ args }) {
|
|
188
|
+
await runLevelsRename({ levelId: args['level-id'], name: args.name, json: args.json === true });
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
const addCommand = defineCommand({
|
|
192
|
+
meta: { name: 'add', description: 'Register a baked .vwld asset as a level.' },
|
|
193
|
+
args: {
|
|
194
|
+
'vwld-asset-id': {
|
|
195
|
+
type: 'positional',
|
|
196
|
+
required: true,
|
|
197
|
+
description: 'Id of a .vwld asset already in the project (see `bitmagic assets list`).',
|
|
198
|
+
},
|
|
199
|
+
name: { type: 'string', description: 'Level name; defaults to the asset\'s name.' },
|
|
200
|
+
'make-start': {
|
|
201
|
+
type: 'boolean',
|
|
202
|
+
description: 'Also make it the level the game boots into. A game\'s first level becomes the start anyway.',
|
|
203
|
+
},
|
|
204
|
+
json: JSON_FLAG,
|
|
205
|
+
},
|
|
206
|
+
async run({ args }) {
|
|
207
|
+
await runLevelsAdd({
|
|
208
|
+
vwldAssetId: args['vwld-asset-id'],
|
|
209
|
+
...(args.name !== undefined ? { name: args.name } : {}),
|
|
210
|
+
makeStart: args['make-start'] === true,
|
|
211
|
+
json: args.json === true,
|
|
212
|
+
});
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
const removeCommand = defineCommand({
|
|
216
|
+
meta: {
|
|
217
|
+
name: 'remove',
|
|
218
|
+
description: 'Remove a level and the objects belonging to it. The .vwld asset stays in the project.',
|
|
219
|
+
},
|
|
220
|
+
args: {
|
|
221
|
+
'level-id': { type: 'positional', required: true, description: 'The level id (see `bitmagic levels list`).' },
|
|
222
|
+
json: JSON_FLAG,
|
|
223
|
+
},
|
|
224
|
+
async run({ args }) {
|
|
225
|
+
await runLevelsRemove({ levelId: args['level-id'], json: args.json === true });
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
export const levelsCommand = defineCommand({
|
|
229
|
+
meta: {
|
|
230
|
+
name: 'levels',
|
|
231
|
+
description: 'Manage the levels `bitmagic forge` creates: list, add, rename, set-start, remove.',
|
|
232
|
+
},
|
|
233
|
+
subCommands: {
|
|
234
|
+
list: listCommand,
|
|
235
|
+
add: addCommand,
|
|
236
|
+
rename: renameCommand,
|
|
237
|
+
'set-start': setStartCommand,
|
|
238
|
+
remove: removeCommand,
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
//# sourceMappingURL=levels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levels.js","sourceRoot":"","sources":["../../src/commands/levels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface NumberFlagOptions {
|
|
2
|
+
min?: number;
|
|
3
|
+
max?: number;
|
|
4
|
+
/** Only for flags whose generator schema declares `.int()` (image width/height). */
|
|
5
|
+
integer?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseNumberFlag(flagName: string, raw: string | undefined, options?: NumberFlagOptions): number | undefined;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one numeric-flag parser every command uses.
|
|
3
|
+
*
|
|
4
|
+
* It exists because `verify.ts --timeout` once shipped a bug where an unparseable value silently
|
|
5
|
+
* became `NaN` and produced a false failure pointing nowhere near the real cause. Every numeric
|
|
6
|
+
* flag goes through here so a typo is rejected up front, naming the flag.
|
|
7
|
+
*
|
|
8
|
+
* It is SHARED because a second copy re-opened that exact hazard: `commands/assets.ts` was written
|
|
9
|
+
* with a stricter version while `commands/generate.ts` kept the lax one, so `generate model
|
|
10
|
+
* --height 0x10` quietly scaled a model to 16 metres — `Number()` accepts hex, binary, exponents
|
|
11
|
+
* and surrounding whitespace, and `Number('')` is 0. One decimal-only grammar, one place.
|
|
12
|
+
*/
|
|
13
|
+
import { CliError } from '../errors.js';
|
|
14
|
+
/** A decimal number and nothing else — no `0x10`, no `1e3`, no `''`. */
|
|
15
|
+
const DECIMAL = /^-?\d+(\.\d+)?$/;
|
|
16
|
+
export function parseNumberFlag(flagName, raw, options = {}) {
|
|
17
|
+
if (raw === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
const trimmed = raw.trim();
|
|
20
|
+
if (!DECIMAL.test(trimmed)) {
|
|
21
|
+
throw new CliError(`--${flagName} must be a decimal number, got ${JSON.stringify(raw)}. world.json is unchanged.`);
|
|
22
|
+
}
|
|
23
|
+
const value = Number(trimmed);
|
|
24
|
+
if (!Number.isFinite(value)) {
|
|
25
|
+
throw new CliError(`--${flagName} must be a number, got ${JSON.stringify(raw)}. world.json is unchanged.`);
|
|
26
|
+
}
|
|
27
|
+
if (options.integer && !Number.isInteger(value)) {
|
|
28
|
+
throw new CliError(`--${flagName} must be a whole number, got ${JSON.stringify(raw)}. world.json is unchanged.`);
|
|
29
|
+
}
|
|
30
|
+
if (options.min !== undefined && value < options.min) {
|
|
31
|
+
throw new CliError(`--${flagName} must be at least ${options.min}, got ${value}. world.json is unchanged.`);
|
|
32
|
+
}
|
|
33
|
+
if (options.max !== undefined && value > options.max) {
|
|
34
|
+
throw new CliError(`--${flagName} must be at most ${options.max}, got ${value}. world.json is unchanged.`);
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=number-flag.js.map
|