@msn-control/liftoff 0.2.1 → 0.3.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 +165 -8
- package/dist/args.d.ts +19 -0
- package/dist/args.js +216 -39
- package/dist/args.js.map +1 -1
- package/dist/catalogs.d.ts +7 -1
- package/dist/catalogs.js +55 -0
- package/dist/catalogs.js.map +1 -1
- package/dist/cli.js +12 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands.js +172 -26
- package/dist/commands.js.map +1 -1
- package/dist/file-system.d.ts +3 -0
- package/dist/file-system.js +306 -24
- package/dist/file-system.js.map +1 -1
- package/dist/genai-templates.d.ts +10 -0
- package/dist/genai-templates.js +10 -0
- package/dist/genai-templates.js.map +1 -0
- package/dist/interactive.js +21 -6
- package/dist/interactive.js.map +1 -1
- package/dist/migrate-plan.d.ts +1 -1
- package/dist/migrate-plan.js +38 -10
- package/dist/migrate-plan.js.map +1 -1
- package/dist/planner.js +199 -11
- package/dist/planner.js.map +1 -1
- package/dist/reconcile.d.ts +1 -0
- package/dist/reconcile.js +58 -12
- package/dist/reconcile.js.map +1 -1
- package/dist/scan.d.ts +2 -1
- package/dist/scan.js +112 -3
- package/dist/scan.js.map +1 -1
- package/dist/standard-templates.d.ts +5 -0
- package/dist/standard-templates.js +942 -0
- package/dist/standard-templates.js.map +1 -0
- package/dist/template-types.d.ts +1 -0
- package/dist/template-types.js +2 -0
- package/dist/template-types.js.map +1 -0
- package/dist/templates.d.ts +18 -0
- package/dist/templates.js +1363 -142
- package/dist/templates.js.map +1 -1
- package/dist/types.d.ts +24 -2
- package/package.json +6 -4
package/dist/migrate-plan.js
CHANGED
|
@@ -1,32 +1,56 @@
|
|
|
1
1
|
const staged = (sourcePath) => `migration/legacy/${sourcePath}`;
|
|
2
|
-
export function seedMigrationGroups(inventory) {
|
|
2
|
+
export function seedMigrationGroups(inventory, plan) {
|
|
3
3
|
const byKind = (kind) => inventory.findings.filter((finding) => finding.kind === kind);
|
|
4
4
|
const groups = [];
|
|
5
|
+
const dependencyFile = plan.apiStack.id === 'python-fastapi'
|
|
6
|
+
? 'backend/pyproject.toml'
|
|
7
|
+
: plan.apiStack.id === 'node-fastify' ? 'backend/package.json' : 'backend/go.mod';
|
|
8
|
+
const configFile = plan.apiStack.id === 'python-fastapi'
|
|
9
|
+
? 'backend/config/settings.py'
|
|
10
|
+
: plan.apiStack.id === 'node-fastify' ? 'backend/src/config.ts' : 'backend/internal/config/config.go';
|
|
11
|
+
const apiDirectory = plan.apiStack.id === 'python-fastapi'
|
|
12
|
+
? 'backend/apis/routes/'
|
|
13
|
+
: plan.apiStack.id === 'node-fastify' ? 'backend/src/' : 'backend/internal/api/';
|
|
14
|
+
const testDirectory = plan.apiStack.id === 'python-fastapi'
|
|
15
|
+
? 'backend/tests/'
|
|
16
|
+
: plan.apiStack.id === 'node-fastify' ? 'backend/test/' : 'backend/internal/';
|
|
5
17
|
const push = (title, tasks) => {
|
|
6
18
|
if (tasks.length > 0) {
|
|
7
19
|
groups.push({ title, tasks });
|
|
8
20
|
}
|
|
9
21
|
};
|
|
10
22
|
push('Dependencies', [
|
|
11
|
-
...byKind('python-deps').map((f) => `
|
|
12
|
-
...byKind('node-deps').map((f) => `Reconcile Node dependencies from ${staged(f.sourcePath)} with
|
|
23
|
+
...byKind('python-deps').map((f) => `Reconcile Python dependencies from ${staged(f.sourcePath)} with ${dependencyFile}`),
|
|
24
|
+
...byKind('node-deps').map((f) => `Reconcile Node dependencies from ${staged(f.sourcePath)} with ${dependencyFile}${plan.includeFrontend ? ' and frontend/package.json where applicable' : ''}`),
|
|
25
|
+
...byKind('go-deps').map((f) => `Reconcile Go dependencies from ${staged(f.sourcePath)} with ${dependencyFile}`)
|
|
13
26
|
]);
|
|
14
|
-
push('Configuration', byKind('env-file').map((f) => `Map variables from ${staged(f.sourcePath)} into environments/*/backend.env and
|
|
27
|
+
push('Configuration', byKind('env-file').map((f) => `Map variables from ${staged(f.sourcePath)} into environments/*/backend.env and ${configFile}`));
|
|
15
28
|
const codeTasks = [];
|
|
16
29
|
for (const finding of byKind('framework')) {
|
|
17
30
|
if (finding.evidence.startsWith('fastapi')) {
|
|
18
|
-
codeTasks.push(`Move FastAPI route modules into
|
|
31
|
+
codeTasks.push(`Move FastAPI route modules into ${apiDirectory} and register them in the generated API entrypoint (detected: ${finding.evidence})`);
|
|
19
32
|
}
|
|
20
33
|
else {
|
|
21
|
-
codeTasks.push(`
|
|
34
|
+
codeTasks.push(`Port application entrypoints into ${apiDirectory} using ${plan.apiStack.framework} - large task: port handlers, middleware, and auth (detected: ${finding.evidence})`);
|
|
22
35
|
}
|
|
23
36
|
}
|
|
24
|
-
codeTasks.push(...byKind('
|
|
37
|
+
codeTasks.push(...byKind('go-source').map((f) => `Move Go application code from ${staged(f.sourcePath)} into backend/cmd/api/ or backend/internal/api/ as appropriate and register it with the generated entrypoint (detected: ${f.evidence})`));
|
|
38
|
+
if (plan.projectType.id === 'genai') {
|
|
39
|
+
codeTasks.push(...byKind('retrieval').map((f) => `Move retrieval and vector-store code into backend/orchestration/retrieval/ (detected: ${f.evidence})`));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
codeTasks.push(...byKind('retrieval').map((f) => `Decide how legacy retrieval code should be handled in this standard project (detected: ${f.evidence})`));
|
|
43
|
+
}
|
|
25
44
|
codeTasks.push(...byKind('frontend').map((f) => `Move the frontend application into frontend/ and merge its dependencies with the scaffold's (detected: ${f.evidence})`));
|
|
26
45
|
push('Application code', codeTasks);
|
|
46
|
+
const migrationInstruction = plan.apiStack.id === 'python-fastapi'
|
|
47
|
+
? 'replace the generated Alembic baseline with the legacy revision history or append the generated schema after its unique head'
|
|
48
|
+
: plan.apiStack.id === 'node-fastify'
|
|
49
|
+
? 'replace the generated Drizzle baseline or import legacy SQL before it, then regenerate the Drizzle journal and snapshot metadata'
|
|
50
|
+
: 'replace the generated Goose baseline or renumber legacy migrations and the baseline into one unique ordered sequence';
|
|
27
51
|
push('Data and tests', [
|
|
28
|
-
...byKind('db-migrations').map((f) => `
|
|
29
|
-
...byKind('tests').map((f) => `Relocate tests from ${staged(f.sourcePath)} under
|
|
52
|
+
...byKind('db-migrations').map((f) => `Rebase migration history from ${staged(f.sourcePath)}: ${migrationInstruction}`),
|
|
53
|
+
...byKind('tests').map((f) => `Relocate tests from ${staged(f.sourcePath)} under ${testDirectory}`)
|
|
30
54
|
]);
|
|
31
55
|
push('CI and Docker', [
|
|
32
56
|
...byKind('ci').map((f) => `Port CI jobs from ${staged(f.sourcePath)} into the generated GitHub workflow`),
|
|
@@ -55,6 +79,9 @@ export function renderMigrationTasks(groups) {
|
|
|
55
79
|
return `${lines.join('\n').trimEnd()}\n`;
|
|
56
80
|
}
|
|
57
81
|
export function renderMigrationProposal(plan, inventory) {
|
|
82
|
+
const typeSpecific = plan.pattern
|
|
83
|
+
? `- Pattern: ${plan.pattern.label}`
|
|
84
|
+
: `- API stack: ${plan.apiStack.label}`;
|
|
58
85
|
return `# Proposal: migrate-to-liftoff
|
|
59
86
|
|
|
60
87
|
## Why
|
|
@@ -73,7 +100,8 @@ This migration is complete when all tasks are checked, \`liftoff validate\` and
|
|
|
73
100
|
|
|
74
101
|
## Project
|
|
75
102
|
|
|
76
|
-
-
|
|
103
|
+
- Project type: ${plan.projectType.label}
|
|
104
|
+
${typeSpecific}
|
|
77
105
|
- Cloud: ${plan.provider.label} (${plan.region.slug})
|
|
78
106
|
- Frontend: ${plan.includeFrontend ? 'yes' : 'no'}
|
|
79
107
|
- Spec workflow: ${plan.specWorkflow.label}
|
package/dist/migrate-plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-plan.js","sourceRoot":"","sources":["../src/migrate-plan.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,GAAG,CAAC,UAAkB,EAAE,EAAE,CAAC,oBAAoB,UAAU,EAAE,CAAC;AAExE,MAAM,UAAU,mBAAmB,CAAC,SAA0B;
|
|
1
|
+
{"version":3,"file":"migrate-plan.js","sourceRoot":"","sources":["../src/migrate-plan.ts"],"names":[],"mappings":"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"}
|
package/dist/planner.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { apiStacks, environments, getApiStack, getEnvironment, getPattern, getProvider, getProjectType, getSpecWorkflow, resolveRegion, specWorkflows } from './catalogs.js';
|
|
4
4
|
export class PlanValidationError extends Error {
|
|
5
5
|
issues;
|
|
6
6
|
constructor(issues) {
|
|
@@ -9,11 +9,121 @@ export class PlanValidationError extends Error {
|
|
|
9
9
|
this.name = 'PlanValidationError';
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
|
+
const CONFIG_FIELDS = new Set([
|
|
13
|
+
'projectName',
|
|
14
|
+
'projectType',
|
|
15
|
+
'apiStack',
|
|
16
|
+
'pattern',
|
|
17
|
+
'cloud',
|
|
18
|
+
'region',
|
|
19
|
+
'includeFrontend',
|
|
20
|
+
'environments',
|
|
21
|
+
'specWorkflow'
|
|
22
|
+
]);
|
|
23
|
+
function isRecord(value) {
|
|
24
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
25
|
+
}
|
|
26
|
+
function optionalConfigString(config, field) {
|
|
27
|
+
const value = config[field];
|
|
28
|
+
if (value === undefined) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
32
|
+
throw new PlanValidationError([`Configuration field ${field} must be a non-empty string.`]);
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function resolveConfigCatalogValue(config, field, resolver) {
|
|
37
|
+
const value = optionalConfigString(config, field);
|
|
38
|
+
if (value === undefined) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
const resolved = resolver(value);
|
|
42
|
+
if (!resolved) {
|
|
43
|
+
throw new PlanValidationError([`Configuration field ${field} has unsupported value ${JSON.stringify(value)}.`]);
|
|
44
|
+
}
|
|
45
|
+
return resolved.id;
|
|
46
|
+
}
|
|
12
47
|
export async function loadConfigOptions(configPath, cwd) {
|
|
13
48
|
const resolvedPath = path.resolve(cwd, configPath);
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
49
|
+
let raw;
|
|
50
|
+
try {
|
|
51
|
+
raw = await readFile(resolvedPath, 'utf8');
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw new PlanValidationError([
|
|
55
|
+
`Unable to read configuration ${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
let parsed;
|
|
59
|
+
try {
|
|
60
|
+
parsed = JSON.parse(raw);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw new PlanValidationError([
|
|
64
|
+
`Unable to parse configuration ${resolvedPath}: ${error instanceof Error ? error.message : String(error)}`
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
67
|
+
if (!isRecord(parsed)) {
|
|
68
|
+
throw new PlanValidationError(['Configuration root must be a JSON object.']);
|
|
69
|
+
}
|
|
70
|
+
const unknownFields = Object.keys(parsed).filter((field) => !CONFIG_FIELDS.has(field));
|
|
71
|
+
if (unknownFields.length > 0) {
|
|
72
|
+
throw new PlanValidationError([`Unknown configuration field${unknownFields.length === 1 ? '' : 's'}: ${unknownFields.join(', ')}.`]);
|
|
73
|
+
}
|
|
74
|
+
const projectName = optionalConfigString(parsed, 'projectName');
|
|
75
|
+
const projectType = resolveConfigCatalogValue(parsed, 'projectType', getProjectType);
|
|
76
|
+
const apiStack = resolveConfigCatalogValue(parsed, 'apiStack', getApiStack);
|
|
77
|
+
const pattern = resolveConfigCatalogValue(parsed, 'pattern', getPattern);
|
|
78
|
+
const cloud = resolveConfigCatalogValue(parsed, 'cloud', getProvider);
|
|
79
|
+
const specWorkflow = resolveConfigCatalogValue(parsed, 'specWorkflow', getSpecWorkflow);
|
|
80
|
+
const includeFrontendValue = parsed.includeFrontend;
|
|
81
|
+
if (includeFrontendValue !== undefined && typeof includeFrontendValue !== 'boolean') {
|
|
82
|
+
throw new PlanValidationError(['Configuration field includeFrontend must be a boolean.']);
|
|
83
|
+
}
|
|
84
|
+
let selectedEnvironments;
|
|
85
|
+
if (parsed.environments !== undefined) {
|
|
86
|
+
if (!Array.isArray(parsed.environments) || parsed.environments.length === 0) {
|
|
87
|
+
throw new PlanValidationError(['Configuration field environments must be a non-empty string array.']);
|
|
88
|
+
}
|
|
89
|
+
selectedEnvironments = parsed.environments.map((value, index) => {
|
|
90
|
+
if (typeof value !== 'string') {
|
|
91
|
+
throw new PlanValidationError([`Configuration field environments[${index}] must be a string.`]);
|
|
92
|
+
}
|
|
93
|
+
const environment = getEnvironment(value);
|
|
94
|
+
if (!environment) {
|
|
95
|
+
throw new PlanValidationError([`Configuration field environments contains unsupported value ${JSON.stringify(value)}.`]);
|
|
96
|
+
}
|
|
97
|
+
return environment.id;
|
|
98
|
+
});
|
|
99
|
+
if (new Set(selectedEnvironments).size !== selectedEnvironments.length) {
|
|
100
|
+
throw new PlanValidationError(['Configuration field environments must not contain duplicates.']);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
let region = optionalConfigString(parsed, 'region');
|
|
104
|
+
const provider = cloud ? getProvider(cloud) : getProvider('azure');
|
|
105
|
+
if (region && provider?.status === 'available') {
|
|
106
|
+
const resolution = resolveRegion(provider.id, region);
|
|
107
|
+
if (resolution.status !== 'resolved') {
|
|
108
|
+
throw new PlanValidationError([
|
|
109
|
+
resolution.status === 'ambiguous'
|
|
110
|
+
? `Configuration field region ${JSON.stringify(region)} is ambiguous. Use one of: ${resolution.matches.map((match) => match.slug).join(', ')}.`
|
|
111
|
+
: `Configuration field region has unsupported value ${JSON.stringify(region)}.`
|
|
112
|
+
]);
|
|
113
|
+
}
|
|
114
|
+
region = resolution.region.slug;
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
projectName,
|
|
118
|
+
projectType,
|
|
119
|
+
apiStack,
|
|
120
|
+
pattern,
|
|
121
|
+
cloud,
|
|
122
|
+
region,
|
|
123
|
+
includeFrontend: includeFrontendValue,
|
|
124
|
+
environments: selectedEnvironments,
|
|
125
|
+
specWorkflow
|
|
126
|
+
};
|
|
17
127
|
}
|
|
18
128
|
export function mergeOptions(base, override) {
|
|
19
129
|
const definedOverride = Object.fromEntries(Object.entries(override).filter(([, value]) => value !== undefined));
|
|
@@ -30,9 +140,32 @@ export function buildProjectPlan(input, options) {
|
|
|
30
140
|
if (options.requireProjectName && !projectName) {
|
|
31
141
|
issues.push('Project name is required.');
|
|
32
142
|
}
|
|
143
|
+
const inferredProjectType = input.projectType ?? (input.pattern ? 'genai' : input.apiStack ? 'standard' : undefined);
|
|
144
|
+
const projectType = inferredProjectType ? getProjectType(inferredProjectType) : undefined;
|
|
145
|
+
if (!projectType) {
|
|
146
|
+
issues.push(inferredProjectType ? `Unknown project type: ${inferredProjectType}.` : 'Project type is required.');
|
|
147
|
+
}
|
|
33
148
|
const pattern = input.pattern ? getPattern(input.pattern) : undefined;
|
|
34
|
-
|
|
35
|
-
|
|
149
|
+
let apiStack = input.apiStack ? getApiStack(input.apiStack) : undefined;
|
|
150
|
+
if (input.apiStack && !apiStack) {
|
|
151
|
+
issues.push(`Unknown API stack: ${input.apiStack}. Use one of: ${apiStacks.map((stack) => stack.id).join(', ')}.`);
|
|
152
|
+
}
|
|
153
|
+
if (projectType?.id === 'genai') {
|
|
154
|
+
if (!pattern) {
|
|
155
|
+
issues.push(input.pattern ? `Unknown GenAI pattern: ${input.pattern}.` : 'GenAI pattern is required.');
|
|
156
|
+
}
|
|
157
|
+
if (apiStack && apiStack.id !== 'python-fastapi') {
|
|
158
|
+
issues.push('GenAI projects use the python-fastapi API stack.');
|
|
159
|
+
}
|
|
160
|
+
apiStack = getApiStack('python-fastapi');
|
|
161
|
+
}
|
|
162
|
+
else if (projectType?.id === 'standard') {
|
|
163
|
+
if (input.pattern) {
|
|
164
|
+
issues.push('Standard projects cannot select a GenAI pattern. Remove --pattern or choose a GenAI project.');
|
|
165
|
+
}
|
|
166
|
+
if (!apiStack) {
|
|
167
|
+
issues.push('API stack is required for standard projects.');
|
|
168
|
+
}
|
|
36
169
|
}
|
|
37
170
|
const provider = getProvider(input.cloud ?? 'azure');
|
|
38
171
|
if (!provider) {
|
|
@@ -56,7 +189,16 @@ export function buildProjectPlan(input, options) {
|
|
|
56
189
|
else if (regionResolution?.status === 'unknown') {
|
|
57
190
|
issues.push(`Unknown region "${regionResolution.input}" for ${provider?.label}.`);
|
|
58
191
|
}
|
|
59
|
-
if (issues.length > 0 ||
|
|
192
|
+
if (issues.length > 0 ||
|
|
193
|
+
!projectName && options.requireProjectName ||
|
|
194
|
+
!projectType ||
|
|
195
|
+
!apiStack ||
|
|
196
|
+
projectType.id === 'genai' && !pattern ||
|
|
197
|
+
!provider ||
|
|
198
|
+
!specWorkflow ||
|
|
199
|
+
provider.status !== 'available' ||
|
|
200
|
+
!regionResolution ||
|
|
201
|
+
regionResolution.status !== 'resolved') {
|
|
60
202
|
throw new PlanValidationError(issues);
|
|
61
203
|
}
|
|
62
204
|
const effectiveProjectName = projectName || 'liftoff-preview';
|
|
@@ -65,15 +207,52 @@ export function buildProjectPlan(input, options) {
|
|
|
65
207
|
projectName: effectiveProjectName,
|
|
66
208
|
safeProjectName,
|
|
67
209
|
packageName: safeProjectName.replace(/_/g, '-'),
|
|
210
|
+
projectType,
|
|
211
|
+
apiStack,
|
|
68
212
|
pattern,
|
|
69
213
|
provider,
|
|
70
214
|
region: regionResolution.region,
|
|
71
215
|
includeFrontend: input.includeFrontend ?? false,
|
|
72
|
-
frontendStarter: pattern
|
|
216
|
+
frontendStarter: pattern?.frontendStarter ?? 'API starter',
|
|
73
217
|
environments: selectedEnvironments.values,
|
|
74
218
|
specWorkflow,
|
|
75
|
-
approvedStack
|
|
219
|
+
approvedStack: approvedStackFor(projectType.id, apiStack.id)
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function approvedStackFor(projectType, apiStack) {
|
|
223
|
+
if (projectType === 'genai') {
|
|
224
|
+
return [
|
|
225
|
+
'FastAPI',
|
|
226
|
+
'PydanticAI',
|
|
227
|
+
'Pydantic settings',
|
|
228
|
+
'Scalar',
|
|
229
|
+
'PostgreSQL',
|
|
230
|
+
'Alembic',
|
|
231
|
+
'Redis',
|
|
232
|
+
'Azure Service Bus',
|
|
233
|
+
'Azure Blob Storage',
|
|
234
|
+
'Azure Communication Services',
|
|
235
|
+
'Langfuse',
|
|
236
|
+
'Docker Compose',
|
|
237
|
+
'OpenTofu'
|
|
238
|
+
];
|
|
239
|
+
}
|
|
240
|
+
const stackSpecific = {
|
|
241
|
+
'python-fastapi': ['FastAPI', 'Pydantic settings', 'SQLAlchemy', 'Alembic', 'pytest'],
|
|
242
|
+
'node-fastify': ['Fastify', 'TypeScript', 'Drizzle', 'Vitest'],
|
|
243
|
+
'go-huma': ['Huma v2', 'Chi', 'pgx', 'Goose', 'go test']
|
|
76
244
|
};
|
|
245
|
+
return [
|
|
246
|
+
...stackSpecific[apiStack],
|
|
247
|
+
'Scalar',
|
|
248
|
+
'PostgreSQL',
|
|
249
|
+
'Redis',
|
|
250
|
+
'Azure Service Bus',
|
|
251
|
+
'Azure Blob Storage',
|
|
252
|
+
'Azure Communication Services',
|
|
253
|
+
'Docker Compose',
|
|
254
|
+
'OpenTofu'
|
|
255
|
+
];
|
|
77
256
|
}
|
|
78
257
|
function resolveEnvironments(values) {
|
|
79
258
|
if (!values || values.length === 0) {
|
|
@@ -102,16 +281,25 @@ export function toSafeProjectName(projectName) {
|
|
|
102
281
|
}
|
|
103
282
|
export function formatProjectPlan(plan) {
|
|
104
283
|
const frontendLine = plan.includeFrontend ? `Vue 3 + Tailwind (${plan.frontendStarter})` : 'Not generated';
|
|
284
|
+
if (plan.projectType.id === 'genai' && !plan.pattern) {
|
|
285
|
+
throw new Error('GenAI project plan is missing its pattern.');
|
|
286
|
+
}
|
|
287
|
+
const typeSpecificLine = plan.pattern
|
|
288
|
+
? `Pattern: ${plan.pattern.label} (${plan.pattern.scaffoldStatus})`
|
|
289
|
+
: `API stack: ${plan.apiStack.label}`;
|
|
105
290
|
return [
|
|
106
291
|
`Project: ${plan.projectName}`,
|
|
107
|
-
`
|
|
292
|
+
`Project type: ${plan.projectType.label}`,
|
|
293
|
+
typeSpecificLine,
|
|
108
294
|
`Cloud: ${plan.provider.label}`,
|
|
109
295
|
`Region: ${plan.region.displayName} / ${plan.region.slug}`,
|
|
110
296
|
`Frontend: ${frontendLine}`,
|
|
111
297
|
`Spec workflow: ${plan.specWorkflow.label}`,
|
|
112
298
|
`Environments: ${plan.environments.map((environment) => environment.id).join(', ')}`,
|
|
113
299
|
`Approved stack: ${plan.approvedStack.join(', ')}`,
|
|
114
|
-
|
|
300
|
+
plan.projectType.id === 'genai'
|
|
301
|
+
? 'Local development: Docker Compose with PostgreSQL/pgvector as required, Redis, Azurite, Mailpit, and optional Langfuse profile'
|
|
302
|
+
: 'Local development: Docker Compose with PostgreSQL, Redis, Azurite, and Mailpit',
|
|
115
303
|
'Infrastructure: OpenTofu for Azure'
|
|
116
304
|
].join('\n');
|
|
117
305
|
}
|
package/dist/planner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"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"}
|
package/dist/reconcile.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export interface ReconcileEntry {
|
|
|
9
9
|
rendered?: GeneratedArtifact;
|
|
10
10
|
cleanMove?: boolean;
|
|
11
11
|
refreshHash?: boolean;
|
|
12
|
+
destinationMatches?: boolean;
|
|
12
13
|
}
|
|
13
14
|
export declare function reconcileProject(manifest: LiftoffManifest, render: GeneratedArtifact[], projectRoot: string): Promise<ReconcileEntry[]>;
|
|
14
15
|
export declare function hasDrift(entries: ReconcileEntry[]): boolean;
|
package/dist/reconcile.js
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
|
-
import {
|
|
3
|
-
import path from 'node:path';
|
|
2
|
+
import { readProjectFile } from './file-system.js';
|
|
4
3
|
const hashBytes = (content) => `sha256:${createHash('sha256').update(content).digest('hex')}`;
|
|
5
4
|
async function readDisk(projectRoot, pathParts) {
|
|
6
|
-
|
|
7
|
-
return await readFile(path.join(projectRoot, ...pathParts));
|
|
8
|
-
}
|
|
9
|
-
catch {
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
5
|
+
return readProjectFile(projectRoot, pathParts);
|
|
12
6
|
}
|
|
13
7
|
export async function reconcileProject(manifest, render, projectRoot) {
|
|
14
8
|
const recordedByName = new Map(manifest.artifacts.map((artifact) => [artifact.logicalName, artifact]));
|
|
@@ -24,6 +18,29 @@ export async function reconcileProject(manifest, render, projectRoot) {
|
|
|
24
18
|
}
|
|
25
19
|
const renderHash = hashBytes(artifact.content);
|
|
26
20
|
if (!recorded) {
|
|
21
|
+
const destination = await readDisk(projectRoot, artifact.pathParts);
|
|
22
|
+
if (destination !== undefined && destination.toString('utf8') === artifact.content) {
|
|
23
|
+
entries.push({
|
|
24
|
+
logicalName: artifact.logicalName,
|
|
25
|
+
status: 'unchanged',
|
|
26
|
+
pathParts: artifact.pathParts,
|
|
27
|
+
reason: 'unrecorded destination already matches the current template; recorded state catches up',
|
|
28
|
+
rendered: artifact,
|
|
29
|
+
refreshHash: true,
|
|
30
|
+
destinationMatches: true
|
|
31
|
+
});
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (destination !== undefined) {
|
|
35
|
+
entries.push({
|
|
36
|
+
logicalName: artifact.logicalName,
|
|
37
|
+
status: 'conflict',
|
|
38
|
+
pathParts: artifact.pathParts,
|
|
39
|
+
reason: 'destination exists but is not owned by the recorded state',
|
|
40
|
+
rendered: artifact
|
|
41
|
+
});
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
27
44
|
entries.push({
|
|
28
45
|
logicalName: artifact.logicalName,
|
|
29
46
|
status: 'new',
|
|
@@ -36,8 +53,8 @@ export async function reconcileProject(manifest, render, projectRoot) {
|
|
|
36
53
|
const samePath = recorded.pathParts.join('\0') === artifact.pathParts.join('\0');
|
|
37
54
|
if (!samePath) {
|
|
38
55
|
const priorDisk = await readDisk(projectRoot, recorded.pathParts);
|
|
56
|
+
const newDisk = await readDisk(projectRoot, artifact.pathParts);
|
|
39
57
|
if (priorDisk === undefined) {
|
|
40
|
-
const newDisk = await readDisk(projectRoot, artifact.pathParts);
|
|
41
58
|
if (newDisk !== undefined && newDisk.toString('utf8') === artifact.content) {
|
|
42
59
|
entries.push({
|
|
43
60
|
logicalName: artifact.logicalName,
|
|
@@ -46,7 +63,18 @@ export async function reconcileProject(manifest, render, projectRoot) {
|
|
|
46
63
|
previousPathParts: recorded.pathParts,
|
|
47
64
|
reason: 'already at the new location; recorded state catches up',
|
|
48
65
|
rendered: artifact,
|
|
49
|
-
refreshHash: true
|
|
66
|
+
refreshHash: true,
|
|
67
|
+
destinationMatches: true
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else if (newDisk !== undefined) {
|
|
71
|
+
entries.push({
|
|
72
|
+
logicalName: artifact.logicalName,
|
|
73
|
+
status: 'conflict',
|
|
74
|
+
pathParts: artifact.pathParts,
|
|
75
|
+
previousPathParts: recorded.pathParts,
|
|
76
|
+
reason: 'recorded source is absent and the new destination contains different bytes',
|
|
77
|
+
rendered: artifact
|
|
50
78
|
});
|
|
51
79
|
}
|
|
52
80
|
else {
|
|
@@ -62,6 +90,21 @@ export async function reconcileProject(manifest, render, projectRoot) {
|
|
|
62
90
|
continue;
|
|
63
91
|
}
|
|
64
92
|
const cleanMove = hashBytes(priorDisk) === recorded.contentHash;
|
|
93
|
+
const destinationMatches = newDisk !== undefined && newDisk.toString('utf8') === artifact.content;
|
|
94
|
+
if (newDisk !== undefined && !destinationMatches) {
|
|
95
|
+
entries.push({
|
|
96
|
+
logicalName: artifact.logicalName,
|
|
97
|
+
status: 'moved',
|
|
98
|
+
pathParts: artifact.pathParts,
|
|
99
|
+
previousPathParts: recorded.pathParts,
|
|
100
|
+
cleanMove: false,
|
|
101
|
+
reason: cleanMove
|
|
102
|
+
? 'relocated by the current templates but the destination contains user-owned bytes'
|
|
103
|
+
: 'relocated by the current templates, modified locally, and the destination contains different bytes',
|
|
104
|
+
rendered: artifact
|
|
105
|
+
});
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
65
108
|
entries.push({
|
|
66
109
|
logicalName: artifact.logicalName,
|
|
67
110
|
status: 'moved',
|
|
@@ -69,9 +112,12 @@ export async function reconcileProject(manifest, render, projectRoot) {
|
|
|
69
112
|
previousPathParts: recorded.pathParts,
|
|
70
113
|
cleanMove,
|
|
71
114
|
reason: cleanMove
|
|
72
|
-
?
|
|
115
|
+
? destinationMatches
|
|
116
|
+
? 'relocated by the current templates; destination already matches'
|
|
117
|
+
: 'relocated by the current templates'
|
|
73
118
|
: 'relocated by the current templates but modified locally',
|
|
74
|
-
rendered: artifact
|
|
119
|
+
rendered: artifact,
|
|
120
|
+
destinationMatches
|
|
75
121
|
});
|
|
76
122
|
continue;
|
|
77
123
|
}
|
package/dist/reconcile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"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"}
|
package/dist/scan.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { ProjectOptions } from './types.js';
|
|
2
2
|
export interface ScanFinding {
|
|
3
|
-
kind: 'python-deps' | 'node-deps' | 'framework' | 'retrieval' | 'frontend' | 'env-file' | 'docker' | 'compose' | 'ci' | 'tests' | 'db-migrations' | 'spec-workflow' | 'cloud';
|
|
3
|
+
kind: 'python-deps' | 'node-deps' | 'go-deps' | 'go-source' | 'framework' | 'api-stack' | 'genai' | 'retrieval' | 'frontend' | 'env-file' | 'docker' | 'compose' | 'ci' | 'tests' | 'db-migrations' | 'spec-workflow' | 'cloud';
|
|
4
4
|
evidence: string;
|
|
5
5
|
sourcePath: string;
|
|
6
|
+
value?: string;
|
|
6
7
|
}
|
|
7
8
|
export interface LegacyInventory {
|
|
8
9
|
rootName: string;
|