@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/file-system.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { access, lstat, mkdir, readdir, readFile, realpath, rename, stat, unlink, writeFile } from 'node:fs/promises';
|
|
2
3
|
import path from 'node:path';
|
|
4
|
+
import { getApiStack, getEnvironment, getPattern, getProvider, getProjectType, getSpecWorkflow, listRegions } from './catalogs.js';
|
|
3
5
|
export class FileSystemError extends Error {
|
|
4
6
|
constructor(message) {
|
|
5
7
|
super(message);
|
|
@@ -9,8 +11,100 @@ export class FileSystemError extends Error {
|
|
|
9
11
|
export function resolveTargetRoot(cwd, projectName) {
|
|
10
12
|
return path.resolve(cwd, projectName);
|
|
11
13
|
}
|
|
14
|
+
const SEMVER_PATTERN = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
|
|
15
|
+
const CONTENT_HASH_PATTERN = /^sha256:[0-9a-f]{64}$/;
|
|
16
|
+
const WINDOWS_DRIVE_PATTERN = /^[A-Za-z]:/;
|
|
17
|
+
const WINDOWS_RESERVED_NAME_PATTERN = /^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(?:\.|$)/i;
|
|
18
|
+
function errorCode(error) {
|
|
19
|
+
if (typeof error !== 'object' || error === null || !('code' in error)) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const code = error.code;
|
|
23
|
+
return typeof code === 'string' ? code : undefined;
|
|
24
|
+
}
|
|
25
|
+
function errorMessage(error) {
|
|
26
|
+
return error instanceof Error ? error.message : String(error);
|
|
27
|
+
}
|
|
28
|
+
function isRecord(value) {
|
|
29
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
30
|
+
}
|
|
31
|
+
function isPathWithin(root, candidate) {
|
|
32
|
+
const relative = path.relative(root, candidate);
|
|
33
|
+
return relative === '' || (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative));
|
|
34
|
+
}
|
|
35
|
+
export function validateArtifactPathParts(value, label = 'Artifact path') {
|
|
36
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
37
|
+
throw new FileSystemError(`${label} must be a non-empty path-part array.`);
|
|
38
|
+
}
|
|
39
|
+
return value.map((part, index) => {
|
|
40
|
+
if (typeof part !== 'string' || part.length === 0 || part.trim().length === 0) {
|
|
41
|
+
throw new FileSystemError(`${label} part ${index + 1} must be a non-empty string.`);
|
|
42
|
+
}
|
|
43
|
+
if (part === '.' ||
|
|
44
|
+
part === '..' ||
|
|
45
|
+
part.includes('/') ||
|
|
46
|
+
part.includes('\\') ||
|
|
47
|
+
part.includes('\0') ||
|
|
48
|
+
path.posix.isAbsolute(part) ||
|
|
49
|
+
path.win32.isAbsolute(part) ||
|
|
50
|
+
WINDOWS_DRIVE_PATTERN.test(part)) {
|
|
51
|
+
throw new FileSystemError(`${label} contains unsafe path part ${JSON.stringify(part)}.`);
|
|
52
|
+
}
|
|
53
|
+
if (part.endsWith('.') || part.endsWith(' ') || WINDOWS_RESERVED_NAME_PATTERN.test(part)) {
|
|
54
|
+
throw new FileSystemError(`${label} contains non-portable path part ${JSON.stringify(part)}.`);
|
|
55
|
+
}
|
|
56
|
+
return part;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
12
59
|
export function artifactPath(root, pathParts) {
|
|
13
|
-
|
|
60
|
+
const validated = validateArtifactPathParts(pathParts);
|
|
61
|
+
const joinedPath = path.join(root, ...validated);
|
|
62
|
+
const resolvedRoot = path.resolve(root);
|
|
63
|
+
const resolvedPath = path.resolve(joinedPath);
|
|
64
|
+
if (!isPathWithin(resolvedRoot, resolvedPath) || resolvedPath === resolvedRoot) {
|
|
65
|
+
throw new FileSystemError(`Artifact path escapes project root: ${validated.join('/')}`);
|
|
66
|
+
}
|
|
67
|
+
return joinedPath;
|
|
68
|
+
}
|
|
69
|
+
export async function resolveProjectPath(projectRoot, pathParts) {
|
|
70
|
+
const validated = validateArtifactPathParts(pathParts);
|
|
71
|
+
const resolvedRoot = path.resolve(projectRoot);
|
|
72
|
+
const targetPath = artifactPath(resolvedRoot, validated);
|
|
73
|
+
let realRoot;
|
|
74
|
+
try {
|
|
75
|
+
realRoot = await realpath(resolvedRoot);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw new FileSystemError(`Unable to resolve project root ${resolvedRoot}: ${errorMessage(error)}`);
|
|
79
|
+
}
|
|
80
|
+
let current = resolvedRoot;
|
|
81
|
+
for (const [index, part] of validated.entries()) {
|
|
82
|
+
current = path.join(current, part);
|
|
83
|
+
let details;
|
|
84
|
+
try {
|
|
85
|
+
details = await lstat(current);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (errorCode(error) === 'ENOENT') {
|
|
89
|
+
return targetPath;
|
|
90
|
+
}
|
|
91
|
+
throw new FileSystemError(`Unable to inspect artifact path ${validated.join('/')}: ${errorMessage(error)}`);
|
|
92
|
+
}
|
|
93
|
+
let resolvedExistingPath;
|
|
94
|
+
try {
|
|
95
|
+
resolvedExistingPath = await realpath(current);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw new FileSystemError(`Unable to resolve artifact path ${validated.join('/')}: ${errorMessage(error)}`);
|
|
99
|
+
}
|
|
100
|
+
if (!isPathWithin(realRoot, resolvedExistingPath)) {
|
|
101
|
+
throw new FileSystemError(`Artifact path escapes project root through a symlink: ${validated.join('/')}`);
|
|
102
|
+
}
|
|
103
|
+
if (index < validated.length - 1 && !details.isDirectory() && !details.isSymbolicLink()) {
|
|
104
|
+
throw new FileSystemError(`Artifact path parent is not a directory: ${validated.slice(0, index + 1).join('/')}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return targetPath;
|
|
14
108
|
}
|
|
15
109
|
export async function assertNewOrEmptyDirectory(targetRoot) {
|
|
16
110
|
try {
|
|
@@ -24,7 +118,7 @@ export async function assertNewOrEmptyDirectory(targetRoot) {
|
|
|
24
118
|
}
|
|
25
119
|
}
|
|
26
120
|
catch (error) {
|
|
27
|
-
if (error
|
|
121
|
+
if (errorCode(error) === 'ENOENT') {
|
|
28
122
|
return;
|
|
29
123
|
}
|
|
30
124
|
throw error;
|
|
@@ -32,10 +126,9 @@ export async function assertNewOrEmptyDirectory(targetRoot) {
|
|
|
32
126
|
}
|
|
33
127
|
export async function writeArtifacts(targetRoot, artifacts) {
|
|
34
128
|
await assertNewOrEmptyDirectory(targetRoot);
|
|
129
|
+
await mkdir(targetRoot, { recursive: true });
|
|
35
130
|
for (const artifact of artifacts) {
|
|
36
|
-
|
|
37
|
-
await mkdir(path.dirname(targetPath), { recursive: true });
|
|
38
|
-
await writeFile(targetPath, artifact.content, 'utf8');
|
|
131
|
+
await writeProjectFile(targetRoot, artifact.pathParts, artifact.content);
|
|
39
132
|
}
|
|
40
133
|
}
|
|
41
134
|
export const SUPPORTED_MANIFEST_VERSIONS = [2];
|
|
@@ -48,20 +141,164 @@ const LEGACY_SEED_LOGICAL_NAMES = new Set([
|
|
|
48
141
|
'openspec-seed-tasks'
|
|
49
142
|
]);
|
|
50
143
|
export async function loadManifest(projectRoot) {
|
|
51
|
-
|
|
52
|
-
let manifest;
|
|
144
|
+
let raw;
|
|
53
145
|
try {
|
|
54
|
-
|
|
146
|
+
const manifestBytes = await readProjectFile(projectRoot, ['liftoff.manifest.json']);
|
|
147
|
+
if (manifestBytes === undefined) {
|
|
148
|
+
throw new Error('file does not exist');
|
|
149
|
+
}
|
|
150
|
+
raw = JSON.parse(manifestBytes.toString('utf8'));
|
|
55
151
|
}
|
|
56
152
|
catch (error) {
|
|
57
|
-
throw new FileSystemError(`Unable to read liftoff.manifest.json: ${error
|
|
153
|
+
throw new FileSystemError(`Unable to read liftoff.manifest.json: ${errorMessage(error)}`);
|
|
154
|
+
}
|
|
155
|
+
if (!isRecord(raw)) {
|
|
156
|
+
throw new FileSystemError('Manifest root must be a JSON object.');
|
|
58
157
|
}
|
|
59
|
-
|
|
60
|
-
|
|
158
|
+
const artifactVersion = raw.artifactVersion;
|
|
159
|
+
if (typeof artifactVersion !== 'number' || !Number.isInteger(artifactVersion)) {
|
|
160
|
+
throw new FileSystemError('Manifest artifactVersion must be an integer.');
|
|
161
|
+
}
|
|
162
|
+
if (!SUPPORTED_MANIFEST_VERSIONS.includes(artifactVersion)) {
|
|
163
|
+
throw new FileSystemError(`Unsupported manifest artifactVersion ${JSON.stringify(artifactVersion)}; this CLI supports version ${SUPPORTED_MANIFEST_VERSIONS.join(', ')}. ` +
|
|
61
164
|
'Regenerate the project with this CLI or use the Liftoff version that generated it.');
|
|
62
165
|
}
|
|
63
|
-
|
|
64
|
-
|
|
166
|
+
if (raw.generatedBy !== 'Mission Control Liftoff') {
|
|
167
|
+
throw new FileSystemError('Manifest generatedBy must be "Mission Control Liftoff".');
|
|
168
|
+
}
|
|
169
|
+
const liftoffVersion = requiredString(raw, 'liftoffVersion', 'Manifest');
|
|
170
|
+
if (!SEMVER_PATTERN.test(liftoffVersion)) {
|
|
171
|
+
throw new FileSystemError('Manifest liftoffVersion must be a valid semantic version.');
|
|
172
|
+
}
|
|
173
|
+
const project = normalizeManifestProject(raw.project);
|
|
174
|
+
const artifacts = normalizeManifestArtifacts(raw.artifacts)
|
|
175
|
+
.filter((artifact) => !LEGACY_SEED_LOGICAL_NAMES.has(artifact.logicalName));
|
|
176
|
+
return {
|
|
177
|
+
artifactVersion: 2,
|
|
178
|
+
generatedBy: 'Mission Control Liftoff',
|
|
179
|
+
liftoffVersion,
|
|
180
|
+
project,
|
|
181
|
+
artifacts
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function requiredString(record, key, scope) {
|
|
185
|
+
const value = record[key];
|
|
186
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
187
|
+
throw new FileSystemError(`${scope}.${key} must be a non-empty string.`);
|
|
188
|
+
}
|
|
189
|
+
return value;
|
|
190
|
+
}
|
|
191
|
+
function optionalString(record, key, scope) {
|
|
192
|
+
const value = record[key];
|
|
193
|
+
if (value === undefined) {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
197
|
+
throw new FileSystemError(`${scope}.${key} must be a non-empty string when present.`);
|
|
198
|
+
}
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
function normalizeManifestProject(project) {
|
|
202
|
+
if (!isRecord(project)) {
|
|
203
|
+
throw new FileSystemError('Manifest.project must be a JSON object.');
|
|
204
|
+
}
|
|
205
|
+
const name = requiredString(project, 'name', 'Manifest.project');
|
|
206
|
+
const patternValue = optionalString(project, 'pattern', 'Manifest.project');
|
|
207
|
+
const projectTypeValue = optionalString(project, 'projectType', 'Manifest.project');
|
|
208
|
+
const projectType = getProjectType(projectTypeValue ?? (patternValue ? 'genai' : ''));
|
|
209
|
+
if (!projectType || projectTypeValue !== undefined && projectType.id !== projectTypeValue) {
|
|
210
|
+
throw new FileSystemError('Manifest project identity is missing a valid projectType.');
|
|
211
|
+
}
|
|
212
|
+
const apiStackValue = optionalString(project, 'apiStack', 'Manifest.project');
|
|
213
|
+
const apiStack = getApiStack(apiStackValue ?? (projectType.id === 'genai' ? 'python-fastapi' : ''));
|
|
214
|
+
if (!apiStack || apiStackValue !== undefined && apiStack.id !== apiStackValue) {
|
|
215
|
+
throw new FileSystemError(`Manifest project type ${projectType.id} is missing a valid apiStack.`);
|
|
216
|
+
}
|
|
217
|
+
const pattern = patternValue ? getPattern(patternValue) : undefined;
|
|
218
|
+
if (patternValue && (!pattern || pattern.id !== patternValue)) {
|
|
219
|
+
throw new FileSystemError(`Manifest project pattern ${JSON.stringify(patternValue)} is invalid.`);
|
|
220
|
+
}
|
|
221
|
+
if (projectType.id === 'genai' && (!pattern || apiStack.id !== 'python-fastapi')) {
|
|
222
|
+
throw new FileSystemError('GenAI manifests require a valid pattern and the python-fastapi API stack.');
|
|
223
|
+
}
|
|
224
|
+
if (projectType.id === 'standard' && pattern) {
|
|
225
|
+
throw new FileSystemError('Standard manifests cannot record a GenAI pattern.');
|
|
226
|
+
}
|
|
227
|
+
const cloudValue = requiredString(project, 'cloud', 'Manifest.project');
|
|
228
|
+
const provider = getProvider(cloudValue);
|
|
229
|
+
if (!provider || provider.id !== cloudValue || provider.status !== 'available') {
|
|
230
|
+
throw new FileSystemError(`Manifest project cloud ${JSON.stringify(cloudValue)} is invalid or unavailable.`);
|
|
231
|
+
}
|
|
232
|
+
const regionValue = requiredString(project, 'region', 'Manifest.project');
|
|
233
|
+
if (!listRegions(provider.id).some((region) => region.slug === regionValue)) {
|
|
234
|
+
throw new FileSystemError(`Manifest project region ${JSON.stringify(regionValue)} is invalid for ${provider.id}.`);
|
|
235
|
+
}
|
|
236
|
+
const frontend = project.frontend;
|
|
237
|
+
if (typeof frontend !== 'boolean') {
|
|
238
|
+
throw new FileSystemError('Manifest.project.frontend must be a boolean.');
|
|
239
|
+
}
|
|
240
|
+
const specWorkflowValue = requiredString(project, 'specWorkflow', 'Manifest.project');
|
|
241
|
+
const specWorkflow = getSpecWorkflow(specWorkflowValue);
|
|
242
|
+
if (!specWorkflow || specWorkflow.id !== specWorkflowValue) {
|
|
243
|
+
throw new FileSystemError(`Manifest project specWorkflow ${JSON.stringify(specWorkflowValue)} is invalid.`);
|
|
244
|
+
}
|
|
245
|
+
if (!Array.isArray(project.environments) || project.environments.length === 0) {
|
|
246
|
+
throw new FileSystemError('Manifest.project.environments must be a non-empty string array.');
|
|
247
|
+
}
|
|
248
|
+
const environments = project.environments.map((value, index) => {
|
|
249
|
+
if (typeof value !== 'string') {
|
|
250
|
+
throw new FileSystemError(`Manifest.project.environments[${index}] must be a string.`);
|
|
251
|
+
}
|
|
252
|
+
const environment = getEnvironment(value);
|
|
253
|
+
if (!environment || environment.id !== value) {
|
|
254
|
+
throw new FileSystemError(`Manifest project environment ${JSON.stringify(value)} is invalid.`);
|
|
255
|
+
}
|
|
256
|
+
return environment.id;
|
|
257
|
+
});
|
|
258
|
+
if (new Set(environments).size !== environments.length) {
|
|
259
|
+
throw new FileSystemError('Manifest.project.environments must not contain duplicates.');
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
name,
|
|
263
|
+
projectType: projectType.id,
|
|
264
|
+
apiStack: apiStack.id,
|
|
265
|
+
...(pattern ? { pattern: pattern.id } : {}),
|
|
266
|
+
cloud: provider.id,
|
|
267
|
+
region: regionValue,
|
|
268
|
+
frontend,
|
|
269
|
+
specWorkflow: specWorkflow.id,
|
|
270
|
+
environments
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function normalizeManifestArtifacts(value) {
|
|
274
|
+
if (!Array.isArray(value)) {
|
|
275
|
+
throw new FileSystemError('Manifest.artifacts must be an array.');
|
|
276
|
+
}
|
|
277
|
+
const logicalNames = new Set();
|
|
278
|
+
const paths = new Set();
|
|
279
|
+
return value.map((entry, index) => {
|
|
280
|
+
const scope = `Manifest.artifacts[${index}]`;
|
|
281
|
+
if (!isRecord(entry)) {
|
|
282
|
+
throw new FileSystemError(`${scope} must be a JSON object.`);
|
|
283
|
+
}
|
|
284
|
+
const logicalName = requiredString(entry, 'logicalName', scope);
|
|
285
|
+
const category = requiredString(entry, 'category', scope);
|
|
286
|
+
const pathParts = validateArtifactPathParts(entry.pathParts, `${scope}.pathParts`);
|
|
287
|
+
const contentHash = requiredString(entry, 'contentHash', scope);
|
|
288
|
+
if (!CONTENT_HASH_PATTERN.test(contentHash)) {
|
|
289
|
+
throw new FileSystemError(`${scope}.contentHash must be a sha256-prefixed lowercase hexadecimal digest.`);
|
|
290
|
+
}
|
|
291
|
+
if (logicalNames.has(logicalName)) {
|
|
292
|
+
throw new FileSystemError(`Manifest contains duplicate logicalName ${JSON.stringify(logicalName)}.`);
|
|
293
|
+
}
|
|
294
|
+
logicalNames.add(logicalName);
|
|
295
|
+
const pathKey = pathParts.join('\0');
|
|
296
|
+
if (paths.has(pathKey)) {
|
|
297
|
+
throw new FileSystemError(`Manifest contains duplicate artifact path ${pathParts.join('/')}.`);
|
|
298
|
+
}
|
|
299
|
+
paths.add(pathKey);
|
|
300
|
+
return { logicalName, category, pathParts, contentHash };
|
|
301
|
+
});
|
|
65
302
|
}
|
|
66
303
|
export async function validateGeneratedProject(projectRoot) {
|
|
67
304
|
let manifest;
|
|
@@ -73,12 +310,17 @@ export async function validateGeneratedProject(projectRoot) {
|
|
|
73
310
|
}
|
|
74
311
|
const issues = [];
|
|
75
312
|
for (const artifact of manifest.artifacts) {
|
|
76
|
-
const targetPath = artifactPath(projectRoot, artifact.pathParts);
|
|
77
313
|
try {
|
|
314
|
+
const targetPath = await resolveProjectPath(projectRoot, artifact.pathParts);
|
|
78
315
|
await access(targetPath);
|
|
79
316
|
}
|
|
80
|
-
catch {
|
|
81
|
-
|
|
317
|
+
catch (error) {
|
|
318
|
+
if (errorCode(error) === 'ENOENT') {
|
|
319
|
+
issues.push(`Missing artifact ${artifact.logicalName} at ${artifact.pathParts.join('/')}`);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
issues.push(`Unable to access artifact ${artifact.logicalName} at ${artifact.pathParts.join('/')}: ${errorMessage(error)}`);
|
|
323
|
+
}
|
|
82
324
|
}
|
|
83
325
|
}
|
|
84
326
|
return issues;
|
|
@@ -93,7 +335,10 @@ export async function findProjectRoot(startDir) {
|
|
|
93
335
|
await access(path.join(current, 'liftoff.manifest.json'));
|
|
94
336
|
return current;
|
|
95
337
|
}
|
|
96
|
-
catch {
|
|
338
|
+
catch (error) {
|
|
339
|
+
if (errorCode(error) !== 'ENOENT' && errorCode(error) !== 'ENOTDIR') {
|
|
340
|
+
throw new FileSystemError(`Unable to inspect ${current} for a Liftoff manifest: ${errorMessage(error)}`);
|
|
341
|
+
}
|
|
97
342
|
const parent = path.dirname(current);
|
|
98
343
|
if (parent === current) {
|
|
99
344
|
return undefined;
|
|
@@ -102,17 +347,54 @@ export async function findProjectRoot(startDir) {
|
|
|
102
347
|
}
|
|
103
348
|
}
|
|
104
349
|
}
|
|
350
|
+
export async function readProjectFile(projectRoot, pathParts) {
|
|
351
|
+
const targetPath = await resolveProjectPath(projectRoot, pathParts);
|
|
352
|
+
try {
|
|
353
|
+
return await readFile(targetPath);
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
if (errorCode(error) === 'ENOENT') {
|
|
357
|
+
return undefined;
|
|
358
|
+
}
|
|
359
|
+
throw new FileSystemError(`Unable to read ${pathParts.join('/')}: ${errorMessage(error)}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
105
362
|
export async function writeProjectFile(projectRoot, pathParts, content) {
|
|
106
|
-
const targetPath =
|
|
107
|
-
|
|
108
|
-
|
|
363
|
+
const targetPath = await resolveProjectPath(projectRoot, pathParts);
|
|
364
|
+
const temporaryPath = path.join(path.dirname(targetPath), `.${path.basename(targetPath)}.liftoff-${process.pid}-${randomUUID()}.tmp`);
|
|
365
|
+
let temporaryFileWritten = false;
|
|
366
|
+
try {
|
|
367
|
+
await mkdir(path.dirname(targetPath), { recursive: true });
|
|
368
|
+
await writeFile(temporaryPath, content, { encoding: 'utf8', flag: 'wx' });
|
|
369
|
+
temporaryFileWritten = true;
|
|
370
|
+
await rename(temporaryPath, targetPath);
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
let cleanupFailure;
|
|
374
|
+
if (temporaryFileWritten) {
|
|
375
|
+
try {
|
|
376
|
+
await unlink(temporaryPath);
|
|
377
|
+
}
|
|
378
|
+
catch (cleanupError) {
|
|
379
|
+
if (errorCode(cleanupError) !== 'ENOENT') {
|
|
380
|
+
cleanupFailure = errorMessage(cleanupError);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
const cleanupDetail = cleanupFailure ? ` Temporary-file cleanup also failed: ${cleanupFailure}` : '';
|
|
385
|
+
throw new FileSystemError(`Unable to write ${pathParts.join('/')}: ${errorMessage(error)}${cleanupDetail}`);
|
|
386
|
+
}
|
|
109
387
|
}
|
|
110
388
|
export async function deleteProjectFile(projectRoot, pathParts) {
|
|
389
|
+
const targetPath = await resolveProjectPath(projectRoot, pathParts);
|
|
111
390
|
try {
|
|
112
|
-
await unlink(
|
|
391
|
+
await unlink(targetPath);
|
|
113
392
|
}
|
|
114
|
-
catch {
|
|
115
|
-
|
|
393
|
+
catch (error) {
|
|
394
|
+
if (errorCode(error) === 'ENOENT') {
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
throw new FileSystemError(`Unable to delete ${pathParts.join('/')}: ${errorMessage(error)}`);
|
|
116
398
|
}
|
|
117
399
|
}
|
|
118
400
|
//# sourceMappingURL=file-system.js.map
|
package/dist/file-system.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../src/file-system.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../src/file-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AddArtifact } from './template-types.js';
|
|
2
|
+
import type { ProjectPlan } from './types.js';
|
|
3
|
+
interface GenAiArtifactBuilders {
|
|
4
|
+
backend: (add: AddArtifact, plan: ProjectPlan) => void;
|
|
5
|
+
database: (add: AddArtifact, plan: ProjectPlan) => void;
|
|
6
|
+
pattern: (add: AddArtifact, plan: ProjectPlan) => void;
|
|
7
|
+
functions: (add: AddArtifact, plan: ProjectPlan) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function addGenAiExtensionArtifacts(add: AddArtifact, plan: ProjectPlan, builders: GenAiArtifactBuilders): void;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function addGenAiExtensionArtifacts(add, plan, builders) {
|
|
2
|
+
if (plan.projectType.id !== 'genai' || !plan.pattern) {
|
|
3
|
+
throw new Error('GenAI artifact rendering requires a GenAI project plan.');
|
|
4
|
+
}
|
|
5
|
+
builders.backend(add, plan);
|
|
6
|
+
builders.database(add, plan);
|
|
7
|
+
builders.pattern(add, plan);
|
|
8
|
+
builders.functions(add, plan);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=genai-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genai-templates.js","sourceRoot":"","sources":["../src/genai-templates.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,0BAA0B,CACxC,GAAgB,EAChB,IAAiB,EACjB,QAA+B;IAE/B,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/interactive.js
CHANGED
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
import { createInterface } from 'node:readline/promises';
|
|
2
2
|
import { stdin as input, stdout as output } from 'node:process';
|
|
3
|
-
import { environments, getPattern, getProvider, getSpecWorkflow, patterns, providers, resolveRegion, specWorkflows } from './catalogs.js';
|
|
3
|
+
import { apiStacks, environments, getApiStack, getPattern, getProjectType, getProvider, getSpecWorkflow, patterns, providers, resolveRegion, specWorkflows } from './catalogs.js';
|
|
4
4
|
import { formatProjectPlan } from './planner.js';
|
|
5
5
|
export async function promptForCreateOptions(initial) {
|
|
6
6
|
const rl = createInterface({ input, output });
|
|
7
7
|
try {
|
|
8
8
|
const projectName = initial.projectName ?? await askRequired(rl, 'Project name');
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
const inferredProjectType = initial.projectType ?? (initial.pattern ? 'genai' : initial.apiStack ? 'standard' : undefined);
|
|
10
|
+
const projectType = inferredProjectType ?? (await confirm(rl, 'Is this a GenAI project?', true) ? 'genai' : 'standard');
|
|
11
|
+
const pattern = projectType === 'genai'
|
|
12
|
+
? initial.pattern ?? await choose(rl, 'Select GenAI pattern', patterns.map((pattern) => ({
|
|
13
|
+
value: pattern.id,
|
|
14
|
+
label: `${pattern.label} (${pattern.scaffoldStatus})`,
|
|
15
|
+
disabled: false
|
|
16
|
+
})))
|
|
17
|
+
: initial.pattern;
|
|
18
|
+
const apiStack = projectType === 'standard'
|
|
19
|
+
? initial.apiStack ?? await choose(rl, 'Select API stack', apiStacks.map((stack) => ({
|
|
20
|
+
value: stack.id,
|
|
21
|
+
label: `${stack.label} (${stack.databaseTooling})`,
|
|
22
|
+
disabled: false
|
|
23
|
+
})), 'python-fastapi')
|
|
24
|
+
: initial.apiStack ?? 'python-fastapi';
|
|
14
25
|
const cloud = initial.cloud ?? await choose(rl, 'Target cloud', providers.map((provider) => ({
|
|
15
26
|
value: provider.id,
|
|
16
27
|
label: `${provider.label}${provider.status === 'planned' ? ' - planned' : ''}`,
|
|
@@ -27,6 +38,8 @@ export async function promptForCreateOptions(initial) {
|
|
|
27
38
|
return {
|
|
28
39
|
...initial,
|
|
29
40
|
projectName,
|
|
41
|
+
projectType,
|
|
42
|
+
apiStack,
|
|
30
43
|
pattern,
|
|
31
44
|
cloud,
|
|
32
45
|
region,
|
|
@@ -132,6 +145,8 @@ async function askEnvironments(rl) {
|
|
|
132
145
|
export function resolveCatalogInput(options) {
|
|
133
146
|
return {
|
|
134
147
|
...options,
|
|
148
|
+
projectType: options.projectType && getProjectType(options.projectType)?.id,
|
|
149
|
+
apiStack: options.apiStack && getApiStack(options.apiStack)?.id,
|
|
135
150
|
pattern: options.pattern && getPattern(options.pattern)?.id,
|
|
136
151
|
cloud: options.cloud && getProvider(options.cloud)?.id,
|
|
137
152
|
specWorkflow: options.specWorkflow && getSpecWorkflow(options.specWorkflow)?.id
|
package/dist/interactive.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"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"}
|
package/dist/migrate-plan.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export interface SeededGroup {
|
|
|
4
4
|
title: string;
|
|
5
5
|
tasks: string[];
|
|
6
6
|
}
|
|
7
|
-
export declare function seedMigrationGroups(inventory: LegacyInventory): SeededGroup[];
|
|
7
|
+
export declare function seedMigrationGroups(inventory: LegacyInventory, plan: ProjectPlan): SeededGroup[];
|
|
8
8
|
export declare function renderMigrationTasks(groups: SeededGroup[]): string;
|
|
9
9
|
export declare function renderMigrationProposal(plan: ProjectPlan, inventory: LegacyInventory): string;
|
|
10
10
|
export declare function renderMigrationChecklist(plan: ProjectPlan, inventory: LegacyInventory, groups: SeededGroup[]): string;
|