@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.
Files changed (65) hide show
  1. package/README.md +82 -32
  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 +42 -1
  7. package/dist/args.js +170 -37
  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 +11 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/commands.d.ts +9 -0
  15. package/dist/commands.js +832 -227
  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 +18 -0
  20. package/dist/framework-adapters.js +115 -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 +43 -2
  29. package/dist/interactive.js +202 -91
  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.d.ts +5 -0
  35. package/dist/planner.js +87 -21
  36. package/dist/planner.js.map +1 -1
  37. package/dist/process-runner.d.ts +28 -0
  38. package/dist/process-runner.js +83 -0
  39. package/dist/process-runner.js.map +1 -0
  40. package/dist/project-dependencies.d.ts +30 -0
  41. package/dist/project-dependencies.js +164 -0
  42. package/dist/project-dependencies.js.map +1 -0
  43. package/dist/published-verifier.js +1 -1
  44. package/dist/published-verifier.js.map +1 -1
  45. package/dist/reconcile.js +4 -1
  46. package/dist/reconcile.js.map +1 -1
  47. package/dist/runtime.d.ts +2 -0
  48. package/dist/runtime.js +9 -0
  49. package/dist/runtime.js.map +1 -0
  50. package/dist/standard-templates.js +3 -30
  51. package/dist/standard-templates.js.map +1 -1
  52. package/dist/templates.d.ts +9 -1
  53. package/dist/templates.js +110 -46
  54. package/dist/templates.js.map +1 -1
  55. package/dist/terminal.d.ts +128 -0
  56. package/dist/terminal.js +598 -0
  57. package/dist/terminal.js.map +1 -0
  58. package/dist/types.d.ts +38 -1
  59. package/dist/workstation-catalog.d.ts +20 -0
  60. package/dist/workstation-catalog.js +122 -0
  61. package/dist/workstation-catalog.js.map +1 -0
  62. package/dist/workstation.d.ts +76 -0
  63. package/dist/workstation.js +461 -0
  64. package/dist/workstation.js.map +1 -0
  65. package/package.json +8 -2
package/dist/types.d.ts CHANGED
@@ -2,6 +2,7 @@ export type PatternId = 'rag' | 'chatbot' | 'agent' | 'prompt' | 'multi-agent' |
2
2
  export type ProviderId = 'azure' | 'aws' | 'gcp';
3
3
  export type ProviderStatus = 'available' | 'planned';
4
4
  export type SpecWorkflowId = 'openspec' | 'spec-kit';
5
+ export type CodingAgentId = 'github-copilot' | 'claude';
5
6
  export type EnvironmentId = 'dev' | 'test' | 'prod';
6
7
  export type ScaffoldStatus = 'full' | 'foundation' | 'integration-shell';
7
8
  export type ProjectTypeId = 'genai' | 'standard';
@@ -55,6 +56,27 @@ export interface SpecWorkflowDefinition {
55
56
  default: boolean;
56
57
  description: string;
57
58
  }
