@microwiseai/snapshot 0.5.2 → 0.6.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 (134) hide show
  1. package/dist/commands/doctor.d.ts +2 -0
  2. package/dist/commands/doctor.d.ts.map +1 -0
  3. package/dist/commands/doctor.js +37 -0
  4. package/dist/commands/doctor.js.map +1 -0
  5. package/dist/commands/install.d.ts.map +1 -1
  6. package/dist/commands/install.js +68 -206
  7. package/dist/commands/install.js.map +1 -1
  8. package/dist/commands/publish.d.ts +0 -4
  9. package/dist/commands/publish.d.ts.map +1 -1
  10. package/dist/commands/publish.js +1 -35
  11. package/dist/commands/publish.js.map +1 -1
  12. package/dist/commands/setup.d.ts +5 -0
  13. package/dist/commands/setup.d.ts.map +1 -0
  14. package/dist/commands/setup.js +52 -0
  15. package/dist/commands/setup.js.map +1 -0
  16. package/dist/index.js +18 -27
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/config.js +1 -1
  19. package/dist/lib/config.js.map +1 -1
  20. package/dist/lib/gitlab.d.ts.map +1 -1
  21. package/dist/lib/gitlab.js +8 -6
  22. package/dist/lib/gitlab.js.map +1 -1
  23. package/dist/lib/prerequisites.d.ts +33 -0
  24. package/dist/lib/prerequisites.d.ts.map +1 -0
  25. package/dist/lib/prerequisites.js +123 -0
  26. package/dist/lib/prerequisites.js.map +1 -0
  27. package/dist/lib/transitive-resolver.d.ts +0 -121
  28. package/dist/lib/transitive-resolver.d.ts.map +1 -1
  29. package/dist/lib/transitive-resolver.js +0 -190
  30. package/dist/lib/transitive-resolver.js.map +1 -1
  31. package/package.json +3 -20
  32. package/dist/commands/clone-all.d.ts +0 -21
  33. package/dist/commands/clone-all.d.ts.map +0 -1
  34. package/dist/commands/clone-all.js +0 -57
  35. package/dist/commands/clone-all.js.map +0 -1
  36. package/dist/commands/preflight.d.ts +0 -31
  37. package/dist/commands/preflight.d.ts.map +0 -1
  38. package/dist/commands/preflight.js +0 -83
  39. package/dist/commands/preflight.js.map +0 -1
  40. package/dist/lib/distkit-closure-bridge.d.ts +0 -102
  41. package/dist/lib/distkit-closure-bridge.d.ts.map +0 -1
  42. package/dist/lib/distkit-closure-bridge.js +0 -177
  43. package/dist/lib/distkit-closure-bridge.js.map +0 -1
  44. package/dist/lib/distkit-closure-parity.d.ts +0 -110
  45. package/dist/lib/distkit-closure-parity.d.ts.map +0 -1
  46. package/dist/lib/distkit-closure-parity.js +0 -134
  47. package/dist/lib/distkit-closure-parity.js.map +0 -1
  48. package/dist/lib/distkit-routing-port.d.ts +0 -37
  49. package/dist/lib/distkit-routing-port.d.ts.map +0 -1
  50. package/dist/lib/distkit-routing-port.js +0 -72
  51. package/dist/lib/distkit-routing-port.js.map +0 -1
  52. package/dist/lib/install-timeline.d.ts +0 -81
  53. package/dist/lib/install-timeline.d.ts.map +0 -1
  54. package/dist/lib/install-timeline.js +0 -243
  55. package/dist/lib/install-timeline.js.map +0 -1
  56. package/dist/lib/preflight-adapter.d.ts +0 -52
  57. package/dist/lib/preflight-adapter.d.ts.map +0 -1
  58. package/dist/lib/preflight-adapter.js +0 -224
  59. package/dist/lib/preflight-adapter.js.map +0 -1
  60. package/node_modules/@gitdot/clone-lib/README.md +0 -117
  61. package/node_modules/@gitdot/clone-lib/dist/bin/gitdot-resolve.d.ts +0 -9
  62. package/node_modules/@gitdot/clone-lib/dist/bin/gitdot-resolve.d.ts.map +0 -1
  63. package/node_modules/@gitdot/clone-lib/dist/bin/gitdot-resolve.js +0 -154
  64. package/node_modules/@gitdot/clone-lib/dist/bin/gitdot-resolve.js.map +0 -1
  65. package/node_modules/@gitdot/clone-lib/dist/clone.d.ts +0 -21
  66. package/node_modules/@gitdot/clone-lib/dist/clone.d.ts.map +0 -1
  67. package/node_modules/@gitdot/clone-lib/dist/clone.js +0 -228
  68. package/node_modules/@gitdot/clone-lib/dist/clone.js.map +0 -1
  69. package/node_modules/@gitdot/clone-lib/dist/dotpath.d.ts +0 -10
  70. package/node_modules/@gitdot/clone-lib/dist/dotpath.d.ts.map +0 -1
  71. package/node_modules/@gitdot/clone-lib/dist/dotpath.js +0 -27
  72. package/node_modules/@gitdot/clone-lib/dist/dotpath.js.map +0 -1
  73. package/node_modules/@gitdot/clone-lib/dist/git.d.ts +0 -23
  74. package/node_modules/@gitdot/clone-lib/dist/git.d.ts.map +0 -1
  75. package/node_modules/@gitdot/clone-lib/dist/git.js +0 -134
  76. package/node_modules/@gitdot/clone-lib/dist/git.js.map +0 -1
  77. package/node_modules/@gitdot/clone-lib/dist/index.d.ts +0 -17
  78. package/node_modules/@gitdot/clone-lib/dist/index.d.ts.map +0 -1
  79. package/node_modules/@gitdot/clone-lib/dist/index.js +0 -35
  80. package/node_modules/@gitdot/clone-lib/dist/index.js.map +0 -1
  81. package/node_modules/@gitdot/clone-lib/dist/lock.d.ts +0 -24
  82. package/node_modules/@gitdot/clone-lib/dist/lock.d.ts.map +0 -1
  83. package/node_modules/@gitdot/clone-lib/dist/lock.js +0 -97
  84. package/node_modules/@gitdot/clone-lib/dist/lock.js.map +0 -1
  85. package/node_modules/@gitdot/clone-lib/dist/resolve/gitlab.d.ts +0 -15
  86. package/node_modules/@gitdot/clone-lib/dist/resolve/gitlab.d.ts.map +0 -1
  87. package/node_modules/@gitdot/clone-lib/dist/resolve/gitlab.js +0 -124
  88. package/node_modules/@gitdot/clone-lib/dist/resolve/gitlab.js.map +0 -1
  89. package/node_modules/@gitdot/clone-lib/dist/resolve/index.d.ts +0 -12
  90. package/node_modules/@gitdot/clone-lib/dist/resolve/index.d.ts.map +0 -1
  91. package/node_modules/@gitdot/clone-lib/dist/resolve/index.js +0 -31
  92. package/node_modules/@gitdot/clone-lib/dist/resolve/index.js.map +0 -1
  93. package/node_modules/@gitdot/clone-lib/dist/resolve/manifest.d.ts +0 -32
  94. package/node_modules/@gitdot/clone-lib/dist/resolve/manifest.d.ts.map +0 -1
  95. package/node_modules/@gitdot/clone-lib/dist/resolve/manifest.js +0 -159
  96. package/node_modules/@gitdot/clone-lib/dist/resolve/manifest.js.map +0 -1
  97. package/node_modules/@gitdot/clone-lib/dist/resolve/member.d.ts +0 -44
  98. package/node_modules/@gitdot/clone-lib/dist/resolve/member.d.ts.map +0 -1
  99. package/node_modules/@gitdot/clone-lib/dist/resolve/member.js +0 -163
  100. package/node_modules/@gitdot/clone-lib/dist/resolve/member.js.map +0 -1
  101. package/node_modules/@gitdot/clone-lib/dist/resolve/resolve.d.ts +0 -18
  102. package/node_modules/@gitdot/clone-lib/dist/resolve/resolve.d.ts.map +0 -1
  103. package/node_modules/@gitdot/clone-lib/dist/resolve/resolve.js +0 -155
  104. package/node_modules/@gitdot/clone-lib/dist/resolve/resolve.js.map +0 -1
  105. package/node_modules/@gitdot/clone-lib/dist/types.d.ts +0 -225
  106. package/node_modules/@gitdot/clone-lib/dist/types.d.ts.map +0 -1
  107. package/node_modules/@gitdot/clone-lib/dist/types.js +0 -9
  108. package/node_modules/@gitdot/clone-lib/dist/types.js.map +0 -1
  109. package/node_modules/@gitdot/clone-lib/package.json +0 -53
  110. package/node_modules/@microwiseai/install-preflight/dist/index.d.ts +0 -27
  111. package/node_modules/@microwiseai/install-preflight/dist/index.d.ts.map +0 -1
  112. package/node_modules/@microwiseai/install-preflight/dist/index.js +0 -26
  113. package/node_modules/@microwiseai/install-preflight/dist/index.js.map +0 -1
  114. package/node_modules/@microwiseai/install-preflight/dist/policy.d.ts +0 -42
  115. package/node_modules/@microwiseai/install-preflight/dist/policy.d.ts.map +0 -1
  116. package/node_modules/@microwiseai/install-preflight/dist/policy.js +0 -79
  117. package/node_modules/@microwiseai/install-preflight/dist/policy.js.map +0 -1
  118. package/node_modules/@microwiseai/install-preflight/dist/preflight.d.ts +0 -18
  119. package/node_modules/@microwiseai/install-preflight/dist/preflight.d.ts.map +0 -1
  120. package/node_modules/@microwiseai/install-preflight/dist/preflight.js +0 -0
  121. package/node_modules/@microwiseai/install-preflight/dist/preflight.js.map +0 -1
  122. package/node_modules/@microwiseai/install-preflight/dist/resolvers.d.ts +0 -26
  123. package/node_modules/@microwiseai/install-preflight/dist/resolvers.d.ts.map +0 -1
  124. package/node_modules/@microwiseai/install-preflight/dist/resolvers.js +0 -63
  125. package/node_modules/@microwiseai/install-preflight/dist/resolvers.js.map +0 -1
  126. package/node_modules/@microwiseai/install-preflight/dist/semver.d.ts +0 -45
  127. package/node_modules/@microwiseai/install-preflight/dist/semver.d.ts.map +0 -1
  128. package/node_modules/@microwiseai/install-preflight/dist/semver.js +0 -195
  129. package/node_modules/@microwiseai/install-preflight/dist/semver.js.map +0 -1
  130. package/node_modules/@microwiseai/install-preflight/dist/types.d.ts +0 -136
  131. package/node_modules/@microwiseai/install-preflight/dist/types.d.ts.map +0 -1
  132. package/node_modules/@microwiseai/install-preflight/dist/types.js +0 -11
  133. package/node_modules/@microwiseai/install-preflight/dist/types.js.map +0 -1
  134. package/node_modules/@microwiseai/install-preflight/package.json +0 -49
