@miller-tech/uap 1.46.7 → 1.48.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.
Files changed (41) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/bin/cli.js +9 -0
  3. package/dist/bin/cli.js.map +1 -1
  4. package/dist/cli/deliver.d.ts +14 -0
  5. package/dist/cli/deliver.d.ts.map +1 -1
  6. package/dist/cli/deliver.js +204 -11
  7. package/dist/cli/deliver.js.map +1 -1
  8. package/dist/cli/setup.d.ts +1 -0
  9. package/dist/cli/setup.d.ts.map +1 -1
  10. package/dist/cli/setup.js +19 -0
  11. package/dist/cli/setup.js.map +1 -1
  12. package/dist/delivery/agentic-executor.d.ts +8 -0
  13. package/dist/delivery/agentic-executor.d.ts.map +1 -1
  14. package/dist/delivery/agentic-executor.js +12 -2
  15. package/dist/delivery/agentic-executor.js.map +1 -1
  16. package/dist/delivery/applier.d.ts +8 -0
  17. package/dist/delivery/applier.d.ts.map +1 -1
  18. package/dist/delivery/applier.js +35 -1
  19. package/dist/delivery/applier.js.map +1 -1
  20. package/dist/delivery/auto-optimizer.d.ts +11 -0
  21. package/dist/delivery/auto-optimizer.d.ts.map +1 -1
  22. package/dist/delivery/auto-optimizer.js +11 -2
  23. package/dist/delivery/auto-optimizer.js.map +1 -1
  24. package/dist/delivery/ci-watcher.d.ts +72 -0
  25. package/dist/delivery/ci-watcher.d.ts.map +1 -0
  26. package/dist/delivery/ci-watcher.js +221 -0
  27. package/dist/delivery/ci-watcher.js.map +1 -0
  28. package/dist/delivery/deploy-dev-gate.d.ts +44 -0
  29. package/dist/delivery/deploy-dev-gate.d.ts.map +1 -0
  30. package/dist/delivery/deploy-dev-gate.js +175 -0
  31. package/dist/delivery/deploy-dev-gate.js.map +1 -0
  32. package/dist/delivery/verifier-ladder.d.ts +77 -0
  33. package/dist/delivery/verifier-ladder.d.ts.map +1 -1
  34. package/dist/delivery/verifier-ladder.js +225 -3
  35. package/dist/delivery/verifier-ladder.js.map +1 -1
  36. package/dist/utils/self-update.d.ts +53 -0
  37. package/dist/utils/self-update.d.ts.map +1 -0
  38. package/dist/utils/self-update.js +135 -0
  39. package/dist/utils/self-update.js.map +1 -0
  40. package/package.json +1 -1
  41. package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
@@ -10,6 +10,16 @@
10
10
  * Detection is npm-centric (package.json scripts); callers targeting other
11
11
  * ecosystems can pass explicit rungs.
12
12
  */
