@msn-control/liftoff 0.6.2 → 0.8.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 (111) hide show
  1. package/README.md +15 -1
  2. package/assets/governance/single-maintainer-gitflow/policy.md +705 -0
  3. package/assets/locks/frontend/package-lock.json +1012 -1694
  4. package/assets/locks/frontend/package.json +5 -6
  5. package/assets/locks/go-backend/go.mod +17 -0
  6. package/assets/locks/go-backend/go.sum +159 -0
  7. package/assets/locks/node-backend/package-lock.json +1473 -2320
  8. package/assets/locks/node-backend/package.json +8 -7
  9. package/assets/locks/opentofu-azure/.terraform.lock.hcl +39 -0
  10. package/assets/locks/opentofu-azure/versions.tf +10 -0
  11. package/assets/locks/python-genai/function-requirements.txt +1734 -0
  12. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/PKG-INFO +25 -0
  13. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/SOURCES.txt +6 -0
  14. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/dependency_links.txt +1 -0
  15. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/requires.txt +23 -0
  16. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/top_level.txt +1 -0
  17. package/assets/locks/python-genai/pyproject.toml +42 -0
  18. package/assets/locks/python-genai/uv.lock +2536 -0
  19. package/assets/locks/python-standard/pyproject.toml +36 -0
  20. package/assets/locks/python-standard/uv.lock +1780 -0
  21. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +4 -4
  22. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +667 -1108
  23. package/assets/supported-stack.json +711 -0
  24. package/dist/args.js +26 -1
  25. package/dist/args.js.map +1 -1
  26. package/dist/catalogs.d.ts +3 -1
  27. package/dist/catalogs.js +29 -7
  28. package/dist/catalogs.js.map +1 -1
  29. package/dist/cli.js +2 -1
  30. package/dist/cli.js.map +1 -1
  31. package/dist/commands.d.ts +6 -0
  32. package/dist/commands.js +364 -172
  33. package/dist/commands.js.map +1 -1
  34. package/dist/container-validation.d.ts +2 -0
  35. package/dist/container-validation.js +26 -0
  36. package/dist/container-validation.js.map +1 -0
  37. package/dist/file-system.d.ts +1 -0
  38. package/dist/file-system.js +141 -7
  39. package/dist/file-system.js.map +1 -1
  40. package/dist/framework-adapters.js +1 -0
  41. package/dist/framework-adapters.js.map +1 -1
  42. package/dist/go-template-assets.d.ts +2 -0
  43. package/dist/go-template-assets.js +14 -0
  44. package/dist/go-template-assets.js.map +1 -0
  45. package/dist/init-filesystem.js +5 -4
  46. package/dist/init-filesystem.js.map +1 -1
  47. package/dist/interactive.d.ts +0 -5
  48. package/dist/interactive.js +11 -73
  49. package/dist/interactive.js.map +1 -1
  50. package/dist/opentofu-template-assets.d.ts +2 -0
  51. package/dist/opentofu-template-assets.js +10 -0
  52. package/dist/opentofu-template-assets.js.map +1 -0
  53. package/dist/package-identity.d.ts +8 -0
  54. package/dist/package-identity.js +16 -0
  55. package/dist/package-identity.js.map +1 -0
  56. package/dist/planner.js +42 -3
  57. package/dist/planner.js.map +1 -1
  58. package/dist/power-apps-templates.js +6 -0
  59. package/dist/power-apps-templates.js.map +1 -1
  60. package/dist/project-dependencies.d.ts +1 -1
  61. package/dist/project-dependencies.js +15 -34
  62. package/dist/project-dependencies.js.map +1 -1
  63. package/dist/published-verifier.js +11 -1
  64. package/dist/published-verifier.js.map +1 -1
  65. package/dist/python-template-assets.d.ts +4 -0
  66. package/dist/python-template-assets.js +34 -0
  67. package/dist/python-template-assets.js.map +1 -0
  68. package/dist/repository-governance.d.ts +17 -0
  69. package/dist/repository-governance.js +507 -0
  70. package/dist/repository-governance.js.map +1 -0
  71. package/dist/runtime.d.ts +1 -1
  72. package/dist/runtime.js +3 -1
  73. package/dist/runtime.js.map +1 -1
  74. package/dist/self-upgrade.d.ts +77 -0
  75. package/dist/self-upgrade.js +499 -0
  76. package/dist/self-upgrade.js.map +1 -0
  77. package/dist/stable-release.d.ts +18 -0
  78. package/dist/stable-release.js +66 -0
  79. package/dist/stable-release.js.map +1 -0
  80. package/dist/standard-templates.js +28 -97
  81. package/dist/standard-templates.js.map +1 -1
  82. package/dist/supported-stack.d.ts +115 -0
  83. package/dist/supported-stack.js +439 -0
  84. package/dist/supported-stack.js.map +1 -0
  85. package/dist/telemetry/contract.d.ts +1 -1
  86. package/dist/telemetry/contract.js +1 -0
  87. package/dist/telemetry/contract.js.map +1 -1
  88. package/dist/templates.js +216 -125
  89. package/dist/templates.js.map +1 -1
  90. package/dist/types.d.ts +18 -1
  91. package/dist/workstation-catalog.js +15 -12
  92. package/dist/workstation-catalog.js.map +1 -1
  93. package/dist/workstation.js +16 -6
  94. package/dist/workstation.js.map +1 -1
  95. package/docs/cli-reference.md +99 -22
  96. package/docs/configuration-and-manifests.md +14 -7
  97. package/docs/existing-repositories.md +27 -6
  98. package/docs/getting-started.md +23 -7
  99. package/docs/prerequisites.md +30 -4
  100. package/docs/project-structure.md +20 -1
  101. package/docs/repository-governance.md +91 -0
  102. package/docs/safety-and-consent.md +42 -17
  103. package/docs/spec-workflows-and-agents.md +22 -8
  104. package/docs/supported-stack.md +89 -0
  105. package/docs/telemetry.md +6 -0
  106. package/docs/troubleshooting.md +84 -8
  107. package/docs/workloads.md +18 -5
  108. package/package.json +14 -6
  109. package/dist/update-impact.d.ts +0 -23
  110. package/dist/update-impact.js +0 -127
  111. package/dist/update-impact.js.map +0 -1
