@glubean/cli 0.8.3 → 0.9.0
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 +4 -2
- package/dist/commands/dry-run.d.ts +105 -0
- package/dist/commands/dry-run.d.ts.map +1 -0
- package/dist/commands/dry-run.js +238 -0
- package/dist/commands/dry-run.js.map +1 -0
- package/dist/commands/load.d.ts.map +1 -1
- package/dist/commands/load.js +20 -2
- package/dist/commands/load.js.map +1 -1
- package/dist/commands/run.d.ts +18 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +188 -24
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/sync.d.ts +21 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +322 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/lib/active_env.d.ts +16 -1
- package/dist/lib/active_env.d.ts.map +1 -1
- package/dist/lib/active_env.js +46 -1
- package/dist/lib/active_env.js.map +1 -1
- package/dist/lib/only-selectors.d.ts +61 -0
- package/dist/lib/only-selectors.d.ts.map +1 -0
- package/dist/lib/only-selectors.js +79 -0
- package/dist/lib/only-selectors.js.map +1 -0
- package/dist/lib/upload.d.ts +53 -0
- package/dist/lib/upload.d.ts.map +1 -1
- package/dist/lib/upload.js +196 -9
- package/dist/lib/upload.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +72 -3
- package/dist/main.js.map +1 -1
- package/package.json +7 -7
- package/dist/lib/env.d.ts +0 -29
- package/dist/lib/env.d.ts.map +0 -1
- package/dist/lib/env.js +0 -59
- package/dist/lib/env.js.map +0 -1
package/dist/lib/upload.d.ts
CHANGED
|
@@ -169,6 +169,28 @@ export interface UploadOptions {
|
|
|
169
169
|
* runs set this — those dirs hold TEST artifacts (the LoadArtifact is already
|
|
170
170
|
* the `result` blob), so attaching them would misattribute stale files. */
|
|
171
171
|
skipArtifacts?: boolean;
|
|
172
|
+
/** This run's exact screenshot file paths (absolute), extracted from the
|
|
173
|
+
* `browser:screenshot` event stream. When provided, the `.glubean/screenshots`
|
|
174
|
+
* portion uploads ONLY these files instead of walking the whole dir — the dir
|
|
175
|
+
* accumulates screenshots across runs, so a plain walk misattributes stale
|
|
176
|
+
* files from previous runs to this run (ART1). Each path is realpath-checked
|
|
177
|
+
* to be inside `.glubean/screenshots`; escapees are dropped. When omitted, the
|
|
178
|
+
* screenshots dir is walked as before (backward compatible). Does NOT affect
|
|
179
|
+
* the `.glubean/artifacts` scan, which always walks. */
|
|
180
|
+
screenshotPaths?: string[];
|
|
181
|
+
}
|
|
182
|
+
/** A file the server confirmed receiving, with the stat identity it had when
|
|
183
|
+
* its bytes were read into the upload form. Cleanup (ART1-B) re-checks this
|
|
184
|
+
* identity immediately before unlinking so it never deletes a file that was
|
|
185
|
+
* recreated at the same path after the upload (different content the server
|
|
186
|
+
* never saw). */
|
|
187
|
+
export interface UploadedArtifactFile {
|
|
188
|
+
/** Absolute (realpath'd for whitelist screenshots) path of the posted file. */
|
|
189
|
+
path: string;
|
|
190
|
+
size: number;
|
|
191
|
+
mtimeMs: number;
|
|
192
|
+
ino: number;
|
|
193
|
+
dev: number;
|
|
172
194
|
}
|
|
173
195
|
export interface UploadReceipt {
|
|
174
196
|
schemaVersion: "glubean.upload-receipt.v1";
|
|
@@ -194,8 +216,39 @@ export interface UploadReceipt {
|
|
|
194
216
|
sizeBytes?: number;
|
|
195
217
|
statusCode?: number;
|
|
196
218
|
error?: string;
|
|
219
|
+
/** The files that actually entered the multipart form (absolute path +
|
|
220
|
+
* stat identity captured at upload time), set only when the server
|
|
221
|
+
* confirmed the batch (`status: "uploaded"`). Excludes over-cap skips.
|
|
222
|
+
* Mixed set: `.glubean/artifacts` walk entries AND whitelist screenshots
|
|
223
|
+
* — a caller cleaning up local screenshots must intersect with its own
|
|
224
|
+
* run's screenshot list (ART1-B), never delete this list wholesale. The
|
|
225
|
+
* identity lets cleanup verify the on-disk file is still the exact file
|
|
226
|
+
* the server received (a concurrent run may have recreated the path). */
|
|
227
|
+
uploadedFiles?: UploadedArtifactFile[];
|
|
197
228
|
};
|
|
198
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* ART1-B — delete this run's screenshots locally once the Cloud confirmed it
|
|
232
|
+
* received them. Deletes ONLY the intersection of:
|
|
233
|
+
* - `screenshotPaths`: this run's screenshot list (from the event stream), and
|
|
234
|
+
* - `uploadedFiles`: what `uploadToCloud` actually posted in a server-confirmed
|
|
235
|
+
* batch (`receipt.artifactUpload.uploadedFiles`).
|
|
236
|
+
* plus the same realpath containment guard as the upload whitelist: a path is
|
|
237
|
+
* only unlinked when it resolves strictly inside `.glubean/screenshots`. On top
|
|
238
|
+
* of path membership, the file's stat identity (dev/ino/size/mtimeMs) must still
|
|
239
|
+
* match what was uploaded — a concurrent run that recreated the same path put
|
|
240
|
+
* bytes there the server never received, and those must survive. (The check is
|
|
241
|
+
* re-done immediately before each unlink; POSIX offers no unlink-by-fd, so a
|
|
242
|
+
* recreation landing in the sub-ms window between lstat and unlink is the one
|
|
243
|
+
* residual race — codex r2 P3, accepted.) So a partial
|
|
244
|
+
* upload (over-cap skip) keeps its file, a failed batch keeps everything, and
|
|
245
|
+
* nothing outside the screenshots dir (e.g. `.glubean/artifacts`, or an escapee
|
|
246
|
+
* event path) is ever touched. Idempotent: already-missing files are skipped
|
|
247
|
+
* silently. Returns how many files were removed.
|
|
248
|
+
*/
|
|
249
|
+
export declare function removeUploadedScreenshots(rootDir: string, screenshotPaths: string[], uploadedFiles: UploadedArtifactFile[]): Promise<{
|
|
250
|
+
removed: number;
|
|
251
|
+
}>;
|
|
199
252
|
/**
|
|
200
253
|
* Upload a run (test or load) + optionally its artifacts to Glubean Cloud under
|
|
201
254
|
* a target (ADR 0007). The caller assembles the run-level `UploadRunInput` from
|
package/dist/lib/upload.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA2DH,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AACtC,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAClF,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,aAAa,CAAC;AAE9E,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wFAAwF;AACxF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,KAAK,EAAE,KAAK,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;KACpB,CAAC,CAAC;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB;;;;;WAKG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;YACpB,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,KAAK,CAAC;gBACb,IAAI,EAAE,MAAM,CAAC;gBACb,EAAE,EAAE,MAAM,CAAC;gBACX,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;gBAChB,UAAU,EAAE,MAAM,CAAC;gBACnB,IAAI,CAAC,EAAE,OAAO,CAAC;aAChB,CAAC,CAAC;SACJ,CAAC,CAAC;QACH,2EAA2E;QAC3E,SAAS,CAAC,EAAE,KAAK,CAAC;YAChB,UAAU,EAAE,MAAM,CAAC;YACnB,UAAU,EAAE,MAAM,CAAC;YACnB,QAAQ,EAAE,MAAM,CAAC;YACjB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,KAAK,CAAC;gBACX,GAAG,EAAE,MAAM,CAAC;gBACZ,YAAY,CAAC,EAAE,MAAM,CAAC;gBACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;aACnB,CAAC,CAAC;SACJ,CAAC,CAAC;QACH;;;;;;;;;WASG;QACH,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC;QAChC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;QACtB;;;;;WAKG;QACH,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB;;qFAEiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB;;gFAE4E;IAC5E,aAAa,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/upload.js
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* `…/runs/{id}/artifacts` (one part = one artifact, ≤512KB each). Files over
|
|
11
11
|
* the inline cap are skipped (presigned R2 upload is an M6 follow-up).
|
|
12
12
|
*/
|
|
13
|
-
import { readdir, stat, readFile } from "node:fs/promises";
|
|
14
|
-
import { basename, extname, join, relative } from "node:path";
|
|
13
|
+
import { readdir, stat, lstat, readFile, realpath, unlink } from "node:fs/promises";
|
|
14
|
+
import { basename, extname, join, relative, sep } from "node:path";
|
|
15
15
|
import { CLI_VERSION } from "../version.js";
|
|
16
16
|
import { detectCiContext } from "./ci.js";
|
|
17
17
|
const colors = {
|
|
@@ -135,6 +135,154 @@ async function walkDir(dir) {
|
|
|
135
135
|
}
|
|
136
136
|
return files;
|
|
137
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Resolve this run's screenshot whitelist against the on-disk screenshots dir.
|
|
140
|
+
*
|
|
141
|
+
* The whitelist replaces walkDir's natural containment, so every path is
|
|
142
|
+
* realpath'd and confirmed to live under the (realpath'd) screenshots root —
|
|
143
|
+
* an escapee (e.g. an event-stream `path` of `../../.env`) is dropped, never
|
|
144
|
+
* read. Returns the safe candidates plus counts of what was skipped:
|
|
145
|
+
* - `outOfBounds`: whitelist entries that don't resolve or escape the root.
|
|
146
|
+
* - `outOfList`: files physically present in the dir but NOT in this run's
|
|
147
|
+
* list (stale prior-run files, or a `saveArtifact` that emitted no `path`).
|
|
148
|
+
*/
|
|
149
|
+
async function collectRunScreenshots(screenshotsRoot, whitelist) {
|
|
150
|
+
let realRoot;
|
|
151
|
+
try {
|
|
152
|
+
realRoot = await realpath(screenshotsRoot);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
realRoot = undefined; // dir doesn't exist
|
|
156
|
+
}
|
|
157
|
+
const included = new Set();
|
|
158
|
+
const candidates = [];
|
|
159
|
+
let outOfBounds = 0;
|
|
160
|
+
if (realRoot === undefined) {
|
|
161
|
+
// The run listed screenshots but the dir is gone — nothing safe to upload.
|
|
162
|
+
return { candidates, outOfBounds: whitelist.length, outOfList: 0 };
|
|
163
|
+
}
|
|
164
|
+
for (const p of whitelist) {
|
|
165
|
+
let real;
|
|
166
|
+
try {
|
|
167
|
+
real = await realpath(p);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
outOfBounds += 1; // missing / unreadable
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (real !== realRoot && !real.startsWith(realRoot + sep)) {
|
|
174
|
+
outOfBounds += 1; // escapes the screenshots root — refuse it
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
// Regular files only — matches the walkDir path this replaces. A dir/FIFO
|
|
178
|
+
// slipping in would throw at readFile and fail the whole artifact batch.
|
|
179
|
+
try {
|
|
180
|
+
if (!(await stat(real)).isFile()) {
|
|
181
|
+
outOfBounds += 1;
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
outOfBounds += 1; // vanished between realpath and stat
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (included.has(real))
|
|
190
|
+
continue; // dedupe repeats in the list
|
|
191
|
+
included.add(real);
|
|
192
|
+
candidates.push({
|
|
193
|
+
path: real,
|
|
194
|
+
relativeName: join("screenshots", relative(realRoot, real)),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
// Count files on disk that this run's list didn't cover (surfaced as a
|
|
198
|
+
// warning by the caller so an upstream regression can't silently drop them).
|
|
199
|
+
let outOfList = 0;
|
|
200
|
+
for (const filePath of await walkDir(screenshotsRoot)) {
|
|
201
|
+
let real;
|
|
202
|
+
try {
|
|
203
|
+
real = await realpath(filePath);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
if (!included.has(real))
|
|
209
|
+
outOfList += 1;
|
|
210
|
+
}
|
|
211
|
+
return { candidates, outOfBounds, outOfList };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* ART1-B — delete this run's screenshots locally once the Cloud confirmed it
|
|
215
|
+
* received them. Deletes ONLY the intersection of:
|
|
216
|
+
* - `screenshotPaths`: this run's screenshot list (from the event stream), and
|
|
217
|
+
* - `uploadedFiles`: what `uploadToCloud` actually posted in a server-confirmed
|
|
218
|
+
* batch (`receipt.artifactUpload.uploadedFiles`).
|
|
219
|
+
* plus the same realpath containment guard as the upload whitelist: a path is
|
|
220
|
+
* only unlinked when it resolves strictly inside `.glubean/screenshots`. On top
|
|
221
|
+
* of path membership, the file's stat identity (dev/ino/size/mtimeMs) must still
|
|
222
|
+
* match what was uploaded — a concurrent run that recreated the same path put
|
|
223
|
+
* bytes there the server never received, and those must survive. (The check is
|
|
224
|
+
* re-done immediately before each unlink; POSIX offers no unlink-by-fd, so a
|
|
225
|
+
* recreation landing in the sub-ms window between lstat and unlink is the one
|
|
226
|
+
* residual race — codex r2 P3, accepted.) So a partial
|
|
227
|
+
* upload (over-cap skip) keeps its file, a failed batch keeps everything, and
|
|
228
|
+
* nothing outside the screenshots dir (e.g. `.glubean/artifacts`, or an escapee
|
|
229
|
+
* event path) is ever touched. Idempotent: already-missing files are skipped
|
|
230
|
+
* silently. Returns how many files were removed.
|
|
231
|
+
*/
|
|
232
|
+
export async function removeUploadedScreenshots(rootDir, screenshotPaths, uploadedFiles) {
|
|
233
|
+
let realRoot;
|
|
234
|
+
try {
|
|
235
|
+
realRoot = await realpath(join(rootDir, ".glubean", "screenshots"));
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return { removed: 0 }; // dir gone — nothing local to clean
|
|
239
|
+
}
|
|
240
|
+
// uploadedFiles screenshot entries are keyed by realpath (the whitelist
|
|
241
|
+
// resolver emits realpaths), so realpath'd screenshotPaths compare directly.
|
|
242
|
+
const uploaded = new Map(uploadedFiles.map((f) => [f.path, f]));
|
|
243
|
+
const seen = new Set();
|
|
244
|
+
let removed = 0;
|
|
245
|
+
for (const p of screenshotPaths) {
|
|
246
|
+
let real;
|
|
247
|
+
try {
|
|
248
|
+
real = await realpath(p);
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
continue; // already gone (idempotent) or never existed
|
|
252
|
+
}
|
|
253
|
+
if (seen.has(real))
|
|
254
|
+
continue; // dedupe repeats in the list
|
|
255
|
+
seen.add(real);
|
|
256
|
+
// Containment guard (strictly inside the root — never the root itself):
|
|
257
|
+
// an event path that resolved elsewhere must not be deleted even if a
|
|
258
|
+
// same-string entry was uploaded via the `.glubean/artifacts` walk.
|
|
259
|
+
if (!real.startsWith(realRoot + sep))
|
|
260
|
+
continue;
|
|
261
|
+
const identity = uploaded.get(real);
|
|
262
|
+
if (!identity)
|
|
263
|
+
continue; // not confirmed uploaded — keep it
|
|
264
|
+
// Identity check immediately before unlink: the on-disk file must still be
|
|
265
|
+
// the exact file whose bytes the server received. lstat (not stat) so a
|
|
266
|
+
// symlink swapped in at this path can't borrow its target's identity.
|
|
267
|
+
try {
|
|
268
|
+
const s = await lstat(real);
|
|
269
|
+
if (!s.isFile() ||
|
|
270
|
+
s.dev !== identity.dev ||
|
|
271
|
+
s.ino !== identity.ino ||
|
|
272
|
+
s.size !== identity.size ||
|
|
273
|
+
s.mtimeMs !== identity.mtimeMs) {
|
|
274
|
+
continue; // recreated/replaced since upload — the server never saw it
|
|
275
|
+
}
|
|
276
|
+
await unlink(real);
|
|
277
|
+
removed += 1;
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Vanished concurrently or not deletable — keeping a local file is
|
|
281
|
+
// always safe; never fail the run over cleanup.
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return { removed };
|
|
285
|
+
}
|
|
138
286
|
/**
|
|
139
287
|
* Upload a run (test or load) + optionally its artifacts to Glubean Cloud under
|
|
140
288
|
* a target (ADR 0007). The caller assembles the run-level `UploadRunInput` from
|
|
@@ -246,14 +394,38 @@ export async function uploadToCloud(input, options) {
|
|
|
246
394
|
if (options.skipArtifacts)
|
|
247
395
|
return receipt;
|
|
248
396
|
const artifactRoot = join(rootDir, ".glubean");
|
|
249
|
-
const
|
|
250
|
-
join(artifactRoot, "artifacts"),
|
|
251
|
-
join(artifactRoot, "screenshots"),
|
|
252
|
-
];
|
|
397
|
+
const screenshotsRoot = join(artifactRoot, "screenshots");
|
|
253
398
|
const candidates = [];
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
399
|
+
// `.glubean/artifacts` — always walked (out of ART1 scope: it holds
|
|
400
|
+
// per-run-named artifact files, not the shared screenshot pool).
|
|
401
|
+
for (const filePath of await walkDir(join(artifactRoot, "artifacts"))) {
|
|
402
|
+
candidates.push({
|
|
403
|
+
path: filePath,
|
|
404
|
+
relativeName: relative(artifactRoot, filePath),
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
// `.glubean/screenshots` — the dir accumulates screenshots across runs, so
|
|
408
|
+
// walking it uploads stale files from previous runs as this run's evidence
|
|
409
|
+
// (ART1). When the caller passes this run's exact screenshot list, use it as
|
|
410
|
+
// a whitelist (realpath-contained to the screenshots root) instead.
|
|
411
|
+
if (options.screenshotPaths) {
|
|
412
|
+
const { candidates: shots, outOfBounds, outOfList } = await collectRunScreenshots(screenshotsRoot, options.screenshotPaths);
|
|
413
|
+
candidates.push(...shots);
|
|
414
|
+
if (outOfBounds > 0 || outOfList > 0) {
|
|
415
|
+
const parts = [];
|
|
416
|
+
if (outOfList > 0) {
|
|
417
|
+
parts.push(`${outOfList} on disk not in this run's screenshot list`);
|
|
418
|
+
}
|
|
419
|
+
if (outOfBounds > 0) {
|
|
420
|
+
parts.push(`${outOfBounds} out of bounds / unresolved`);
|
|
421
|
+
}
|
|
422
|
+
// Surfaced (not silent) so a future `saveArtifact` that omits `path`
|
|
423
|
+
// can't quietly drop this run's screenshots from the upload.
|
|
424
|
+
console.log(`${colors.yellow}Skipped ${parts.join(", ")} screenshot file(s) — only this run's screenshots are uploaded.${colors.reset}`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
for (const filePath of await walkDir(screenshotsRoot)) {
|
|
257
429
|
candidates.push({
|
|
258
430
|
path: filePath,
|
|
259
431
|
relativeName: relative(artifactRoot, filePath),
|
|
@@ -267,6 +439,11 @@ export async function uploadToCloud(input, options) {
|
|
|
267
439
|
let uploadedCount = 0;
|
|
268
440
|
let skippedCount = 0;
|
|
269
441
|
let totalSize = 0;
|
|
442
|
+
// Files that actually enter the form — NOT the over-cap skips — with their
|
|
443
|
+
// upload-time stat identity. Reported on the receipt (uploadedFiles) only
|
|
444
|
+
// once the server confirms the batch, so local cleanup (ART1-B) can never
|
|
445
|
+
// delete a file the Cloud never received.
|
|
446
|
+
const postedFiles = [];
|
|
270
447
|
for (const file of candidates) {
|
|
271
448
|
const s = await stat(file.path);
|
|
272
449
|
if (s.size > INLINE_THRESHOLD) {
|
|
@@ -282,6 +459,13 @@ export async function uploadToCloud(input, options) {
|
|
|
282
459
|
form.append("files", new Blob([bytes], { type: mime }), file.relativeName);
|
|
283
460
|
uploadedCount += 1;
|
|
284
461
|
totalSize += s.size;
|
|
462
|
+
postedFiles.push({
|
|
463
|
+
path: file.path,
|
|
464
|
+
size: s.size,
|
|
465
|
+
mtimeMs: s.mtimeMs,
|
|
466
|
+
ino: s.ino,
|
|
467
|
+
dev: s.dev,
|
|
468
|
+
});
|
|
285
469
|
}
|
|
286
470
|
if (uploadedCount === 0) {
|
|
287
471
|
// Everything was over the inline cap — record the skip, nothing posted.
|
|
@@ -302,6 +486,9 @@ export async function uploadToCloud(input, options) {
|
|
|
302
486
|
sizeBytes: totalSize,
|
|
303
487
|
...(outcome.statusCode !== undefined ? { statusCode: outcome.statusCode } : {}),
|
|
304
488
|
...(outcome.error ? { error: outcome.error } : {}),
|
|
489
|
+
// Only a server-confirmed batch exposes what was posted — a failed POST
|
|
490
|
+
// must never feed the local cleanup path.
|
|
491
|
+
...(outcome.ok ? { uploadedFiles: postedFiles } : {}),
|
|
305
492
|
};
|
|
306
493
|
if (!outcome.ok)
|
|
307
494
|
return receipt;
|
package/dist/lib/upload.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4/BH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/main.js
CHANGED
|
@@ -15,6 +15,8 @@ import { formatResolvedPlan } from "./lib/print-plan.js";
|
|
|
15
15
|
import { initCommand } from "./commands/init.js";
|
|
16
16
|
import { runCommand, resolveTestFilesForSuite } from "./commands/run.js";
|
|
17
17
|
import { scanCommand } from "./commands/scan.js";
|
|
18
|
+
import { dryRunCommand } from "./commands/dry-run.js";
|
|
19
|
+
import { syncCommand } from "./commands/sync.js";
|
|
18
20
|
import { loadCommand } from "./commands/load.js";
|
|
19
21
|
import { validateMetadataCommand } from "./commands/validate_metadata.js";
|
|
20
22
|
import { loginCommand } from "./commands/login.js";
|
|
@@ -76,7 +78,7 @@ program
|
|
|
76
78
|
.option("-t, --tag <tag>", "Run only tests with matching tag (comma-separated or repeatable)", collect, [])
|
|
77
79
|
.option("--tag-mode <mode>", 'Tag match logic: "or" (any tag) or "and" (all tags)', "or")
|
|
78
80
|
.option("--exclude-tag <tag>", "Exclude tests with matching tag (comma-separated or repeatable; always OR-mode — any match drops the test)", collect, [])
|
|
79
|
-
.option("--env-file <path>", "Path to .env file (default: .env
|
|
81
|
+
.option("--env-file <path>", "Path to .env file (default: active env set via 'glubean env use', else .env; prod-like active envs are refused implicitly — pass this flag explicitly)")
|
|
80
82
|
.option("-l, --log-file", "Write logs to file (<testfile>.log)")
|
|
81
83
|
.option("--pretty", "Pretty-print JSON in log file (2-space indent)")
|
|
82
84
|
.option("--verbose", "Show all output (traces, assertions) in console")
|
|
@@ -98,6 +100,7 @@ program
|
|
|
98
100
|
.option("-M, --meta <key=value>", "Custom run metadata (repeatable)", collect, [])
|
|
99
101
|
.option("--upload", "Upload run results and artifacts to Glubean Cloud")
|
|
100
102
|
.option("--upload-receipt-json <path>", "Write Cloud upload receipt JSON after --upload")
|
|
103
|
+
.option("--keep-local", "Keep local screenshot files after --upload (skip post-upload cleanup)")
|
|
101
104
|
.option("--project <id>", "Glubean Cloud project ID (or GLUBEAN_PROJECT_ID env)")
|
|
102
105
|
.option("--upload-target <id>", "Cloud target id runs upload to (or GLUBEAN_TARGET_ID; else project default)")
|
|
103
106
|
.option("--token <token>", "Auth token for cloud upload (or GLUBEAN_TOKEN env)")
|
|
@@ -105,6 +108,9 @@ program
|
|
|
105
108
|
.option("--input-json <value>", "Explicit case input as JSON literal or @path/to.json. Validated against the case's `needs` schema; runs raw (overlay skipped). Requires --filter to match exactly one testId.")
|
|
106
109
|
.option("--bootstrap-json <value>", "Bootstrap params as JSON literal or @path/to.json. Validated against the overlay's `params` schema and passed to overlay's run(ctx, params). Requires --filter to match exactly one testId.")
|
|
107
110
|
.option("--force-standalone", "DEBUG: bypass `runnability.requireAttachment` for the filtered case. Emits a runtime warning. Author-debug only.")
|
|
111
|
+
.option("--only-id <id>", "Run only the test(s) with matching id (repeatable). For `.each` rows pass the concrete expanded id.", collect, [])
|
|
112
|
+
.option("--row <n>", "With a single --only-id, isolate the 0-based `.each` row index.")
|
|
113
|
+
.option("--rerun-failed", "Re-run only the tests that failed in the last `glubean run` (reads .glubean/last-run.result.json).")
|
|
108
114
|
.action(async (target, options, cmd) => {
|
|
109
115
|
await executeRun(target, options, cmd);
|
|
110
116
|
});
|
|
@@ -390,6 +396,18 @@ async function executeRun(target, options, cmd) {
|
|
|
390
396
|
console.log(formatResolvedPlan(printPlan));
|
|
391
397
|
console.log("");
|
|
392
398
|
}
|
|
399
|
+
// B2 M3 — parse + validate --row (a 0-based `.each` row index). Commander
|
|
400
|
+
// hands it through as a raw string; reject anything that isn't a
|
|
401
|
+
// non-negative integer before runCommand builds selectors.
|
|
402
|
+
let parsedRow;
|
|
403
|
+
if (options.row !== undefined) {
|
|
404
|
+
const raw = String(options.row).trim();
|
|
405
|
+
if (!/^\d+$/.test(raw)) {
|
|
406
|
+
console.error(`\x1b[31m--row must be a non-negative integer (got "${options.row}").\x1b[0m`);
|
|
407
|
+
process.exit(1);
|
|
408
|
+
}
|
|
409
|
+
parsedRow = parseInt(raw, 10);
|
|
410
|
+
}
|
|
393
411
|
await runCommand(resolvedTarget, {
|
|
394
412
|
filter: options.filter ?? resolvedPlan?.selection.filter,
|
|
395
413
|
pick: options.pick ?? resolvedPlan?.selection.pick,
|
|
@@ -453,6 +471,8 @@ async function executeRun(target, options, cmd) {
|
|
|
453
471
|
: undefined,
|
|
454
472
|
upload: options.upload ?? resolvedPlan?.upload?.enabled,
|
|
455
473
|
uploadReceiptJson: options.uploadReceiptJson,
|
|
474
|
+
// ART1-B escape hatch: keep local screenshots after a successful upload.
|
|
475
|
+
keepLocal: options.keepLocal,
|
|
456
476
|
// When the profile declares upload.projectId and CLI didn't pass
|
|
457
477
|
// --project, forward it as the project identifier so the upload
|
|
458
478
|
// preflight doesn't exit with "no project ID found". The value may be
|
|
@@ -477,6 +497,11 @@ async function executeRun(target, options, cmd) {
|
|
|
477
497
|
inputJson: options.inputJson,
|
|
478
498
|
bootstrapJson: options.bootstrapJson,
|
|
479
499
|
forceStandalone: options.forceStandalone,
|
|
500
|
+
// B2 M3 — `{id, rowIndex}` selectors. onlyId is a collected array (may be
|
|
501
|
+
// empty); row is the validated integer; rerunFailed is a boolean flag.
|
|
502
|
+
onlyId: options.onlyId,
|
|
503
|
+
row: parsedRow,
|
|
504
|
+
rerunFailed: !!options.rerunFailed,
|
|
480
505
|
allowedKindsPerFile,
|
|
481
506
|
// Phase 4: thread the v1 plan's full redaction config (replacement
|
|
482
507
|
// format + globalRules + custom patterns) into runCommand so newly
|
|
@@ -529,7 +554,7 @@ ciCmd
|
|
|
529
554
|
.option("-t, --tag <tag>", "Run only tests with matching tag (comma-separated or repeatable)", collect, [])
|
|
530
555
|
.option("--tag-mode <mode>", 'Tag match logic: "or" (any tag) or "and" (all tags)', "or")
|
|
531
556
|
.option("--exclude-tag <tag>", "Exclude tests with matching tag (comma-separated or repeatable; always OR-mode — any match drops the test)", collect, [])
|
|
532
|
-
.option("--env-file <path>", "Path to .env file (default: .env
|
|
557
|
+
.option("--env-file <path>", "Path to .env file (default: active env set via 'glubean env use', else .env; prod-like active envs are refused implicitly — pass this flag explicitly)")
|
|
533
558
|
.option("-l, --log-file", "Write logs to file (<testfile>.log)")
|
|
534
559
|
.option("--pretty", "Pretty-print JSON in log file (2-space indent)")
|
|
535
560
|
.option("--verbose", "Show all output (traces, assertions) in console")
|
|
@@ -551,6 +576,7 @@ ciCmd
|
|
|
551
576
|
.option("-M, --meta <key=value>", "Custom run metadata (repeatable)", collect, [])
|
|
552
577
|
.option("--upload", "Upload run results and artifacts to Glubean Cloud")
|
|
553
578
|
.option("--upload-receipt-json <path>", "Write Cloud upload receipt JSON after --upload")
|
|
579
|
+
.option("--keep-local", "Keep local screenshot files after --upload (skip post-upload cleanup)")
|
|
554
580
|
.option("--project <id>", "Glubean Cloud project ID (or GLUBEAN_PROJECT_ID env)")
|
|
555
581
|
.option("--upload-target <id>", "Cloud target id runs upload to (or GLUBEAN_TARGET_ID; else project default)")
|
|
556
582
|
.option("--token <token>", "Auth token for cloud upload (or GLUBEAN_TOKEN env)")
|
|
@@ -558,6 +584,9 @@ ciCmd
|
|
|
558
584
|
.option("--input-json <value>", "Explicit case input as JSON literal or @path/to.json. Validated against the case's `needs` schema; runs raw (overlay skipped). Requires --filter to match exactly one testId.")
|
|
559
585
|
.option("--bootstrap-json <value>", "Bootstrap params as JSON literal or @path/to.json. Validated against the overlay's `params` schema and passed to overlay's run(ctx, params). Requires --filter to match exactly one testId.")
|
|
560
586
|
.option("--force-standalone", "DEBUG: bypass `runnability.requireAttachment` for the filtered case. Emits a runtime warning. Author-debug only.")
|
|
587
|
+
.option("--only-id <id>", "Run only the test(s) with matching id (repeatable). For `.each` rows pass the concrete expanded id.", collect, [])
|
|
588
|
+
.option("--row <n>", "With a single --only-id, isolate the 0-based `.each` row index.")
|
|
589
|
+
.option("--rerun-failed", "Re-run only the tests that failed in the last `glubean run` (reads .glubean/last-run.result.json).")
|
|
561
590
|
.action(async (target, options, cmd) => {
|
|
562
591
|
// Bake in the `ci` profile so executeRun's profile-mode branch fires.
|
|
563
592
|
// The user can't override this — that would defeat the point of the
|
|
@@ -580,12 +609,52 @@ program
|
|
|
580
609
|
});
|
|
581
610
|
});
|
|
582
611
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
612
|
+
// dry-run command — project test SHAPE (assertions/endpoints) without running
|
|
613
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
614
|
+
program
|
|
615
|
+
.command("dry-run")
|
|
616
|
+
.description("Project each simple test's shape (assertions, endpoints) without running it")
|
|
617
|
+
.option("-d, --dir <path>", "Directory to scan", ".")
|
|
618
|
+
.option("--json", "Output as JSON")
|
|
619
|
+
.option("--out <path>", "Write the projection JSON to a file")
|
|
620
|
+
.action(async (options) => {
|
|
621
|
+
await dryRunCommand({
|
|
622
|
+
dir: options.dir,
|
|
623
|
+
json: options.json,
|
|
624
|
+
out: options.out,
|
|
625
|
+
});
|
|
626
|
+
});
|
|
627
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
628
|
+
// sync command — sync test-definition projections (specs) to Glubean Cloud
|
|
629
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
630
|
+
program
|
|
631
|
+
.command("sync")
|
|
632
|
+
.description("Sync the repo's test-definition projections (metadata + dry-run shape) to Glubean Cloud for team review")
|
|
633
|
+
.option("-d, --dir <path>", "Locate the project from this directory (the WHOLE project is always synced)", ".")
|
|
634
|
+
.option("--project <id>", "Glubean Cloud project ID (or GLUBEAN_PROJECT_ID env)")
|
|
635
|
+
.option("--token <token>", "Auth token (or GLUBEAN_TOKEN env)")
|
|
636
|
+
.option("--token-env <name>", "Read the token from this env var instead of GLUBEAN_TOKEN")
|
|
637
|
+
.option("--api-url <url>", "Glubean API server URL (or GLUBEAN_API_URL env)")
|
|
638
|
+
.option("--env-file <name>", "Env file basename to load (default: active env, else .env; prod-like active envs are refused implicitly)")
|
|
639
|
+
.option("--allow-empty", "Allow clearing the project's projections when no tests are found")
|
|
640
|
+
.action(async (options) => {
|
|
641
|
+
await syncCommand({
|
|
642
|
+
dir: options.dir,
|
|
643
|
+
project: options.project,
|
|
644
|
+
token: options.token,
|
|
645
|
+
tokenEnv: options.tokenEnv,
|
|
646
|
+
apiUrl: options.apiUrl,
|
|
647
|
+
envFile: options.envFile,
|
|
648
|
+
allowEmpty: options.allowEmpty,
|
|
649
|
+
});
|
|
650
|
+
});
|
|
651
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
583
652
|
// load command — run performance plans (.load.ts)
|
|
584
653
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
585
654
|
program
|
|
586
655
|
.command("load [target]")
|
|
587
656
|
.description("Run loadRunner() performance plans (.load.ts) and write LoadArtifacts")
|
|
588
|
-
.option("--env-file <name>", "Env file basename (default: active env, else .env)")
|
|
657
|
+
.option("--env-file <name>", "Env file basename (default: active env, else .env; prod-like active envs are refused implicitly)")
|
|
589
658
|
.option("--upload", "Upload each plan's LoadArtifact to Glubean Cloud")
|
|
590
659
|
.option("--upload-receipt-json <path>", "Write Cloud upload receipt(s) JSON after --upload")
|
|
591
660
|
.option("--project <id>", "Glubean Cloud project ID (or GLUBEAN_PROJECT_ID env)")
|