@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.
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"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"}
@@ -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 artifactDirs = [
250
- join(artifactRoot, "artifacts"),
251
- join(artifactRoot, "screenshots"),
252
- ];
397
+ const screenshotsRoot = join(artifactRoot, "screenshots");
253
398
  const candidates = [];
254
- for (const dir of artifactDirs) {
255
- const dirFiles = await walkDir(dir);
256
- for (const filePath of dirFiles) {
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;
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA45BH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
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 if it exists)")
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 if it exists)")
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)")