59
+ export interface ExternalCommand {
60
+ executable: string;
61
+ args: string[];
62
+ }
63
+ export interface CodingAgentDefinition {
64
+ id: CodingAgentId;
65
+ inputName: string;
66
+ label: string;
67
+ aliases: string[];
68
+ executable: string;
69
+ integrationIds: Record<SpecWorkflowId, string>;
70
+ }
71
+ export interface FrameworkDefinition {
72
+ id: SpecWorkflowId;
73
+ executable: string;
74
+ version: string;
75
+ installCommand: ExternalCommand;
76
+ allowedRoots: string[];
77
+ baseMarkers: string[][];
78
+ agentMarkers: Record<CodingAgentId, string[][]>;
79
+ }
58
80
  export interface ProjectOptions {
59
81
  projectName?: string;
60
82
  projectType?: string;
@@ -65,8 +87,13 @@ export interface ProjectOptions {
65
87
  includeFrontend?: boolean;
66
88
  environments?: string[];
67
89
  specWorkflow?: string;
90
+ agents?: string[];
91
+ defaultAgent?: string;
68
92
  configPath?: string;
69
93
  yes?: boolean;
94
+ force?: boolean;
95
+ installTools?: boolean;
96
+ installDependencies?: boolean;
70
97
  }
71
98
  export interface ProjectPlan {
72
99
  projectName: string;
@@ -81,6 +108,9 @@ export interface ProjectPlan {
81
108
  frontendStarter: string;
82
109
  environments: EnvironmentDefinition[];
83
110
  specWorkflow: SpecWorkflowDefinition;
111
+ agents: CodingAgentDefinition[];
112
+ defaultAgent?: CodingAgentDefinition;
113
+ framework: FrameworkDefinition;
84
114
  approvedStack: string[];
85
115
  }
86
116
  export interface GeneratedArtifact {
@@ -96,7 +126,7 @@ export interface ManifestArtifact {
96
126
  contentHash: string;
97
127
  }
98
128
  export interface LiftoffManifest {
99
- artifactVersion: 2;
129
+ artifactVersion: 2 | 3;
100
130
  generatedBy: 'Mission Control Liftoff';
101
131
  liftoffVersion: string;
102
132
  project: {
@@ -108,8 +138,15 @@ export interface LiftoffManifest {
108
138
  region: string;
109
139
  frontend: boolean;
110
140
  specWorkflow: SpecWorkflowId;
141
+ agents: CodingAgentId[];
142
+ defaultAgent?: CodingAgentId;
111
143
  environments: EnvironmentId[];
112
144
  };
145
+ framework: {
146
+ state: 'initialized' | 'legacy';
147
+ adapter: SpecWorkflowId;
148
+ contractVersion?: string;
149
+ };
113
150
  artifacts: ManifestArtifact[];
114
151
  }
115
152
  export interface ParsedArgs {
@@ -0,0 +1,20 @@
1
+ import type { ExternalCommand } from './types.js';
2
+ export type WorkstationRequirementId = 'node' | 'python' | 'go' | 'uv' | 'docker' | 'opentofu' | 'azure-cli' | 'openspec' | 'spec-kit' | 'github-copilot' | 'claude';
3
+ export type RequirementSeverity = 'blocking' | 'advisory';
4
+ export type SupportedPlatform = 'darwin' | 'win32' | 'linux';
5
+ export type LinuxFamily = 'debian' | 'fedora' | 'arch' | 'unknown';
6
+ export interface InstallRecipe {
7
+ command: ExternalCommand;
8
+ manager: 'brew' | 'winget' | 'npm' | 'uv';
9
+ }
10
+ export interface WorkstationRequirementDefinition {
11
+ id: WorkstationRequirementId;
12
+ label: string;
13
+ severity: RequirementSeverity;
14
+ probes: ExternalCommand[];
15
+ minimumVersion?: string;
16
+ exactVersion?: string;
17
+ install: Partial<Record<SupportedPlatform, InstallRecipe>>;
18
+ linuxRemedies: Record<LinuxFamily, string>;
19
+ }
20
+ export declare const workstationRequirementCatalog: Record<WorkstationRequirementId, WorkstationRequirementDefinition>;
@@ -0,0 +1,122 @@
1
+ const linuxRemedies = (url) => ({
2
+ debian: `Follow the official Debian/Ubuntu installation guide: ${url}`,
3
+ fedora: `Follow the official Fedora/RHEL installation guide: ${url}`,
4
+ arch: `Follow the official Arch Linux installation guide: ${url}`,
5
+ unknown: `Follow the official Linux installation guide: ${url}`
6
+ });
7
+ const winget = (id) => ({
8
+ manager: 'winget',
9
+ command: { executable: 'winget', args: ['install', '--id', id, '--exact', '--accept-package-agreements', '--accept-source-agreements'] }
10
+ });
11
+ const brew = (name, cask = false) => ({
12
+ manager: 'brew',
13
+ command: { executable: 'brew', args: ['install', ...(cask ? ['--cask'] : []), name] }
14
+ });
15
+ export const workstationRequirementCatalog = {
16
+ node: {
17
+ id: 'node',
18
+ label: 'Node.js',
19
+ severity: 'blocking',
20
+ probes: [{ executable: 'node', args: ['--version'] }],
21
+ minimumVersion: '20.19.0',
22
+ install: { darwin: brew('node'), win32: winget('OpenJS.NodeJS.LTS') },
23
+ linuxRemedies: linuxRemedies('https://nodejs.org/en/download/package-manager')
24
+ },
25
+ python: {
26
+ id: 'python',
27
+ label: 'Python',
28
+ severity: 'blocking',
29
+ probes: [
30
+ { executable: 'python3', args: ['--version'] },
31
+ { executable: 'python', args: ['--version'] },
32
+ { executable: 'py', args: ['-3', '--version'] }
33
+ ],
34
+ minimumVersion: '3.11.0',
35
+ install: { darwin: brew('python@3.12'), win32: winget('Python.Python.3.12') },
36
+ linuxRemedies: linuxRemedies('https://www.python.org/downloads/')
37
+ },
38
+ go: {
39
+ id: 'go',
40
+ label: 'Go',
41
+ severity: 'blocking',
42
+ probes: [{ executable: 'go', args: ['version'] }],
43
+ minimumVersion: '1.23.0',
44
+ install: { darwin: brew('go'), win32: winget('GoLang.Go') },
45
+ linuxRemedies: linuxRemedies('https://go.dev/doc/install')
46
+ },
47
+ uv: {
48
+ id: 'uv',
49
+ label: 'uv',
50
+ severity: 'blocking',
51
+ probes: [{ executable: 'uv', args: ['--version'] }],
52
+ install: { darwin: brew('uv'), win32: winget('astral-sh.uv') },
53
+ linuxRemedies: linuxRemedies('https://docs.astral.sh/uv/getting-started/installation/')
54
+ },
55
+ docker: {
56
+ id: 'docker',
57
+ label: 'Docker',
58
+ severity: 'advisory',
59
+ probes: [{ executable: 'docker', args: ['--version'] }],
60
+ install: { darwin: brew('docker', true), win32: winget('Docker.DockerDesktop') },
61
+ linuxRemedies: linuxRemedies('https://docs.docker.com/engine/install/')
62
+ },
63
+ opentofu: {
64
+ id: 'opentofu',
65
+ label: 'OpenTofu',
66
+ severity: 'advisory',
67
+ probes: [{ executable: 'tofu', args: ['--version'] }],
68
+ install: { darwin: brew('opentofu'), win32: winget('OpenTofu.OpenTofu') },
69
+ linuxRemedies: linuxRemedies('https://opentofu.org/docs/intro/install/')
70
+ },
71
+ 'azure-cli': {
72
+ id: 'azure-cli',
73
+ label: 'Azure CLI',
74
+ severity: 'advisory',
75
+ probes: [{ executable: 'az', args: ['version', '--output', 'json'] }],
76
+ install: { darwin: brew('azure-cli'), win32: winget('Microsoft.AzureCLI') },
77
+ linuxRemedies: linuxRemedies('https://learn.microsoft.com/cli/azure/install-azure-cli-linux')
78
+ },
79
+ openspec: {
80
+ id: 'openspec',
81
+ label: 'OpenSpec',
82
+ severity: 'blocking',
83
+ probes: [{ executable: 'openspec', args: ['--version'] }],
84
+ exactVersion: '1.6.0',
85
+ install: {
86
+ darwin: { manager: 'npm', command: { executable: 'npm', args: ['install', '-g', '@fission-ai/openspec@1.6.0'] } },
87
+ win32: { manager: 'npm', command: { executable: 'npm', args: ['install', '-g', '@fission-ai/openspec@1.6.0'] } },
88
+ linux: { manager: 'npm', command: { executable: 'npm', args: ['install', '-g', '@fission-ai/openspec@1.6.0'] } }
89
+ },
90
+ linuxRemedies: linuxRemedies('https://github.com/Fission-AI/OpenSpec')
91
+ },
92
+ 'spec-kit': {
93
+ id: 'spec-kit',
94
+ label: 'Spec Kit',
95
+ severity: 'blocking',
96
+ probes: [{ executable: 'specify', args: ['--version'] }],
97
+ exactVersion: '0.14.1',
98
+ install: {
99
+ darwin: { manager: 'uv', command: { executable: 'uv', args: ['tool', 'install', 'specify-cli==0.14.1'] } },
100
+ win32: { manager: 'uv', command: { executable: 'uv', args: ['tool', 'install', 'specify-cli==0.14.1'] } },
101
+ linux: { manager: 'uv', command: { executable: 'uv', args: ['tool', 'install', 'specify-cli==0.14.1'] } }
102
+ },
103
+ linuxRemedies: linuxRemedies('https://github.com/github/spec-kit')
104
+ },
105
+ 'github-copilot': {
106
+ id: 'github-copilot',
107
+ label: 'GitHub Copilot',
108
+ severity: 'blocking',
109
+ probes: [{ executable: 'copilot', args: ['--version'] }],
110
+ install: { darwin: brew('copilot-cli', true), win32: winget('GitHub.Copilot') },
111
+ linuxRemedies: linuxRemedies('https://docs.github.com/en/copilot/how-tos/copilot-cli/set-up-copilot-cli/install-copilot-cli')
112
+ },
113
+ claude: {
114
+ id: 'claude',
115
+ label: 'Claude Code',
116
+ severity: 'blocking',
117
+ probes: [{ executable: 'claude', args: ['--version'] }],
118
+ install: { darwin: brew('claude-code', true), win32: winget('Anthropic.ClaudeCode') },
119
+ linuxRemedies: linuxRemedies('https://docs.anthropic.com/en/docs/claude-code/setup')
120
+ }
121
+ };
122
+ //# sourceMappingURL=workstation-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workstation-catalog.js","sourceRoot":"","sources":["../src/workstation-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { type LinuxFamily, type RequirementSeverity, type SupportedPlatform, type WorkstationRequirementDefinition, type WorkstationRequirementId } from './workstation-catalog.js';
2
+ import type { CommandRunner, RunCommandOptions } from './process-runner.js';
3
+ import type { ApiStackId, CodingAgentId, ProviderId, ProjectPlan, SpecWorkflowId } from './types.js';
4
+ export type RequirementState = 'ready' | 'missing' | 'outdated' | 'unhealthy' | 'not-observable';
5
+ export interface SelectedRequirement {
6
+ id: WorkstationRequirementId;
7
+ definition: WorkstationRequirementDefinition;
8
+ severity: RequirementSeverity;
9
+ reasons: string[];
10
+ minimumVersion?: string;
11
+ exactVersion?: string;
12
+ }
13
+ export interface ReadinessNotice {
14
+ label: string;
15
+ state: 'ready' | 'unhealthy' | 'not-observable';
16
+ detail: string;
17
+ remedy?: string;
18
+ }
19
+ export interface RequirementProbeResult {
20
+ requirement: SelectedRequirement;
21
+ state: RequirementState;
22
+ detail: string;
23
+ detectedVersion?: string;
24
+ detectedBy?: string;
25
+ remedy?: string;
26
+ notices: ReadinessNotice[];
27
+ }
28
+ export interface WorkstationRequirementSelection {
29
+ apiStack: {
30
+ id: ApiStackId;
31
+ };
32
+ specWorkflow: {
33
+ id: SpecWorkflowId;
34
+ };
35
+ framework: {
36
+ version: string;
37
+ };
38
+ provider: {
39
+ id: ProviderId;
40
+ };
41
+ agents: Array<{
42
+ id: CodingAgentId;
43
+ label: string;
44
+ }>;
45
+ }
46
+ export interface RequirementSelectionOptions {
47
+ includeFramework?: boolean;
48
+ }
49
+ export interface HostEnvironment {
50
+ platform: SupportedPlatform;
51
+ linuxFamily: LinuxFamily;
52
+ }
53
+ export type InstallState = 'installed' | 'declined' | 'manual' | 'failed' | 'restart-required';
54
+ export interface InstallResult {
55
+ requirement: SelectedRequirement;
56
+ state: InstallState;
57
+ detail: string;
58
+ command?: string;
59
+ probe: RequirementProbeResult;
60
+ remedy?: string;
61
+ }
62
+ export declare function extractVersion(output: string): string | undefined;
63
+ export declare function selectLiftoffRuntimeRequirements(): SelectedRequirement[];
64
+ export declare function selectWorkstationRequirements(plan: ProjectPlan | WorkstationRequirementSelection, options?: RequirementSelectionOptions): SelectedRequirement[];
65
+ export declare function probeRequirement(requirement: SelectedRequirement, runner: CommandRunner, options?: Pick<RunCommandOptions, 'cwd'>): Promise<RequirementProbeResult>;
66
+ export declare function probeWorkstation(requirements: SelectedRequirement[], runner: CommandRunner, options?: Pick<RunCommandOptions, 'cwd'>): Promise<RequirementProbeResult[]>;
67
+ export declare function parseLinuxFamily(osRelease: string): LinuxFamily;
68
+ export declare function detectHostEnvironment(platform?: NodeJS.Platform, osReleasePath?: string): Promise<HostEnvironment>;
69
+ export declare function installRequirement(requirement: SelectedRequirement, currentProbe: RequirementProbeResult, context: {
70
+ authorized: boolean;
71
+ host: HostEnvironment;
72
+ runner: CommandRunner;
73
+ cwd?: string;
74
+ streamOptions?: Pick<RunCommandOptions, 'stdout' | 'stderr'>;
75
+ }): Promise<InstallResult>;
76
+ export declare function blockingReadinessFailures(results: RequirementProbeResult[]): RequirementProbeResult[];