@geonosis/release 1.4.0 → 2.1.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/dist/index.d.ts CHANGED
@@ -1,3 +1,41 @@
1
+ import { ReportEnvelope } from '@geonosis/ratchet';
2
+
3
+ type AdoptionVerdict = 'BEHIND' | 'FLOOR UNDECLARED' | 'INCOHERENT' | 'UNJUDGED';
4
+ type AdoptionFinding = {
5
+ consumer: string;
6
+ detail: string;
7
+ name: string;
8
+ verdict: AdoptionVerdict;
9
+ };
10
+ type AdoptionConsumer = {
11
+ /** How many specs naming a package of this workspace that consumer's manifests declare. */
12
+ declared: number;
13
+ findings: AdoptionFinding[];
14
+ name: string;
15
+ };
16
+ type AdoptionReport = {
17
+ considered: number;
18
+ consumers: AdoptionConsumer[];
19
+ excused: {
20
+ path: string;
21
+ reason: string;
22
+ }[];
23
+ /** The registry the current numbers came from, or undefined when they came off this workspace. */
24
+ registry: string | undefined;
25
+ versions: Record<string, string>;
26
+ };
27
+ declare const runAdoption: ({ declared, registry, root, }: {
28
+ declared: {
29
+ name: string;
30
+ }[];
31
+ registry?: string;
32
+ root: string;
33
+ }) => Promise<AdoptionReport>;
34
+ declare const formatAdoption: (report: AdoptionReport) => string;
35
+ declare const ADOPTION_TOOL = "release-adoption";
36
+ declare const ADOPTION_NEXT = "geonosis-release adoption --json and read `consumers` \u2014 every declared consumer leaves by exactly one door, read or excused, and a release review carries one row per consumer from it (D-061)";
37
+ declare const adoptionEnvelope: (report: AdoptionReport, durationMs: number) => ReportEnvelope;
38
+
1
39
  /** The dialects the gate can route to. A dialect is never sniffed: it is what the repo declared. */
2
40
  type Dialect = 'mikro-orm-ts' | 'postgres' | 'sqlite';
3
41
  type Phase = 'down' | 'up';
