@msn-control/liftoff 0.7.0 → 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.
- package/README.md +10 -1
- package/assets/governance/single-maintainer-gitflow/policy.md +705 -0
- package/assets/locks/frontend/package-lock.json +1012 -1694
- package/assets/locks/frontend/package.json +5 -6
- package/assets/locks/go-backend/go.mod +17 -0
- package/assets/locks/go-backend/go.sum +159 -0
- package/assets/locks/node-backend/package-lock.json +1473 -2320
- package/assets/locks/node-backend/package.json +8 -7
- package/assets/locks/opentofu-azure/.terraform.lock.hcl +39 -0
- package/assets/locks/opentofu-azure/versions.tf +10 -0
- package/assets/locks/python-genai/function-requirements.txt +1734 -0
- package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/PKG-INFO +25 -0
- package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/SOURCES.txt +6 -0
- package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/dependency_links.txt +1 -0
- package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/requires.txt +23 -0
- package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/top_level.txt +1 -0
- package/assets/locks/python-genai/pyproject.toml +42 -0
- package/assets/locks/python-genai/uv.lock +2536 -0
- package/assets/locks/python-standard/pyproject.toml +36 -0
- package/assets/locks/python-standard/uv.lock +1780 -0
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +4 -4
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +667 -1108
- package/assets/supported-stack.json +711 -0
- package/dist/args.js +12 -0
- package/dist/args.js.map +1 -1
- package/dist/catalogs.d.ts +3 -1
- package/dist/catalogs.js +29 -7
- package/dist/catalogs.js.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +6 -0
- package/dist/commands.js +243 -40
- package/dist/commands.js.map +1 -1
- package/dist/container-validation.d.ts +2 -0
- package/dist/container-validation.js +26 -0
- package/dist/container-validation.js.map +1 -0
- package/dist/file-system.js +130 -5
- package/dist/file-system.js.map +1 -1
- package/dist/framework-adapters.js +1 -0
- package/dist/framework-adapters.js.map +1 -1
- package/dist/go-template-assets.d.ts +2 -0
- package/dist/go-template-assets.js +14 -0
- package/dist/go-template-assets.js.map +1 -0
- package/dist/init-filesystem.js +5 -4
- package/dist/init-filesystem.js.map +1 -1
- package/dist/interactive.js +11 -7
- package/dist/interactive.js.map +1 -1
- package/dist/opentofu-template-assets.d.ts +2 -0
- package/dist/opentofu-template-assets.js +10 -0
- package/dist/opentofu-template-assets.js.map +1 -0
- package/dist/package-identity.d.ts +8 -0
- package/dist/package-identity.js +16 -0
- package/dist/package-identity.js.map +1 -0
- package/dist/planner.js +42 -3
- package/dist/planner.js.map +1 -1
- package/dist/power-apps-templates.js +6 -0
- package/dist/power-apps-templates.js.map +1 -1
- package/dist/project-dependencies.d.ts +1 -1
- package/dist/project-dependencies.js +15 -34
- package/dist/project-dependencies.js.map +1 -1
- package/dist/published-verifier.js +11 -1
- package/dist/published-verifier.js.map +1 -1
- package/dist/python-template-assets.d.ts +4 -0
- package/dist/python-template-assets.js +34 -0
- package/dist/python-template-assets.js.map +1 -0
- package/dist/repository-governance.d.ts +17 -0
- package/dist/repository-governance.js +507 -0
- package/dist/repository-governance.js.map +1 -0
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +3 -1
- package/dist/runtime.js.map +1 -1
- package/dist/self-upgrade.d.ts +77 -0
- package/dist/self-upgrade.js +499 -0
- package/dist/self-upgrade.js.map +1 -0
- package/dist/stable-release.d.ts +18 -0
- package/dist/stable-release.js +66 -0
- package/dist/stable-release.js.map +1 -0
- package/dist/standard-templates.js +28 -97
- package/dist/standard-templates.js.map +1 -1
- package/dist/supported-stack.d.ts +115 -0
- package/dist/supported-stack.js +439 -0
- package/dist/supported-stack.js.map +1 -0
- package/dist/telemetry/contract.d.ts +1 -1
- package/dist/telemetry/contract.js +1 -0
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/templates.js +214 -123
- package/dist/templates.js.map +1 -1
- package/dist/types.d.ts +18 -1
- package/dist/workstation-catalog.js +15 -12
- package/dist/workstation-catalog.js.map +1 -1
- package/dist/workstation.js +16 -6
- package/dist/workstation.js.map +1 -1
- package/docs/cli-reference.md +59 -2
- package/docs/configuration-and-manifests.md +13 -5
- package/docs/existing-repositories.md +21 -0
- package/docs/getting-started.md +23 -7
- package/docs/prerequisites.md +30 -4
- package/docs/project-structure.md +20 -1
- package/docs/repository-governance.md +91 -0
- package/docs/safety-and-consent.md +25 -0
- package/docs/spec-workflows-and-agents.md +19 -6
- package/docs/supported-stack.md +89 -0
- package/docs/telemetry.md +6 -0
- package/docs/troubleshooting.md +78 -0
- package/docs/workloads.md +14 -5
- package/package.json +14 -6
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Stats } from 'node:fs';
|
|
2
|
+
import { type StableRelease } from './stable-release.js';
|
|
3
|
+
import { type CommandRunner } from './process-runner.js';
|
|
4
|
+
import type { ExternalCommand } from './types.js';
|
|
5
|
+
export declare const selfUpgradeSchemaVersion: 1;
|
|
6
|
+
export declare const selfUpgradeInstallTimeoutMs: number;
|
|
7
|
+
export declare const selfUpgradeProbeTimeoutMs = 30000;
|
|
8
|
+
export declare const selfUpgradeVerificationTimeoutMs = 15000;
|
|
9
|
+
export type SelfUpgradeMode = 'apply' | 'check';
|
|
10
|
+
export type SelfUpgradeStatus = 'blocked' | 'current' | 'failed' | 'update-available' | 'upgraded';
|
|
11
|
+
export type SelfUpgradeRegistryKind = 'canonical' | 'configured';
|
|
12
|
+
export type SelfUpgradeReasonCode = 'canonical_invalid' | 'canonical_timeout' | 'canonical_unavailable' | 'current' | 'downgrade_refused' | 'invalid_global_root' | 'invalid_package' | 'npm_install_failed' | 'npm_install_timeout' | 'npm_unavailable' | 'registry_invalid' | 'registry_stale' | 'registry_unavailable' | 'unsupported_installation' | 'update_available' | 'upgrade_complete' | 'verification_failed';
|
|
13
|
+
interface SelfUpgradeResultBase {
|
|
14
|
+
schemaVersion: typeof selfUpgradeSchemaVersion;
|
|
15
|
+
mode: SelfUpgradeMode;
|
|
16
|
+
status: SelfUpgradeStatus;
|
|
17
|
+
currentVersion: string;
|
|
18
|
+
reasonCode: SelfUpgradeReasonCode;
|
|
19
|
+
}
|
|
20
|
+
export type SelfUpgradeResult = (SelfUpgradeResultBase & {
|
|
21
|
+
status: 'current';
|
|
22
|
+
reasonCode: 'current';
|
|
23
|
+
}) | (SelfUpgradeResultBase & {
|
|
24
|
+
status: 'update-available';
|
|
25
|
+
reasonCode: 'update_available';
|
|
26
|
+
targetVersion: string;
|
|
27
|
+
registryKind: SelfUpgradeRegistryKind;
|
|
28
|
+
}) | (SelfUpgradeResultBase & {
|
|
29
|
+
status: 'upgraded';
|
|
30
|
+
reasonCode: 'upgrade_complete';
|
|
31
|
+
targetVersion: string;
|
|
32
|
+
registryKind: SelfUpgradeRegistryKind;
|
|
33
|
+
}) | (SelfUpgradeResultBase & {
|
|
34
|
+
status: 'blocked' | 'failed';
|
|
35
|
+
targetVersion?: string;
|
|
36
|
+
registryKind?: SelfUpgradeRegistryKind;
|
|
37
|
+
});
|
|
38
|
+
export type SelfUpgradeStage = 'Inspect global installation' | 'Resolve canonical stable target' | 'Verify configured registry parity' | 'Install exact Liftoff release' | 'Verify replacement';
|
|
39
|
+
export interface SelfUpgradeRequest {
|
|
40
|
+
mode: SelfUpgradeMode;
|
|
41
|
+
currentVersion: string;
|
|
42
|
+
stdout: NodeJS.WritableStream;
|
|
43
|
+
stderr: NodeJS.WritableStream;
|
|
44
|
+
json: boolean;
|
|
45
|
+
runningPackageRoot?: string;
|
|
46
|
+
onStage?: (stage: SelfUpgradeStage, detail?: string) => void;
|
|
47
|
+
onInstallCommand?: (command: ExternalCommand) => void;
|
|
48
|
+
}
|
|
49
|
+
export type SelfUpgradeExecutor = (request: SelfUpgradeRequest) => Promise<SelfUpgradeResult>;
|
|
50
|
+
export interface SelfUpgradeDependencies {
|
|
51
|
+
runner: CommandRunner;
|
|
52
|
+
lookupStableRelease(): Promise<StableRelease>;
|
|
53
|
+
makeNeutralDirectory(): Promise<string>;
|
|
54
|
+
removeNeutralDirectory(directory: string): Promise<void>;
|
|
55
|
+
readJson(filePath: string): Promise<unknown>;
|
|
56
|
+
lstat(filePath: string): Promise<Stats>;
|
|
57
|
+
realpath(filePath: string): Promise<string>;
|
|
58
|
+
platform: NodeJS.Platform;
|
|
59
|
+
execPath: string;
|
|
60
|
+
environment: NodeJS.ProcessEnv;
|
|
61
|
+
}
|
|
62
|
+
export type ConfiguredRegistryTargetResult = {
|
|
63
|
+
status: 'available';
|
|
64
|
+
registryKind: SelfUpgradeRegistryKind;
|
|
65
|
+
} | {
|
|
66
|
+
status: 'stale' | 'unavailable';
|
|
67
|
+
};
|
|
68
|
+
export type ConfiguredRegistryTargetLookup = (targetVersion: string) => Promise<ConfiguredRegistryTargetResult>;
|
|
69
|
+
export declare function pathIsContained(root: string, candidate: string, platform: NodeJS.Platform): boolean;
|
|
70
|
+
export declare function expectedGlobalPackageRoot(globalRoot: string, platform: NodeJS.Platform): string;
|
|
71
|
+
export declare function buildGlobalNpmInstallCommand(targetVersion: string, platform: NodeJS.Platform): ExternalCommand;
|
|
72
|
+
export declare function selfUpgradeExitCode(value: SelfUpgradeResult): number;
|
|
73
|
+
export declare function selfUpgradeRemedy(value: SelfUpgradeResult): string | undefined;
|
|
74
|
+
export declare function selfUpgradeSummary(value: SelfUpgradeResult): string;
|
|
75
|
+
export declare function checkConfiguredRegistryTarget(targetVersion: string, overrides?: Partial<SelfUpgradeDependencies>): Promise<ConfiguredRegistryTargetResult>;
|
|
76
|
+
export declare function runSelfUpgrade(request: SelfUpgradeRequest, overrides?: Partial<SelfUpgradeDependencies>): Promise<SelfUpgradeResult>;
|
|
77
|
+
export {};
|
|
@@ -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>;
|