@msn-control/liftoff 0.3.4 → 0.4.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 (62) hide show
  1. package/README.md +55 -37
  2. package/assets/locks/frontend/package-lock.json +2217 -0
  3. package/assets/locks/frontend/package.json +19 -0
  4. package/assets/locks/node-backend/package-lock.json +4352 -0
  5. package/assets/locks/node-backend/package.json +32 -0
  6. package/dist/args.d.ts +9 -1
  7. package/dist/args.js +110 -33
  8. package/dist/args.js.map +1 -1
  9. package/dist/catalogs.d.ts +10 -1
  10. package/dist/catalogs.js +89 -0
  11. package/dist/catalogs.js.map +1 -1
  12. package/dist/cli.js +5 -0
  13. package/dist/cli.js.map +1 -1
  14. package/dist/commands.d.ts +5 -0
  15. package/dist/commands.js +599 -115
  16. package/dist/commands.js.map +1 -1
  17. package/dist/file-system.js +89 -5
  18. package/dist/file-system.js.map +1 -1
  19. package/dist/framework-adapters.d.ts +15 -0
  20. package/dist/framework-adapters.js +112 -0
  21. package/dist/framework-adapters.js.map +1 -0
  22. package/dist/framework-validation.d.ts +8 -0
  23. package/dist/framework-validation.js +83 -0
  24. package/dist/framework-validation.js.map +1 -0
  25. package/dist/init-filesystem.d.ts +102 -0
  26. package/dist/init-filesystem.js +762 -0
  27. package/dist/init-filesystem.js.map +1 -0
  28. package/dist/interactive.d.ts +5 -1
  29. package/dist/interactive.js +75 -4
  30. package/dist/interactive.js.map +1 -1
  31. package/dist/npm-template-assets.d.ts +3 -0
  32. package/dist/npm-template-assets.js +32 -0
  33. package/dist/npm-template-assets.js.map +1 -0
  34. package/dist/planner.js +62 -3
  35. package/dist/planner.js.map +1 -1
  36. package/dist/process-runner.d.ts +28 -0
  37. package/dist/process-runner.js +80 -0
  38. package/dist/process-runner.js.map +1 -0
  39. package/dist/project-dependencies.d.ts +28 -0
  40. package/dist/project-dependencies.js +163 -0
  41. package/dist/project-dependencies.js.map +1 -0
  42. package/dist/reconcile.js +4 -1
  43. package/dist/reconcile.js.map +1 -1
  44. package/dist/runtime.d.ts +2 -0
  45. package/dist/runtime.js +9 -0
  46. package/dist/runtime.js.map +1 -0
  47. package/dist/standard-templates.js +3 -30
  48. package/dist/standard-templates.js.map +1 -1
  49. package/dist/templates.d.ts +9 -1
  50. package/dist/templates.js +110 -46
  51. package/dist/templates.js.map +1 -1
  52. package/dist/terminal.d.ts +32 -0
  53. package/dist/terminal.js +182 -0
  54. package/dist/terminal.js.map +1 -0
  55. package/dist/types.d.ts +38 -1
  56. package/dist/workstation-catalog.d.ts +20 -0
  57. package/dist/workstation-catalog.js +122 -0
  58. package/dist/workstation-catalog.js.map +1 -0
  59. package/dist/workstation.d.ts +76 -0
  60. package/dist/workstation.js +461 -0
  61. package/dist/workstation.js.map +1 -0
  62. package/package.json +8 -2