13
+ /**
14
+ * Cheap-first promotion tiers. The convergence loop runs the cheapest tier
15
+ * first and only promotes to the next, more expensive tier once the prior is
16
+ * green. `fast` is the existing build/typecheck/unit-test/lint band; the
17
+ * `ci`/`deploy-staging`/`deploy-prod` bands are NEVER run locally — they are
18
+ * consumed after commit via the CI watcher (see ci-watcher.ts).
19
+ */
20
+ export type GateTier = 'fast' | 'integration' | 'deploy-dev' | 'ci' | 'deploy-staging' | 'deploy-prod';
21
+ /** Cheap → expensive promotion order. */
22
+ export declare const TIER_ORDER: GateTier[];
13
23
  export interface GateRung {
14
24
  /** Stable identifier, e.g. 'build', 'typecheck', 'test', 'lint' */
15
25
  id: string;
@@ -27,7 +37,24 @@ export interface GateRung {
27
37
  required: boolean;
28
38
  /** Per-rung timeout in milliseconds */
29
39
  timeoutMs: number;
40
+ /**
41
+ * Cheap-first promotion tier. Absent ⇒ 'fast' (back-compat: existing
42
+ * callers and detectors that predate tiering keep working).
43
+ */
44
+ tier?: GateTier;
45
+ /**
46
+ * Optional teardown run after the rung regardless of outcome (e.g. a
47
+ * deploy-dev compose down / server kill). Best-effort; a teardown failure
48
+ * never flips a passing rung to failed.
49
+ */
50
+ teardown?: {
51
+ command: string;
52
+ args: string[];
53
+ timeoutMs: number;
54
+ };
30
55
  }
56
+ /** Effective tier for a rung — absent tier means the original `fast` band. */
57
+ export declare function tierOf(rung: GateRung): GateTier;
31
58
  export type RungFailureReason = 'exit' | 'timeout' | 'signal' | 'spawn-error';
32
59
  export interface RungResult {
33
60
  id: string;
@@ -59,17 +86,37 @@ export interface LadderOptions {
59
86
  /** Default per-rung timeout in ms (default 300000) */
60
87
  timeoutMs?: number;
61
88
  }
89
+ export declare const DEFAULT_TAIL_CHARS = 2000;
90
+ export declare function sanitizedEnv(): NodeJS.ProcessEnv;
62
91
  /**
63
92
  * Detect the gate rungs available in a project from its package.json scripts.
64
93
  * Order matters: cheap/structural gates run before expensive ones so failure
65
94
  * feedback arrives fast.
66
95
  */
67
96
  export declare function detectRungs(projectRoot: string, timeoutMs?: number): GateRung[];
97
+ /**
98
+ * Detect integration / end-to-end suites: npm `test:integration` / `test:e2e`
99
+ * scripts, or a pytest project declaring an `integration` marker. These cost
100
+ * more than unit tests, so they live in the `integration` tier and only run
101
+ * after the fast tier passes.
102
+ */
103
+ export declare function detectIntegrationRungs(projectRoot: string, scripts: Record<string, string>, timeoutMs?: number): GateRung[];
104
+ /**
105
+ * Detect a local dev deploy+smoke gate. Priority:
106
+ * 1. an explicit `deploy:dev` / `smoke:dev` / `smoke` npm script;
107
+ * 2. a docker-compose file paired with a `smoke` script (compose brought up
108
+ * by the deploy-dev runner, torn down via the rung's teardown);
109
+ * Returns null when nothing is discoverable — the loop still converges on the
110
+ * fast + integration tiers. The deploy-dev tier is only RUN when the caller
111
+ * opts in (maxTier >= deploy-dev); detection is always safe.
112
+ */
113
+ export declare function detectDeployDevRung(projectRoot: string, scripts: Record<string, string>, timeoutMs?: number): GateRung | null;
68
114
  /**
69
115
  * Detect real gates in non-npm projects: a Makefile test/check/build target,
70
116
  * a pytest suite, or a conventional shell test script. Ordered cheap→expensive.
71
117
  */
72
118
  export declare function detectNonNpmRungs(projectRoot: string, timeoutMs?: number): GateRung[];
119
+ export declare function truncateTail(text: string, maxChars: number): string;
73
120
  /** Run a single rung synchronously in the project root. */
74
121
  export declare function runRung(rung: GateRung, projectRoot: string, tailChars?: number): RungResult;
75
122
  /**
@@ -80,4 +127,34 @@ export declare function runRung(rung: GateRung, projectRoot: string, tailChars?:
80
127
  export declare function formatFeedback(results: RungResult[], rungs: GateRung[]): string;
81
128
  /** Run the full ladder, honoring fail-fast for required rungs. */
82
129
  export declare function runLadder(rungs: GateRung[], projectRoot: string, options?: LadderOptions): LadderResult;
130
+ /** A ladder runner: turns a set of rungs into a result. May be async. */
131
+ export type LadderRunFn = (rungs: GateRung[], projectRoot: string, options?: LadderOptions) => LadderResult | Promise<LadderResult>;
132
+ export interface TieredLadderOptions extends LadderOptions {
133
+ /**
134
+ * Highest tier to run locally. Default 'deploy-dev'. The `ci`,
135
+ * `deploy-staging` and `deploy-prod` tiers are never run locally — they are
136
+ * verified after commit via the CI watcher — so they are skipped here.
137
+ */
138
+ maxTier?: GateTier;
139
+ /**
140
+ * Inner per-tier runner. Defaults to {@link runLadder}. Injecting this lets
141
+ * the convergence loop's integrity wrapper compose around the whole tiered
142
+ * run while reusing the standard rung execution underneath.
143
+ */
144
+ runner?: LadderRunFn;
145
+ /**
146
+ * Specialized runner for `deploy-dev` rungs (bring-up + smoke + teardown
147
+ * lifecycle). When absent, deploy-dev rungs fall back to {@link runner},
148
+ * which simply spawns the smoke command without managing a compose stack.
149
+ */
150
+ deployDevRunner?: LadderRunFn;
151
+ }
152
+ /**
153
+ * Cheap-first tiered ladder. Runs the cheapest tier first and only promotes to
154
+ * the next, more expensive tier once the prior tier's required rungs pass. The
155
+ * result is aggregated into a single {@link LadderResult} so the convergence
156
+ * loop's per-turn contract (one ladder result, one feedback string) is
157
+ * unchanged — tier failures flow back through the existing feedback channel.
158
+ */
159
+ export declare function runTieredLadder(rungs: GateRung[], projectRoot: string, options?: TieredLadderOptions): Promise<LadderResult>;
83
160
  //# sourceMappingURL=verifier-ladder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifier-ladder.d.ts","sourceRoot":"","sources":["../../src/delivery/verifier-ladder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,WAAW,QAAQ;IACvB,mEAAmE;IACnE,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAC;AAE9E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mEAAmE;IACnE,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,MAAM,EAAE,OAAO,CAAC;IAChB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmBD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,MAA2B,GAAG,QAAQ,EAAE,CAwEnG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,MAA2B,GAAG,QAAQ,EAAE,CA8DzG;AAQD,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,MAA2B,GAAG,UAAU,CA+C/G;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAqB/E;AAED,kEAAkE;AAClE,wBAAgB,SAAS,CACvB,KAAK,EAAE,QAAQ,EAAE,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,aAAkB,GAC1B,YAAY,CA8Cd"}
1
+ {"version":3,"file":"verifier-ladder.d.ts","sourceRoot":"","sources":["../../src/delivery/verifier-ladder.ts"],"names":[],"mappings":"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"}
@@ -13,13 +13,26 @@
13
13
  import { spawnSync } from 'child_process';
14
14
  import { existsSync, readFileSync, readdirSync } from 'fs';
15
15
  import { join } from 'path';
16
+ /** Cheap → expensive promotion order. */
17
+ export const TIER_ORDER = [
18
+ 'fast',
19
+ 'integration',
20
+ 'deploy-dev',
21
+ 'ci',
22
+ 'deploy-staging',
23
+ 'deploy-prod',
24
+ ];
25
+ /** Effective tier for a rung — absent tier means the original `fast` band. */
26
+ export function tierOf(rung) {
27
+ return rung.tier ?? 'fast';
28
+ }
16
29
  const DEFAULT_TIMEOUT_MS = 300_000;
17
- const DEFAULT_TAIL_CHARS = 2_000;
30
+ export const DEFAULT_TAIL_CHARS = 2_000;
18
31
  /** Env vars matching these patterns are stripped before running gate
19
32
  * commands — project scripts (and npm lifecycle hooks) in arbitrary
20
33
  * --project-root checkouts must not inherit provider credentials. */
21
34
  const SECRET_ENV_RE = /(API_KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL)/i;
22
- function sanitizedEnv() {
35
+ export function sanitizedEnv() {
23
36
  const env = { CI: 'true' };
24
37
  for (const [key, value] of Object.entries(process.env)) {
25
38
  if (SECRET_ENV_RE.test(key))
@@ -54,6 +67,7 @@ export function detectRungs(projectRoot, timeoutMs = DEFAULT_TIMEOUT_MS) {
54
67
  args: ['run', 'build'],
55
68
  required: true,
56
69
  timeoutMs,
70
+ tier: 'fast',
57
71
  });
58
72
  }
59
73
  // Type-check is meaningful for TypeScript projects even when build exists
@@ -68,6 +82,7 @@ export function detectRungs(projectRoot, timeoutMs = DEFAULT_TIMEOUT_MS) {
68
82
  args: ['--no-install', 'tsc', '--noEmit'],
69
83
  required: true,
70
84
  timeoutMs,
85
+ tier: 'fast',
71
86
  });
72
87
  }
73
88
  if (scripts['test']) {
@@ -78,6 +93,7 @@ export function detectRungs(projectRoot, timeoutMs = DEFAULT_TIMEOUT_MS) {
78
93
  args: ['test'],
79
94
  required: true,
80
95
  timeoutMs,
96
+ tier: 'fast',
81
97
  });
82
98
  }
