@msn-control/liftoff 0.9.8 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/DEVELOPER.md +142 -0
  2. package/README.md +26 -18
  3. package/assets/governance/single-maintainer-gitflow/policy.md +62 -13
  4. package/dist/args.js +21 -0
  5. package/dist/args.js.map +1 -1
  6. package/dist/artifact-lifecycle.d.ts +1 -1
  7. package/dist/artifact-lifecycle.js +5 -0
  8. package/dist/artifact-lifecycle.js.map +1 -1
  9. package/dist/commands.js +355 -13
  10. package/dist/commands.js.map +1 -1
  11. package/dist/file-system.js +100 -13
  12. package/dist/file-system.js.map +1 -1
  13. package/dist/governance-activation/activation-state.d.ts +32 -0
  14. package/dist/governance-activation/activation-state.js +165 -0
  15. package/dist/governance-activation/activation-state.js.map +1 -0
  16. package/dist/governance-activation/approvals.d.ts +188 -0
  17. package/dist/governance-activation/approvals.js +508 -0
  18. package/dist/governance-activation/approvals.js.map +1 -0
  19. package/dist/governance-activation/canonical-json.d.ts +3 -0
  20. package/dist/governance-activation/canonical-json.js +36 -0
  21. package/dist/governance-activation/canonical-json.js.map +1 -0
  22. package/dist/governance-activation/commands.d.ts +10 -0
  23. package/dist/governance-activation/commands.js +1023 -0
  24. package/dist/governance-activation/commands.js.map +1 -0
  25. package/dist/governance-activation/compatibility.d.ts +68 -0
  26. package/dist/governance-activation/compatibility.js +447 -0
  27. package/dist/governance-activation/compatibility.js.map +1 -0
  28. package/dist/governance-activation/credentials.d.ts +160 -0
  29. package/dist/governance-activation/credentials.js +403 -0
  30. package/dist/governance-activation/credentials.js.map +1 -0
  31. package/dist/governance-activation/doctor.d.ts +10 -0
  32. package/dist/governance-activation/doctor.js +379 -0
  33. package/dist/governance-activation/doctor.js.map +1 -0
  34. package/dist/governance-activation/evidence.d.ts +49 -0
  35. package/dist/governance-activation/evidence.js +246 -0
  36. package/dist/governance-activation/evidence.js.map +1 -0
  37. package/dist/governance-activation/graph.d.ts +397 -0
  38. package/dist/governance-activation/graph.js +441 -0
  39. package/dist/governance-activation/graph.js.map +1 -0
  40. package/dist/governance-activation/identity.d.ts +35 -0
  41. package/dist/governance-activation/identity.js +89 -0
  42. package/dist/governance-activation/identity.js.map +1 -0
  43. package/dist/governance-activation/index.d.ts +18 -0
  44. package/dist/governance-activation/index.js +19 -0
  45. package/dist/governance-activation/index.js.map +1 -0
  46. package/dist/governance-activation/migration.d.ts +44 -0
  47. package/dist/governance-activation/migration.js +268 -0
  48. package/dist/governance-activation/migration.js.map +1 -0
  49. package/dist/governance-activation/readiness.d.ts +23 -0
  50. package/dist/governance-activation/readiness.js +158 -0
  51. package/dist/governance-activation/readiness.js.map +1 -0
  52. package/dist/governance-activation/reconciliation.d.ts +11 -0
  53. package/dist/governance-activation/reconciliation.js +58 -0
  54. package/dist/governance-activation/reconciliation.js.map +1 -0
  55. package/dist/governance-activation/release-integrity.d.ts +11 -0
  56. package/dist/governance-activation/release-integrity.js +49 -0
  57. package/dist/governance-activation/release-integrity.js.map +1 -0
  58. package/dist/governance-activation/seed-lifecycle.d.ts +116 -0
  59. package/dist/governance-activation/seed-lifecycle.js +609 -0
  60. package/dist/governance-activation/seed-lifecycle.js.map +1 -0
  61. package/dist/governance-activation/source-of-truth.d.ts +164 -0
  62. package/dist/governance-activation/source-of-truth.js +986 -0
  63. package/dist/governance-activation/source-of-truth.js.map +1 -0
  64. package/dist/governance-activation/task-projection.d.ts +21 -0
  65. package/dist/governance-activation/task-projection.js +75 -0
  66. package/dist/governance-activation/task-projection.js.map +1 -0
  67. package/dist/governance-activation/transitions.d.ts +163 -0
  68. package/dist/governance-activation/transitions.js +2128 -0
  69. package/dist/governance-activation/transitions.js.map +1 -0
  70. package/dist/governance-activation/type-contract.d.ts +1 -0
  71. package/dist/governance-activation/type-contract.js +27 -0
  72. package/dist/governance-activation/type-contract.js.map +1 -0
  73. package/dist/governance-activation/types.d.ts +390 -0
  74. package/dist/governance-activation/types.js +108 -0
  75. package/dist/governance-activation/types.js.map +1 -0
  76. package/dist/governance-activation/validators.d.ts +17 -0
  77. package/dist/governance-activation/validators.js +1305 -0
  78. package/dist/governance-activation/validators.js.map +1 -0
  79. package/dist/init-filesystem.js +5 -1
  80. package/dist/init-filesystem.js.map +1 -1
  81. package/dist/planner.js +3 -3
  82. package/dist/planner.js.map +1 -1
  83. package/dist/power-apps-templates.js +14 -1
  84. package/dist/power-apps-templates.js.map +1 -1
  85. package/dist/process-runner.d.ts +3 -0
  86. package/dist/process-runner.js +68 -10
  87. package/dist/process-runner.js.map +1 -1
  88. package/dist/repository-governance.d.ts +13 -3
  89. package/dist/repository-governance.js +385 -52
  90. package/dist/repository-governance.js.map +1 -1
  91. package/dist/telemetry/contract.d.ts +1 -1
  92. package/dist/telemetry/contract.js +6 -0
  93. package/dist/telemetry/contract.js.map +1 -1
  94. package/dist/templates.js +320 -25
  95. package/dist/templates.js.map +1 -1
  96. package/dist/types.d.ts +14 -6
  97. package/docs/cli-reference.md +60 -12
  98. package/docs/configuration-and-manifests.md +40 -16
  99. package/docs/existing-repositories.md +22 -11
  100. package/docs/getting-started.md +46 -10
  101. package/docs/prerequisites.md +5 -0
  102. package/docs/project-structure.md +34 -5
  103. package/docs/repository-governance.md +200 -203
  104. package/docs/safety-and-consent.md +29 -2
  105. package/docs/troubleshooting.md +74 -4
  106. package/docs/workloads.md +1 -1
  107. package/package.json +2 -1