@@ -0,0 +1,499 @@
1
+ import { lstat, mkdtemp, readFile, realpath, rm } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { canonicalManualInstallCommand, canonicalNpmRegistry, exactGlobalInstallCommand, liftoffBinaryName, liftoffPackageName, npmExecutableForPlatform } from './package-identity.js';
6
+ import { isStableSemver, lookupStableRelease, stableReleaseLookupTimeoutMs, StableReleaseLookupError } from './stable-release.js';
7
+ import { NodeCommandRunner } from './process-runner.js';
8
+ import { compareSemver } from './semver.js';
9
+ export const selfUpgradeSchemaVersion = 1;
10
+ export const selfUpgradeInstallTimeoutMs = 10 * 60_000;
11
+ export const selfUpgradeProbeTimeoutMs = 30_000;
12
+ export const selfUpgradeVerificationTimeoutMs = 15_000;
13
+ class SelfUpgradeFailure extends Error {
14
+ status;
15
+ reasonCode;
16
+ registryKind;
17
+ constructor(status, reasonCode, registryKind) {
18
+ super(reasonCode);
19
+ this.status = status;
20
+ this.reasonCode = reasonCode;
21
+ this.registryKind = registryKind;
22
+ this.name = 'SelfUpgradeFailure';
23
+ }
24
+ }
25
+ const sourcePackageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
26
+ function pathApiForPlatform(platform) {
27
+ return platform === 'win32' ? path.win32 : path.posix;
28
+ }
29
+ function comparisonPath(value, platform) {
30
+ const normalized = pathApiForPlatform(platform).resolve(value);
31
+ return platform === 'win32' ? normalized.toLowerCase() : normalized;
32
+ }
33
+ export function pathIsContained(root, candidate, platform) {
34
+ const api = pathApiForPlatform(platform);
35
+ const relative = api.relative(comparisonPath(root, platform), comparisonPath(candidate, platform));
36
+ return relative === '' || (relative !== '..' &&
37
+ !relative.startsWith(`..${api.sep}`) &&
38
+ !api.isAbsolute(relative));
39
+ }
40
+ export function expectedGlobalPackageRoot(globalRoot, platform) {
41
+ return pathApiForPlatform(platform).join(globalRoot, ...liftoffPackageName.split('/'));
42
+ }
43
+ export function buildGlobalNpmInstallCommand(targetVersion, platform) {
44
+ return {
45
+ executable: npmExecutableForPlatform(platform),
46
+ args: [
47
+ 'install',
48
+ '--global',
49
+ '--ignore-scripts',
50
+ '--no-audit',
51
+ '--no-fund',
52
+ `${liftoffPackageName}@${targetVersion}`
53
+ ]
54
+ };
55
+ }
56
+ function result(request, status, reasonCode, details = {}) {
57
+ return {
58
+ schemaVersion: selfUpgradeSchemaVersion,
59
+ mode: request.mode,
60
+ status,
61
+ currentVersion: request.currentVersion,
62
+ reasonCode,
63
+ ...(details.targetVersion ? { targetVersion: details.targetVersion } : {}),
64
+ ...(details.registryKind ? { registryKind: details.registryKind } : {})
65
+ };
66
+ }
67
+ function assertNever(value) {
68
+ throw new Error(`Unhandled self-upgrade state: ${String(value)}`);
69
+ }
70
+ export function selfUpgradeExitCode(value) {
71
+ switch (value.status) {
72
+ case 'current':
73
+ case 'upgraded':
74
+ return 0;
75
+ case 'update-available':
76
+ return 2;
77
+ case 'blocked':
78
+ case 'failed':
79
+ return 1;
80
+ default:
81
+ return assertNever(value);
82
+ }
83
+ }
84
+ export function selfUpgradeRemedy(value) {
85
+ switch (value.reasonCode) {
86
+ case 'current':
87
+ case 'update_available':
88
+ case 'upgrade_complete':
89
+ return undefined;
90
+ case 'registry_stale':
91
+ return 'Ask the managed registry owner to synchronize or approve the canonical target, then retry.';
92
+ case 'npm_install_failed':
93
+ case 'npm_install_timeout':
94
+ case 'verification_failed':
95
+ return value.targetVersion
96
+ ? `Run the exact repair command manually: ${exactGlobalInstallCommand(value.targetVersion)}`
97
+ : undefined;
98
+ case 'unsupported_installation':
99
+ case 'invalid_global_root':
100
+ case 'invalid_package':
101
+ case 'npm_unavailable':
102
+ return `Use a supported global npm installation: ${canonicalManualInstallCommand()}`;
103
+ case 'canonical_invalid':
104
+ case 'canonical_timeout':
105
+ case 'canonical_unavailable':
106
+ return 'Retry after canonical npm is reachable and exposes valid stable Liftoff metadata.';
107
+ case 'registry_invalid':
108
+ case 'registry_unavailable':
109
+ return 'Repair the approved npm registry configuration without placing credentials in the registry URL, then retry.';
110
+ case 'downgrade_refused':
111
+ return 'Keep the newer installed CLI; Liftoff does not perform automatic downgrades.';
112
+ default:
113
+ return assertNever(value);
114
+ }
115
+ }
116
+ export function selfUpgradeSummary(value) {
117
+ switch (value.status) {
118
+ case 'current':
119
+ return `Liftoff ${value.currentVersion} is already the canonical stable release.`;
120
+ case 'update-available':
121
+ return `Liftoff ${value.targetVersion} is available for this supported global npm installation.`;
122
+ case 'upgraded':
123
+ return `Liftoff ${value.targetVersion} was installed and verified.`;
124
+ case 'blocked':
125
+ return `CLI upgrade was blocked (${value.reasonCode}).`;
126
+ case 'failed':
127
+ return `CLI upgrade failed (${value.reasonCode}).`;
128
+ default:
129
+ return assertNever(value);
130
+ }
131
+ }
132
+ function readOnlyEnvironment(dependencies, neutralDirectory) {
133
+ return {
134
+ ...dependencies.environment,
135
+ npm_config_cache: path.join(neutralDirectory, 'npm-cache')
136
+ };
137
+ }
138
+ function commandFailed(command) {
139
+ return command.errorCode !== undefined ||
140
+ command.errorMessage !== undefined ||
141
+ command.timedOut ||
142
+ command.signal !== null ||
143
+ command.status !== 0;
144
+ }
145
+ async function inspectGlobalInstallation(request, neutralDirectory, dependencies) {
146
+ const npmExecutable = npmExecutableForPlatform(dependencies.platform);
147
+ const rootResult = await dependencies.runner.run({ executable: npmExecutable, args: ['root', '--global'] }, {
148
+ cwd: neutralDirectory,
149
+ env: readOnlyEnvironment(dependencies, neutralDirectory),
150
+ timeoutMs: selfUpgradeProbeTimeoutMs
151
+ });
152
+ if (rootResult.errorCode === 'ENOENT') {
153
+ throw new SelfUpgradeFailure('blocked', 'npm_unavailable');
154
+ }
155
+ if (commandFailed(rootResult)) {
156
+ throw new SelfUpgradeFailure('failed', 'invalid_global_root');
157
+ }
158
+ const rootLines = rootResult.stdout.trim().split(/\r?\n/).filter(Boolean);
159
+ if (rootLines.length !== 1) {
160
+ throw new SelfUpgradeFailure('blocked', 'invalid_global_root');
161
+ }
162
+ const pathApi = pathApiForPlatform(dependencies.platform);
163
+ const reportedRoot = rootLines[0];
164
+ if (!pathApi.isAbsolute(reportedRoot)) {
165
+ throw new SelfUpgradeFailure('blocked', 'invalid_global_root');
166
+ }
167
+ let globalRoot;
168
+ let runningRoot;
169
+ try {
170
+ globalRoot = await dependencies.realpath(reportedRoot);
171
+ runningRoot = await dependencies.realpath(request.runningPackageRoot ?? sourcePackageRoot);
172
+ }
173
+ catch {
174
+ throw new SelfUpgradeFailure('blocked', 'invalid_global_root');
175
+ }
176
+ const packageRoot = expectedGlobalPackageRoot(globalRoot, dependencies.platform);
177
+ if (!pathIsContained(globalRoot, packageRoot, dependencies.platform) ||
178
+ comparisonPath(packageRoot, dependencies.platform) !==
179
+ comparisonPath(runningRoot, dependencies.platform)) {
180
+ throw new SelfUpgradeFailure('blocked', 'unsupported_installation');
181
+ }
182
+ let packageDetails;
183
+ let metadata;
184
+ try {
185
+ packageDetails = await dependencies.lstat(packageRoot);
186
+ metadata = await dependencies.readJson(pathApi.join(packageRoot, 'package.json'));
187
+ }
188
+ catch {
189
+ throw new SelfUpgradeFailure('blocked', 'invalid_package');
190
+ }
191
+ if (packageDetails.isSymbolicLink() || !packageDetails.isDirectory()) {
192
+ throw new SelfUpgradeFailure('blocked', 'unsupported_installation');
193
+ }
194
+ if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {
195
+ throw new SelfUpgradeFailure('blocked', 'invalid_package');
196
+ }
197
+ const packageMetadata = metadata;
198
+ if (packageMetadata.name !== liftoffPackageName ||
199
+ packageMetadata.version !== request.currentVersion) {
200
+ throw new SelfUpgradeFailure('blocked', 'invalid_package');
201
+ }
202
+ return { npmExecutable, packageRoot };
203
+ }
204
+ function registryKind(value) {
205
+ let parsed;
206
+ try {
207
+ parsed = new URL(value);
208
+ }
209
+ catch {
210
+ throw new SelfUpgradeFailure('blocked', 'registry_invalid');
211
+ }
212
+ if (parsed.protocol !== 'https:' ||
213
+ parsed.username ||
214
+ parsed.password ||
215
+ parsed.search ||
216
+ parsed.hash) {
217
+ throw new SelfUpgradeFailure('blocked', 'registry_invalid');
218
+ }
219
+ const normalized = parsed.toString().replace(/\/$/, '');
220
+ return normalized === canonicalNpmRegistry ? 'canonical' : 'configured';
221
+ }
222
+ async function inspectRegistryParity(targetVersion, npmExecutable, neutralDirectory, dependencies, timeoutMs = selfUpgradeProbeTimeoutMs) {
223
+ const options = {
224
+ cwd: neutralDirectory,
225
+ env: readOnlyEnvironment(dependencies, neutralDirectory),
226
+ timeoutMs
227
+ };
228
+ const registryResult = await dependencies.runner.run({ executable: npmExecutable, args: ['config', 'get', 'registry'] }, options);
229
+ if (commandFailed(registryResult)) {
230
+ throw new SelfUpgradeFailure('failed', 'registry_unavailable');
231
+ }
232
+ const configuredRegistry = registryResult.stdout.trim();
233
+ const kind = registryKind(configuredRegistry);
234
+ const targetResult = await dependencies.runner.run({
235
+ executable: npmExecutable,
236
+ args: [
237
+ 'view',
238
+ `${liftoffPackageName}@${targetVersion}`,
239
+ 'name',
240
+ 'version',
241
+ '--json'
242
+ ]
243
+ }, options);
244
+ if (commandFailed(targetResult)) {
245
+ const notFound = targetResult.status === 1 &&
246
+ /\b(?:E404|404|not found|no match)\b/i.test(targetResult.stderr);
247
+ throw new SelfUpgradeFailure(notFound ? 'blocked' : 'failed', notFound ? 'registry_stale' : 'registry_unavailable', kind);
248
+ }
249
+ let metadata;
250
+ try {
251
+ metadata = JSON.parse(targetResult.stdout);
252
+ }
253
+ catch {
254
+ throw new SelfUpgradeFailure('failed', 'registry_invalid', kind);
255
+ }
256
+ if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {
257
+ throw new SelfUpgradeFailure('failed', 'registry_invalid', kind);
258
+ }
259
+ const record = metadata;
260
+ if (record.name !== liftoffPackageName || record.version !== targetVersion) {
261
+ throw new SelfUpgradeFailure('blocked', 'registry_stale', kind);
262
+ }
263
+ return { kind };
264
+ }
265
+ export async function checkConfiguredRegistryTarget(targetVersion, overrides = {}) {
266
+ const dependencies = {
267
+ ...defaultSelfUpgradeDependencies(),
268
+ ...overrides
269
+ };
270
+ let neutralDirectory;
271
+ try {
272
+ neutralDirectory = await dependencies.makeNeutralDirectory();
273
+ }
274
+ catch {
275
+ return { status: 'unavailable' };
276
+ }
277
+ try {
278
+ const inspection = await inspectRegistryParity(targetVersion, npmExecutableForPlatform(dependencies.platform), neutralDirectory, dependencies, stableReleaseLookupTimeoutMs);
279
+ return { status: 'available', registryKind: inspection.kind };
280
+ }
281
+ catch (error) {
282
+ if (error instanceof SelfUpgradeFailure &&
283
+ error.reasonCode === 'registry_stale') {
284
+ return { status: 'stale' };
285
+ }
286
+ return { status: 'unavailable' };
287
+ }
288
+ finally {
289
+ await dependencies.removeNeutralDirectory(neutralDirectory);
290
+ }
291
+ }
292
+ async function npmGlobalRoot(npmExecutable, neutralDirectory, dependencies) {
293
+ const rootResult = await dependencies.runner.run({ executable: npmExecutable, args: ['root', '--global'] }, {
294
+ cwd: neutralDirectory,
295
+ env: readOnlyEnvironment(dependencies, neutralDirectory),
296
+ timeoutMs: selfUpgradeProbeTimeoutMs
297
+ });
298
+ if (commandFailed(rootResult)) {
299
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
300
+ }
301
+ const lines = rootResult.stdout.trim().split(/\r?\n/).filter(Boolean);
302
+ if (lines.length !== 1 || !pathApiForPlatform(dependencies.platform).isAbsolute(lines[0])) {
303
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
304
+ }
305
+ try {
306
+ return await dependencies.realpath(lines[0]);
307
+ }
308
+ catch {
309
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
310
+ }
311
+ }
312
+ async function verifyReplacement(targetVersion, npmExecutable, neutralDirectory, dependencies) {
313
+ const pathApi = pathApiForPlatform(dependencies.platform);
314
+ const globalRoot = await npmGlobalRoot(npmExecutable, neutralDirectory, dependencies);
315
+ const packageRoot = expectedGlobalPackageRoot(globalRoot, dependencies.platform);
316
+ let packageDetails;
317
+ let metadata;
318
+ try {
319
+ packageDetails = await dependencies.lstat(packageRoot);
320
+ metadata = await dependencies.readJson(pathApi.join(packageRoot, 'package.json'));
321
+ }
322
+ catch {
323
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
324
+ }
325
+ if (packageDetails.isSymbolicLink() ||
326
+ !packageDetails.isDirectory() ||
327
+ !metadata ||
328
+ typeof metadata !== 'object' ||
329
+ Array.isArray(metadata)) {
330
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
331
+ }
332
+ const record = metadata;
333
+ const bin = record.bin;
334
+ if (record.name !== liftoffPackageName ||
335
+ record.version !== targetVersion ||
336
+ !bin ||
337
+ typeof bin !== 'object' ||
338
+ Array.isArray(bin) ||
339
+ typeof bin[liftoffBinaryName] !== 'string') {
340
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
341
+ }
342
+ const declaredBin = bin[liftoffBinaryName];
343
+ if (pathApi.isAbsolute(declaredBin)) {
344
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
345
+ }
346
+ const binaryPath = pathApi.resolve(packageRoot, declaredBin);
347
+ if (!pathIsContained(packageRoot, binaryPath, dependencies.platform)) {
348
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
349
+ }
350
+ let binaryDetails;
351
+ let canonicalBinary;
352
+ try {
353
+ binaryDetails = await dependencies.lstat(binaryPath);
354
+ canonicalBinary = await dependencies.realpath(binaryPath);
355
+ }
356
+ catch {
357
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
358
+ }
359
+ if (binaryDetails.isSymbolicLink() ||
360
+ !binaryDetails.isFile() ||
361
+ !pathIsContained(packageRoot, canonicalBinary, dependencies.platform)) {
362
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
363
+ }
364
+ const versionResult = await dependencies.runner.run({
365
+ executable: dependencies.execPath,
366
+ args: [canonicalBinary, '--version']
367
+ }, {
368
+ cwd: neutralDirectory,
369
+ env: {
370
+ ...dependencies.environment,
371
+ CI: 'true',
372
+ DO_NOT_TRACK: '1',
373
+ LIFTOFF_TELEMETRY: '0'
374
+ },
375
+ timeoutMs: selfUpgradeVerificationTimeoutMs
376
+ });
377
+ if (commandFailed(versionResult) ||
378
+ versionResult.stdout.trim() !== `Liftoff ${targetVersion}`) {
379
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
380
+ }
381
+ }
382
+ function canonicalFailureReason(error) {
383
+ switch (error.code) {
384
+ case 'invalid_metadata':
385
+ return 'canonical_invalid';
386
+ case 'timeout':
387
+ return 'canonical_timeout';
388
+ case 'http_failure':
389
+ case 'network_failure':
390
+ return 'canonical_unavailable';
391
+ default:
392
+ return assertNever(error.code);
393
+ }
394
+ }
395
+ export async function runSelfUpgrade(request, overrides = {}) {
396
+ const dependencies = {
397
+ ...defaultSelfUpgradeDependencies(),
398
+ ...overrides
399
+ };
400
+ const neutralDirectory = await dependencies.makeNeutralDirectory();
401
+ let targetVersion;
402
+ let registry;
403
+ try {
404
+ request.onStage?.('Inspect global installation');
405
+ const installation = await inspectGlobalInstallation(request, neutralDirectory, dependencies);
406
+ request.onStage?.('Resolve canonical stable target');
407
+ let stable;
408
+ try {
409
+ stable = await dependencies.lookupStableRelease();
410
+ }
411
+ catch (error) {
412
+ if (error instanceof StableReleaseLookupError) {
413
+ return result(request, 'failed', canonicalFailureReason(error));
414
+ }
415
+ return result(request, 'failed', 'canonical_unavailable');
416
+ }
417
+ if (stable.name !== liftoffPackageName || !isStableSemver(stable.version)) {
418
+ return result(request, 'failed', 'canonical_invalid');
419
+ }
420
+ targetVersion = stable.version;
421
+ const comparison = compareSemver(targetVersion, request.currentVersion);
422
+ if (comparison === 0) {
423
+ return result(request, 'current', 'current');
424
+ }
425
+ if (comparison < 0) {
426
+ return result(request, 'blocked', 'downgrade_refused', { targetVersion });
427
+ }
428
+ request.onStage?.('Verify configured registry parity');
429
+ const registryInspection = await inspectRegistryParity(targetVersion, installation.npmExecutable, neutralDirectory, dependencies);
430
+ registry = registryInspection.kind;
431
+ if (request.mode === 'check') {
432
+ return result(request, 'update-available', 'update_available', {
433
+ targetVersion,
434
+ registryKind: registry
435
+ });
436
+ }
437
+ request.onStage?.('Install exact Liftoff release', targetVersion);
438
+ const installCommand = buildGlobalNpmInstallCommand(targetVersion, dependencies.platform);
439
+ request.onInstallCommand?.(installCommand);
440
+ const installResult = await dependencies.runner.run(installCommand, {
441
+ cwd: neutralDirectory,
442
+ env: dependencies.environment,
443
+ timeoutMs: selfUpgradeInstallTimeoutMs,
444
+ stream: true,
445
+ stdout: request.json ? request.stderr : request.stdout,
446
+ stderr: request.stderr
447
+ });
448
+ if (installResult.timedOut) {
449
+ return result(request, 'failed', 'npm_install_timeout', {
450
+ targetVersion,
451
+ registryKind: registry
452
+ });
453
+ }
454
+ if (commandFailed(installResult)) {
455
+ return result(request, 'failed', 'npm_install_failed', {
456
+ targetVersion,
457
+ registryKind: registry
458
+ });
459
+ }
460
+ request.onStage?.('Verify replacement', targetVersion);
461
+ await verifyReplacement(targetVersion, installation.npmExecutable, neutralDirectory, dependencies);
462
+ return result(request, 'upgraded', 'upgrade_complete', {
463
+ targetVersion,
464
+ registryKind: registry
465
+ });
466
+ }
467
+ catch (error) {
468
+ if (error instanceof SelfUpgradeFailure) {
469
+ return result(request, error.status, error.reasonCode, {
470
+ ...(targetVersion ? { targetVersion } : {}),
471
+ ...(registry ?? error.registryKind
472
+ ? { registryKind: registry ?? error.registryKind }
473
+ : {})
474
+ });
475
+ }
476
+ return result(request, 'failed', 'verification_failed', {
477
+ ...(targetVersion ? { targetVersion } : {}),
478
+ ...(registry ? { registryKind: registry } : {})
479
+ });
480
+ }
481
+ finally {
482
+ await dependencies.removeNeutralDirectory(neutralDirectory);
483
+ }
484
+ }
485
+ function defaultSelfUpgradeDependencies() {
486
+ return {
487
+ runner: new NodeCommandRunner(),
488
+ lookupStableRelease,
489
+ makeNeutralDirectory: () => mkdtemp(path.join(os.tmpdir(), 'liftoff-upgrade-')),
490
+ removeNeutralDirectory: (directory) => rm(directory, { recursive: true, force: true }),
491
+ readJson: async (filePath) => JSON.parse(await readFile(filePath, 'utf8')),
492
+ lstat,
493
+ realpath,
494
+ platform: process.platform,
495
+ execPath: process.execPath,
496
+ environment: process.env
497
+ };
498
+ }
499
+ //# sourceMappingURL=self-upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-upgrade.js","sourceRoot":"","sources":["../src/self-upgrade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { liftoffPackageName } from './package-identity.js';
2
+ export declare const stableReleaseLookupTimeoutMs = 2000;
3
+ export type StableReleaseFailureCode = 'http_failure' | 'invalid_metadata' | 'network_failure' | 'timeout';
4
+ export declare class StableReleaseLookupError extends Error {
5
+ readonly code: StableReleaseFailureCode;
6
+ constructor(code: StableReleaseFailureCode, message: string);
7
+ }
8
+ export interface StableRelease {
9
+ name: typeof liftoffPackageName;
10
+ version: string;
11
+ }
12
+ export interface StableReleaseLookupOptions {
13
+ fetch?: typeof globalThis.fetch;
14
+ registry?: string;
15
+ timeoutMs?: number;
16
+ }
17
+ export declare function isStableSemver(value: unknown): value is string;
18
+ export declare function lookupStableRelease(options?: StableReleaseLookupOptions): Promise<StableRelease>;
@@ -0,0 +1,66 @@
1
+ import { canonicalNpmRegistry, liftoffPackageName, stableNpmTag } from './package-identity.js';
2
+ export const stableReleaseLookupTimeoutMs = 2_000;
3
+ export class StableReleaseLookupError extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.code = code;
8
+ this.name = 'StableReleaseLookupError';
9
+ }
10
+ }
11
+ export function isStableSemver(value) {
12
+ return typeof value === 'string' &&
13
+ /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(value);
14
+ }
15
+ function packageMetadataUrl(registry) {
16
+ const base = new URL(registry);
17
+ const normalized = base.toString().endsWith('/') ? base : new URL(`${base.toString()}/`);
18
+ return new URL(`${encodeURIComponent(liftoffPackageName)}/${stableNpmTag}`, normalized);
19
+ }
20
+ export async function lookupStableRelease(options = {}) {
21
+ const fetchRelease = options.fetch ?? globalThis.fetch.bind(globalThis);
22
+ const timeoutMs = options.timeoutMs ?? stableReleaseLookupTimeoutMs;
23
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {
24
+ throw new StableReleaseLookupError('invalid_metadata', 'Stable release timeout must be positive.');
25
+ }
26
+ const controller = new AbortController();
27
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
28
+ try {
29
+ const response = await fetchRelease(packageMetadataUrl(options.registry ?? canonicalNpmRegistry), {
30
+ headers: { accept: 'application/vnd.npm.install-v1+json' },
31
+ redirect: 'error',
32
+ signal: controller.signal
33
+ });
34
+ if (!response.ok) {
35
+ throw new StableReleaseLookupError('http_failure', `Canonical npm stable release lookup returned HTTP ${response.status}.`);
36
+ }
37
+ let value;
38
+ try {
39
+ value = await response.json();
40
+ }
41
+ catch {
42
+ throw new StableReleaseLookupError('invalid_metadata', 'Canonical npm stable release metadata was not valid JSON.');
43
+ }
44
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
45
+ throw new StableReleaseLookupError('invalid_metadata', 'Canonical npm stable release metadata must be an object.');
46
+ }
47
+ const metadata = value;
48
+ if (metadata.name !== liftoffPackageName || !isStableSemver(metadata.version)) {
49
+ throw new StableReleaseLookupError('invalid_metadata', 'Canonical npm stable release metadata has an invalid package name or version.');
50
+ }
51
+ return { name: liftoffPackageName, version: metadata.version };
52
+ }
53
+ catch (error) {
54
+ if (error instanceof StableReleaseLookupError) {
55
+ throw error;
56
+ }
57
+ if (controller.signal.aborted) {
58
+ throw new StableReleaseLookupError('timeout', 'Canonical npm stable release lookup timed out.');
59
+ }
60
+ throw new StableReleaseLookupError('network_failure', 'Canonical npm stable release lookup failed.');
61
+ }
62
+ finally {
63
+ clearTimeout(timer);
64
+ }
65
+ }
66
+ //# sourceMappingURL=stable-release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable-release.js","sourceRoot":"","sources":["../src/stable-release.ts"],"names":[],"mappings":"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"}