83
99
  if (scripts['lint']) {
@@ -88,6 +104,7 @@ export function detectRungs(projectRoot, timeoutMs = DEFAULT_TIMEOUT_MS) {
88
104
  args: ['run', 'lint'],
89
105
  required: false,
90
106
  timeoutMs,
107
+ tier: 'fast',
91
108
  });
92
109
  }
93
110
  // Non-npm projects (the common case for polyglot CLI tasks) expose their
@@ -96,8 +113,133 @@ export function detectRungs(projectRoot, timeoutMs = DEFAULT_TIMEOUT_MS) {
96
113
  if (rungs.length === 0) {
97
114
  rungs.push(...detectNonNpmRungs(projectRoot, timeoutMs));
98
115
  }
116
+ // Promotion tiers above `fast`: integration suites and a local dev
117
+ // deploy+smoke. These are appended after the fast band so cheap-first
118
+ // promotion (runTieredLadder) runs them only once the fast tier is green.
119
+ rungs.push(...detectIntegrationRungs(projectRoot, scripts, timeoutMs));
120
+ const deployDev = detectDeployDevRung(projectRoot, scripts, timeoutMs);
121
+ if (deployDev)
122
+ rungs.push(deployDev);
123
+ return rungs;
124
+ }
125
+ /**
126
+ * Detect integration / end-to-end suites: npm `test:integration` / `test:e2e`
127
+ * scripts, or a pytest project declaring an `integration` marker. These cost
128
+ * more than unit tests, so they live in the `integration` tier and only run
129
+ * after the fast tier passes.
130
+ */
131
+ export function detectIntegrationRungs(projectRoot, scripts, timeoutMs = DEFAULT_TIMEOUT_MS) {
132
+ const rungs = [];
133
+ // Integration suites are slower; give them a larger budget (capped at 20m).
134
+ const integrationTimeout = Math.min(timeoutMs * 4, 1_200_000);
135
+ if (scripts['test:integration']) {
136
+ rungs.push({
137
+ id: 'test:integration',
138
+ name: 'Integration tests (npm run test:integration)',
139
+ command: 'npm',
140
+ args: ['run', 'test:integration'],
141
+ required: true,
142
+ timeoutMs: integrationTimeout,
143
+ tier: 'integration',
144
+ });
145
+ }
146
+ if (scripts['test:e2e']) {
147
+ rungs.push({
148
+ id: 'test:e2e',
149
+ name: 'E2E tests (npm run test:e2e)',
150
+ command: 'npm',
151
+ args: ['run', 'test:e2e'],
152
+ required: true,
153
+ timeoutMs: integrationTimeout,
154
+ tier: 'integration',
155
+ });
156
+ }
157
+ // pytest integration marker — only when no npm integration script already
158
+ // covers it, to avoid double-running in polyglot repos.
159
+ if (rungs.length === 0 && pytestHasIntegrationMarker(projectRoot)) {
160
+ rungs.push({
161
+ id: 'pytest:integration',
162
+ name: 'Integration tests (pytest -m integration)',
163
+ command: 'python3',
164
+ args: ['-m', 'pytest', '-m', 'integration', '-q'],
165
+ required: true,
166
+ timeoutMs: integrationTimeout,
167
+ tier: 'integration',
168
+ });
169
+ }
99
170
  return rungs;
100
171
  }
