@msn-control/liftoff 0.3.4 → 0.4.1
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 +82 -32
- package/assets/locks/frontend/package-lock.json +2217 -0
- package/assets/locks/frontend/package.json +19 -0
- package/assets/locks/node-backend/package-lock.json +4352 -0
- package/assets/locks/node-backend/package.json +32 -0
- package/dist/args.d.ts +42 -1
- package/dist/args.js +170 -37
- package/dist/args.js.map +1 -1
- package/dist/catalogs.d.ts +10 -1
- package/dist/catalogs.js +89 -0
- package/dist/catalogs.js.map +1 -1
- package/dist/cli.js +11 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +9 -0
- package/dist/commands.js +832 -227
- package/dist/commands.js.map +1 -1
- package/dist/file-system.js +89 -5
- package/dist/file-system.js.map +1 -1
- package/dist/framework-adapters.d.ts +18 -0
- package/dist/framework-adapters.js +115 -0
- package/dist/framework-adapters.js.map +1 -0
- package/dist/framework-validation.d.ts +8 -0
- package/dist/framework-validation.js +83 -0
- package/dist/framework-validation.js.map +1 -0
- package/dist/init-filesystem.d.ts +102 -0
- package/dist/init-filesystem.js +762 -0
- package/dist/init-filesystem.js.map +1 -0
- package/dist/interactive.d.ts +43 -2
- package/dist/interactive.js +202 -91
- package/dist/interactive.js.map +1 -1
- package/dist/npm-template-assets.d.ts +3 -0
- package/dist/npm-template-assets.js +32 -0
- package/dist/npm-template-assets.js.map +1 -0
- package/dist/planner.d.ts +5 -0
- package/dist/planner.js +87 -21
- package/dist/planner.js.map +1 -1
- package/dist/process-runner.d.ts +28 -0
- package/dist/process-runner.js +83 -0
- package/dist/process-runner.js.map +1 -0
- package/dist/project-dependencies.d.ts +30 -0
- package/dist/project-dependencies.js +164 -0
- package/dist/project-dependencies.js.map +1 -0
- package/dist/published-verifier.js +1 -1
- package/dist/published-verifier.js.map +1 -1
- package/dist/reconcile.js +4 -1
- package/dist/reconcile.js.map +1 -1
- package/dist/runtime.d.ts +2 -0
- package/dist/runtime.js +9 -0
- package/dist/runtime.js.map +1 -0
- package/dist/standard-templates.js +3 -30
- package/dist/standard-templates.js.map +1 -1
- package/dist/templates.d.ts +9 -1
- package/dist/templates.js +110 -46
- package/dist/templates.js.map +1 -1
- package/dist/terminal.d.ts +128 -0
- package/dist/terminal.js +598 -0
- package/dist/terminal.js.map +1 -0
- package/dist/types.d.ts +38 -1
- package/dist/workstation-catalog.d.ts +20 -0
- package/dist/workstation-catalog.js +122 -0
- package/dist/workstation-catalog.js.map +1 -0
- package/dist/workstation.d.ts +76 -0
- package/dist/workstation.js +461 -0
- package/dist/workstation.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
import { access, readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { workstationRequirementCatalog } from './workstation-catalog.js';
|
|
4
|
+
const REQUIREMENT_ORDER = [
|
|
5
|
+
'node',
|
|
6
|
+
'python',
|
|
7
|
+
'go',
|
|
8
|
+
'uv',
|
|
9
|
+
'docker',
|
|
10
|
+
'opentofu',
|
|
11
|
+
'azure-cli',
|
|
12
|
+
'openspec',
|
|
13
|
+
'spec-kit',
|
|
14
|
+
'github-copilot',
|
|
15
|
+
'claude'
|
|
16
|
+
];
|
|
17
|
+
const MISSING_ERROR_CODES = new Set(['ENOENT', 'UNKNOWN']);
|
|
18
|
+
function compareVersions(left, right) {
|
|
19
|
+
const leftParts = left.split('.').map(Number);
|
|
20
|
+
const rightParts = right.split('.').map(Number);
|
|
21
|
+
for (let index = 0; index < Math.max(leftParts.length, rightParts.length); index += 1) {
|
|
22
|
+
const difference = (leftParts[index] ?? 0) - (rightParts[index] ?? 0);
|
|
23
|
+
if (difference !== 0) {
|
|
24
|
+
return difference;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
export function extractVersion(output) {
|
|
30
|
+
return output.match(/(?:^|[^0-9])v?([0-9]+\.[0-9]+(?:\.[0-9]+)?)(?:[^0-9]|$)/)?.[1];
|
|
31
|
+
}
|
|
32
|
+
export function selectLiftoffRuntimeRequirements() {
|
|
33
|
+
const definition = workstationRequirementCatalog.node;
|
|
34
|
+
return [{
|
|
35
|
+
id: 'node',
|
|
36
|
+
definition,
|
|
37
|
+
severity: definition.severity,
|
|
38
|
+
reasons: ['Liftoff runtime'],
|
|
39
|
+
minimumVersion: '20.19.0'
|
|
40
|
+
}];
|
|
41
|
+
}
|
|
42
|
+
export function selectWorkstationRequirements(plan, options = {}) {
|
|
43
|
+
const selected = new Map();
|
|
44
|
+
const add = (id, reason, overrides = {}) => {
|
|
45
|
+
const definition = workstationRequirementCatalog[id];
|
|
46
|
+
const existing = selected.get(id);
|
|
47
|
+
const minimumVersion = overrides.minimumVersion ?? definition.minimumVersion;
|
|
48
|
+
const exactVersion = overrides.exactVersion ?? definition.exactVersion;
|
|
49
|
+
if (existing) {
|
|
50
|
+
existing.reasons.push(reason);
|
|
51
|
+
if (minimumVersion && (!existing.minimumVersion || compareVersions(minimumVersion, existing.minimumVersion) > 0)) {
|
|
52
|
+
existing.minimumVersion = minimumVersion;
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
selected.set(id, {
|
|
57
|
+
id,
|
|
58
|
+
definition,
|
|
59
|
+
severity: overrides.severity ?? definition.severity,
|
|
60
|
+
reasons: [reason],
|
|
61
|
+
...(minimumVersion ? { minimumVersion } : {}),
|
|
62
|
+
...(exactVersion ? { exactVersion } : {})
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
add('node', 'Liftoff runtime', { minimumVersion: '20.19.0' });
|
|
66
|
+
if (plan.apiStack.id === 'python-fastapi') {
|
|
67
|
+
add('python', 'selected Python API stack', { minimumVersion: '3.12.0' });
|
|
68
|
+
}
|
|
69
|
+
else if (plan.apiStack.id === 'go-huma') {
|
|
70
|
+
add('go', 'selected Go API stack', { minimumVersion: '1.23.0' });
|
|
71
|
+
}
|
|
72
|
+
if (plan.specWorkflow.id === 'openspec') {
|
|
73
|
+
add('node', 'OpenSpec runtime', { minimumVersion: '20.19.0' });
|
|
74
|
+
if (options.includeFramework !== false) {
|
|
75
|
+
add('openspec', 'selected spec-driven framework', { exactVersion: plan.framework.version });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
add('python', 'Spec Kit runtime', { minimumVersion: '3.11.0' });
|
|
80
|
+
add('uv', 'Spec Kit installer and launcher');
|
|
81
|
+
if (options.includeFramework !== false) {
|
|
82
|
+
add('spec-kit', 'selected spec-driven framework', { exactVersion: plan.framework.version });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
add('docker', 'generated local development stack');
|
|
86
|
+
add('opentofu', 'generated infrastructure');
|
|
87
|
+
if (plan.provider.id === 'azure') {
|
|
88
|
+
add('azure-cli', 'selected Azure cloud');
|
|
89
|
+
}
|
|
90
|
+
for (const agent of plan.agents) {
|
|
91
|
+
add(agent.id, `selected ${agent.label} coding agent`);
|
|
92
|
+
}
|
|
93
|
+
return REQUIREMENT_ORDER.flatMap((id) => {
|
|
94
|
+
const requirement = selected.get(id);
|
|
95
|
+
return requirement ? [requirement] : [];
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function missingResult(requirement, detail = 'command not found') {
|
|
99
|
+
return {
|
|
100
|
+
requirement,
|
|
101
|
+
state: 'missing',
|
|
102
|
+
detail,
|
|
103
|
+
remedy: `Install ${requirement.definition.label}.`,
|
|
104
|
+
notices: []
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function commandMissing(result) {
|
|
108
|
+
return result.errorCode !== undefined && MISSING_ERROR_CODES.has(result.errorCode);
|
|
109
|
+
}
|
|
110
|
+
async function probeCommandCandidates(requirement, runner, options) {
|
|
111
|
+
const results = [];
|
|
112
|
+
for (const command of requirement.definition.probes) {
|
|
113
|
+
const result = await runner.run(command, { timeoutMs: 15_000, ...options });
|
|
114
|
+
if (!commandMissing(result)) {
|
|
115
|
+
results.push(result);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return results;
|
|
119
|
+
}
|
|
120
|
+
async function copilotFallback(requirement, runner, options) {
|
|
121
|
+
const result = await runner.run({ executable: 'code', args: ['--list-extensions'] }, { timeoutMs: 15_000, ...options });
|
|
122
|
+
if (commandMissing(result)) {
|
|
123
|
+
return {
|
|
124
|
+
requirement,
|
|
125
|
+
state: 'not-observable',
|
|
126
|
+
detail: 'Copilot CLI and the VS Code CLI are unavailable, so agent presence cannot be observed.',
|
|
127
|
+
remedy: 'Install the Copilot CLI, or verify that GitHub.copilot or GitHub.copilot-chat is enabled in VS Code.',
|
|
128
|
+
notices: []
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (result.status !== 0) {
|
|
132
|
+
return {
|
|
133
|
+
requirement,
|
|
134
|
+
state: 'unhealthy',
|
|
135
|
+
detail: result.stderr.trim() || 'VS Code extension discovery failed.',
|
|
136
|
+
remedy: 'Run `code --list-extensions` and repair the VS Code CLI before retrying.',
|
|
137
|
+
notices: []
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const extensions = result.stdout.toLowerCase().split(/\r?\n/);
|
|
141
|
+
const installed = extensions.some((id) => id === 'github.copilot' || id === 'github.copilot-chat');
|
|
142
|
+
return installed
|
|
143
|
+
? {
|
|
144
|
+
requirement,
|
|
145
|
+
state: 'ready',
|
|
146
|
+
detail: 'GitHub Copilot is installed as a VS Code extension.',
|
|
147
|
+
detectedBy: 'code --list-extensions',
|
|
148
|
+
notices: [{
|
|
149
|
+
label: 'GitHub Copilot authentication',
|
|
150
|
+
state: 'not-observable',
|
|
151
|
+
detail: 'Authentication is managed by the selected editor or agent.',
|
|
152
|
+
remedy: 'Open GitHub Copilot and sign in if prompted.'
|
|
153
|
+
}]
|
|
154
|
+
}
|
|
155
|
+
: missingResult(requirement, 'GitHub Copilot CLI and supported VS Code extensions were not found.');
|
|
156
|
+
}
|
|
157
|
+
function classifyVersion(requirement, command, result) {
|
|
158
|
+
if (result.timedOut) {
|
|
159
|
+
return {
|
|
160
|
+
requirement,
|
|
161
|
+
state: 'unhealthy',
|
|
162
|
+
detail: `${command.executable} version probe timed out.`,
|
|
163
|
+
remedy: `Repair ${requirement.definition.label} and retry.`,
|
|
164
|
+
notices: []
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
if (result.status !== 0) {
|
|
168
|
+
return {
|
|
169
|
+
requirement,
|
|
170
|
+
state: 'unhealthy',
|
|
171
|
+
detail: result.stderr.trim() || result.errorMessage || `${command.executable} exited with status ${result.status}.`,
|
|
172
|
+
remedy: `Repair ${requirement.definition.label} and retry.`,
|
|
173
|
+
notices: []
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
const output = `${result.stdout}\n${result.stderr}`.trim();
|
|
177
|
+
const version = extractVersion(output);
|
|
178
|
+
if ((requirement.minimumVersion || requirement.exactVersion) && !version) {
|
|
179
|
+
return {
|
|
180
|
+
requirement,
|
|
181
|
+
state: 'unhealthy',
|
|
182
|
+
detail: `Unable to parse a version from: ${output || '(empty output)'}`,
|
|
183
|
+
remedy: `Verify ${requirement.definition.label} manually and reinstall it if necessary.`,
|
|
184
|
+
notices: []
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
if (version && requirement.exactVersion && compareVersions(version, requirement.exactVersion) !== 0) {
|
|
188
|
+
return {
|
|
189
|
+
requirement,
|
|
190
|
+
state: 'outdated',
|
|
191
|
+
detail: `Found ${version}; Liftoff tested this integration with exactly ${requirement.exactVersion}.`,
|
|
192
|
+
detectedVersion: version,
|
|
193
|
+
detectedBy: command.executable,
|
|
194
|
+
remedy: `Install ${requirement.definition.label} ${requirement.exactVersion}.`,
|
|
195
|
+
notices: []
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
if (version && requirement.minimumVersion && compareVersions(version, requirement.minimumVersion) < 0) {
|
|
199
|
+
return {
|
|
200
|
+
requirement,
|
|
201
|
+
state: 'outdated',
|
|
202
|
+
detail: `Found ${version}; version ${requirement.minimumVersion} or newer is required.`,
|
|
203
|
+
detectedVersion: version,
|
|
204
|
+
detectedBy: command.executable,
|
|
205
|
+
remedy: `Upgrade ${requirement.definition.label} to ${requirement.minimumVersion} or newer.`,
|
|
206
|
+
notices: []
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
requirement,
|
|
211
|
+
state: 'ready',
|
|
212
|
+
detail: version ? `Version ${version}` : 'Available',
|
|
213
|
+
...(version ? { detectedVersion: version } : {}),
|
|
214
|
+
detectedBy: command.executable,
|
|
215
|
+
notices: []
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
async function healthNotices(requirement, runner, options) {
|
|
219
|
+
let command;
|
|
220
|
+
let label;
|
|
221
|
+
let remedy;
|
|
222
|
+
switch (requirement.id) {
|
|
223
|
+
case 'docker':
|
|
224
|
+
command = { executable: 'docker', args: ['info', '--format', '{{.ServerVersion}}'] };
|
|
225
|
+
label = 'Docker daemon';
|
|
226
|
+
remedy = 'Start Docker Desktop or the Docker daemon.';
|
|
227
|
+
break;
|
|
228
|
+
case 'azure-cli':
|
|
229
|
+
command = { executable: 'az', args: ['account', 'show', '--output', 'none', '--only-show-errors'] };
|
|
230
|
+
label = 'Azure authentication';
|
|
231
|
+
remedy = 'Run `az login`.';
|
|
232
|
+
break;
|
|
233
|
+
case 'claude':
|
|
234
|
+
command = { executable: 'claude', args: ['doctor'] };
|
|
235
|
+
label = 'Claude Code doctor';
|
|
236
|
+
remedy = 'Run `claude doctor` and resolve the reported setup or authentication issue.';
|
|
237
|
+
break;
|
|
238
|
+
case 'github-copilot':
|
|
239
|
+
return [{
|
|
240
|
+
label: 'GitHub Copilot authentication',
|
|
241
|
+
state: 'not-observable',
|
|
242
|
+
detail: 'Liftoff does not automate or persist Copilot credentials.',
|
|
243
|
+
remedy: 'Run `copilot` and sign in if prompted.'
|
|
244
|
+
}];
|
|
245
|
+
default:
|
|
246
|
+
return [];
|
|
247
|
+
}
|
|
248
|
+
const result = await runner.run(command, { timeoutMs: 20_000, ...options });
|
|
249
|
+
if (result.status === 0) {
|
|
250
|
+
return [{ label, state: 'ready', detail: result.stdout.trim().split(/\r?\n/)[0] || 'Healthy' }];
|
|
251
|
+
}
|
|
252
|
+
return [{
|
|
253
|
+
label,
|
|
254
|
+
state: 'unhealthy',
|
|
255
|
+
detail: result.timedOut ? 'Health probe timed out.' : result.stderr.trim().split(/\r?\n/)[0] || 'Health probe failed.',
|
|
256
|
+
remedy
|
|
257
|
+
}];
|
|
258
|
+
}
|
|
259
|
+
export async function probeRequirement(requirement, runner, options = {}) {
|
|
260
|
+
const candidates = await probeCommandCandidates(requirement, runner, options);
|
|
261
|
+
if (candidates.length === 0) {
|
|
262
|
+
return requirement.id === 'github-copilot'
|
|
263
|
+
? copilotFallback(requirement, runner, options)
|
|
264
|
+
: missingResult(requirement);
|
|
265
|
+
}
|
|
266
|
+
const classified = candidates.map((candidate) => classifyVersion(requirement, candidate.command, candidate));
|
|
267
|
+
const ready = classified.find((result) => result.state === 'ready');
|
|
268
|
+
if (ready) {
|
|
269
|
+
ready.notices = await healthNotices(requirement, runner, options);
|
|
270
|
+
return ready;
|
|
271
|
+
}
|
|
272
|
+
if (requirement.id === 'github-copilot') {
|
|
273
|
+
const fallback = await copilotFallback(requirement, runner, options);
|
|
274
|
+
if (fallback.state === 'ready') {
|
|
275
|
+
return fallback;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return classified.find((result) => result.state === 'outdated') ?? classified[0];
|
|
279
|
+
}
|
|
280
|
+
export async function probeWorkstation(requirements, runner, options = {}) {
|
|
281
|
+
return Promise.all(requirements.map((requirement) => probeRequirement(requirement, runner, options)));
|
|
282
|
+
}
|
|
283
|
+
export function parseLinuxFamily(osRelease) {
|
|
284
|
+
const values = Object.fromEntries(osRelease.split(/\r?\n/).flatMap((line) => {
|
|
285
|
+
const match = line.match(/^([A-Z_]+)=(.*)$/);
|
|
286
|
+
return match ? [[match[1], match[2].replace(/^"|"$/g, '').toLowerCase()]] : [];
|
|
287
|
+
}));
|
|
288
|
+
const identity = `${values.ID ?? ''} ${values.ID_LIKE ?? ''}`;
|
|
289
|
+
if (/\b(debian|ubuntu|mint)\b/.test(identity)) {
|
|
290
|
+
return 'debian';
|
|
291
|
+
}
|
|
292
|
+
if (/\b(fedora|rhel|centos|rocky|alma)\b/.test(identity)) {
|
|
293
|
+
return 'fedora';
|
|
294
|
+
}
|
|
295
|
+
if (/\b(arch|manjaro)\b/.test(identity)) {
|
|
296
|
+
return 'arch';
|
|
297
|
+
}
|
|
298
|
+
return 'unknown';
|
|
299
|
+
}
|
|
300
|
+
export async function detectHostEnvironment(platform = process.platform, osReleasePath = '/etc/os-release') {
|
|
301
|
+
if (platform === 'darwin' || platform === 'win32') {
|
|
302
|
+
return { platform, linuxFamily: 'unknown' };
|
|
303
|
+
}
|
|
304
|
+
let osRelease = '';
|
|
305
|
+
try {
|
|
306
|
+
osRelease = await readFile(osReleasePath, 'utf8');
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
// The exact distribution is optional; unknown still yields a safe manual remedy.
|
|
310
|
+
}
|
|
311
|
+
return { platform: 'linux', linuxFamily: parseLinuxFamily(osRelease) };
|
|
312
|
+
}
|
|
313
|
+
function installRecipe(requirement, host) {
|
|
314
|
+
const recipe = requirement.definition.install[host.platform];
|
|
315
|
+
if (host.platform !== 'linux') {
|
|
316
|
+
return recipe;
|
|
317
|
+
}
|
|
318
|
+
return recipe && (recipe.manager === 'npm' || recipe.manager === 'uv') ? recipe : undefined;
|
|
319
|
+
}
|
|
320
|
+
async function managerAvailable(recipe, runner, options) {
|
|
321
|
+
const result = await runner.run({ executable: recipe.command.executable, args: ['--version'] }, { timeoutMs: 10_000, ...options });
|
|
322
|
+
return !commandMissing(result) && result.status === 0;
|
|
323
|
+
}
|
|
324
|
+
function pathRemedy(recipe, requirement) {
|
|
325
|
+
const executable = requirement.definition.probes[0]?.executable ?? requirement.id;
|
|
326
|
+
switch (recipe.manager) {
|
|
327
|
+
case 'brew':
|
|
328
|
+
return `Run \`brew --prefix\`, ensure its bin directory is on PATH, open a new terminal, then retry ${executable}.`;
|
|
329
|
+
case 'winget':
|
|
330
|
+
return `Open a new terminal and retry ${executable}; if it is still missing, inspect the WinGet package installation and PATH aliases.`;
|
|
331
|
+
case 'npm':
|
|
332
|
+
return `Run \`npm prefix -g\`, add that installation's bin directory to PATH, open a new terminal, then retry ${executable}.`;
|
|
333
|
+
case 'uv':
|
|
334
|
+
return `Run \`uv tool dir --bin\`, add that directory to PATH, open a new terminal, then retry ${executable}.`;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
async function documentedInstallLocations(recipe, requirement, context) {
|
|
338
|
+
let binDirectories = [];
|
|
339
|
+
if (recipe.manager === 'winget') {
|
|
340
|
+
if (process.env.LOCALAPPDATA) {
|
|
341
|
+
binDirectories = [path.join(process.env.LOCALAPPDATA, 'Microsoft', 'WindowsApps')];
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
const locationCommand = recipe.manager === 'npm'
|
|
346
|
+
? { executable: recipe.command.executable, args: ['prefix', '-g'] }
|
|
347
|
+
: recipe.manager === 'uv'
|
|
348
|
+
? { executable: recipe.command.executable, args: ['tool', 'dir', '--bin'] }
|
|
349
|
+
: { executable: recipe.command.executable, args: ['--prefix'] };
|
|
350
|
+
const location = await context.runner.run(locationCommand, {
|
|
351
|
+
cwd: context.cwd,
|
|
352
|
+
timeoutMs: 10_000
|
|
353
|
+
});
|
|
354
|
+
if (location.status === 0 && location.stdout.trim()) {
|
|
355
|
+
const root = location.stdout.trim().split(/\r?\n/)[0];
|
|
356
|
+
binDirectories = recipe.manager === 'npm' && context.host.platform !== 'win32'
|
|
357
|
+
? [path.join(root, 'bin')]
|
|
358
|
+
: recipe.manager === 'brew'
|
|
359
|
+
? [path.join(root, 'bin')]
|
|
360
|
+
: [root];
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
const extensions = context.host.platform === 'win32' ? ['', '.exe', '.cmd', '.bat'] : [''];
|
|
364
|
+
const candidates = new Set();
|
|
365
|
+
for (const directory of binDirectories) {
|
|
366
|
+
for (const probe of requirement.definition.probes) {
|
|
367
|
+
for (const extension of extensions) {
|
|
368
|
+
candidates.add(path.join(directory, `${probe.executable}${extension}`));
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
const found = [];
|
|
373
|
+
for (const candidate of candidates) {
|
|
374
|
+
try {
|
|
375
|
+
await access(candidate);
|
|
376
|
+
found.push(candidate);
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
// Candidate locations are best-effort diagnostics after a successful installer.
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return found;
|
|
383
|
+
}
|
|
384
|
+
function manualRemedy(requirement, host) {
|
|
385
|
+
return host.platform === 'linux'
|
|
386
|
+
? requirement.definition.linuxRemedies[host.linuxFamily]
|
|
387
|
+
: `Install ${requirement.definition.label} manually and retry.`;
|
|
388
|
+
}
|
|
389
|
+
export async function installRequirement(requirement, currentProbe, context) {
|
|
390
|
+
if (!context.authorized) {
|
|
391
|
+
return {
|
|
392
|
+
requirement,
|
|
393
|
+
state: 'declined',
|
|
394
|
+
detail: 'Installation was not authorized.',
|
|
395
|
+
probe: currentProbe,
|
|
396
|
+
remedy: currentProbe.remedy
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
const recipe = installRecipe(requirement, context.host);
|
|
400
|
+
if (!recipe) {
|
|
401
|
+
return {
|
|
402
|
+
requirement,
|
|
403
|
+
state: 'manual',
|
|
404
|
+
detail: `Liftoff does not automate ${requirement.definition.label} installation on this host.`,
|
|
405
|
+
probe: currentProbe,
|
|
406
|
+
remedy: manualRemedy(requirement, context.host)
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
if (!await managerAvailable(recipe, context.runner, { cwd: context.cwd })) {
|
|
410
|
+
return {
|
|
411
|
+
requirement,
|
|
412
|
+
state: 'manual',
|
|
413
|
+
detail: `${recipe.manager} is unavailable and Liftoff does not bootstrap package managers.`,
|
|
414
|
+
probe: currentProbe,
|
|
415
|
+
remedy: `Install ${recipe.manager} through its official instructions, then retry.`
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
const result = await context.runner.run(recipe.command, {
|
|
419
|
+
cwd: context.cwd,
|
|
420
|
+
timeoutMs: 10 * 60_000,
|
|
421
|
+
stream: true,
|
|
422
|
+
...context.streamOptions
|
|
423
|
+
});
|
|
424
|
+
if (result.status !== 0 || result.timedOut) {
|
|
425
|
+
return {
|
|
426
|
+
requirement,
|
|
427
|
+
state: 'failed',
|
|
428
|
+
detail: result.timedOut
|
|
429
|
+
? `${requirement.definition.label} installation timed out.`
|
|
430
|
+
: result.stderr.trim().split(/\r?\n/)[0] || `Installer exited with status ${result.status}.`,
|
|
431
|
+
command: result.displayCommand,
|
|
432
|
+
probe: currentProbe,
|
|
433
|
+
remedy: manualRemedy(requirement, context.host)
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
const nextProbe = await probeRequirement(requirement, context.runner, { cwd: context.cwd });
|
|
437
|
+
if (nextProbe.state !== 'ready') {
|
|
438
|
+
const foundLocations = await documentedInstallLocations(recipe, requirement, context);
|
|
439
|
+
return {
|
|
440
|
+
requirement,
|
|
441
|
+
state: 'restart-required',
|
|
442
|
+
detail: foundLocations.length > 0
|
|
443
|
+
? `The installer succeeded and wrote ${foundLocations.join(', ')}, but the command is not ready on PATH in this process.`
|
|
444
|
+
: 'The installer succeeded, but the required command is not ready in this process after checking its documented install location.',
|
|
445
|
+
command: result.displayCommand,
|
|
446
|
+
probe: nextProbe,
|
|
447
|
+
remedy: pathRemedy(recipe, requirement)
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
requirement,
|
|
452
|
+
state: 'installed',
|
|
453
|
+
detail: `${requirement.definition.label} is ready.`,
|
|
454
|
+
command: result.displayCommand,
|
|
455
|
+
probe: nextProbe
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
export function blockingReadinessFailures(results) {
|
|
459
|
+
return results.filter((result) => result.requirement.severity === 'blocking' && result.state !== 'ready');
|
|
460
|
+
}
|
|
461
|
+
//# sourceMappingURL=workstation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workstation.js","sourceRoot":"","sources":["../src/workstation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@msn-control/liftoff",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Mission Control Liftoff CLI for scaffolding governed GenAI and standard API applications.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "GPL-3.0-only",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
},
|
|
31
31
|
"files": [
|
|
32
32
|
"dist",
|
|
33
|
+
"assets/locks",
|
|
33
34
|
"README.md",
|
|
34
35
|
"LICENSE"
|
|
35
36
|
],
|
|
@@ -46,11 +47,16 @@
|
|
|
46
47
|
"check": "npm run build && npm test"
|
|
47
48
|
},
|
|
48
49
|
"engines": {
|
|
49
|
-
"node": ">=20"
|
|
50
|
+
"node": ">=20.19"
|
|
50
51
|
},
|
|
51
52
|
"devDependencies": {
|
|
53
|
+
"@types/cross-spawn": "^6.0.6",
|
|
52
54
|
"@types/node": "^20.14.10",
|
|
53
55
|
"typescript": "^7.0.2",
|
|
54
56
|
"vitest": "^4.1.9"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"cross-spawn": "^7.0.6",
|
|
60
|
+
"picocolors": "^1.1.1"
|
|
55
61
|
}
|
|
56
62
|
}
|