@bitmagic/cli 0.1.14 → 0.1.16
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 +37 -11
- package/dist/cli.d.ts +56 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/check.d.ts +6 -1
- package/dist/commands/check.js +14 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/cover.d.ts +100 -0
- package/dist/commands/cover.js +321 -0
- package/dist/commands/cover.js.map +1 -0
- package/dist/commands/forge.d.ts +4 -0
- package/dist/commands/forge.js +24 -9
- package/dist/commands/forge.js.map +1 -1
- package/dist/commands/generate.d.ts +13 -3
- package/dist/commands/generate.js +54 -15
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.js +44 -14
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.js +15 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +4 -0
- package/dist/commands/logout.js +8 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/publish.d.ts +23 -0
- package/dist/commands/publish.js +72 -23
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/upgrade.d.ts +7 -1
- package/dist/commands/upgrade.js +30 -14
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/verify.js +2 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/whoami.d.ts +4 -0
- package/dist/commands/whoami.js +9 -2
- package/dist/commands/whoami.js.map +1 -1
- package/dist/publish/fingerprint.js +13 -5
- package/dist/publish/fingerprint.js.map +1 -1
- package/dist/render/inline-image.d.ts +45 -0
- package/dist/render/inline-image.js +70 -0
- package/dist/render/inline-image.js.map +1 -0
- package/dist/scaffold/project-files.d.ts +15 -0
- package/dist/scaffold/project-files.js +80 -6
- package/dist/scaffold/project-files.js.map +1 -1
- package/dist/scaffold/project.d.ts +2 -0
- package/dist/scaffold/project.js +5 -2
- package/dist/scaffold/project.js.map +1 -1
- package/package.json +2 -2
package/dist/commands/publish.js
CHANGED
|
@@ -13,15 +13,16 @@
|
|
|
13
13
|
*
|
|
14
14
|
* - The verify gate runs BEFORE the build, because a stale or failing verify means there is
|
|
15
15
|
* nothing worth building yet, and `bitmagic build` on top of a broken game just wastes time.
|
|
16
|
-
* - The thumbnail — the
|
|
17
|
-
* `forge/upload-proxy.ts` bridges for
|
|
18
|
-
* `begin` needs its public URL to render the
|
|
16
|
+
* - The thumbnail — `bitmagic cover`'s artwork when the project has any, else the verify
|
|
17
|
+
* screenshot, uploaded through the same signed-upload lane `forge/upload-proxy.ts` bridges for
|
|
18
|
+
* the browser — is uploaded BEFORE `begin`, because `begin` needs its public URL to render the
|
|
19
|
+
* meta block. See `resolveThumbnailSource` for the preference order.
|
|
19
20
|
* - The bundle is PUT to GCS BEFORE `complete`, because `complete` range-reads the object to
|
|
20
21
|
* confirm it carries the meta block `begin` issued — there is nothing to confirm yet.
|
|
21
22
|
*
|
|
22
23
|
* `--force` overrides the verdict and staleness `checkVerifyGate` checks, never the existence of
|
|
23
|
-
* a record:
|
|
24
|
-
*
|
|
24
|
+
* a record: a project with no cover art has only the verify screenshot to publish a thumbnail
|
|
25
|
+
* from. `--name`/`--description` are sent on the wire for THIS publish only —
|
|
25
26
|
* they are never written back into the project's own `game.json`, which would change the
|
|
26
27
|
* fingerprint and invalidate the very verify this command just checked.
|
|
27
28
|
*/
|
|
@@ -34,6 +35,7 @@ import { CliError } from '../errors.js';
|
|
|
34
35
|
import { engineUpdateNotice } from '../project/engine-update.js';
|
|
35
36
|
import { createOutput } from '../output.js';
|
|
36
37
|
import { loadProjectContext } from '../project/context.js';
|
|
38
|
+
import { coverImagePath } from './cover.js';
|
|
37
39
|
import { resolveEnvironment, resolveAuth0ClientId } from '../config/environments.js';
|
|
38
40
|
import { readDefaultEnvironment } from '../config/credentials.js';
|
|
39
41
|
import { getAccessToken } from '../auth/session.js';
|
|
@@ -71,27 +73,65 @@ function defaultDeps() {
|
|
|
71
73
|
};
|
|
72
74
|
}
|
|
73
75
|
/**
|
|
74
|
-
*
|
|
76
|
+
* What this publish should use as its thumbnail, in preference order.
|
|
75
77
|
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
+
* The generated cover wins when there is one: it was drawn from the game's design, whereas the
|
|
79
|
+
* verify screenshot is whatever the camera happened to be pointing at one second after load. The
|
|
80
|
+
* screenshot remains the fallback rather than being retired, because `bitmagic cover` costs sparks
|
|
81
|
+
* and is optional — a creator who never runs it must still be able to publish.
|
|
82
|
+
*
|
|
83
|
+
* Returns null when neither exists, which the caller turns into exit 3.
|
|
78
84
|
*/
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
85
|
+
export function resolveThumbnailSource(root, readFile = (file) => fs.readFileSync(file)) {
|
|
86
|
+
try {
|
|
87
|
+
return {
|
|
88
|
+
bytes: readFile(coverImagePath(root)),
|
|
89
|
+
filename: 'thumbnail.webp',
|
|
90
|
+
contentType: 'image/webp',
|
|
91
|
+
label: 'generated cover art',
|
|
92
|
+
generated: true,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// No cover — fall through to the verify screenshot the gate above already guaranteed a run for.
|
|
97
|
+
}
|
|
82
98
|
try {
|
|
83
|
-
|
|
99
|
+
return {
|
|
100
|
+
bytes: readFile(path.join(verifyArtifactDir(root), 'screenshot.png')),
|
|
101
|
+
filename: 'thumbnail.png',
|
|
102
|
+
contentType: 'image/png',
|
|
103
|
+
label: 'verify screenshot',
|
|
104
|
+
generated: false,
|
|
105
|
+
};
|
|
84
106
|
}
|
|
85
107
|
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Upload this publish's thumbnail and return its public URL, alongside which of the two images it
|
|
113
|
+
* came from — `--json` reports that, so an agent can tell a generated cover from the fallback
|
|
114
|
+
* without parsing the prose. See `resolveThumbnailSource` for the preference order and why.
|
|
115
|
+
*/
|
|
116
|
+
async function uploadThumbnail(context, environment, token, apiDeps, log) {
|
|
117
|
+
const source = resolveThumbnailSource(context.root);
|
|
118
|
+
if (source === null) {
|
|
86
119
|
// Exit 3, not 6: the record passed the verify gate above, but there is nothing to publish a
|
|
87
120
|
// thumbnail FROM — the same remedy as every other exit-3 case ("run bitmagic verify"), not an
|
|
88
121
|
// upload failure.
|
|
89
|
-
throw new CliError(`No
|
|
122
|
+
throw new CliError(`No thumbnail to publish: neither ${coverImagePath(context.root)} nor ` +
|
|
123
|
+
`${path.join(verifyArtifactDir(context.root), 'screenshot.png')} exists. ` +
|
|
124
|
+
'Run `bitmagic verify` before publishing (or `bitmagic cover` for generated artwork).', 3);
|
|
90
125
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
126
|
+
log(`Thumbnail: ${source.label}.`);
|
|
127
|
+
if (!source.generated) {
|
|
128
|
+
// A nudge, not a gate: the screenshot publishes perfectly well, it just rarely looks like
|
|
129
|
+
// anything a player would click on.
|
|
130
|
+
log(' Run `bitmagic cover` for artwork generated from GAME-DESIGN.md instead.');
|
|
131
|
+
}
|
|
132
|
+
const signed = await requestThumbnailUploadUrl(environment, token, { gameId: context.metadata.gameId, filename: source.filename, contentType: source.contentType }, apiDeps);
|
|
133
|
+
await putThumbnail(signed, source.bytes, source.contentType, apiDeps);
|
|
134
|
+
return { url: signed.publicUrl, source: source.generated ? 'cover' : 'screenshot' };
|
|
95
135
|
}
|
|
96
136
|
/**
|
|
97
137
|
* The whole command. See the file header for why the order below cannot be reshuffled.
|
|
@@ -103,6 +143,13 @@ export async function runPublish(args, deps = defaultDeps()) {
|
|
|
103
143
|
const log = deps.log ?? output.info;
|
|
104
144
|
const visibility = resolveVisibility(args.visibility);
|
|
105
145
|
const force = args.force === true;
|
|
146
|
+
// Omitted rather than sent as undefined, so the server's own defaults apply. Spread into BOTH
|
|
147
|
+
// request bodies — see the comment on the `completePublish` call for why `complete` must repeat
|
|
148
|
+
// every one of them rather than inherit what `begin` was told.
|
|
149
|
+
const overrides = {
|
|
150
|
+
...(args.name !== undefined ? { name: args.name } : {}),
|
|
151
|
+
...(args.description !== undefined ? { description: args.description } : {}),
|
|
152
|
+
};
|
|
106
153
|
const context = loadProjectContext(deps.startDir);
|
|
107
154
|
const fingerprint = computeFingerprint(context.root);
|
|
108
155
|
const gate = checkVerifyGate(readVerifyRecord(verifyArtifactDir(context.root)), fingerprint, force);
|
|
@@ -120,7 +167,10 @@ export async function runPublish(args, deps = defaultDeps()) {
|
|
|
120
167
|
const clientId = resolveAuth0ClientId(environment);
|
|
121
168
|
const token = await getAccessToken(environment, clientId, { fetch: deps.fetch, sleep: deps.sleep }, deps.baseDir);
|
|
122
169
|
const apiDeps = { fetch: deps.fetch };
|
|
123
|
-
|
|
170
|
+
// `log`, not `deps.log`: the latter is optional now, and production leaves it unset so prose
|
|
171
|
+
// routes through the Output seam that `--json` redirects to stderr.
|
|
172
|
+
const thumbnail = await uploadThumbnail(context, environment, token, apiDeps, log);
|
|
173
|
+
const thumbnailUrl = thumbnail.url;
|
|
124
174
|
// No bundleBytes/sha256 sent here — see BeginPublishRequest's doc comment in publish/client.ts.
|
|
125
175
|
// The only honest number for those fields is the size/hash of the bundle AFTER the meta block
|
|
126
176
|
// below is injected, and that block (and the publishVersion inside it) isn't known until THIS
|
|
@@ -128,12 +178,11 @@ export async function runPublish(args, deps = defaultDeps()) {
|
|
|
128
178
|
const begun = await beginPublish(environment, token, {
|
|
129
179
|
gameId: context.metadata.gameId,
|
|
130
180
|
visibility,
|
|
131
|
-
...
|
|
132
|
-
...(args.description !== undefined ? { description: args.description } : {}),
|
|
181
|
+
...overrides,
|
|
133
182
|
engineVersion: context.metadata.engineVersion,
|
|
134
183
|
thumbnailUrl,
|
|
135
184
|
}, apiDeps);
|
|
136
|
-
const htmlPath = buildBundlePaths(context.root)
|
|
185
|
+
const { htmlPath } = buildBundlePaths(context.root);
|
|
137
186
|
let builtHtml;
|
|
138
187
|
try {
|
|
139
188
|
builtHtml = fs.readFileSync(htmlPath, 'utf-8');
|
|
@@ -168,8 +217,7 @@ export async function runPublish(args, deps = defaultDeps()) {
|
|
|
168
217
|
key: begun.key,
|
|
169
218
|
publishVersion: begun.publishVersion,
|
|
170
219
|
visibility,
|
|
171
|
-
...
|
|
172
|
-
...(args.description !== undefined ? { description: args.description } : {}),
|
|
220
|
+
...overrides,
|
|
173
221
|
thumbnailUrl,
|
|
174
222
|
bundleBytes: publishedBytes,
|
|
175
223
|
sha256: publishedSha256,
|
|
@@ -194,6 +242,7 @@ export async function runPublish(args, deps = defaultDeps()) {
|
|
|
194
242
|
visibility: done.visibility,
|
|
195
243
|
publishVersion: done.publishVersion,
|
|
196
244
|
gameId: context.metadata.gameId,
|
|
245
|
+
thumbnailSource: thumbnail.source,
|
|
197
246
|
});
|
|
198
247
|
// Everything below runs AFTER the game is live. `complete` has written the bytes and the row,
|
|
199
248
|
// so nothing here can un-publish anything — this stage only decides what we tell the creator.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type Output } from '../output.js';
|
|
2
|
+
import { type DependencyMismatch } from '../scaffold/dependency-diff.js';
|
|
1
3
|
export interface GitStatus {
|
|
2
4
|
dirty: boolean;
|
|
3
5
|
}
|
|
@@ -23,7 +25,7 @@ export declare function assertCleanTree(status: GitStatus, force: boolean): void
|
|
|
23
25
|
* Exported for its test — the detection helpers can be unit-tested on their own, but only
|
|
24
26
|
* calling this proves the printed line actually uses them.
|
|
25
27
|
*/
|
|
26
|
-
export declare function printDependencyReport(root: string):
|
|
28
|
+
export declare function printDependencyReport(output: Output, root: string): DependencyMismatch[];
|
|
27
29
|
export declare const upgradeCommand: import("citty").CommandDef<{
|
|
28
30
|
readonly engine: {
|
|
29
31
|
readonly type: "string";
|
|
@@ -33,4 +35,8 @@ export declare const upgradeCommand: import("citty").CommandDef<{
|
|
|
33
35
|
readonly type: "boolean";
|
|
34
36
|
readonly description: "Upgrade even with uncommitted changes in the working tree.";
|
|
35
37
|
};
|
|
38
|
+
readonly json: {
|
|
39
|
+
readonly type: "boolean";
|
|
40
|
+
readonly description: "Print the result as JSON on stdout; all progress goes to stderr.";
|
|
41
|
+
};
|
|
36
42
|
}>;
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineCommand } from 'citty';
|
|
2
|
+
import { createOutput } from '../output.js';
|
|
2
3
|
import * as fs from 'fs';
|
|
3
4
|
import * as os from 'os';
|
|
4
5
|
import * as path from 'path';
|
|
@@ -87,25 +88,26 @@ function isStringRecord(value) {
|
|
|
87
88
|
* Exported for its test — the detection helpers can be unit-tested on their own, but only
|
|
88
89
|
* calling this proves the printed line actually uses them.
|
|
89
90
|
*/
|
|
90
|
-
export function printDependencyReport(root) {
|
|
91
|
+
export function printDependencyReport(output, root) {
|
|
91
92
|
const mismatches = diffDependencies(readPackageJsonDeps(root), {
|
|
92
93
|
dependencies: DEPENDENCIES,
|
|
93
94
|
devDependencies: DEV_DEPENDENCIES,
|
|
94
95
|
});
|
|
95
96
|
if (mismatches.length === 0)
|
|
96
|
-
return;
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
return mismatches;
|
|
98
|
+
output.info('');
|
|
99
|
+
output.info("package.json is not touched by upgrade, and it is missing or outdated on dependencies the " +
|
|
99
100
|
'vendored engine now needs. Run:');
|
|
100
101
|
const manager = detectPackageManager(root);
|
|
101
102
|
const deps = mismatches.filter((m) => m.kind === 'dependency');
|
|
102
103
|
const devDeps = mismatches.filter((m) => m.kind === 'devDependency');
|
|
103
104
|
if (deps.length > 0) {
|
|
104
|
-
|
|
105
|
+
output.info(` ${addCommand(manager, false, deps.map((m) => `${m.name}@${m.required}`))}`);
|
|
105
106
|
}
|
|
106
107
|
if (devDeps.length > 0) {
|
|
107
|
-
|
|
108
|
+
output.info(` ${addCommand(manager, true, devDeps.map((m) => `${m.name}@${m.required}`))}`);
|
|
108
109
|
}
|
|
110
|
+
return mismatches;
|
|
109
111
|
}
|
|
110
112
|
export const upgradeCommand = defineCommand({
|
|
111
113
|
meta: {
|
|
@@ -115,14 +117,19 @@ export const upgradeCommand = defineCommand({
|
|
|
115
117
|
args: {
|
|
116
118
|
engine: { type: 'string', description: 'Engine version to upgrade to (must be the currently published one).' },
|
|
117
119
|
force: { type: 'boolean', description: 'Upgrade even with uncommitted changes in the working tree.' },
|
|
120
|
+
json: {
|
|
121
|
+
type: 'boolean',
|
|
122
|
+
description: 'Print the result as JSON on stdout; all progress goes to stderr.',
|
|
123
|
+
},
|
|
118
124
|
},
|
|
119
125
|
async run({ args }) {
|
|
126
|
+
const output = createOutput(args.json === true);
|
|
120
127
|
const context = loadProjectContext();
|
|
121
128
|
assertCleanTree(getGitStatus(context.root), args.force === true);
|
|
122
129
|
const environment = resolveEnvironment({ storedDefault: readDefaultEnvironment() });
|
|
123
130
|
const clientId = resolveAuth0ClientId(environment);
|
|
124
131
|
const token = await getAccessToken(environment, clientId, deps);
|
|
125
|
-
|
|
132
|
+
output.info('Fetching the engine manifest…');
|
|
126
133
|
const manifest = await fetchEngineManifest(environment, token, { fetch: globalThis.fetch });
|
|
127
134
|
// The manifest endpoint only ever serves the currently published engine — there is no way to
|
|
128
135
|
// fetch an older or specific version's tarball. An explicit --engine that names anything else
|
|
@@ -136,7 +143,7 @@ export const upgradeCommand = defineCommand({
|
|
|
136
143
|
const workDir = fs.mkdtempSync(path.join(os.tmpdir(), 'bitmagic-upgrade-'));
|
|
137
144
|
try {
|
|
138
145
|
const tarballPath = path.join(workDir, 'engine.tar.gz');
|
|
139
|
-
|
|
146
|
+
output.info(`Downloading engine ${manifest.version}…`);
|
|
140
147
|
await downloadAndVerify(manifest.tarballUrl, manifest.sha256, tarballPath, { fetch: globalThis.fetch });
|
|
141
148
|
const extracted = path.join(workDir, 'extracted');
|
|
142
149
|
const templatesDir = path.join(workDir, 'templates');
|
|
@@ -146,21 +153,30 @@ export const upgradeCommand = defineCommand({
|
|
|
146
153
|
extractedEngineDir: extracted,
|
|
147
154
|
engineVersion: manifest.version,
|
|
148
155
|
});
|
|
149
|
-
|
|
156
|
+
output.info('');
|
|
150
157
|
if (result.previousEngineVersion === result.engineVersion) {
|
|
151
158
|
// A project scaffolded before `vite.publish.config.js` existed lands here: no engine
|
|
152
159
|
// bump, but this run is exactly how it gains the file `bitmagic build` needs. Say so
|
|
153
160
|
// explicitly rather than reporting "already up to date" and doing nothing.
|
|
154
|
-
|
|
161
|
+
output.info(`Already on engine ${result.engineVersion}. Refreshed the platform files anyway.`);
|
|
155
162
|
}
|
|
156
163
|
else {
|
|
157
|
-
|
|
164
|
+
output.info(`Upgraded engine ${result.previousEngineVersion} -> ${result.engineVersion}.`);
|
|
158
165
|
}
|
|
159
|
-
|
|
166
|
+
output.info('Replaced:');
|
|
160
167
|
for (const file of result.replaced) {
|
|
161
|
-
|
|
168
|
+
output.info(` ${file}`);
|
|
162
169
|
}
|
|
163
|
-
printDependencyReport(context.root);
|
|
170
|
+
const mismatches = printDependencyReport(output, context.root);
|
|
171
|
+
output.result({
|
|
172
|
+
ok: true,
|
|
173
|
+
engineVersion: result.engineVersion,
|
|
174
|
+
previousEngineVersion: result.previousEngineVersion,
|
|
175
|
+
replaced: result.replaced,
|
|
176
|
+
// The install command is printed as prose; an agent gets the structured form instead of
|
|
177
|
+
// parsing it back out of a sentence.
|
|
178
|
+
missingDependencies: mismatches,
|
|
179
|
+
});
|
|
164
180
|
}
|
|
165
181
|
finally {
|
|
166
182
|
fs.rmSync(workDir, { recursive: true, force: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,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,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACvG,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -76,8 +76,8 @@ export const verifyCommand = defineCommand({
|
|
|
76
76
|
const context = loadProjectContext();
|
|
77
77
|
const tsc = projectBin(context.root, 'tsc');
|
|
78
78
|
const vite = projectBin(context.root, 'vite');
|
|
79
|
-
const
|
|
80
|
-
|
|
79
|
+
const output = createOutput(args.json === true);
|
|
80
|
+
output.info('Building…');
|
|
81
81
|
const build = spawnSync(tsc, [], { cwd: context.root, stdio: 'inherit' });
|
|
82
82
|
if (build.error) {
|
|
83
83
|
throw new CliError(`Could not run the TypeScript compiler: ${build.error.message}`);
|
|
@@ -117,7 +117,6 @@ export const verifyCommand = defineCommand({
|
|
|
117
117
|
});
|
|
118
118
|
const result = classifyVerifyRun(observations);
|
|
119
119
|
const outcome = decideVerifyOutcome(result, computeFingerprint(context.root), new Date().toISOString());
|
|
120
|
-
const output = createOutput(args.json === true);
|
|
121
120
|
recordAndGateVerify(artifactDir, outcome, { consolePath, screenshotPath }, {
|
|
122
121
|
write: writeVerifyRecord,
|
|
123
122
|
// Under --json both streams are prose and belong on stderr; the result document below
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,4 +8,8 @@ export declare const whoamiCommand: import("citty").CommandDef<{
|
|
|
8
8
|
readonly type: "string";
|
|
9
9
|
readonly description: "Environment to query (dev, prod, local).";
|
|
10
10
|
};
|
|
11
|
+
readonly json: {
|
|
12
|
+
readonly type: "boolean";
|
|
13
|
+
readonly description: "Print the result as JSON on stdout; all progress goes to stderr.";
|
|
14
|
+
};
|
|
11
15
|
}>;
|
package/dist/commands/whoami.js
CHANGED
|
@@ -3,6 +3,7 @@ import { resolveEnvironment, resolveAuth0ClientId } from '../config/environments
|
|
|
3
3
|
import { readDefaultEnvironment } from '../config/credentials.js';
|
|
4
4
|
import { getAccessToken } from '../auth/session.js';
|
|
5
5
|
import { apiGet } from '../http/client.js';
|
|
6
|
+
import { createOutput } from '../output.js';
|
|
6
7
|
const deviceFlowDeps = { fetch: globalThis.fetch, sleep: (ms) => new Promise((r) => setTimeout(r, ms)) };
|
|
7
8
|
export async function runWhoami(explicitEnv) {
|
|
8
9
|
const environment = resolveEnvironment({
|
|
@@ -19,11 +20,17 @@ export const whoamiCommand = defineCommand({
|
|
|
19
20
|
meta: { name: 'whoami', description: 'Show the identity the CLI is authenticated as.' },
|
|
20
21
|
args: {
|
|
21
22
|
env: { type: 'string', description: 'Environment to query (dev, prod, local).' },
|
|
23
|
+
json: {
|
|
24
|
+
type: 'boolean',
|
|
25
|
+
description: 'Print the result as JSON on stdout; all progress goes to stderr.',
|
|
26
|
+
},
|
|
22
27
|
},
|
|
23
28
|
async run({ args }) {
|
|
29
|
+
const output = createOutput(args.json === true);
|
|
24
30
|
const me = await runWhoami(args.env);
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
output.info(`user: ${me.userId}`);
|
|
32
|
+
output.info(`roles: ${me.roles.length > 0 ? me.roles.join(', ') : '(none)'}`);
|
|
33
|
+
output.result({ ok: true, userId: me.userId, roles: me.roles });
|
|
27
34
|
},
|
|
28
35
|
});
|
|
29
36
|
//# sourceMappingURL=whoami.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C,MAAM,cAAc,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;AAEvH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAoB;IAClD,MAAM,WAAW,GAAG,kBAAkB,CAAC;QACrC,QAAQ,EAAE,WAAW;QACrB,aAAa,EAAE,sBAAsB,EAAE;KACxC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC1E,OAAO,MAAM,CAAiB,WAAW,EAAE,oBAAoB,EAAE,KAAK,EAAE;QACtE,KAAK,EAAE,UAAU,CAAC,KAAK;KACxB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gDAAgD,EAAE;IACvF,IAAI,EAAE;QACJ,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;QAChF,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,kEAAkE;SAChF;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -19,13 +19,21 @@ import * as path from 'path';
|
|
|
19
19
|
*
|
|
20
20
|
* `.DS_Store` is excluded for the same reason at file granularity: on macOS, Finder writes it
|
|
21
21
|
* merely for opening the project folder, and no build tool ever reads it — so it is another way
|
|
22
|
-
* to flip the fingerprint without editing anything.
|
|
23
|
-
*
|
|
24
|
-
*
|
|
22
|
+
* to flip the fingerprint without editing anything. The list is deliberately not a general ignore
|
|
23
|
+
* mechanism, because a false "fresh" ships an unverified bundle while a false "stale" only costs
|
|
24
|
+
* one `bitmagic verify`.
|
|
25
|
+
*
|
|
26
|
+
* `GAME-DESIGN.md` earns its place on the same "no build tool reads it" test: nothing imports it,
|
|
27
|
+
* `vite.publish.config.js` cannot put prose in the bundle, and it exists to be REWRITTEN as the
|
|
28
|
+
* game evolves — it is the input `bitmagic cover` reads. Left in, the ordinary
|
|
29
|
+
* `bitmagic verify` → refine the design doc → `bitmagic publish` sequence exits 3 over a paragraph
|
|
30
|
+
* of prose, which teaches agents to reach for `--force` (the one flag that also waves through a
|
|
31
|
+
* genuinely stale verify). Excluded at basename granularity like `.DS_Store`, so a design doc kept
|
|
32
|
+
* in a subdirectory counts the same way.
|
|
25
33
|
*/
|
|
26
34
|
const EXCLUDED_DIRS = new Set(['.bitmagic', 'node_modules', 'dist', '.vite-cache', '.git']);
|
|
27
|
-
/** See EXCLUDED_DIRS:
|
|
28
|
-
const EXCLUDED_FILES = new Set(['.DS_Store']);
|
|
35
|
+
/** See EXCLUDED_DIRS: files that can never change what the bundle contains. */
|
|
36
|
+
const EXCLUDED_FILES = new Set(['.DS_Store', 'GAME-DESIGN.md']);
|
|
29
37
|
/**
|
|
30
38
|
* A relative path as the fingerprint hashes it: always forward-slashed.
|
|
31
39
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/publish/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/publish/fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5F,+EAA+E;AAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,MAAc,IAAI,CAAC,GAAG;IACtE,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,IAAI,CAAC,GAAW,EAAE,IAAY,EAAE,GAAa;IACpD,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAChE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,EAAE,CAAC;IAEb,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drawing an image into the terminal, for the one thing in this CLI that produces something worth
|
|
3
|
+
* looking at: the generated cover art.
|
|
4
|
+
*
|
|
5
|
+
* This is the only place in the package that writes escape sequences. Every other command prints
|
|
6
|
+
* plain lines on purpose, because an agent tool is usually what reads them — so the rule here is
|
|
7
|
+
* that the image is strictly ADDITIONAL. The caller prints the path and URL first, unconditionally;
|
|
8
|
+
* this function either draws on top of that or does nothing at all. It never replaces a line, and
|
|
9
|
+
* it never reports failure as an error.
|
|
10
|
+
*
|
|
11
|
+
* Only the iTerm2 inline-image protocol is implemented. It takes the image bytes in whatever format
|
|
12
|
+
* the terminal can decode, which is what makes the Forger's webp usable without transcoding. kitty
|
|
13
|
+
* and Ghostty speak a different protocol whose only portable transmission format is PNG (`f=100`),
|
|
14
|
+
* and decoding webp to PNG would mean adding an image codec to a package that deliberately depends
|
|
15
|
+
* on almost nothing — so those terminals fall through to the plain lines like any other.
|
|
16
|
+
*/
|
|
17
|
+
import { Buffer } from 'buffer';
|
|
18
|
+
export interface InlineImageEnv {
|
|
19
|
+
TERM_PROGRAM?: string | undefined;
|
|
20
|
+
LC_TERMINAL?: string | undefined;
|
|
21
|
+
KONSOLE_VERSION?: string | undefined;
|
|
22
|
+
TMUX?: string | undefined;
|
|
23
|
+
BITMAGIC_NO_INLINE_IMAGE?: string | undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Whether this terminal is known to implement the iTerm2 inline-image protocol.
|
|
27
|
+
*
|
|
28
|
+
* An allowlist, never a guess: a terminal that does not understand the sequence prints its raw
|
|
29
|
+
* bytes, and a screenful of base64 in the middle of a command's output is far worse than no image.
|
|
30
|
+
* `TMUX` disqualifies everything — tmux swallows the sequence unless it is wrapped in its own
|
|
31
|
+
* passthrough, and a wrapped sequence that reaches a pane the user cannot see helps nobody.
|
|
32
|
+
*/
|
|
33
|
+
export declare function supportsInlineImage(env: InlineImageEnv, isTTY: boolean): boolean;
|
|
34
|
+
/** The raw iTerm2 sequence for `bytes`, exported so a test can assert its shape without a TTY. */
|
|
35
|
+
export declare function inlineImageSequence(bytes: Buffer): string;
|
|
36
|
+
export interface RenderInlineImageOptions {
|
|
37
|
+
env?: InlineImageEnv;
|
|
38
|
+
isTTY?: boolean;
|
|
39
|
+
write?: (chunk: string) => void;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Draw `bytes` into the terminal if it can display them. Returns whether anything was drawn, so a
|
|
43
|
+
* caller can decide what else to say — never throws, and never writes when unsupported.
|
|
44
|
+
*/
|
|
45
|
+
export declare function renderInlineImage(bytes: Buffer, options?: RenderInlineImageOptions): boolean;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drawing an image into the terminal, for the one thing in this CLI that produces something worth
|
|
3
|
+
* looking at: the generated cover art.
|
|
4
|
+
*
|
|
5
|
+
* This is the only place in the package that writes escape sequences. Every other command prints
|
|
6
|
+
* plain lines on purpose, because an agent tool is usually what reads them — so the rule here is
|
|
7
|
+
* that the image is strictly ADDITIONAL. The caller prints the path and URL first, unconditionally;
|
|
8
|
+
* this function either draws on top of that or does nothing at all. It never replaces a line, and
|
|
9
|
+
* it never reports failure as an error.
|
|
10
|
+
*
|
|
11
|
+
* Only the iTerm2 inline-image protocol is implemented. It takes the image bytes in whatever format
|
|
12
|
+
* the terminal can decode, which is what makes the Forger's webp usable without transcoding. kitty
|
|
13
|
+
* and Ghostty speak a different protocol whose only portable transmission format is PNG (`f=100`),
|
|
14
|
+
* and decoding webp to PNG would mean adding an image codec to a package that deliberately depends
|
|
15
|
+
* on almost nothing — so those terminals fall through to the plain lines like any other.
|
|
16
|
+
*/
|
|
17
|
+
/** Written as escapes rather than literal control bytes, so the source stays greppable. */
|
|
18
|
+
const ESC = '\u001b';
|
|
19
|
+
const BEL = '\u0007';
|
|
20
|
+
/** Width in terminal cells. Large enough to read as a picture, small enough not to fill a screen. */
|
|
21
|
+
const IMAGE_CELL_WIDTH = 40;
|
|
22
|
+
/**
|
|
23
|
+
* Whether this terminal is known to implement the iTerm2 inline-image protocol.
|
|
24
|
+
*
|
|
25
|
+
* An allowlist, never a guess: a terminal that does not understand the sequence prints its raw
|
|
26
|
+
* bytes, and a screenful of base64 in the middle of a command's output is far worse than no image.
|
|
27
|
+
* `TMUX` disqualifies everything — tmux swallows the sequence unless it is wrapped in its own
|
|
28
|
+
* passthrough, and a wrapped sequence that reaches a pane the user cannot see helps nobody.
|
|
29
|
+
*/
|
|
30
|
+
export function supportsInlineImage(env, isTTY) {
|
|
31
|
+
if (!isTTY)
|
|
32
|
+
return false;
|
|
33
|
+
if (env.BITMAGIC_NO_INLINE_IMAGE)
|
|
34
|
+
return false;
|
|
35
|
+
if (env.TMUX)
|
|
36
|
+
return false;
|
|
37
|
+
if (env.TERM_PROGRAM === 'iTerm.app' || env.TERM_PROGRAM === 'WezTerm')
|
|
38
|
+
return true;
|
|
39
|
+
if (env.LC_TERMINAL === 'iTerm2')
|
|
40
|
+
return true;
|
|
41
|
+
return env.KONSOLE_VERSION !== undefined && env.KONSOLE_VERSION !== '';
|
|
42
|
+
}
|
|
43
|
+
/** The raw iTerm2 sequence for `bytes`, exported so a test can assert its shape without a TTY. */
|
|
44
|
+
export function inlineImageSequence(bytes) {
|
|
45
|
+
const payload = bytes.toString('base64');
|
|
46
|
+
// `size` is the DECODED byte count, which is what iTerm2 uses to know the transfer is complete.
|
|
47
|
+
// preserveAspectRatio keeps the 1:1 cover square rather than stretching it to the cell box.
|
|
48
|
+
return (`${ESC}]1337;File=inline=1;size=${bytes.length};width=${IMAGE_CELL_WIDTH};` +
|
|
49
|
+
`preserveAspectRatio=1:${payload}${BEL}\n`);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Draw `bytes` into the terminal if it can display them. Returns whether anything was drawn, so a
|
|
53
|
+
* caller can decide what else to say — never throws, and never writes when unsupported.
|
|
54
|
+
*/
|
|
55
|
+
export function renderInlineImage(bytes, options = {}) {
|
|
56
|
+
const env = options.env ?? process.env;
|
|
57
|
+
const isTTY = options.isTTY ?? process.stdout.isTTY === true;
|
|
58
|
+
if (!supportsInlineImage(env, isTTY))
|
|
59
|
+
return false;
|
|
60
|
+
const write = options.write ?? ((chunk) => process.stdout.write(chunk));
|
|
61
|
+
try {
|
|
62
|
+
write(inlineImageSequence(bytes));
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// A closed or non-writable stdout is not worth failing a successful generation over.
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=inline-image.js.map
|