172
+ /** True when a pytest config declares an `integration` marker. */
173
+ function pytestHasIntegrationMarker(projectRoot) {
174
+ for (const file of ['pyproject.toml', 'pytest.ini', 'setup.cfg', 'tox.ini']) {
175
+ const p = join(projectRoot, file);
176
+ if (!existsSync(p))
177
+ continue;
178
+ try {
179
+ const body = readFileSync(p, 'utf-8');
180
+ // Look for a `markers` block that mentions integration.
181
+ if (/markers\b[\s\S]{0,400}?integration\b/i.test(body))
182
+ return true;
183
+ }
184
+ catch {
185
+ /* unreadable config */
186
+ }
187
+ }
188
+ return false;
189
+ }
190
+ /**
191
+ * Detect a local dev deploy+smoke gate. Priority:
192
+ * 1. an explicit `deploy:dev` / `smoke:dev` / `smoke` npm script;
193
+ * 2. a docker-compose file paired with a `smoke` script (compose brought up
194
+ * by the deploy-dev runner, torn down via the rung's teardown);
195
+ * Returns null when nothing is discoverable — the loop still converges on the
196
+ * fast + integration tiers. The deploy-dev tier is only RUN when the caller
197
+ * opts in (maxTier >= deploy-dev); detection is always safe.
198
+ */
199
+ export function detectDeployDevRung(projectRoot, scripts, timeoutMs = DEFAULT_TIMEOUT_MS) {
200
+ const deployTimeout = Math.min(timeoutMs, 300_000);
201
+ if (scripts['deploy:dev']) {
202
+ return {
203
+ id: 'deploy:dev',
204
+ name: 'Dev deploy + smoke (npm run deploy:dev)',
205
+ command: 'npm',
206
+ args: ['run', 'deploy:dev'],
207
+ required: true,
208
+ timeoutMs: deployTimeout,
209
+ tier: 'deploy-dev',
210
+ };
211
+ }
212
+ const smokeScript = scripts['smoke:dev'] ? 'smoke:dev' : scripts['smoke'] ? 'smoke' : null;
213
+ const composeFile = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'].find((f) => existsSync(join(projectRoot, f)));
214
+ if (smokeScript && composeFile) {
215
+ // Compose is brought up by the deploy-dev runner; the smoke script is the
216
+ // health check; teardown always tears the stack down (see deploy-dev-gate).
217
+ return {
218
+ id: 'deploy:dev:compose',
219
+ name: `Dev deploy + smoke (compose up → npm run ${smokeScript})`,
220
+ command: 'npm',
221
+ args: ['run', smokeScript],
222
+ required: true,
223
+ timeoutMs: deployTimeout,
224
+ tier: 'deploy-dev',
225
+ teardown: { command: 'docker', args: ['compose', 'down', '-v'], timeoutMs: 30_000 },
226
+ };
227
+ }
228
+ if (smokeScript) {
229
+ // Smoke check with no compose — the runner starts `npm start` (if present)
230
+ // in the background, runs smoke, then kills it.
231
+ return {
232
+ id: 'deploy:dev:smoke',
233
+ name: `Dev deploy + smoke (npm run ${smokeScript})`,
234
+ command: 'npm',
235
+ args: ['run', smokeScript],
236
+ required: true,
237
+ timeoutMs: deployTimeout,
238
+ tier: 'deploy-dev',
239
+ };
240
+ }
241
+ return null;
242
+ }
101
243
  /**
102
244
  * Detect real gates in non-npm projects: a Makefile test/check/build target,
103
245
  * a pytest suite, or a conventional shell test script. Ordered cheap→expensive.
@@ -166,7 +308,7 @@ export function detectNonNpmRungs(projectRoot, timeoutMs = DEFAULT_TIMEOUT_MS) {
166
308
  }
167
309
  return rungs;
168
310
  }
169
- function truncateTail(text, maxChars) {
311
+ export function truncateTail(text, maxChars) {
170
312
  const trimmed = text.trim();
171
313
  if (trimmed.length <= maxChars)
172
314
  return trimmed;
@@ -283,4 +425,84 @@ export function runLadder(rungs, projectRoot, options = {}) {
283
425
  feedback: formatFeedback(results, rungs),
284
426
  };
285
427
  }
428
+ const skippedRung = (rung) => ({
429
+ id: rung.id,
430
+ name: rung.name,
431
+ passed: false,
432
+ skipped: true,
433
+ exitCode: null,
434
+ durationMs: 0,
435
+ outputTail: '',
436
+ });
437
+ /**
438
+ * Cheap-first tiered ladder. Runs the cheapest tier first and only promotes to
439
+ * the next, more expensive tier once the prior tier's required rungs pass. The
440
+ * result is aggregated into a single {@link LadderResult} so the convergence
441
+ * loop's per-turn contract (one ladder result, one feedback string) is
442
+ * unchanged — tier failures flow back through the existing feedback channel.
443
+ */
444
+ export async function runTieredLadder(rungs, projectRoot, options = {}) {
445
+ const maxTier = options.maxTier ?? 'deploy-dev';
446
+ const maxIdx = TIER_ORDER.indexOf(maxTier);
447
+ const runner = options.runner ?? runLadder;
448
+ const tailChars = options.outputTailChars ?? DEFAULT_TAIL_CHARS;
449
+ const innerOptions = {
450
+ failFast: options.failFast,
451
+ outputTailChars: tailChars,
452
+ timeoutMs: options.timeoutMs,
453
+ };
454
+ // Group rungs by tier, preserving insertion order within a tier.
455
+ const byTier = new Map();
456
+ for (const rung of rungs) {
457
+ const t = tierOf(rung);
458
+ const list = byTier.get(t) ?? [];
459
+ list.push(rung);
460
+ byTier.set(t, list);
461
+ }
462
+ const results = [];
463
+ // Rungs that were eligible to run (tier <= maxTier); only these gate delivery.
464
+ const inScope = [];
465
+ let promotionStopped = false;
466
+ for (const tier of TIER_ORDER) {
467
+ const tierRungs = byTier.get(tier);
468
+ if (!tierRungs || tierRungs.length === 0)
469
+ continue;
470
+ const eligible = TIER_ORDER.indexOf(tier) <= maxIdx;
471
+ if (!eligible) {
472
+ // Above maxTier — verified remotely, never run locally.
473
+ for (const rung of tierRungs)
474
+ results.push(skippedRung(rung));
475
+ continue;
476
+ }
477
+ inScope.push(...tierRungs);
478
+ if (promotionStopped) {
479
+ // A cheaper tier failed — don't pay for this tier.
480
+ for (const rung of tierRungs)
481
+ results.push(skippedRung(rung));
482
+ continue;
483
+ }
484
+ const useRunner = tier === 'deploy-dev' && options.deployDevRunner ? options.deployDevRunner : runner;
485
+ const tierResult = await useRunner(tierRungs, projectRoot, innerOptions);
486
+ results.push(...tierResult.results);
487
+ if (!tierResult.passed)
488
+ promotionStopped = true;
489
+ }
490
+ // Aggregate — only in-scope rungs gate delivery (remote tiers are skipped).
491
+ // Score is computed over in-scope rungs ONLY: out-of-scope rungs (above
492
+ // maxTier) are skipped and must not dilute the convergence signal that feeds
493
+ // printProgress / bestScore / --keep-best.
494
+ const inScopeIds = new Set(inScope.map((r) => r.id));
495
+ const inScopeResults = results.filter((r) => inScopeIds.has(r.id));
496
+ const passedCount = inScopeResults.filter((r) => r.passed).length;
497
+ const score = inScopeResults.length > 0 ? passedCount / inScopeResults.length : 1;
498
+ const requiredInScope = inScope.filter((r) => r.required);
499
+ const requiredPassed = requiredInScope.filter((rung) => results.some((r) => r.id === rung.id && r.passed)).length;
500
+ const passed = requiredPassed === requiredInScope.length;
501
+ return {
502
+ passed,
503
+ score,
504
+ results,
505
+ feedback: formatFeedback(results, inScope.length > 0 ? inScope : rungs),
506
+ };
507
+ }
286
508
  //# sourceMappingURL=verifier-ladder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifier-ladder.js","sourceRoot":"","sources":["../../src/delivery/verifier-ladder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verifier-ladder.js","sourceRoot":"","sources":["../../src/delivery/verifier-ladder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Self-update: keep the globally-installed UAP CLI at the latest published npm