@@ -0,0 +1,609 @@
1
+ import { readdir, readFile } from 'node:fs/promises';
2
+ import { loadManifest, resolveProjectPath, writeProjectFile } from '../file-system.js';
3
+ import { getPattern } from '../catalogs.js';
4
+ import { toSafeProjectName } from '../planner.js';
5
+ import { formatCommand } from '../process-runner.js';
6
+ const seedChangePathParts = (changeName) => ['openspec', 'changes', changeName];
7
+ function errorCode(error) {
8
+ if (typeof error !== 'object' || error === null || !('code' in error)) {
9
+ return undefined;
10
+ }
11
+ const code = error.code;
12
+ return typeof code === 'string' ? code : undefined;
13
+ }
14
+ function errorMessage(error) {
15
+ return error instanceof Error ? error.message : String(error);
16
+ }
17
+ export function generatedSeedChangeName(manifest) {
18
+ return `bootstrap-${toSafeProjectName(manifest.project.name)}`;
19
+ }
20
+ export function generatedSeedCapabilityId(workload) {
21
+ if (workload.kind === 'power-apps-code-app') {
22
+ return 'power-apps-code-app-baseline';
23
+ }
24
+ if (workload.kind === 'standard') {
25
+ return `${workload.apiStack}-application-baseline`;
26
+ }
27
+ return `${workload.pattern}-application-baseline`;
28
+ }
29
+ function isWorkerWorkload(workload) {
30
+ return workload.kind === 'genai' && getPattern(workload.pattern)?.worker === true;
31
+ }
32
+ export function selectSeedBaselineChecks(manifest, changeName = generatedSeedChangeName(manifest)) {
33
+ const workload = manifest.project.workload;
34
+ const checks = [
35
+ {
36
+ id: 'liftoff-validate',
37
+ taskId: '2.1',
38
+ label: 'Run Liftoff manifest validation',
39
+ applicability: {
40
+ applicable: true,
41
+ command: { executable: 'liftoff', args: ['validate'] },
42
+ cwdPathParts: []
43
+ }
44
+ }
45
+ ];
46
+ if (workload.kind === 'power-apps-code-app') {
47
+ checks.push({
48
+ id: 'backend-tests',
49
+ taskId: '2.2',
50
+ label: 'Record backend tests as inapplicable',
51
+ applicability: {
52
+ applicable: false,
53
+ reason: 'no Liftoff backend is generated for Power Apps code apps'
54
+ }
55
+ });
56
+ }
57
+ else if (workload.kind === 'genai' || workload.apiStack === 'python-fastapi') {
58
+ checks.push({
59
+ id: 'backend-tests',
60
+ taskId: '2.2',
61
+ label: 'Run backend tests',
62
+ applicability: {
63
+ applicable: true,
64
+ command: { executable: 'uv', args: ['run', '--project', 'backend', 'python', '-m', 'pytest', '-q', 'backend/tests'] },
65
+ cwdPathParts: []
66
+ }
67
+ });
68
+ }
69
+ else if (workload.apiStack === 'node-fastify') {
70
+ checks.push({
71
+ id: 'backend-tests',
72
+ taskId: '2.2',
73
+ label: 'Run backend tests',
74
+ applicability: {
75
+ applicable: true,
76
+ command: { executable: 'npm', args: ['test'] },
77
+ cwdPathParts: ['backend']
78
+ }
79
+ });
80
+ }
81
+ else {
82
+ checks.push({
83
+ id: 'backend-tests',
84
+ taskId: '2.2',
85
+ label: 'Run backend tests',
86
+ applicability: {
87
+ applicable: true,
88
+ command: { executable: 'go', args: ['test', './...'] },
89
+ cwdPathParts: ['backend']
90
+ }
91
+ });
92
+ }
93
+ if (isWorkerWorkload(workload)) {
94
+ checks.push({
95
+ id: 'worker-tests',
96
+ taskId: '2.3',
97
+ label: 'Run generated worker tests',
98
+ applicability: {
99
+ applicable: true,
100
+ command: { executable: 'uv', args: ['run', '--project', '../../backend', '--directory', '.', 'python', '-m', 'pytest', '-q'] },
101
+ cwdPathParts: ['functions', `${workload.pattern}-worker`]
102
+ }
103
+ });
104
+ }
105
+ else {
106
+ checks.push({
107
+ id: 'worker-tests',
108
+ taskId: '2.3',
109
+ label: 'Record worker tests as inapplicable',
110
+ applicability: {
111
+ applicable: false,
112
+ reason: 'no generated worker boundary is present'
113
+ }
114
+ });
115
+ }
116
+ if (workload.kind === 'power-apps-code-app') {
117
+ checks.push({
118
+ id: 'frontend-build',
119
+ taskId: '2.4',
120
+ label: 'Run frontend build',
121
+ applicability: {
122
+ applicable: true,
123
+ command: { executable: 'npm', args: ['run', 'build'] },
124
+ cwdPathParts: []
125
+ }
126
+ });
127
+ }
128
+ else if (workload.frontend) {
129
+ checks.push({
130
+ id: 'frontend-build',
131
+ taskId: '2.4',
132
+ label: 'Run frontend build',
133
+ applicability: {
134
+ applicable: true,
135
+ command: { executable: 'npm', args: ['run', 'build'] },
136
+ cwdPathParts: ['frontend']
137
+ }
138
+ });
139
+ }
140
+ else {
141
+ checks.push({
142
+ id: 'frontend-build',
143
+ taskId: '2.4',
144
+ label: 'Record frontend build as inapplicable',
145
+ applicability: {
146
+ applicable: false,
147
+ reason: 'no generated frontend is present'
148
+ }
149
+ });
150
+ }
151
+ if (workload.kind === 'power-apps-code-app') {
152
+ for (const [id, taskId, label] of [
153
+ ['docker-compose-config', '2.5', 'Record Docker Compose validation as inapplicable'],
154
+ ['tofu-fmt', '2.6', 'Record OpenTofu formatting as inapplicable'],
155
+ ['tofu-init', '2.7', 'Record OpenTofu initialization as inapplicable'],
156
+ ['tofu-validate', '2.8', 'Record OpenTofu validation as inapplicable']
157
+ ]) {
158
+ checks.push({
159
+ id,
160
+ taskId,
161
+ label,
162
+ applicability: {
163
+ applicable: false,
164
+ reason: id === 'docker-compose-config'
165
+ ? 'no generated Docker Compose boundary is present'
166
+ : 'no generated OpenTofu boundary is present'
167
+ }
168
+ });
169
+ }
170
+ }
171
+ else {
172
+ checks.push({
173
+ id: 'docker-compose-config',
174
+ taskId: '2.5',
175
+ label: 'Validate Docker Compose configuration without startup',
176
+ applicability: {
177
+ applicable: true,
178
+ command: { executable: 'docker', args: ['compose', 'config', '-q'] },
179
+ cwdPathParts: []
180
+ }
181
+ }, {
182
+ id: 'tofu-fmt',
183
+ taskId: '2.6',
184
+ label: 'Check OpenTofu formatting',
185
+ applicability: {
186
+ applicable: true,
187
+ command: { executable: 'tofu', args: ['fmt', '-check', '-recursive'] },
188
+ cwdPathParts: ['infrastructure', 'opentofu', 'azure']
189
+ }
190
+ }, {
191
+ id: 'tofu-init',
192
+ taskId: '2.7',
193
+ label: 'Initialize OpenTofu without a remote backend',
194
+ applicability: {
195
+ applicable: true,
196
+ command: { executable: 'tofu', args: ['init', '-backend=false'] },
197
+ cwdPathParts: ['infrastructure', 'opentofu', 'azure']
198
+ }
199
+ }, {
200
+ id: 'tofu-validate',
201
+ taskId: '2.8',
202
+ label: 'Validate OpenTofu configuration without plan or apply',
203
+ applicability: {
204
+ applicable: true,
205
+ command: { executable: 'tofu', args: ['validate'] },
206
+ cwdPathParts: ['infrastructure', 'opentofu', 'azure']
207
+ }
208
+ });
209
+ }
210
+ checks.push({
211
+ id: 'openspec-strict',
212
+ taskId: '2.9',
213
+ label: 'Run strict OpenSpec validation',
214
+ applicability: {
215
+ applicable: true,
216
+ command: { executable: 'openspec', args: ['validate', changeName, '--strict'] },
217
+ cwdPathParts: []
218
+ }
219
+ });
220
+ return checks;
221
+ }
222
+ function extractDeclaredCapabilities(proposal) {
223
+ const capabilities = [];
224
+ const lines = proposal.split(/\r?\n/);
225
+ let inNewCapabilities = false;
226
+ for (const line of lines) {
227
+ if (/^###\s+New Capabilities\s*$/i.test(line.trim())) {
228
+ inNewCapabilities = true;
229
+ continue;
230
+ }
231
+ if (inNewCapabilities && /^###\s+/.test(line.trim())) {
232
+ break;
233
+ }
234
+ if (!inNewCapabilities) {
235
+ continue;
236
+ }
237
+ const match = line.match(/^\s*-\s+`([^`]+)`:/);
238
+ if (match) {
239
+ capabilities.push(match[1]);
240
+ }
241
+ }
242
+ return capabilities;
243
+ }
244
+ async function readRequiredProjectText(projectRoot, pathParts) {
245
+ const filePath = await resolveProjectPath(projectRoot, [...pathParts]);
246
+ try {
247
+ return await readFile(filePath, 'utf8');
248
+ }
249
+ catch (error) {
250
+ if (errorCode(error) === 'ENOENT') {
251
+ throw new Error(`Missing required seed artifact ${pathParts.join('/')}.`);
252
+ }
253
+ throw new Error(`Unable to read seed artifact ${pathParts.join('/')}: ${errorMessage(error)}.`);
254
+ }
255
+ }
256
+ async function activeBootstrapChanges(projectRoot) {
257
+ const changesRoot = await resolveProjectPath(projectRoot, ['openspec', 'changes']);
258
+ let entries;
259
+ try {
260
+ entries = await readdir(changesRoot, { withFileTypes: true });
261
+ }
262
+ catch (error) {
263
+ if (errorCode(error) === 'ENOENT') {
264
+ return [];
265
+ }
266
+ throw new Error(`Unable to inspect openspec/changes: ${errorMessage(error)}.`);
267
+ }
268
+ return entries
269
+ .filter((entry) => entry.isDirectory() && entry.name.startsWith('bootstrap-') && entry.name !== 'archive')
270
+ .map((entry) => entry.name)
271
+ .sort();
272
+ }
273
+ async function archivedBootstrapChangeExists(projectRoot, changeName) {
274
+ const archiveRoot = await resolveProjectPath(projectRoot, ['openspec', 'changes', 'archive']);
275
+ let entries;
276
+ try {
277
+ entries = await readdir(archiveRoot, { withFileTypes: true });
278
+ }
279
+ catch (error) {
280
+ if (errorCode(error) === 'ENOENT') {
281
+ return false;
282
+ }
283
+ throw new Error(`Unable to inspect openspec/changes/archive: ${errorMessage(error)}.`);
284
+ }
285
+ return entries.some((entry) => entry.isDirectory() && entry.name.endsWith(changeName));
286
+ }
287
+ export async function discoverGeneratedSeed(projectRoot) {
288
+ const manifest = await loadManifest(projectRoot);
289
+ const changeName = generatedSeedChangeName(manifest);
290
+ if (manifest.project.specWorkflow !== 'openspec') {
291
+ return {
292
+ state: 'blocked',
293
+ changeName,
294
+ issues: ['The generated project does not use OpenSpec, so no OpenSpec bootstrap seed can be completed.']
295
+ };
296
+ }
297
+ const active = await activeBootstrapChanges(projectRoot);
298
+ if (active.length === 0) {
299
+ if (await archivedBootstrapChangeExists(projectRoot, changeName)) {
300
+ return {
301
+ state: 'archived',
302
+ changeName,
303
+ detail: 'The generated bootstrap seed is already archived.'
304
+ };
305
+ }
306
+ return {
307
+ state: 'blocked',
308
+ changeName,
309
+ issues: [`Generated seed ${changeName} is absent from openspec/changes and not archived.`]
310
+ };
311
+ }
312
+ if (active.length !== 1 || active[0] !== changeName) {
313
+ return {
314
+ state: 'blocked',
315
+ changeName,
316
+ issues: [`Expected exactly active generated seed ${changeName}; found ${active.join(', ')}.`]
317
+ };
318
+ }
319
+ const changePathParts = seedChangePathParts(changeName);
320
+ const issues = [];
321
+ let proposal = '';
322
+ for (const artifact of ['.openspec.yaml', 'proposal.md', 'design.md', 'tasks.md']) {
323
+ try {
324
+ const content = await readRequiredProjectText(projectRoot, [...changePathParts, artifact]);
325
+ if (artifact === 'proposal.md') {
326
+ proposal = content;
327
+ }
328
+ }
329
+ catch (error) {
330
+ issues.push(errorMessage(error));
331
+ }
332
+ }
333
+ const declaredCapabilities = proposal ? extractDeclaredCapabilities(proposal) : [];
334
+ if (declaredCapabilities.length !== 1) {
335
+ issues.push(`Expected exactly one proposal-declared bootstrap capability; found ${declaredCapabilities.length}.`);
336
+ }
337
+ const expectedCapability = generatedSeedCapabilityId(manifest.project.workload);
338
+ const capabilityId = declaredCapabilities[0] ?? expectedCapability;
339
+ if (capabilityId !== expectedCapability) {
340
+ issues.push(`Proposal declares ${capabilityId}, but manifest workload requires ${expectedCapability}.`);
341
+ }
342
+ try {
343
+ await readRequiredProjectText(projectRoot, [...changePathParts, 'specs', capabilityId, 'spec.md']);
344
+ }
345
+ catch (error) {
346
+ issues.push(errorMessage(error));
347
+ }
348
+ if (issues.length > 0) {
349
+ return { state: 'blocked', changeName, issues };
350
+ }
351
+ return { state: 'active', changeName, changePathParts, capabilityId };
352
+ }
353
+ function checkFailureDetail(result) {
354
+ if (result.timedOut) {
355
+ return 'command timed out';
356
+ }
357
+ if (result.errorCode || result.errorMessage) {
358
+ return [result.errorCode, result.errorMessage].filter(Boolean).join(': ');
359
+ }
360
+ return `exit status ${result.status ?? 'unknown'}`;
361
+ }
362
+ async function runSeedBaselineCheck(projectRoot, runner, check) {
363
+ if (!check.applicability.applicable) {
364
+ return {
365
+ id: check.id,
366
+ taskId: check.taskId,
367
+ label: check.label,
368
+ status: 'inapplicable',
369
+ reason: check.applicability.reason
370
+ };
371
+ }
372
+ const cwd = check.applicability.cwdPathParts.length === 0
373
+ ? projectRoot
374
+ : await resolveProjectPath(projectRoot, [...check.applicability.cwdPathParts]);
375
+ const result = await runner.run(check.applicability.command, { cwd });
376
+ if (result.status === 0 && !result.timedOut && !result.errorCode) {
377
+ return {
378
+ id: check.id,
379
+ taskId: check.taskId,
380
+ label: check.label,
381
+ status: 'passed',
382
+ command: check.applicability.command,
383
+ cwdPathParts: check.applicability.cwdPathParts,
384
+ result
385
+ };
386
+ }
387
+ return {
388
+ id: check.id,
389
+ taskId: check.taskId,
390
+ label: check.label,
391
+ status: 'failed',
392
+ command: check.applicability.command,
393
+ cwdPathParts: check.applicability.cwdPathParts,
394
+ result,
395
+ detail: checkFailureDetail(result)
396
+ };
397
+ }
398
+ export async function runSeedBaselineChecks(projectRoot, runner, checks) {
399
+ const outcomes = [];
400
+ for (const check of checks) {
401
+ const outcome = await runSeedBaselineCheck(projectRoot, runner, check);
402
+ outcomes.push(outcome);
403
+ }
404
+ return outcomes;
405
+ }
406
+ function checkboxPattern(taskId) {
407
+ return new RegExp(`^(\\s*-\\s+\\[)([ xX])(\\]\\s+${taskId.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s.*)$`);
408
+ }
409
+ export function markSuccessfulSeedTasks(markdown, outcomes) {
410
+ const successfulTaskIds = new Set([
411
+ '1.1',
412
+ '1.2',
413
+ ...outcomes
414
+ .filter((outcome) => outcome.status === 'passed' || outcome.status === 'inapplicable')
415
+ .map((outcome) => outcome.taskId),
416
+ '3.1'
417
+ ]);
418
+ const lines = markdown.split('\n');
419
+ for (const taskId of successfulTaskIds) {
420
+ const pattern = checkboxPattern(taskId);
421
+ const matches = lines
422
+ .map((line, index) => ({ line, index, match: line.match(pattern) }))
423
+ .filter((entry) => entry.match !== null);
424
+ if (matches.length !== 1) {
425
+ throw new Error(`Seed task ${taskId} must appear exactly once before completion; found ${matches.length}.`);
426
+ }
427
+ const [match] = matches;
428
+ lines[match.index] = `${match.match[1]}x${match.match[3]}`;
429
+ }
430
+ return lines.join('\n');
431
+ }
432
+ export function markAllSeedTasksForArchive(markdown) {
433
+ const taskIds = [
434
+ '1.1',
435
+ '1.2',
436
+ '2.1',
437
+ '2.2',
438
+ '2.3',
439
+ '2.4',
440
+ '2.5',
441
+ '2.6',
442
+ '2.7',
443
+ '2.8',
444
+ '2.9',
445
+ '3.1'
446
+ ];
447
+ const lines = markdown.split('\n');
448
+ for (const taskId of taskIds) {
449
+ const pattern = checkboxPattern(taskId);
450
+ const matches = lines
451
+ .map((line, index) => ({ line, index, match: line.match(pattern) }))
452
+ .filter((entry) => entry.match !== null);
453
+ if (matches.length === 0) {
454
+ continue;
455
+ }
456
+ if (matches.length > 1) {
457
+ throw new Error(`Seed task ${taskId} must appear at most once before archive; found ${matches.length}.`);
458
+ }
459
+ const [match] = matches;
460
+ lines[match.index] = `${match.match[1]}x${match.match[3]}`;
461
+ }
462
+ return lines.join('\n');
463
+ }
464
+ export async function validateGeneratedSeedForPhase(projectRoot, runner) {
465
+ const discovery = await discoverGeneratedSeed(projectRoot);
466
+ if (discovery.state === 'archived') {
467
+ return {
468
+ status: 'passed',
469
+ changeName: discovery.changeName,
470
+ detail: discovery.detail
471
+ };
472
+ }
473
+ if (discovery.state === 'blocked') {
474
+ return {
475
+ status: 'blocked',
476
+ changeName: discovery.changeName,
477
+ issues: discovery.issues
478
+ };
479
+ }
480
+ const command = { executable: 'openspec', args: ['validate', discovery.changeName, '--strict'] };
481
+ const result = await runner.run(command, { cwd: projectRoot });
482
+ if (result.status !== 0 || result.timedOut || result.errorCode) {
483
+ return {
484
+ status: 'blocked',
485
+ changeName: discovery.changeName,
486
+ issues: [
487
+ `OpenSpec strict validation failed: ${formatCommand(command)} (${checkFailureDetail(result)}).`
488
+ ]
489
+ };
490
+ }
491
+ return {
492
+ status: 'passed',
493
+ changeName: discovery.changeName,
494
+ capabilityId: discovery.capabilityId,
495
+ command: result,
496
+ detail: 'Generated seed artifacts are present and strict-valid.'
497
+ };
498
+ }
499
+ export async function verifyGeneratedSeedBaselineForPhase(projectRoot, runner) {
500
+ const manifest = await loadManifest(projectRoot);
501
+ const discovery = await discoverGeneratedSeed(projectRoot);
502
+ if (discovery.state === 'blocked') {
503
+ return {
504
+ status: 'blocked',
505
+ changeName: discovery.changeName,
506
+ issues: discovery.issues,
507
+ checks: []
508
+ };
509
+ }
510
+ const checks = selectSeedBaselineChecks(manifest, discovery.changeName);
511
+ const outcomes = await runSeedBaselineChecks(projectRoot, runner, checks);
512
+ const failures = outcomes.filter((outcome) => outcome.status === 'failed');
513
+ if (failures.length > 0) {
514
+ return {
515
+ status: 'blocked',
516
+ changeName: discovery.changeName,
517
+ issues: failures.map((failure) => `${failure.label} failed: ${formatCommand(failure.command)} (${failure.detail})`),
518
+ checks: outcomes
519
+ };
520
+ }
521
+ return { status: 'passed', changeName: discovery.changeName, checks: outcomes };
522
+ }
523
+ export async function archiveGeneratedSeedForPhase(projectRoot, runner) {
524
+ const discovery = await discoverGeneratedSeed(projectRoot);
525
+ if (discovery.state === 'archived') {
526
+ return {
527
+ status: 'already-archived',
528
+ changeName: discovery.changeName,
529
+ detail: discovery.detail
530
+ };
531
+ }
532
+ if (discovery.state === 'blocked') {
533
+ return {
534
+ status: 'blocked',
535
+ changeName: discovery.changeName,
536
+ issues: discovery.issues
537
+ };
538
+ }
539
+ const taskPathParts = [...discovery.changePathParts, 'tasks.md'];
540
+ const originalTasks = await readRequiredProjectText(projectRoot, taskPathParts);
541
+ const completedTasks = markAllSeedTasksForArchive(originalTasks);
542
+ await writeProjectFile(projectRoot, taskPathParts, completedTasks);
543
+ const archiveCommand = { executable: 'openspec', args: ['archive', discovery.changeName, '--yes', '--json'] };
544
+ const archive = await runner.run(archiveCommand, { cwd: projectRoot });
545
+ if (archive.status !== 0 || archive.timedOut || archive.errorCode) {
546
+ await writeProjectFile(projectRoot, taskPathParts, originalTasks);
547
+ return {
548
+ status: 'blocked',
549
+ changeName: discovery.changeName,
550
+ issues: [
551
+ `OpenSpec archive failed: ${formatCommand(archiveCommand)} (${checkFailureDetail(archive)}). ` +
552
+ 'Seed tasks were restored and the seed remains active.'
553
+ ]
554
+ };
555
+ }
556
+ return {
557
+ status: 'archived',
558
+ changeName: discovery.changeName,
559
+ capabilityId: discovery.capabilityId,
560
+ archive,
561
+ archiveSyncBehavior: 'OpenSpec archive updates main specs as part of archive; the lifecycle engine intentionally never passes --skip-specs.',
562
+ detail: 'Generated seed was archived after prior seed validation and baseline verification evidence.'
563
+ };
564
+ }
565
+ export async function completeGeneratedSeedLifecycle(projectRoot, runner) {
566
+ const discovery = await discoverGeneratedSeed(projectRoot);
567
+ if (discovery.state === 'archived') {
568
+ return {
569
+ status: 'already-archived',
570
+ changeName: discovery.changeName,
571
+ detail: discovery.detail
572
+ };
573
+ }
574
+ if (discovery.state === 'blocked') {
575
+ return {
576
+ status: 'blocked',
577
+ changeName: discovery.changeName,
578
+ issues: discovery.issues,
579
+ checks: []
580
+ };
581
+ }
582
+ const verification = await verifyGeneratedSeedBaselineForPhase(projectRoot, runner);
583
+ if (verification.status === 'blocked') {
584
+ return {
585
+ status: 'blocked',
586
+ changeName: verification.changeName,
587
+ issues: verification.issues,
588
+ checks: verification.checks
589
+ };
590
+ }
591
+ const archive = await archiveGeneratedSeedForPhase(projectRoot, runner);
592
+ if (archive.status === 'blocked') {
593
+ return {
594
+ status: 'blocked',
595
+ changeName: archive.changeName,
596
+ issues: archive.issues,
597
+ checks: verification.checks
598
+ };
599
+ }
600
+ return {
601
+ status: 'archived',
602
+ changeName: archive.changeName,
603
+ capabilityId: archive.capabilityId ?? discovery.capabilityId,
604
+ checks: verification.checks,
605
+ archive: archive.archive,
606
+ archiveSyncBehavior: archive.archiveSyncBehavior
607
+ };
608
+ }
609
+ //# sourceMappingURL=seed-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-lifecycle.js","sourceRoot":"","sources":["../../src/governance-activation/seed-lifecycle.ts"],"names":[],"mappings":"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"}