@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.
@@ -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) => `Port Python dependencies from ${staged(f.sourcePath)} into backend/pyproject.toml`),
12
- ...byKind('node-deps').map((f) => `Reconcile Node dependencies from ${staged(f.sourcePath)} with the scaffold (frontend/package.json when a frontend is generated)`)
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 backend/config/settings.py`));
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 backend/apis/routes/ and register them in backend/apis/main.py (detected: ${finding.evidence})`);
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(`Rewrite the application entrypoints as FastAPI routes under backend/apis/routes/ - large task: port handlers, middleware, and auth (detected: ${finding.evidence})`);
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('retrieval').map((f) => `Move retrieval and vector-store code into backend/orchestration/retrieval/ (detected: ${f.evidence})`));
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) => `Graft migration history from ${staged(f.sourcePath)} into database/migrations/`),
29
- ...byKind('tests').map((f) => `Relocate tests from ${staged(f.sourcePath)} under backend/tests/`)
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
- - Pattern: ${plan.pattern.label}
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}
@@ -1 +1 @@
1
- {"version":3,"file":"migrate-plan.js","sourceRoot":"","sources":["../src/migrate-plan.ts"],"names":[],"mappings":"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"}
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 { approvedStack, environments, getEnvironment, getPattern, getProvider, getSpecWorkflow, resolveRegion, specWorkflows } from './catalogs.js';
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
- const raw = await readFile(resolvedPath, 'utf8');
15
- const parsed = JSON.parse(raw);
16
- return parsed;
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
- if (!pattern) {
35
- issues.push(input.pattern ? `Unknown GenAI pattern: ${input.pattern}.` : 'GenAI pattern is required.');
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 || !projectName && options.requireProjectName || !pattern || !provider || !specWorkflow || provider.status !== 'available' || !regionResolution || regionResolution.status !== 'resolved') {
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.frontendStarter,
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
- `Pattern: ${plan.pattern.label} (${plan.pattern.scaffoldStatus})`,
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
- 'Local development: Docker Compose with PostgreSQL/pgvector, Redis, Azurite, Mailpit, and optional Langfuse profile',
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
  }
@@ -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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"}
@@ -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 { readFile } from 'node:fs/promises';
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
- try {
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
- ? 'relocated by the current templates'
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
  }
@@ -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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"}
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;