@@ -1,243 +0,0 @@
1
- /**
2
- * install-timeline.ts — Install timeline instrumentation (investigation only).
3
- *
4
- * Purpose: measure WHY a snapshot install is slow, from the inside, without
5
- * changing any install behavior. Purely additive: when the opt-in env flag is
6
- * unset the whole thing is a no-op with negligible overhead — every `start()`
7
- * returns one shared no-op handle and `finalize()` returns immediately.
8
- *
9
- * Opt-in: SNAPSHOT_INSTALL_TIMELINE ∈ {'1','true'} (case-insensitive).
10
- *
11
- * Output when enabled:
12
- * (a) console phase-summary table with relative [+Xs] offsets, per-phase
13
- * durations, a `◄ dominant` marker on the largest phase, and per-command /
14
- * per-package rows indented under their phase, then a total line.
15
- * (b) JSONL file at ~/.ist/logs/snapshot-install-timeline/<ISO>.jsonl —
16
- * one line per event + a trailing summary line, for cross-run diffing.
17
- *
18
- * Security (security-ssot-principle): tokens must NEVER be written. Command
19
- * strings and meta are sanitized — IST_SESSION_TOKEN, authToken, _authToken=,
20
- * and Bearer values are replaced with `***` before any record/print/write.
21
- */
22
- import { performance } from 'node:perf_hooks';
23
- import { homedir } from 'node:os';
24
- import { join } from 'node:path';
25
- import { mkdirSync, writeFileSync } from 'node:fs';
26
- const ENABLE_VALUES = new Set(['1', 'true']);
27
- /** Shared no-op handle — one allocation, reused for every disabled span. */
28
- const NOOP_SPAN = { end() { } };
29
- // ----------------------------------------------------------------------------
30
- // Sanitization (security-ssot-principle): never emit a real token.
31
- // ----------------------------------------------------------------------------
32
- // Keys whose VALUE is credential material and must be redacted wholesale.
33
- // Deliberately NOT a bare "auth" match: `authType` ('proxy-token'|'anonymous')
34
- // is a useful, non-secret diagnostic and must survive. `authToken` still matches
35
- // via "token".
36
- const SUSPICIOUS_KEY = /(token|secret|password|bearer|credential|apikey)/i;
37
- /** Redact token material from an arbitrary string. */
38
- export function sanitizeString(input, env) {
39
- let out = input;
40
- // key=value / key: value forms for known token-bearing keys.
41
- out = out.replace(/(_authToken\s*=\s*)[^\s&'"]+/gi, '$1***');
42
- out = out.replace(/(authToken["'\s]*[:=]\s*["']?)[^\s,'"&}]+/gi, '$1***');
43
- out = out.replace(/(IST_SESSION_TOKEN["'\s]*[:=]\s*["']?)[^\s,'"&}]+/gi, '$1***');
44
- // Bearer <token>
45
- out = out.replace(/(Bearer\s+)[A-Za-z0-9._\-+/=]+/gi, '$1***');
46
- // Belt-and-suspenders: scrub any literal occurrence of the actual token value
47
- // that may have leaked into a command string via env interpolation.
48
- const literal = (env ?? {})['IST_SESSION_TOKEN'];
49
- if (literal && literal.length >= 8) {
50
- out = out.split(literal).join('***');
51
- }
52
- return out;
53
- }
54
- /** Deep-sanitize a meta object: scrub string values and redact suspicious keys. */
55
- export function sanitizeMeta(meta, env) {
56
- if (!meta)
57
- return undefined;
58
- return sanitizeValue(meta, env);
59
- }
60
- function sanitizeValue(value, env) {
61
- if (typeof value === 'string')
62
- return sanitizeString(value, env);
63
- if (Array.isArray(value))
64
- return value.map((v) => sanitizeValue(v, env));
65
- if (value && typeof value === 'object') {
66
- const out = {};
67
- for (const [k, v] of Object.entries(value)) {
68
- if (SUSPICIOUS_KEY.test(k) && typeof v === 'string') {
69
- out[k] = '***';
70
- }
71
- else {
72
- out[k] = sanitizeValue(v, env);
73
- }
74
- }
75
- return out;
76
- }
77
- return value;
78
- }
79
- class NoopTimeline {
80
- enabled = false;
81
- start() {
82
- return NOOP_SPAN;
83
- }
84
- finalize() { }
85
- getEvents() {
86
- return [];
87
- }
88
- }
89
- class ActiveTimeline {
90
- enabled = true;
91
- now;
92
- wallNow;
93
- env;
94
- logDir;
95
- logger;
96
- mkdir;
97
- writeFile;
98
- t0;
99
- wallT0;
100
- events = [];
101
- /** Stack of currently-open phase labels (for parent association). */
102
- phaseStack = [];
103
- finalized = false;
104
- constructor(opts) {
105
- this.now = opts.now ?? (() => performance.now());
106
- this.wallNow = opts.wallNow ?? (() => Date.now());
107
- this.env = opts.env ?? process.env;
108
- this.logDir =
109
- opts.logDir ?? join(homedir(), '.ist', 'logs', 'snapshot-install-timeline');
110
- this.logger = opts.logger ?? ((line) => console.log(line));
111
- this.mkdir = opts.mkdir ?? ((dir) => mkdirSync(dir, { recursive: true }));
112
- this.writeFile =
113
- opts.writeFile ?? ((path, content) => writeFileSync(path, content));
114
- this.t0 = this.now();
115
- this.wallT0 = this.wallNow();
116
- }
117
- start(label, opts = {}) {
118
- const category = opts.category ?? 'phase';
119
- const startMono = this.now();
120
- const startOffsetMs = startMono - this.t0;
121
- const wallStartIso = new Date(this.wallT0 + startOffsetMs).toISOString();
122
- // Parent = innermost currently-open phase (commands/packages nest under it).
123
- const parentLabel = category === 'phase' ? undefined : this.phaseStack[this.phaseStack.length - 1];
124
- // Sanitize the label too — callers pass raw command strings as labels
125
- // (e.g. runCommand), which may embed token material.
126
- const safeLabel = sanitizeString(label, this.env);
127
- const event = {
128
- label: safeLabel,
129
- category,
130
- startOffsetMs,
131
- durationMs: 0,
132
- wallStartIso,
133
- parentLabel,
134
- meta: sanitizeMeta(opts.meta, this.env),
135
- };
136
- this.events.push(event);
137
- if (category === 'phase') {
138
- this.phaseStack.push(label);
139
- }
140
- let ended = false;
141
- return {
142
- end: (endMeta) => {
143
- if (ended)
144
- return;
145
- ended = true;
146
- event.durationMs = this.now() - startMono;
147
- if (endMeta) {
148
- const clean = sanitizeMeta(endMeta, this.env);
149
- event.meta = { ...(event.meta ?? {}), ...(clean ?? {}) };
150
- }
151
- if (category === 'phase') {
152
- // Pop this phase if it is on top; tolerate out-of-order ends.
153
- const idx = this.phaseStack.lastIndexOf(label);
154
- if (idx !== -1)
155
- this.phaseStack.splice(idx, 1);
156
- }
157
- },
158
- };
159
- }
160
- getEvents() {
161
- return this.events;
162
- }
163
- finalize() {
164
- if (this.finalized)
165
- return;
166
- this.finalized = true;
167
- const phases = this.events.filter((e) => e.category === 'phase');
168
- const totalMs = phases.reduce((sum, p) => sum + p.durationMs, 0);
169
- const dominant = phases.reduce((max, p) => (max === null || p.durationMs > max.durationMs ? p : max), null);
170
- this.printConsole(phases, dominant, totalMs);
171
- this.writeJsonl(dominant, totalMs);
172
- }
173
- printConsole(phases, dominant, totalMs) {
174
- const log = this.logger;
175
- log('');
176
- log('━━━ Install Timeline (SNAPSHOT_INSTALL_TIMELINE) ━━━');
177
- // Top-level = phases in start order, plus any orphan (parentless) non-phase.
178
- const orphans = this.events.filter((e) => e.category !== 'phase' && !e.parentLabel);
179
- const roots = [...phases, ...orphans].sort((a, b) => a.startOffsetMs - b.startOffsetMs);
180
- const labelWidth = Math.max(20, ...this.events.map((e) => e.label.length + (e.category === 'phase' ? 0 : 2)));
181
- for (const root of roots) {
182
- const offset = `[+${(root.startOffsetMs / 1000).toFixed(1)}s]`;
183
- const dur = `${Math.round(root.durationMs)}ms`;
184
- const marker = dominant && root === dominant ? ' ◄ dominant' : '';
185
- log(`${offset} ${root.label.padEnd(labelWidth)} ${dur.padStart(8)}${marker}`);
186
- if (root.category === 'phase') {
187
- const children = this.events
188
- .filter((e) => e.parentLabel === root.label)
189
- .sort((a, b) => a.startOffsetMs - b.startOffsetMs);
190
- for (const child of children) {
191
- const cdur = `${Math.round(child.durationMs)}ms`;
192
- const tag = `${child.category}: ${child.label}`;
193
- log(` ${tag.padEnd(labelWidth)} ${cdur.padStart(8)}`);
194
- }
195
- }
196
- }
197
- log(` ${'total'.padEnd(labelWidth)} ${`${(totalMs / 1000).toFixed(1)}s`.padStart(8)}`);
198
- log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
199
- }
200
- writeJsonl(dominant, totalMs) {
201
- const wallStartIso = new Date(this.wallT0).toISOString();
202
- const fileName = `${wallStartIso.replace(/[:.]/g, '-')}.jsonl`;
203
- const filePath = join(this.logDir, fileName);
204
- const lines = [];
205
- for (const e of this.events) {
206
- lines.push(JSON.stringify({ kind: 'event', ...e }));
207
- }
208
- lines.push(JSON.stringify({
209
- kind: 'summary',
210
- wallStartIso,
211
- totalMs: Math.round(totalMs),
212
- eventCount: this.events.length,
213
- phaseCount: this.events.filter((e) => e.category === 'phase').length,
214
- dominantPhase: dominant?.label,
215
- dominantMs: dominant ? Math.round(dominant.durationMs) : undefined,
216
- }));
217
- try {
218
- this.mkdir(this.logDir);
219
- this.writeFile(filePath, lines.join('\n') + '\n');
220
- this.logger(`Timeline written: ${filePath}`);
221
- }
222
- catch (err) {
223
- // Investigation-only: never let logging failure affect the install.
224
- const msg = err instanceof Error ? err.message : String(err);
225
- this.logger(`Timeline: failed to write JSONL (${msg})`);
226
- }
227
- }
228
- }
229
- /**
230
- * Decide enablement from the opt-in env flag (unless explicitly overridden).
231
- */
232
- export function isTimelineEnabled(env = process.env) {
233
- const raw = env['SNAPSHOT_INSTALL_TIMELINE'];
234
- return raw !== undefined && ENABLE_VALUES.has(raw.trim().toLowerCase());
235
- }
236
- /**
237
- * Factory: returns an active timeline when opted-in, else a zero-overhead no-op.
238
- */
239
- export function createInstallTimeline(opts = {}) {
240
- const enabled = opts.enabled ?? isTimelineEnabled(opts.env ?? process.env);
241
- return enabled ? new ActiveTimeline(opts) : new NoopTimeline();
242
- }
243
- //# sourceMappingURL=install-timeline.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-timeline.js","sourceRoot":"","sources":["../../src/lib/install-timeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AA+CnD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7C,4EAA4E;AAC5E,MAAM,SAAS,GAAe,EAAE,GAAG,KAAI,CAAC,EAAE,CAAC;AAE3C,+EAA+E;AAC/E,mEAAmE;AACnE,+EAA+E;AAE/E,0EAA0E;AAC1E,+EAA+E;AAC/E,iFAAiF;AACjF,eAAe;AACf,MAAM,cAAc,GAAG,mDAAmD,CAAC;AAE3E,sDAAsD;AACtD,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,GAAwC;IACpF,IAAI,GAAG,GAAG,KAAK,CAAC;IAEhB,6DAA6D;IAC7D,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;IAC7D,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,6CAA6C,EAAE,OAAO,CAAC,CAAC;IAC1E,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,qDAAqD,EAAE,OAAO,CAAC,CAAC;IAClF,iBAAiB;IACjB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAC;IAE/D,8EAA8E;IAC9E,oEAAoE;IACpE,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACjD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACnC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAC1B,IAAyC,EACzC,GAAwC;IAExC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,aAAa,CAAC,IAAI,EAAE,GAAG,CAA4B,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,GAAwC;IAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YACtE,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACpD,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAcD,MAAM,YAAY;IACP,OAAO,GAAG,KAAK,CAAC;IACzB,KAAK;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,QAAQ,KAAU,CAAC;IACnB,SAAS;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,MAAM,cAAc;IACT,OAAO,GAAG,IAAI,CAAC;IAEP,GAAG,CAAe;IAClB,OAAO,CAAe;IACtB,GAAG,CAAqC;IACxC,MAAM,CAAS;IACf,MAAM,CAAyB;IAC/B,KAAK,CAAwB;IAC7B,SAAS,CAA0C;IAEnD,EAAE,CAAS;IACX,MAAM,CAAS;IACf,MAAM,GAAoB,EAAE,CAAC;IAC9C,qEAAqE;IACpD,UAAU,GAAa,EAAE,CAAC;IACnC,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,IAA4B;QACtC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QACnC,IAAI,CAAC,MAAM;YACT,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,SAAS;YACZ,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAY,EAAE,OAAe,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAEtF,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAa,EAAE,OAAqB,EAAE;QAC1C,MAAM,QAAQ,GAAqB,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QACzE,6EAA6E;QAC7E,MAAM,WAAW,GACf,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEjF,sEAAsE;QACtE,qDAAqD;QACrD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAElD,MAAM,KAAK,GAAkB;YAC3B,KAAK,EAAE,SAAS;YAChB,QAAQ;YACR,aAAa;YACb,UAAU,EAAE,CAAC;YACb,YAAY;YACZ,WAAW;YACX,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;SACxC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,OAAO;YACL,GAAG,EAAE,CAAC,OAAiC,EAAQ,EAAE;gBAC/C,IAAI,KAAK;oBAAE,OAAO;gBAClB,KAAK,GAAG,IAAI,CAAC;gBACb,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC1C,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC9C,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC3D,CAAC;gBACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,8DAA8D;oBAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBAC/C,IAAI,GAAG,KAAK,CAAC,CAAC;wBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EACrE,IAAI,CACL,CAAC;QAEF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAEO,YAAY,CAClB,MAAuB,EACvB,QAA8B,EAC9B,OAAe;QAEf,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,CAAC;QACR,GAAG,CAAC,sDAAsD,CAAC,CAAC;QAE5D,6EAA6E;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACpF,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC;QAExF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,EAAE,EACF,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC7E,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAC/C,MAAM,MAAM,GAAG,QAAQ,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;YAE9E,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM;qBACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,KAAK,CAAC;qBAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC;gBACrD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;oBAC7B,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;oBACjD,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChD,GAAG,CAAC,YAAY,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;QAED,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/F,GAAG,CAAC,uDAAuD,CAAC,CAAC;IAC/D,CAAC;IAEO,UAAU,CAAC,QAA8B,EAAE,OAAe;QAChE,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE7C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,IAAI,CACR,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,SAAS;YACf,YAAY;YACZ,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAC5B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC9B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM;YACpE,aAAa,EAAE,QAAQ,EAAE,KAAK;YAC9B,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;SACnE,CAAC,CACH,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,oEAAoE;YACpE,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,oCAAoC,GAAG,GAAG,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA0C,OAAO,CAAC,GAAG;IACrF,MAAM,GAAG,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC7C,OAAO,GAAG,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA+B,EAAE;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3E,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC;AACjE,CAAC"}
@@ -1,52 +0,0 @@
1
- /**
2
- * Snapshot ↔ install-preflight adapter (thin).
3
- *
4
- * Maps a snapshot.json into the registry-agnostic preflight engine's inputs and
5
- * runs the gate. The engine (@microwiseai/install-preflight) knows nothing about
6
- * snapshots; all snapshot-specific knowledge lives here:
7
- *
8
- * • install groups (npm-proxy / glpkg / skit) + legacy packages/skits → channels
9
- * + package requests, all probed ANONYMOUSLY (reproduces a first-time
10
- * end-user with no token).
11
- * • transitive closure discovery: uses the publisher's token to expand npm
12
- * deps via the proxy, then hands the discovered nodes back to the engine to
13
- * probe anonymously — so a private transitive dep (401 for end-users) is
14
- * caught even though the publisher can see it.
15
- * • [B] the snapshot's OWN version must be stable when promoted to `latest`.
16
- *
17
- * See architecture/decisions — this is the blocking preflight gate wired into
18
- * `snapshot publish` and the `snapshot preflight` command.
19
- */
20
- import { formatReport, createNpmPackumentResolver, type PreflightInput, type PreflightReport, type Resolver } from '@microwiseai/install-preflight';
21
- import type { Snapshot } from './types.js';
22
- export interface SnapshotPreflightOptions {
23
- /** Attempt transitive-closure discovery (needs a token). Default: true. */
24
- includeTransitive?: boolean;
25
- /** dist-tag this publish targets (default 'latest'). */
26
- distTag?: string;
27
- /** Verbose progress logging via the provided sink. */
28
- log?: (msg: string) => void;
29
- /** Override the engine's network resolver (tests / custom lanes). */
30
- resolver?: Resolver;
31
- }
32
- export interface SnapshotPreflightResult {
33
- report: PreflightReport;
34
- /** Non-fatal warnings (e.g. transitive discovery skipped). Surfaced, never silent. */
35
- warnings: string[];
36
- }
37
- /**
38
- * Build the full engine input for a snapshot: anonymous channels + direct pins
39
- * (+ discovered transitive closure). Exposed for testing/other callers.
40
- */
41
- export declare function buildSnapshotPreflightInput(snapshot: Snapshot, options?: SnapshotPreflightOptions): Promise<{
42
- input: PreflightInput;
43
- warnings: string[];
44
- }>;
45
- /**
46
- * Run the blocking preflight gate for a snapshot. Combines:
47
- * [A] anonymous resolvability of the whole closure (engine), and
48
- * [B] the snapshot's own version must be stable when promoted to `latest`.
49
- */
50
- export declare function runSnapshotPreflight(snapshot: Snapshot, options?: SnapshotPreflightOptions): Promise<SnapshotPreflightResult>;
51
- export { formatReport, createNpmPackumentResolver };
52
- //# sourceMappingURL=preflight-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preflight-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/preflight-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAEL,YAAY,EACZ,0BAA0B,EAE1B,KAAK,cAAc,EACnB,KAAK,eAAe,EAIpB,KAAK,QAAQ,EACd,MAAM,gCAAgC,CAAC;AAIxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C,MAAM,WAAW,wBAAwB;IACvC,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,eAAe,CAAC;IACxB,sFAAsF;IACtF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA2KD;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqBxD;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAsBlC;AAED,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,CAAC"}
@@ -1,224 +0,0 @@
1
- /**
2
- * Snapshot ↔ install-preflight adapter (thin).
3
- *
4
- * Maps a snapshot.json into the registry-agnostic preflight engine's inputs and
5
- * runs the gate. The engine (@microwiseai/install-preflight) knows nothing about
6
- * snapshots; all snapshot-specific knowledge lives here:
7
- *
8
- * • install groups (npm-proxy / glpkg / skit) + legacy packages/skits → channels
9
- * + package requests, all probed ANONYMOUSLY (reproduces a first-time
10
- * end-user with no token).
11
- * • transitive closure discovery: uses the publisher's token to expand npm
12
- * deps via the proxy, then hands the discovered nodes back to the engine to
13
- * probe anonymously — so a private transitive dep (401 for end-users) is
14
- * caught even though the publisher can see it.
15
- * • [B] the snapshot's OWN version must be stable when promoted to `latest`.
16
- *
17
- * See architecture/decisions — this is the blocking preflight gate wired into
18
- * `snapshot publish` and the `snapshot preflight` command.
19
- */
20
- import { preflight, formatReport, createNpmPackumentResolver, checkStableRelease, } from '@microwiseai/install-preflight';
21
- import { REGISTRY_PROXY_URL, GITLAB_GROUP_ID, getLicenseKey, getProxyAuthToken } from './config.js';
22
- import { resolveDepsFromLicenseAPI, isDistkitClosureEnabled } from './transitive-resolver.js';
23
- /** Installer groups whose members resolve as npm-style packages through the proxy. */
24
- const NPM_LIKE_GROUPS = new Set(['npm-proxy', 'glpkg', 'gitlab-install', 'skit']);
25
- /** Extract the `@scope` prefix of a package name, or null. */
26
- function scopeOf(name) {
27
- return name.startsWith('@') && name.includes('/') ? name.split('/')[0] : null;
28
- }
29
- /** True for names that legacy `packages`/`skits` maps treat as skits. */
30
- function isSkitName(name) {
31
- return name.endsWith('-kit') || name.endsWith('kit');
32
- }
33
- /**
34
- * Build one anonymous channel per installer lane actually used by the snapshot.
35
- * All lanes hit the same registry-proxy packument endpoint (`GET /{name}`),
36
- * differing only by id/scope for reporting.
37
- */
38
- function buildChannels(scopes) {
39
- const base = {
40
- registryUrl: REGISTRY_PROXY_URL,
41
- auth: { kind: 'anonymous' },
42
- strategy: 'npm-packument',
43
- scopes,
44
- groupId: GITLAB_GROUP_ID,
45
- };
46
- return [
47
- { id: 'npm-proxy', ...base },
48
- { id: 'glpkg', ...base },
49
- { id: 'skit', ...base },
50
- ];
51
- }
52
- /** Collect the DIRECT pins declared by a snapshot into engine requests. */
53
- function collectDirectRequests(snapshot) {
54
- const requests = [];
55
- const push = (channel, name, range) => {
56
- requests.push({ name, range, channel });
57
- };
58
- // New installer-based structure.
59
- if (snapshot.install) {
60
- for (const [installer, pkgs] of Object.entries(snapshot.install)) {
61
- const channel = installer === 'gitlab-install' ? 'glpkg' : installer;
62
- for (const [name, version] of Object.entries(pkgs)) {
63
- push(channel === 'npm-proxy' || channel === 'glpkg' || channel === 'skit' ? channel : 'npm-proxy', name, version);
64
- }
65
- }
66
- }
67
- // Legacy maps.
68
- if (snapshot.packages) {
69
- for (const [name, version] of Object.entries(snapshot.packages)) {
70
- push(isSkitName(name) ? 'skit' : 'npm-proxy', name, version);
71
- }
72
- }
73
- if (snapshot.skits) {
74
- for (const [name, version] of Object.entries(snapshot.skits)) {
75
- push('skit', name, version);
76
- }
77
- }
78
- return requests;
79
- }
80
- /** Scopes declared by the snapshot's registry block (fallback to pins' scopes). */
81
- function collectScopes(snapshot, requests) {
82
- const scopes = new Set();
83
- if (snapshot.registry) {
84
- for (const scope of Object.keys(snapshot.registry))
85
- scopes.add(scope);
86
- }
87
- if (scopes.size === 0) {
88
- for (const r of requests) {
89
- const s = scopeOf(r.name);
90
- if (s)
91
- scopes.add(s);
92
- }
93
- }
94
- return Array.from(scopes);
95
- }
96
- /**
97
- * Discover transitive npm deps via the proxy (token-authenticated), returning
98
- * extra requests to probe ANONYMOUSLY. Failure is non-fatal: it returns a
99
- * warning so coverage gaps are surfaced, never silently dropped.
100
- */
101
- async function discoverTransitive(direct, scopes) {
102
- const token = getLicenseKey() || getProxyAuthToken();
103
- if (!token) {
104
- return {
105
- requests: [],
106
- warning: 'Transitive-closure discovery skipped: no token available (login for full coverage). ' +
107
- 'Only directly-declared pins were checked.',
108
- };
109
- }
110
- // Expand npm/glpkg-lane pins within tracked scopes.
111
- const npmDirect = direct.filter((r) => (r.channel === 'npm-proxy' || r.channel === 'glpkg') && scopes.some((s) => r.name.startsWith(s)));
112
- if (npmDirect.length === 0 || scopes.length === 0)
113
- return { requests: [] };
114
- // ── §5-step6 CUTOVER SWITCH (behind SNAPSHOT_DISTKIT_CLOSURE) ──────────────
115
- // flag ON: resolve the transitive closure CLIENT-SIDE via distkit walkClosure
116
- // (subsumes /resolve-deps — §3d). PREFLIGHT probes the PRIVATE lane (a private
117
- // transitive dep that 401s anonymously is the risk this gate exists for; public
118
- // deps are npmjs-anonymous-trivial). §1.4 fail-loud: a resolver error propagates
119
- // (NOT swallowed into a warning) — a partial closure would be a wrong gate.
120
- // The full public-inclusive closure/lock is produced separately by
121
- // resolveSnapshotToLock; it is not what the anonymous-probe gate needs.
122
- if (isDistkitClosureEnabled()) {
123
- // DYNAMIC import: the distkit bridge is loaded ONLY on the flag-ON path, so
124
- // flag-OFF (default) has NO load-time dependency on distkit — 100% reversible
125
- // and shippable even while distkit is unpublished/unlinked.
126
- const { resolveTransitiveClosureFromPins } = await import('./distkit-closure-bridge.js');
127
- const closure = await resolveTransitiveClosureFromPins(npmDirect.map((r) => ({ name: r.name, version: r.range })), scopes);
128
- const directNames = new Set(direct.map((r) => `${r.channel}:${r.name}`));
129
- const requests = [];
130
- for (const node of closure) {
131
- if (!scopes.some((s) => node.name.startsWith(s)))
132
- continue; // private lane only (preflight)
133
- if (directNames.has(`npm-proxy:${node.name}`) || directNames.has(`glpkg:${node.name}`))
134
- continue;
135
- requests.push({
136
- name: node.name,
137
- range: node.version,
138
- channel: 'npm-proxy',
139
- requestedBy: node.requestedBy.join(', ') || '(transitive closure)',
140
- });
141
- }
142
- return { requests };
143
- }
144
- // flag OFF (default): legacy /resolve-deps path — COMPLETELY UNCHANGED.
145
- try {
146
- const resolved = await resolveDepsFromLicenseAPI({
147
- packages: npmDirect.map((r) => `${r.name}@${r.range}`),
148
- groupId: GITLAB_GROUP_ID,
149
- scopes,
150
- includePeer: true,
151
- });
152
- const directNames = new Set(direct.map((r) => `${r.channel}:${r.name}`));
153
- const requests = [];
154
- for (const [name, version] of Object.entries(resolved.dependencies)) {
155
- if (directNames.has(`npm-proxy:${name}`) || directNames.has(`glpkg:${name}`))
156
- continue;
157
- requests.push({
158
- name,
159
- range: version,
160
- channel: 'npm-proxy',
161
- requestedBy: '(transitive closure)',
162
- });
163
- }
164
- for (const [name, version] of Object.entries(resolved.peerDependencies ?? {})) {
165
- if (requests.some((r) => r.name === name) || directNames.has(`npm-proxy:${name}`))
166
- continue;
167
- requests.push({ name, range: version, channel: 'npm-proxy', requestedBy: '(peer dependency)' });
168
- }
169
- return { requests };
170
- }
171
- catch (err) {
172
- return {
173
- requests: [],
174
- warning: `Transitive-closure discovery failed (${err instanceof Error ? err.message : String(err)}). ` +
175
- 'Only directly-declared pins were checked — transitive private/unpublished deps may be missed.',
176
- };
177
- }
178
- }
179
- /**
180
- * Build the full engine input for a snapshot: anonymous channels + direct pins
181
- * (+ discovered transitive closure). Exposed for testing/other callers.
182
- */
183
- export async function buildSnapshotPreflightInput(snapshot, options = {}) {
184
- const { includeTransitive = true, distTag = 'latest' } = options;
185
- const warnings = [];
186
- const direct = collectDirectRequests(snapshot);
187
- const scopes = collectScopes(snapshot, direct);
188
- let packages = direct;
189
- if (includeTransitive) {
190
- const { requests, warning } = await discoverTransitive(direct, scopes);
191
- if (warning)
192
- warnings.push(warning);
193
- packages = [...direct, ...requests];
194
- }
195
- const input = {
196
- channels: buildChannels(scopes),
197
- packages,
198
- policy: { distTag, requireStableForTags: ['latest'], forbidPrereleaseDefaultResolve: true },
199
- resolver: options.resolver,
200
- };
201
- return { input, warnings };
202
- }
203
- /**
204
- * Run the blocking preflight gate for a snapshot. Combines:
205
- * [A] anonymous resolvability of the whole closure (engine), and
206
- * [B] the snapshot's own version must be stable when promoted to `latest`.
207
- */
208
- export async function runSnapshotPreflight(snapshot, options = {}) {
209
- const distTag = options.distTag ?? 'latest';
210
- const { input, warnings } = await buildSnapshotPreflightInput(snapshot, options);
211
- options.log?.(`Preflight: probing ${input.packages.length} package(s) anonymously across ${input.channels.length} channel(s)...`);
212
- const report = await preflight(input);
213
- // [B] (b1): the snapshot itself must be a stable release when → latest.
214
- const selfFinding = snapshot.version
215
- ? checkStableRelease(snapshot.version, { package: snapshot.name, channel: 'snapshot', requested: snapshot.version }, { distTag, requireStableForTags: ['latest'] })
216
- : null;
217
- if (selfFinding) {
218
- report.findings.unshift(selfFinding);
219
- report.ok = false;
220
- }
221
- return { report, warnings };
222
- }
223
- export { formatReport, createNpmPackumentResolver };
224
- //# sourceMappingURL=preflight-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preflight-adapter.js","sourceRoot":"","sources":["../../src/lib/preflight-adapter.ts"],"names":[],"mappings":"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"}