@@ -0,0 +1,163 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { formatCommand } from './process-runner.js';
5
+ import { readProjectFile, writeProjectFile } from './file-system.js';
6
+ function npmExecutable(platform) {
7
+ return platform === 'win32' ? 'npm.cmd' : 'npm';
8
+ }
9
+ function pythonCommand(probes) {
10
+ const python = probes.find((probe) => probe.requirement.id === 'python' && probe.state === 'ready');
11
+ const executable = python?.detectedBy ?? (process.platform === 'win32' ? 'py' : 'python3');
12
+ return {
13
+ executable,
14
+ prefixArgs: executable === 'py' ? ['-3'] : []
15
+ };
16
+ }
17
+ export function buildDependencySetupPlan(plan, projectRoot, probes, platform = process.platform) {
18
+ const commands = [];
19
+ const protectedPaths = [];
20
+ if (plan.apiStack.id === 'python-fastapi') {
21
+ const python = pythonCommand(probes);
22
+ const virtualPython = platform === 'win32'
23
+ ? path.join(projectRoot, '.venv', 'Scripts', 'python.exe')
24
+ : path.join(projectRoot, '.venv', 'bin', 'python');
25
+ commands.push({
26
+ id: 'python-venv',
27
+ label: 'Create project Python virtual environment',
28
+ command: {
29
+ executable: python.executable,
30
+ args: [...python.prefixArgs, '-m', 'venv', '.venv']
31
+ },
32
+ cwd: projectRoot
33
+ }, {
34
+ id: 'python-backend',
35
+ label: 'Install backend Python dependencies',
36
+ command: {
37
+ executable: virtualPython,
38
+ args: ['-m', 'pip', 'install', '-e', './backend[test]']
39
+ },
40
+ cwd: projectRoot
41
+ });
42
+ protectedPaths.push(['backend', 'pyproject.toml']);
43
+ if (plan.projectType.id === 'genai' && plan.pattern?.worker) {
44
+ const requirements = ['functions', `${plan.pattern.id}-worker`, 'requirements.txt'];
45
+ commands.push({
46
+ id: 'python-function-worker',
47
+ label: 'Install Function worker Python dependencies',
48
+ command: {
49
+ executable: virtualPython,
50
+ args: ['-m', 'pip', 'install', '-r', requirements.join('/')]
51
+ },
52
+ cwd: projectRoot
53
+ });
54
+ protectedPaths.push(requirements);
55
+ }
56
+ }
57
+ else if (plan.apiStack.id === 'node-fastify') {
58
+ commands.push({
59
+ id: 'node-backend',
60
+ label: 'Install backend Node.js dependencies',
61
+ command: { executable: npmExecutable(platform), args: ['ci'] },
62
+ cwd: path.join(projectRoot, 'backend')
63
+ });
64
+ protectedPaths.push(['backend', 'package.json'], ['backend', 'package-lock.json']);
65
+ }
66
+ else {
67
+ commands.push({
68
+ id: 'go-backend',
69
+ label: 'Download backend Go modules',
70
+ command: { executable: 'go', args: ['mod', 'download'] },
71
+ cwd: path.join(projectRoot, 'backend')
72
+ });
73
+ protectedPaths.push(['backend', 'go.mod'], ['backend', 'go.sum']);
74
+ }
75
+ if (plan.includeFrontend) {
76
+ commands.push({
77
+ id: 'node-frontend',
78
+ label: 'Install frontend Node.js dependencies',
79
+ command: { executable: npmExecutable(platform), args: ['ci'] },
80
+ cwd: path.join(projectRoot, 'frontend')
81
+ });
82
+ protectedPaths.push(['frontend', 'package.json'], ['frontend', 'package-lock.json']);
83
+ }
84
+ return { commands, protectedPaths };
85
+ }
86
+ function contentHash(content) {
87
+ return createHash('sha256').update(content).digest('hex');
88
+ }
89
+ async function captureProtectedFiles(projectRoot, protectedPaths) {
90
+ const snapshots = [];
91
+ for (const pathParts of protectedPaths) {
92
+ const content = await readProjectFile(projectRoot, pathParts);
93
+ if (!content) {
94
+ throw new Error(`Dependency setup cannot protect missing file ${pathParts.join('/')}.`);
95
+ }
96
+ snapshots.push({ pathParts, content, hash: contentHash(content) });
97
+ }
98
+ return snapshots;
99
+ }
100
+ async function restoreMutations(projectRoot, snapshots) {
101
+ const restored = [];
102
+ for (const snapshot of snapshots) {
103
+ const current = await readProjectFile(projectRoot, snapshot.pathParts);
104
+ if (!current || contentHash(current) !== snapshot.hash) {
105
+ await writeProjectFile(projectRoot, snapshot.pathParts, snapshot.content.toString('utf8'));
106
+ restored.push(snapshot.pathParts.join('/'));
107
+ }
108
+ }
109
+ return restored;
110
+ }
111
+ export function dependencyResumeCommand(command, platform = process.platform) {
112
+ const changeDirectory = platform === 'win32'
113
+ ? `cd /d ${JSON.stringify(command.cwd)}`
114
+ : `cd ${JSON.stringify(command.cwd)}`;
115
+ return `${changeDirectory} && ${formatCommand(command.command)}`;
116
+ }
117
+ export async function runDependencySetup(setup, projectRoot, runner, streams) {
118
+ const snapshots = await captureProtectedFiles(projectRoot, setup.protectedPaths);
119
+ const completed = [];
120
+ for (const command of setup.commands) {
121
+ const result = await runner.run(command.command, {
122
+ cwd: command.cwd,
123
+ timeoutMs: 15 * 60_000,
124
+ stream: true,
125
+ stdout: streams.stdout,
126
+ stderr: streams.stderr
127
+ });
128
+ if (result.status !== 0 || result.timedOut) {
129
+ const restoredMutations = await restoreMutations(projectRoot, snapshots);
130
+ return {
131
+ success: false,
132
+ completed,
133
+ failed: command,
134
+ detail: result.timedOut
135
+ ? 'dependency command timed out'
136
+ : result.stderr.trim().split(/\r?\n/)[0] || `exit status ${result.status}`,
137
+ restoredMutations,
138
+ resumeCommand: dependencyResumeCommand(command)
139
+ };
140
+ }
141
+ completed.push(command);
142
+ const restoredMutations = await restoreMutations(projectRoot, snapshots);
143
+ if (restoredMutations.length > 0) {
144
+ return {
145
+ success: false,
146
+ completed,
147
+ failed: command,
148
+ detail: `dependency command modified protected files: ${restoredMutations.join(', ')}`,
149
+ restoredMutations,
150
+ resumeCommand: dependencyResumeCommand(command)
151
+ };
152
+ }
153
+ }
154
+ return { success: true, completed, restoredMutations: [] };
155
+ }
156
+ export async function verifyDependencyLockPair(packagePath, lockPath) {
157
+ const [packageJson, lockJson] = await Promise.all([
158
+ readFile(packagePath, 'utf8').then((value) => JSON.parse(value)),
159
+ readFile(lockPath, 'utf8').then((value) => JSON.parse(value))
160
+ ]);
161
+ return packageJson.name === lockJson.name && packageJson.name === lockJson.packages?.['']?.name;
162
+ }
163
+ //# sourceMappingURL=project-dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-dependencies.js","sourceRoot":"","sources":["../src/project-dependencies.ts"],"names":[],"mappings":"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"}
package/dist/reconcile.js CHANGED
@@ -13,7 +13,10 @@ export async function reconcileProject(manifest, render, projectRoot) {
13
13
  // the manifest is rewritten wholesale on apply; liftoff.config.json is user-owned
14
14
  // desired state; seed content is gifted once and follows its own lifecycle -
15
15
  // none of them are reconciled
16
- if (artifact.logicalName === 'manifest' || artifact.logicalName === 'liftoff-config' || artifact.category === 'seed') {
16
+ if (artifact.logicalName === 'manifest' ||
17
+ artifact.logicalName === 'liftoff-config' ||
18
+ artifact.category === 'seed' ||
19
+ artifact.category === 'framework') {
17
20
  continue;
18
21
  }
19
22
  const renderHash = hashBytes(artifact.content);
@@ -1 +1 @@
1
- {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const minimumNodeVersion = "20.19.0";
2
+ export declare function nodeRuntimeError(observedVersion?: string): string | undefined;
@@ -0,0 +1,9 @@
1
+ import { compareSemver } from './semver.js';
2
+ export const minimumNodeVersion = '20.19.0';
3
+ export function nodeRuntimeError(observedVersion = process.versions.node) {
4
+ if (compareSemver(observedVersion, minimumNodeVersion) >= 0) {
5
+ return undefined;
6
+ }
7
+ return `Liftoff requires Node.js ${minimumNodeVersion} or newer; found ${observedVersion}. Upgrade Node.js before retrying.`;
8
+ }
9
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAE5C,MAAM,UAAU,gBAAgB,CAAC,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI;IACtE,IAAI,aAAa,CAAC,eAAe,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,4BAA4B,kBAAkB,oBAAoB,eAAe,oCAAoC,CAAC;AAC/H,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { renderNpmLock, renderNpmPackage } from './npm-template-assets.js';
1
2
  const stackBuilders = {
2
3
  'python-fastapi': addPythonArtifacts,
3
4
  'node-fastify': addNodeArtifacts,
@@ -328,6 +329,7 @@ def downgrade():
328
329
  }
329
330
  function addNodeArtifacts(add, plan) {
330
331
  add('node-backend-package', 'backend', ['backend', 'package.json'], renderNodePackage(plan));
332
+ add('node-backend-lock', 'backend', ['backend', 'package-lock.json'], renderNpmLock('node-backend', `${plan.safeProjectName}-backend`));
331
333
  add('node-backend-tsconfig', 'backend', ['backend', 'tsconfig.json'], renderNodeTsconfig());
332
334
  add('node-backend-drizzle-config', 'backend', ['backend', 'drizzle.config.ts'], renderNodeDrizzleConfig());
333
335
  add('node-backend-config', 'backend', ['backend', 'src', 'config.ts'], renderNodeConfig(plan));
@@ -342,36 +344,7 @@ function addNodeArtifacts(add, plan) {
342
344
  add('database-schema', 'database', ['database', 'models', 'schema.sql'], renderStandardSchema(plan));
343
345
  }
344
346
  function renderNodePackage(plan) {
345
- return JSON.stringify({
346
- name: `${plan.safeProjectName}-backend`,
347
- version: '0.1.0',
348
- private: true,
349
- type: 'module',
350
- engines: { node: '>=20' },
351
- scripts: {
352
- dev: 'tsx watch src/server.ts',
353
- build: 'tsc -p tsconfig.json',
354
- start: 'node dist/server.js',
355
- test: 'vitest run',
356
- 'db:generate': 'drizzle-kit generate',
357
- 'db:migrate': 'drizzle-kit migrate'
358
- },
359
- dependencies: {
360
- '@fastify/cors': '^10.0.1',
361
- '@fastify/swagger': '^9.4.0',
362
- 'drizzle-orm': '^0.44.0',
363
- fastify: '^5.4.0',
364
- pg: '^8.16.0'
365
- },
366
- devDependencies: {
367
- '@types/node': '^20.14.10',
368
- '@types/pg': '^8.15.0',
369
- 'drizzle-kit': '^0.31.0',
370
- tsx: '^4.20.0',
371
- typescript: '^5.5.4',
372
- vitest: '^4.1.9'
373
- }
374
- }, null, 2);
347
+ return renderNpmPackage('node-backend', `${plan.safeProjectName}-backend`);
375
348
  }
376
349
  function renderNodeTsconfig() {
377
350
  return JSON.stringify({
@@ -1 +1 @@
1
- {"version":3,"file":"standard-templates.js","sourceRoot":"","sources":["../src/standard-templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standard-templates.js","sourceRoot":"","sources":["../src/standard-templates.ts"],"names":[],"mappings":"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"}
@@ -18,4 +18,12 @@ export declare const AZURE_NAME_LIMITS: {
18
18
  export type AzureResourceNames = Record<keyof typeof AZURE_NAME_LIMITS, string>;
19
19
  export declare function buildAzureResourceNames(plan: ProjectPlan, environment: string, resourceSuffix: string): AzureResourceNames;
20
20
  export declare function buildArtifacts(plan: ProjectPlan): GeneratedArtifact[];
21
- export declare function buildManifest(plan: ProjectPlan, artifacts: GeneratedArtifact[]): LiftoffManifest;
21
+ export declare function partitionGeneratedArtifacts(artifacts: GeneratedArtifact[]): {
22
+ durable: GeneratedArtifact[];
23
+ framework: GeneratedArtifact[];
24
+ seed: GeneratedArtifact[];
25
+ manifest: GeneratedArtifact;
26
+ };
27
+ export declare function buildManifest(plan: ProjectPlan, artifacts: GeneratedArtifact[], options?: {
28
+ frameworkState?: 'initialized' | 'legacy';
29
+ }): LiftoffManifest;
package/dist/templates.js CHANGED
@@ -2,6 +2,9 @@ import { createHash } from 'node:crypto';
2
2
  import { addGenAiExtensionArtifacts } from './genai-templates.js';
3
3
  import { addStandardStackArtifacts, renderStandardDockerfile, renderStandardEnv } from './standard-templates.js';
4
4
  import { liftoffVersion } from './version.js';
5
+ import { renderNpmLock, renderNpmPackage } from './npm-template-assets.js';
6
+ import { formatCommand } from './process-runner.js';
7
+ import { workstationRequirementCatalog } from './workstation-catalog.js';
5
8
  const contentHash = (content) => `sha256:${createHash('sha256').update(content, 'utf8').digest('hex')}`;
6
9
  const DEFAULT_FUNCTION_WORKER_QUEUE_NAME = 'events';
7
10
  export const AZURE_NAME_LIMITS = {
@@ -93,9 +96,23 @@ export function buildArtifacts(plan) {
93
96
  });
94
97
  return artifacts;
95
98
  }
96
- export function buildManifest(plan, artifacts) {
99
+ export function partitionGeneratedArtifacts(artifacts) {
100
+ const manifest = artifacts.find((artifact) => artifact.logicalName === 'manifest');
101
+ if (!manifest) {
102
+ throw new Error('Generated artifacts are missing the Liftoff manifest.');
103
+ }
104
+ return {
105
+ durable: artifacts.filter((artifact) => artifact.logicalName !== 'manifest' && artifact.category !== 'seed' && artifact.category !== 'framework'),
106
+ framework: artifacts.filter((artifact) => artifact.category === 'framework'),
107
+ seed: artifacts.filter((artifact) => artifact.category === 'seed'),
108
+ manifest
109
+ };
110
+ }
111
+ export function buildManifest(plan, artifacts, options = {}) {
112
+ const frameworkState = options.frameworkState ?? 'initialized';
113
+ const agents = frameworkState === 'initialized' ? plan.agents.map((agent) => agent.id) : [];
97
114
  return {
98
- artifactVersion: 2,
115
+ artifactVersion: 3,
99
116
  generatedBy: 'Mission Control Liftoff',
100
117
  liftoffVersion,
101
118
  project: {
@@ -107,10 +124,17 @@ export function buildManifest(plan, artifacts) {
107
124
  region: plan.region.slug,
108
125
  frontend: plan.includeFrontend,
109
126
  specWorkflow: plan.specWorkflow.id,
127
+ agents,
128
+ ...(frameworkState === 'initialized' && plan.defaultAgent ? { defaultAgent: plan.defaultAgent.id } : {}),
110
129
  environments: plan.environments.map((environment) => environment.id)
111
130
  },
131
+ framework: {
132
+ state: frameworkState,
133
+ adapter: plan.framework.id,
134
+ ...(frameworkState === 'initialized' ? { contractVersion: plan.framework.version } : {})
135
+ },
112
136
  artifacts: artifacts
113
- .filter((artifact) => artifact.category !== 'seed') // seed content is written once, never tracked
137
+ .filter((artifact) => artifact.category !== 'seed' && artifact.category !== 'framework')
114
138
  .map((artifact) => ({
115
139
  logicalName: artifact.logicalName,
116
140
  category: artifact.category,
@@ -131,7 +155,9 @@ function addBaseArtifacts(add, plan) {
131
155
  region: plan.region.slug,
132
156
  includeFrontend: plan.includeFrontend,
133
157
  environments: plan.environments.map((environment) => environment.id),
134
- specWorkflow: plan.specWorkflow.id
158
+ specWorkflow: plan.specWorkflow.id,
159
+ agents: plan.agents.map((agent) => agent.id),
160
+ ...(plan.defaultAgent ? { defaultAgent: plan.defaultAgent.id } : {})
135
161
  }, null, 2));
136
162
  add('env-example', 'configuration', ['.env.example'], renderEnvExample(plan));
137
163
  add('backend-dockerfile', 'runtime', ['Dockerfile'], plan.projectType.id === 'genai' ? renderBackendDockerfile() : renderStandardDockerfile(plan));
@@ -228,22 +254,23 @@ function addInfrastructureArtifacts(add, plan) {
228
254
  function addGovernanceArtifacts(add, plan) {
229
255
  if (plan.specWorkflow.id === 'openspec') {
230
256
  const changeName = `bootstrap-${plan.safeProjectName}`;
231
- add('openspec-config', 'governance', ['openspec', 'config.yaml'], renderOpenSpecConfig(plan));
257
+ add('openspec-config', 'seed', ['openspec', 'config.yaml'], renderOpenSpecConfig(plan));
232
258
  add('openspec-seed-change-metadata', 'seed', ['openspec', 'changes', changeName, '.openspec.yaml'], 'schema: spec-driven');
233
259
  add('openspec-seed-proposal', 'seed', ['openspec', 'changes', changeName, 'proposal.md'], renderSeedProposal(plan));
234
260
  add('openspec-seed-design', 'seed', ['openspec', 'changes', changeName, 'design.md'], renderSeedDesign(plan));
235
261
  add('openspec-seed-tasks', 'seed', ['openspec', 'changes', changeName, 'tasks.md'], renderSeedTasks());
236
- add('openspec-spec-placeholder', 'governance', ['openspec', 'specs', '.gitkeep'], '');
262
+ add('openspec-spec-placeholder', 'seed', ['openspec', 'specs', '.gitkeep'], '');
237
263
  }
238
264
  else {
239
- add('spec-kit-constitution', 'governance', ['.specify', 'memory', 'constitution.md'], renderSpecKitConstitution(plan));
240
- add('spec-kit-spec-template', 'governance', ['.specify', 'templates', 'spec-template.md'], renderSpecKitSpecTemplate());
241
- add('spec-kit-plan-template', 'governance', ['.specify', 'templates', 'plan-template.md'], renderSpecKitPlanTemplate());
242
- add('specs-placeholder', 'governance', ['specs', '.gitkeep'], '');
265
+ add('spec-kit-constitution', 'seed', ['.specify', 'memory', 'constitution.md'], renderSpecKitConstitution(plan));
266
+ add('spec-kit-spec-template', 'framework', ['.specify', 'templates', 'spec-template.md'], renderSpecKitSpecTemplate());
267
+ add('spec-kit-plan-template', 'framework', ['.specify', 'templates', 'plan-template.md'], renderSpecKitPlanTemplate());
268
+ add('specs-placeholder', 'seed', ['specs', '.gitkeep'], '');
243
269
  }
244
270
  }
245
271
  function addFrontendArtifacts(add, plan) {
246
272
  add('frontend-package', 'frontend', ['frontend', 'package.json'], renderFrontendPackage(plan));
273
+ add('frontend-lock', 'frontend', ['frontend', 'package-lock.json'], renderNpmLock('frontend', `${plan.safeProjectName}-frontend`));
247
274
  add('frontend-index', 'frontend', ['frontend', 'index.html'], renderFrontendIndex(plan));
248
275
  add('frontend-main', 'frontend', ['frontend', 'src', 'main.ts'], renderFrontendMain());
249
276
  add('frontend-app', 'frontend', ['frontend', 'src', 'App.vue'], renderFrontendApp(plan));
@@ -256,19 +283,20 @@ function addFrontendArtifacts(add, plan) {
256
283
  function renderDirectBuildAndTestGuide(plan) {
257
284
  let backendCommands;
258
285
  if (plan.projectType.id === 'genai' || plan.apiStack.id === 'python-fastapi') {
259
- backendCommands = `python -m venv .venv
260
- . .venv/bin/activate
261
- python -m pip install -e "./backend[test]"
286
+ backendCommands = `# macOS and Linux
287
+ python3 -m venv .venv
288
+ .venv/bin/python -m pip install -e "./backend[test]"
262
289
  (cd backend && python -m pytest -q)`;
263
290
  }
264
291
  else if (plan.apiStack.id === 'node-fastify') {
265
292
  backendCommands = `cd backend
266
- npm install
293
+ npm ci
267
294
  npm run build
268
295
  npm test`;
269
296
  }
270
297
  else {
271
298
  backendCommands = `cd backend
299
+ go mod download
272
300
  go test ./...`;
273
301
  }
274
302
  const frontendCommands = plan.includeFrontend ? `
@@ -278,28 +306,86 @@ Build the frontend without a running backend:
278
306
  \`\`\`bash
279
307
  cp frontend/.env.example frontend/.env
280
308
  cd frontend
281
- npm install
309
+ npm ci
282
310
  npm run build
283
311
  \`\`\`
284
312
  ` : '';
313
+ const windowsPythonCommands = plan.projectType.id === 'genai' || plan.apiStack.id === 'python-fastapi'
314
+ ? `
315
+
316
+ Equivalent Windows dependency commands:
317
+
318
+ \`\`\`powershell
319
+ py -3 -m venv .venv
320
+ .venv\\Scripts\\python.exe -m pip install -e "./backend[test]"
321
+ \`\`\`
322
+ `
323
+ : '';
285
324
  const functionCommands = hasFunctionWorker(plan) ? `
286
325
 
287
326
  Run the Function worker unit tests from the same Python virtual environment:
288
327
 
289
328
  \`\`\`bash
290
- cd functions/${functionWorkerName(plan)}
291
- python -m pip install -r requirements.txt
292
- python -m pytest -q
329
+ .venv/bin/python -m pip install -r functions/${functionWorkerName(plan)}/requirements.txt
330
+ (cd functions/${functionWorkerName(plan)} && ../../.venv/bin/python -m pytest -q)
293
331
  \`\`\`
294
332
  ` : '';
295
- return `## Direct Build And Test
333
+ return `## Project Dependencies, Build, And Test
334
+
335
+ \`liftoff init --install-dependencies\` runs the selected stack's locked project-local dependency commands. To run or resume them manually:
296
336
 
297
337
  \`\`\`bash
298
338
  ${backendCommands}
299
339
  \`\`\`
300
340
 
301
- On Windows, activate Python virtual environments with \`.venv\\Scripts\\activate\`.
302
- ${frontendCommands}${functionCommands}`;
341
+ ${windowsPythonCommands}${frontendCommands}${functionCommands}`;
342
+ }
343
+ function renderAdvisoryReadinessGuide(plan) {
344
+ const selected = [
345
+ 'docker',
346
+ 'opentofu',
347
+ ...(plan.provider.id === 'azure' ? ['azure-cli'] : [])
348
+ ];
349
+ return selected.map((id) => {
350
+ const requirement = workstationRequirementCatalog[id];
351
+ const mac = requirement.install.darwin;
352
+ const windows = requirement.install.win32;
353
+ const commands = [
354
+ ...(mac ? [`macOS: \`${formatCommand(mac.command)}\``] : []),
355
+ ...(windows ? [`Windows: \`${formatCommand(windows.command)}\``] : []),
356
+ `Linux: ${requirement.linuxRemedies.unknown}`
357
+ ].join('; ');
358
+ const health = id === 'docker'
359
+ ? ' After installation, start Docker Desktop or the Docker daemon.'
360
+ : id === 'azure-cli'
361
+ ? ' After installation, run `az login` if authentication is not ready.'
362
+ : '';
363
+ return `- ${requirement.label}: ${commands}.${health}`;
364
+ }).join('\n');
365
+ }
366
+ function renderSpecWorkflowGuide(plan) {
367
+ const agents = plan.agents.map((agent) => `${agent.label}${plan.defaultAgent?.id === agent.id ? ' (default integration)' : ''}`).join(', ');
368
+ const ownership = plan.specWorkflow.id === 'openspec'
369
+ ? 'OpenSpec core files and the selected Copilot or Claude skill integrations'
370
+ : 'Spec Kit core files, integration state, and the selected Copilot or Claude skill integrations';
371
+ return `## Spec-Driven Workflow And Validation
372
+
373
+ - Workflow: ${plan.specWorkflow.label} ${plan.framework.version}
374
+ - AI coding agents: ${agents}
375
+ - Framework ownership: the official initializer owns ${ownership}. Liftoff validates these files but excludes framework-owned output and one-time seed content from durable manifest hashes.
376
+ - Deferred tools: advisory workstation checks may be deferred. Liftoff never claims they are installed and never installs them without \`--install-tools\`.
377
+
378
+ If \`liftoff doctor\` reports a selected advisory tool as missing, use its registered readiness remedy:
379
+
380
+ ${renderAdvisoryReadinessGuide(plan)}
381
+
382
+ Validate the scaffold and workstation after setup:
383
+
384
+ \`\`\`bash
385
+ liftoff validate
386
+ liftoff doctor
387
+ \`\`\`
388
+ `;
303
389
  }
304
390
  function renderGeneratedConfigurationGuide(plan) {
305
391
  const frontendConfiguration = plan.includeFrontend
@@ -370,9 +456,7 @@ tofu apply -var-file=environments/dev.tfvars
370
456
 
371
457
  The first apply uses a public bootstrap image. Follow \`infrastructure/opentofu/azure/README.md\` to build the generated backend in ACR and apply its image.
372
458
 
373
- ## Spec-Driven Workflow
374
-
375
- Selected workflow: ${plan.specWorkflow.label}.
459
+ ${renderSpecWorkflowGuide(plan)}
376
460
  `;
377
461
  }
378
462
  const pattern = genAiPattern(plan);
@@ -422,9 +506,7 @@ tofu apply -var-file=environments/dev.tfvars
422
506
 
423
507
  The first apply uses a public bootstrap image. Follow \`infrastructure/opentofu/azure/README.md\` to build the generated backend in ACR and apply its image.
424
508
 
425
- ## Spec-Driven Workflow
426
-
427
- Selected workflow: ${plan.specWorkflow.label}.
509
+ ${renderSpecWorkflowGuide(plan)}
428
510
  ${functionsSection}
429
511
  `;
430
512
  }
@@ -2455,25 +2537,7 @@ function renderSpecKitPlanTemplate() {
2455
2537
  `;
2456
2538
  }
2457
2539
  function renderFrontendPackage(plan) {
2458
- return JSON.stringify({
2459
- name: `${plan.safeProjectName}-frontend`,
2460
- version: '0.1.0',
2461
- private: true,
2462
- type: 'module',
2463
- scripts: {
2464
- dev: 'vite',
2465
- build: 'vite build',
2466
- preview: 'vite preview'
2467
- },
2468
- dependencies: {
2469
- '@vitejs/plugin-vue': '^5.0.5',
2470
- vite: '^5.3.1',
2471
- vue: '^3.4.29',
2472
- tailwindcss: '^3.4.4',
2473
- autoprefixer: '^10.4.19',
2474
- postcss: '^8.4.38'
2475
- }
2476
- }, null, 2);
2540
+ return renderNpmPackage('frontend', `${plan.safeProjectName}-frontend`);
2477
2541
  }
2478
2542
  function renderFrontendIndex(plan) {
2479
2543
  return `<div id="app"></div><script type="module" src="/src/main.ts"></script><title>${escapeHtml(plan.projectName)}</title>`;