3
+ * version. Wired into `uap setup` so every project setup automatically ensures
4
+ * the CLI is current (the published OSS package), non-fatally.
5
+ *
6
+ * Safe by construction:
7
+ * - only updates when a NEWER version is published (semver compare);
8
+ * - only when running as an installed package (a source checkout is left
9
+ * alone so dev builds aren't clobbered);
10
+ * - opt-out via `--no-self-update` / UAP_NO_SELF_UPDATE=1;
11
+ * - every failure path degrades to "skipped" — setup never fails on this.
12
+ */
13
+ export declare const UAP_PACKAGE_NAME = "@miller-tech/uap";
14
+ /**
15
+ * Compare two semver strings (pre-release suffixes ignored). Returns -1 when
16
+ * a < b, 0 when equal, 1 when a > b.
17
+ */
18
+ export declare function compareSemver(a: string, b: string): number;
19
+ /** Read this CLI's own version from its package.json. */
20
+ export declare function getCurrentCliVersion(): string;
21
+ /** Latest version published to the npm registry, or null when unreachable. */
22
+ export declare function getLatestPublishedVersion(pkg?: string, timeoutMs?: number): string | null;
23
+ /**
24
+ * True when this module is the GLOBALLY-installed CLI eligible for self-update:
25
+ * it lives under a node_modules/@miller-tech/uap tree (not a source checkout)
26
+ * AND is not rooted inside the project being set up (so a local/monorepo
27
+ * dependency copy is never clobbered by a `npm install -g`).
28
+ */
29
+ export declare function isInstalledPackage(): boolean;
30
+ export interface SelfUpdateResult {
31
+ /** Whether the registry was actually queried. */
32
+ checked: boolean;
33
+ current: string;
34
+ latest: string | null;
35
+ updated: boolean;
36
+ skipped: boolean;
37
+ reason?: string;
38
+ }
39
+ export interface SelfUpdateOptions {
40
+ /** Master switch; false (or UAP_NO_SELF_UPDATE=1) disables the check. */
41
+ enabled?: boolean;
42
+ packageName?: string;
43
+ current?: string;
44
+ isInstalled?: () => boolean;
45
+ fetchLatest?: () => string | null;
46
+ install?: (versionedPkg: string) => void;
47
+ }
48
+ /**
49
+ * Ensure the global UAP CLI is at the latest published version, updating it when
50
+ * behind. Pure-ish and fully injectable for tests; never throws.
51
+ */
52
+ export declare function selfUpdateCli(options?: SelfUpdateOptions): SelfUpdateResult;
53
+ //# sourceMappingURL=self-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-update.d.ts","sourceRoot":"","sources":["../../src/utils/self-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB1D;AAED,yDAAyD;AACzD,wBAAgB,oBAAoB,IAAI,MAAM,CAK7C;AAED,8EAA8E;AAC9E,wBAAgB,yBAAyB,CACvC,GAAG,GAAE,MAAyB,EAC9B,SAAS,SAAQ,GAChB,MAAM,GAAG,IAAI,CAcf;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAI5C;AAMD,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAyD/E"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Self-update: keep the globally-installed UAP CLI at the latest published npm
3
+ * version. Wired into `uap setup` so every project setup automatically ensures
4
+ * the CLI is current (the published OSS package), non-fatally.
5
+ *
6
+ * Safe by construction:
7
+ * - only updates when a NEWER version is published (semver compare);
8
+ * - only when running as an installed package (a source checkout is left
9
+ * alone so dev builds aren't clobbered);
10
+ * - opt-out via `--no-self-update` / UAP_NO_SELF_UPDATE=1;
11
+ * - every failure path degrades to "skipped" — setup never fails on this.
12
+ */
13
+ import { execFileSync } from 'child_process';
14
+ import { readFileSync } from 'fs';
15
+ import { dirname, join, resolve } from 'path';
16
+ import { fileURLToPath } from 'url';
17
+ export const UAP_PACKAGE_NAME = '@miller-tech/uap';
18
+ /**
19
+ * Compare two semver strings (pre-release suffixes ignored). Returns -1 when
20
+ * a < b, 0 when equal, 1 when a > b.
21
+ */
22
+ export function compareSemver(a, b) {
23
+ const parse = (v) => v
24
+ .trim()
25
+ .replace(/^v/, '')
26
+ .split('-')[0]
27
+ .split('.')
28
+ .map((n) => Number.parseInt(n, 10) || 0);
29
+ const pa = parse(a);
30
+ const pb = parse(b);
31
+ for (let i = 0; i < 3; i++) {
32
+ const x = pa[i] ?? 0;
33
+ const y = pb[i] ?? 0;
34
+ if (x !== y)
35
+ return x < y ? -1 : 1;
36
+ }
37
+ return 0;
38
+ }
39
+ /** Read this CLI's own version from its package.json. */
40
+ export function getCurrentCliVersion() {
41
+ const here = dirname(fileURLToPath(import.meta.url));
42
+ // dist/utils/self-update.js → ../../package.json
43
+ const pkg = JSON.parse(readFileSync(join(here, '../../package.json'), 'utf-8'));
44
+ return pkg.version;
45
+ }
46
+ /** Latest version published to the npm registry, or null when unreachable. */
47
+ export function getLatestPublishedVersion(pkg = UAP_PACKAGE_NAME, timeoutMs = 8_000) {
48
+ try {
49
+ const out = execFileSync('npm', ['view', pkg, 'version'], {
50
+ encoding: 'utf-8',
51
+ timeout: timeoutMs,
52
+ stdio: ['ignore', 'pipe', 'ignore'],
53
+ });
54
+ const v = out.trim();
55
+ // Fully anchored: reject anything but a clean semver token so a malformed
56
+ // registry response can never flow into the install spec.
57
+ return /^v?\d+\.\d+\.\d+(?:-[0-9A-Za-z.]+)?$/.test(v) ? v : null;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ /**
64
+ * True when this module is the GLOBALLY-installed CLI eligible for self-update:
65
+ * it lives under a node_modules/@miller-tech/uap tree (not a source checkout)
66
+ * AND is not rooted inside the project being set up (so a local/monorepo
67
+ * dependency copy is never clobbered by a `npm install -g`).
68
+ */
69
+ export function isInstalledPackage() {
70
+ const here = dirname(fileURLToPath(import.meta.url));
71
+ if (!here.includes(join('node_modules', '@miller-tech', 'uap')))
72
+ return false;
73
+ return !here.startsWith(resolve(process.cwd()));
74
+ }
75
+ function defaultInstall(versionedPkg) {
76
+ execFileSync('npm', ['install', '-g', versionedPkg], { stdio: 'ignore', timeout: 180_000 });
77
+ }
78
+ /**
79
+ * Ensure the global UAP CLI is at the latest published version, updating it when
80
+ * behind. Pure-ish and fully injectable for tests; never throws.
81
+ */
82
+ export function selfUpdateCli(options = {}) {
83
+ const pkg = options.packageName ?? UAP_PACKAGE_NAME;
84
+ // Resolving the current version reads package.json — guard it so the whole
85
+ // function honors its "never throws / setup never fails on this" contract.
86
+ let current;
87
+ try {
88
+ current = options.current ?? getCurrentCliVersion();
89
+ }
90
+ catch {
91
+ return { checked: false, current: 'unknown', latest: null, updated: false, skipped: true, reason: 'could not read current version' };
92
+ }
93
+ try {
94
+ const enabled = options.enabled !== false && process.env.UAP_NO_SELF_UPDATE !== '1';
95
+ if (!enabled) {
96
+ return { checked: false, current, latest: null, updated: false, skipped: true, reason: 'self-update disabled' };
97
+ }
98
+ // Skip in CI unless explicitly forced: auto-mutating the global toolchain
99
+ // mid-pipeline breaks reproducibility (pin versions in IaC instead).
100
+ if (process.env.CI && process.env.UAP_SELF_UPDATE !== '1') {
101
+ return { checked: false, current, latest: null, updated: false, skipped: true, reason: 'CI environment — skipping (set UAP_SELF_UPDATE=1 to force)' };
102
+ }
103
+ const installed = (options.isInstalled ?? isInstalledPackage)();
104
+ if (!installed) {
105
+ return {
106
+ checked: false,
107
+ current,
108
+ latest: null,
109
+ updated: false,
110
+ skipped: true,
111
+ reason: 'running from a source checkout — not self-updating',
112
+ };
113
+ }
114
+ const latest = (options.fetchLatest ?? (() => getLatestPublishedVersion(pkg)))();
115
+ if (!latest) {
116
+ return { checked: true, current, latest: null, updated: false, skipped: true, reason: 'npm registry unreachable' };
117
+ }
118
+ if (compareSemver(current, latest) >= 0) {
119
+ return { checked: true, current, latest, updated: false, skipped: false, reason: 'already up to date' };
120
+ }
121
+ (options.install ?? defaultInstall)(`${pkg}@${latest}`);
122
+ return { checked: true, current, latest, updated: true, skipped: false };
123
+ }
124
+ catch (err) {
125
+ return {
126
+ checked: true,
127
+ current,
128
+ latest: null,
129
+ updated: false,
130
+ skipped: true,
131
+ reason: `update failed: ${String(err).slice(0, 160)}`,
132
+ };
133
+ }
134
+ }
135
+ //# sourceMappingURL=self-update.js.map