@@ -12,6 +50,49 @@ type MigrationDir = {
12
50
  type ProofConfig = {
13
51
  mustAssertVersion?: boolean;
14
52
  };
53
+ /** One domain's shipped migrations, and the tables that are ITS to name. */
54
+ type SchemaDomain = {
55
+ dir: string;
56
+ name: string;
57
+ tables: string[];
58
+ };
59
+ type SchemaConfig = {
60
+ domains: SchemaDomain[];
61
+ sessionVariables: string[];
62
+ };
63
+ type SchemaFinding = {
64
+ line: number;
65
+ path: string;
66
+ why: string;
67
+ };
68
+ type SchemaReport = {
69
+ dirs: string[];
70
+ files: string[];
71
+ findings: SchemaFinding[];
72
+ ok: boolean;
73
+ read: number;
74
+ unreadable: {
75
+ path: string;
76
+ why: string;
77
+ }[];
78
+ };
79
+ /**
80
+ * One consumer tree a release must be read against, how that one is installed, and the commands
81
+ * that are ITS gates when the three script names are not what that tree calls them.
82
+ */
83
+ type SmokeSnapshotConfig = {
84
+ commands?: Partial<Record<'doctor' | 'lint' | 'typecheck', string>>;
85
+ install?: string;
86
+ name: string;
87
+ };
88
+ /**
89
+ * What the release check asks of consumers. Law 6: a repo that names no snapshot gets no sweep —
90
+ * and is told so, rather than passing over nothing.
91
+ */
92
+ type SmokeConfig = {
93
+ exclude?: string[];
94
+ snapshots?: SmokeSnapshotConfig[];
95
+ };
15
96
  /**
16
97
  * Law 6: every directory, dialect, secret name and worker is an OPTION. The defaults are empty, and
17
98
  * a command that needs one it has not got refuses with 2 rather than measuring nothing and
@@ -20,7 +101,10 @@ type ProofConfig = {
20
101
  type ReleaseConfig = {
21
102
  migrations?: MigrationDir[];
22
103
  proof?: ProofConfig;
104
+ /** Absent when the repo never declared the block — which is not the same as declaring it empty. */
105
+ schema?: SchemaConfig;
23
106
  secrets?: string[];
107
+ smoke?: SmokeConfig;
24
108
  steps?: string[];
25
109
  workers?: string[];
26
110
  wrangler?: string[];
@@ -200,6 +284,106 @@ declare const prove: (cwd: string, stub?: string) => Promise<ProveOutcome>;
200
284
  declare const formatProve: (outcome: ProveOutcome) => string;
201
285
  declare const formatVerdict: (verdict: Verdict) => string;
202
286
 
287
+ type PublishedVerdict = 'ABSENT' | 'BEHIND' | 'MATCH' | 'UNREACHABLE';
288
+ type PublishedLine = {
289
+ at: string;
290
+ latest: string | undefined;
291
+ local: string;
292
+ name: string;
293
+ verdict: PublishedVerdict;
294
+ why: string;
295
+ };
296
+ type PublishedReport = {
297
+ considered: number;
298
+ excused: {
299
+ path: string;
300
+ reason: string;
301
+ }[];
302
+ lines: PublishedLine[];
303
+ ok: boolean;
304
+ registry: string;
305
+ sweeps: number;
306
+ unreachable: number;
307
+ waitedMs: number;
308
+ };
309
+ type Local = {
310
+ at: string;
311
+ name: string;
312
+ version: string;
313
+ };
314
+ type Census = {
315
+ excused: {
316
+ path: string;
317
+ reason: string;
318
+ }[];
319
+ locals: Local[];
320
+ };
321
+ /**
322
+ * Every workspace in the tree, split into the ones a publish is a claim about and the ones it is
323
+ * not. Both halves are kept: a check that quietly dropped the manifests it skipped could not say
324
+ * what its denominator was, and "21 of 21" over a tree of 22 is exactly the sample that announced
325
+ * a release the group had not finished (#147).
326
+ */
327
+ declare const censusOf: (root: string) => Census;
328
+ declare const EXISTS_BUT = "exists but no version matching";
329
+ /**
330
+ * #147 — the release is not the publish exiting zero; it is the GROUP resolving from npm.
331
+ *
332
+ * Every workspace, every sweep, with no sampling: the one entry point nobody checked is the one a
333
+ * consumer's bump reads, and it fails in their tree as a nested duplicate rather than as an error
334
+ * anyone here would see.
335
+ */
336
+ declare const runPublished: ({ pollMs, registry, root, waitSeconds, }: {
337
+ pollMs?: number;
338
+ registry?: string;
339
+ root: string;
340
+ waitSeconds?: number;
341
+ }) => Promise<PublishedReport>;
342
+ declare const formatPublished: (report: PublishedReport) => string;
343
+
344
+ /**
345
+ * What a registry says about one package name.
346
+ *
347
+ * Three answers and not two, because a release check and a bump act differently on each: `absent`
348
+ * is the ~4-minute window in which a name published a moment ago still 404s, `present` with the
349
+ * wanted version missing is a manager's cached manifest or a publish that left a package out, and
350
+ * `unreachable` is not a verdict about the package at all.
351
+ */
352
+ type RegistryAnswer = {
353
+ kind: 'absent';
354
+ name: string;
355
+ } | {
356
+ kind: 'present';
357
+ latest: string | undefined;
358
+ name: string;
359
+ versions: string[];
360
+ } | {
361
+ kind: 'unreachable';
362
+ name: string;
363
+ why: string;
364
+ };
365
+ declare const DEFAULT_REGISTRY = "https://registry.npmjs.org";
366
+ /** `@scope/name` → `@scope%2fname`, which is how a registry addresses a scoped packument. */
367
+ declare const registryPathOf: (name: string) => string;
368
+ /**
369
+ * The registry asked over HTTP, and never through the package manager.
370
+ *
371
+ * `npm view` and `bun pm view` answer out of the MANAGER's manifest cache, which is the thing that
372
+ * lied: a consumer's bump aborted on "no version matching 1.4.0" minutes after 1.4.0 was published,
373
+ * because bun had cached the packument from before it (measured 2026-09-01, #147). A check whose
374
+ * job is to catch a stale read must not be reading the same cache.
375
+ */
376
+ declare const askRegistry: ({ name, registry, timeoutMs, }: {
377
+ name: string;
378
+ registry?: string;
379
+ timeoutMs?: number;
380
+ }) => Promise<RegistryAnswer>;
381
+
382
+ declare const runSchema: ({ root }: {
383
+ root: string;
384
+ }) => SchemaReport;
385
+ declare const formatSchema: (report: SchemaReport) => string;
386
+
203
387
  type Request = {
204
388
  step: 'promote';
205
389
  versionId: string;
@@ -228,6 +412,215 @@ declare class Runner {
228
412
  close(): void;
229
413
  }
230
414
 
415
+ /**
416
+ * Where a consumer's bytes live while the release is being read against them.
417
+ *
418
+ * D-048: a consumer tree is private, and a copy of one that reaches a commit cannot be taken back.
419
+ * The directory is under `.geonosis/`, which every repo in this kit's orbit already ignores, and
420
+ * `smoke snapshot` asks git — in the tree it is about to write into — whether that is still true
421
+ * before it copies a single file.
422
+ */
423
+ declare const SNAPSHOTS_DIR = ".geonosis/consumer-snapshots";
424
+ /** The managers a snapshot can be installed with here, each measured on this machine. */
425
+ type Manager = 'bun' | 'pnpm';
426
+ /**
427
+ * Directories a consumer builds or installs into. They are excluded by name at every depth: the
428
+ * snapshot is the SOURCE of a tree, and the install the smoke runs is the thing under test.
429
+ */
430
+ declare const EXCLUDED_DIRS: string[];
431
+ /** What a phase runs: a script of theirs, a binary their install put there, or nothing at all. */
432
+ type Command = {
433
+ exec: string;
434
+ } | {
435
+ run: string;
436
+ } | {
437
+ why: string;
438
+ };
439
+ type SmokePhase = 'doctor' | 'lint' | 'typecheck';
440
+ declare const PHASES: SmokePhase[];
441
+ /** Where the source tree stood, or the sentence saying why nothing here could say. */
442
+ type RecordedCommit = {
443
+ sha: string;
444
+ } | {
445
+ why: string;
446
+ };
447
+ type SnapshotRecord = {
448
+ at: string;
449
+ bytes: number;
450
+ /** Absent in a recording taken before this was recorded at all. */
451
+ commit?: RecordedCommit;
452
+ commands: Record<SmokePhase, Command>;
453
+ excluded: string[];
454
+ files: number;
455
+ from: string;
456
+ lockfile: string;
457
+ manager: Manager;
458
+ manifests: {
459
+ path: string;
460
+ versions: Record<string, string>;
461
+ }[];
462
+ name: string;
463
+ };
464
+ /** git asked in THEIR tree, and only ever asked: law 5 forbids this tool writing a byte there. */
465
+ declare const headOf: (from: string) => RecordedCommit;
466
+ declare const snapshotDir: (root: string, name: string) => string;
467
+ declare const readSnapshot: (root: string, name: string) => SnapshotRecord;
468
+ type SnapshotInput = {
469
+ exclude?: string[];
470
+ from: string;
471
+ name: string;
472
+ named: Partial<Record<SmokePhase, string>>;
473
+ replace: boolean;
474
+ root: string;
475
+ };
476
+ declare const runSnapshot: (input: SnapshotInput) => SnapshotRecord;
477
+ declare const formatSnapshot: (record: SnapshotRecord) => string;
478
+
479
+ /** What a phase did, or the sentence saying there was nothing of theirs to do it with. */
480
+ type PhaseOutcome = {
481
+ code: number;
482
+ command: string;
483
+ lines: string[];
484
+ ok: boolean;
485
+ phase: SmokePhase;
486
+ } | {
487
+ phase: SmokePhase;
488
+ why: string;
489
+ };
490
+ type Packed = {
491
+ files: string[];
492
+ name: string;
493
+ tarball: string;
494
+ version: string;
495
+ };
496
+ type SmokeBaseline = {
497
+ at: string;
498
+ packed: {
499
+ name: string;
500
+ version: string;
501
+ }[];
502
+ phases: PhaseOutcome[];
503
+ rc: string;
504
+ };
505
+ type SmokeComparison = {
506
+ broken: {
507
+ lines: string[];
508
+ phase: SmokePhase;
509
+ }[];
510
+ findings: string[];
511
+ known: SmokePhase[];
512
+ mended: SmokePhase[];
513
+ name: string;
514
+ ok: boolean;
515
+ outcomes: PhaseOutcome[];
516
+ refused: {
517
+ phase: SmokePhase;
518
+ why: string;
519
+ }[];
520
+ };
521
+ declare const BASELINE_FILE = "baseline.json";
522
+ /**
523
+ * The tarballs, because a tarball is what a consumer installs.
524
+ *
525
+ * Escape (1) lived exactly here: the declarations were in the tree, the build made them, and the
526
+ * `files` list did not carry them — so every kit test passed and the first consumer import was
527
+ * TS7016. Nothing short of packing can see that.
528
+ */
529
+ declare const packRc: (rc: string, into: string) => Packed[];
530
+ /**
531
+ * A tarball that promises declarations and does not carry them, read off the pack itself.
532
+ *
533
+ * The consumer's compiler says the same thing one import later — but only about the packages that
534
+ * consumer imports. This says it about every package in the release.
535
+ */
536
+ declare const promisedButNotPacked: (rc: string, packed: Packed[]) => string[];
537
+ /** The snapshot's manifests, pointed at the tarballs instead of at the versions they name. */
538
+ declare const rewriteManifests: (tree: string, manifests: string[], packed: Packed[]) => {
539
+ name: string;
540
+ path: string;
541
+ }[];
542
+ type RunInput = {
543
+ commands?: Partial<Record<SmokePhase, string>>;
544
+ install?: string;
545
+ name: string;
546
+ rc?: string;
547
+ root: string;
548
+ };
549
+ declare const recordBaseline: (input: RunInput) => SmokeBaseline;
550
+ declare const readBaseline: (root: string, name: string) => SmokeBaseline;
551
+ declare const compareToBaseline: (name: string, baseline: SmokeBaseline, outcomes: PhaseOutcome[], findings: string[]) => SmokeComparison;
552
+ declare const runSmoke: (input: RunInput) => SmokeComparison;
553
+ /**
554
+ * What the sweep can say about WHEN a recording was taken: that its source has moved on, or that
555
+ * the question cannot be asked of it at all.
556
+ */
557
+ type SweepNote = {
558
+ stale: string;
559
+ } | {
560
+ undated: string;
561
+ };
562
+ /** One declared consumer's turn in the sweep, in the order the repo declared it. */
563
+ type SweepEntry = {
564
+ comparison: SmokeComparison;
565
+ name: string;
566
+ note?: SweepNote;
567
+ } | {
568
+ name: string;
569
+ why: string;
570
+ };
571
+ type SmokeSweep = {
572
+ entries: SweepEntry[];
573
+ };
574
+ type WantedSnapshot = {
575
+ commands?: Partial<Record<SmokePhase, string>>;
576
+ install?: string;
577
+ name: string;
578
+ };
579
+ /**
580
+ * Where a consumer tree that has never been recorded lives on THIS machine.
581
+ *
582
+ * A never-recorded name has no `from` to look at, so the paths are declared here — uncommitted,
583
+ * under the directory D-048 already keeps out of git, because a machine's checkout layout is one
584
+ * developer's and not the repo's.
585
+ */
586
+ declare const CONSUMER_TREES_FILE = ".geonosis/consumer-trees.local.json";
587
+ /**
588
+ * Every snapshot the release expects, read in turn, in the order the repo declared them.
589
+ *
590
+ * A tree that is not on this machine is SKIPPED with the sentence saying so — a laptop without the
591
+ * consumer trees must not fail, it must say what it could not ask. The skip is not free: its three
592
+ * commands stay in the envelope's denominator as excused, so a sweep that asked nothing cannot be
593
+ * read as a sweep that asked everything.
594
+ */
595
+ declare const sweepSmoke: (input: {
596
+ /** Declared names this run is excused from reading, each said out loud on the command line. */
597
+ absent?: string[];
598
+ rc?: string;
599
+ root: string;
600
+ /**
601
+ * Whether an absent snapshot is a skip. It is when the repo NAMED the set and this laptop has
602
+ * some of it; it is not when a caller asked for one tree by name — that question was asked and
603
+ * has to be answered, not stepped around.
604
+ */
605
+ skipMissing: boolean;
606
+ wanted: WantedSnapshot[];
607
+ }) => SmokeSweep;
608
+ declare const comparisonsIn: (sweep: SmokeSweep) => SmokeComparison[];
609
+ declare const formatSweep: (sweep: SmokeSweep) => string;
610
+ declare const sweepEnvelope: (sweep: SmokeSweep, durationMs: number) => ReportEnvelope;
611
+ declare const formatSmoke: (comparison: SmokeComparison) => string;
612
+ declare const formatBaseline: (name: string, baseline: SmokeBaseline) => string;
613
+ declare const SMOKE_TOOL = "release-smoke";
614
+ declare const SMOKE_NEXT = "geonosis-release smoke run --snapshot <name> --json and read `outcomes` \u2014 every phase the snapshot named leaves by exactly one door: read, excused with the sentence saying there was nothing of theirs to run, or refused because this run and the baseline are not comparable";
615
+ /**
616
+ * The three commands as a census.
617
+ *
618
+ * The denominator is what the SNAPSHOT named, not what this run managed to do: a smoke that skipped
619
+ * the doctor because the bin was not installed and reported OK over two commands is the shape this
620
+ * whole workstream exists to catch.
621
+ */
622
+ declare const smokeEnvelope: (comparison: SmokeComparison, durationMs: number) => ReportEnvelope;
623
+
231
624
  type Extracted = {
232
625
  line: number;
233
626
  sql: string;
@@ -263,4 +656,4 @@ declare const statementsOf: (sql: string) => string;
263
656
  /** One refusal per verb per file, at the line of that verb's first occurrence. */
264
657
  declare const refusalsIn: (path: string, body: string, firstLine?: number) => Refusal[];
265
658
 
266
- export { DEPLOYED_FILE, type Declared, type Deployed, type DeployedReport, type Dialect, type Drift, type MigrationDir, type MigrationsReport, NARROWING, NOTHING_SAYS, PLANTS, type Phase, type PlanReport, type ProveOutcome, type Refusal, type ReleaseConfig, Runner, STEPS, type Verdict, WHY_VERSION_IDENTITY, addSqlIn, declaredIn, driftBetween, formatDeployed, formatMigrations, formatPlan, formatProve, formatVerdict, markersIn, parseJsonc, parseReleaseConfig, parseToml, prove, proveOver, readDeployed, readReleaseConfig, readWrangler, refusalsIn, runDeployed, runMigrations, runPlan, statementsOf };
659
+ export { ADOPTION_NEXT, ADOPTION_TOOL, type AdoptionConsumer, type AdoptionFinding, type AdoptionReport, type AdoptionVerdict, BASELINE_FILE, CONSUMER_TREES_FILE, type Command, DEFAULT_REGISTRY, DEPLOYED_FILE, type Declared, type Deployed, type DeployedReport, type Dialect, type Drift, EXCLUDED_DIRS, EXISTS_BUT, type Manager, type MigrationDir, type MigrationsReport, NARROWING, NOTHING_SAYS, PHASES, PLANTS, type Packed, type Phase, type PhaseOutcome, type PlanReport, type ProveOutcome, type PublishedLine, type PublishedReport, type PublishedVerdict, type RecordedCommit, type Refusal, type RegistryAnswer, type ReleaseConfig, Runner, SMOKE_NEXT, SMOKE_TOOL, SNAPSHOTS_DIR, STEPS, type SchemaConfig, type SchemaDomain, type SchemaFinding, type SchemaReport, type SmokeBaseline, type SmokeComparison, type SmokePhase, type SmokeSweep, type SnapshotRecord, type SweepEntry, type SweepNote, type Verdict, WHY_VERSION_IDENTITY, type WantedSnapshot, addSqlIn, adoptionEnvelope, askRegistry, censusOf, compareToBaseline, comparisonsIn, declaredIn, driftBetween, formatAdoption, formatBaseline, formatDeployed, formatMigrations, formatPlan, formatProve, formatPublished, formatSchema, formatSmoke, formatSnapshot, formatSweep, formatVerdict, headOf, markersIn, packRc, parseJsonc, parseReleaseConfig, parseToml, promisedButNotPacked, prove, proveOver, readBaseline, readDeployed, readReleaseConfig, readSnapshot, readWrangler, recordBaseline, refusalsIn, registryPathOf, rewriteManifests, runAdoption, runDeployed, runMigrations, runPlan, runPublished, runSchema, runSmoke, runSnapshot, smokeEnvelope, snapshotDir, statementsOf, sweepEnvelope, sweepSmoke };
package/dist/index.js CHANGED
@@ -1,62 +1,142 @@
1
1
  import {
2
+ ADOPTION_NEXT,
3
+ ADOPTION_TOOL,
4
+ BASELINE_FILE,
5
+ CONSUMER_TREES_FILE,
6
+ DEFAULT_REGISTRY,
2
7
  DEPLOYED_FILE,
8
+ EXCLUDED_DIRS,
9
+ EXISTS_BUT,
3
10
  NARROWING,
4
11
  NOTHING_SAYS,
12
+ PHASES,
5
13
  PLANTS,
6
14
  Runner,
15
+ SMOKE_NEXT,
16
+ SMOKE_TOOL,
17
+ SNAPSHOTS_DIR,
7
18
  STEPS,
8
19
  WHY_VERSION_IDENTITY,
9
20
  addSqlIn,
21
+ adoptionEnvelope,
22
+ askRegistry,
23
+ censusOf,
24
+ compareToBaseline,
25
+ comparisonsIn,
10
26
  declaredIn,
11
27
  driftBetween,
28
+ formatAdoption,
29
+ formatBaseline,
12
30
  formatDeployed,
13
31
  formatMigrations,
14
32
  formatPlan,
15
33
  formatProve,
34
+ formatPublished,
35
+ formatSchema,
36
+ formatSmoke,
37
+ formatSnapshot,
38
+ formatSweep,
16
39
  formatVerdict,
40
+ headOf,
17
41
  markersIn,
42
+ packRc,
18
43
  parseJsonc,
19
44
  parseReleaseConfig,
20
45
  parseToml,
46
+ promisedButNotPacked,
21
47
  prove,
22
48
  proveOver,
49
+ readBaseline,
23
50
  readDeployed,
24
51
  readReleaseConfig,
52
+ readSnapshot,
25
53
  readWrangler,
54
+ recordBaseline,
26
55
  refusalsIn,
56
+ registryPathOf,
57
+ rewriteManifests,
58
+ runAdoption,
27
59
  runDeployed,
28
60
  runMigrations,
29
61
  runPlan,
30
- statementsOf
31
- } from "./chunk-D5IC766I.js";
62
+ runPublished,
63
+ runSchema,
64
+ runSmoke,
65
+ runSnapshot,
66
+ smokeEnvelope,
67
+ snapshotDir,
68
+ statementsOf,
69
+ sweepEnvelope,
70
+ sweepSmoke
71
+ } from "./chunk-MZWAN6WT.js";
32
72
  export {
73
+ ADOPTION_NEXT,
74
+ ADOPTION_TOOL,
75
+ BASELINE_FILE,
76
+ CONSUMER_TREES_FILE,
77
+ DEFAULT_REGISTRY,
33
78
  DEPLOYED_FILE,
79
+ EXCLUDED_DIRS,
80
+ EXISTS_BUT,
34
81
  NARROWING,
35
82
  NOTHING_SAYS,
83
+ PHASES,
36
84
  PLANTS,
37
85
  Runner,
86
+ SMOKE_NEXT,
87
+ SMOKE_TOOL,
88
+ SNAPSHOTS_DIR,
38
89
  STEPS,
39
90
  WHY_VERSION_IDENTITY,
40
91
  addSqlIn,
92
+ adoptionEnvelope,
93
+ askRegistry,
94
+ censusOf,
95
+ compareToBaseline,
96
+ comparisonsIn,
41
97
  declaredIn,
42
98
  driftBetween,
99
+ formatAdoption,
100
+ formatBaseline,
43
101
  formatDeployed,
44
102
  formatMigrations,
45
103
  formatPlan,
46
104
  formatProve,
105
+ formatPublished,
106
+ formatSchema,
107
+ formatSmoke,
108
+ formatSnapshot,
109
+ formatSweep,
47
110
  formatVerdict,
111
+ headOf,
48
112
  markersIn,
113
+ packRc,
49
114
  parseJsonc,
50
115
  parseReleaseConfig,
51
116
  parseToml,
117
+ promisedButNotPacked,
52
118
  prove,
53
119
  proveOver,
120
+ readBaseline,
54
121
  readDeployed,
55
122
  readReleaseConfig,
123
+ readSnapshot,
56
124
  readWrangler,
125
+ recordBaseline,
57
126
  refusalsIn,
127
+ registryPathOf,
128
+ rewriteManifests,
129
+ runAdoption,
58
130
  runDeployed,
59
131
  runMigrations,
60
132
  runPlan,
61
- statementsOf
133
+ runPublished,
134
+ runSchema,
135
+ runSmoke,
136
+ runSnapshot,
137
+ smokeEnvelope,
138
+ snapshotDir,
139
+ statementsOf,
140
+ sweepEnvelope,
141
+ sweepSmoke
62
142
  };