@msn-control/liftoff 0.11.1 → 0.11.3
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/DEVELOPER.md +29 -10
- package/README.md +11 -6
- package/dist/adapters/filesystem/project-transaction.d.ts +2 -1
- package/dist/adapters/filesystem/project-transaction.js +25 -6
- package/dist/adapters/filesystem/project-transaction.js.map +1 -1
- package/dist/adapters/filesystem/reviewed-update-transaction.d.ts +53 -0
- package/dist/adapters/filesystem/reviewed-update-transaction.js +864 -0
- package/dist/adapters/filesystem/reviewed-update-transaction.js.map +1 -0
- package/dist/adapters/filesystem/update-previews.d.ts +50 -0
- package/dist/adapters/filesystem/update-previews.js +612 -0
- package/dist/adapters/filesystem/update-previews.js.map +1 -0
- package/dist/adapters/process/shell-command.d.ts +2 -0
- package/dist/adapters/process/shell-command.js +10 -1
- package/dist/adapters/process/shell-command.js.map +1 -1
- package/dist/application/context.d.ts +5 -0
- package/dist/application/diagnose/doctor.js +9 -15
- package/dist/application/diagnose/doctor.js.map +1 -1
- package/dist/application/update/approval.d.ts +39 -0
- package/dist/application/update/approval.js +54 -0
- package/dist/application/update/approval.js.map +1 -0
- package/dist/application/update/command-guidance.d.ts +19 -0
- package/dist/application/update/command-guidance.js +28 -0
- package/dist/application/update/command-guidance.js.map +1 -0
- package/dist/application/update/guidance-context.d.ts +2 -0
- package/dist/application/update/guidance-context.js +35 -0
- package/dist/application/update/guidance-context.js.map +1 -0
- package/dist/application/update/inspection.d.ts +40 -0
- package/dist/application/update/inspection.js +241 -0
- package/dist/application/update/inspection.js.map +1 -0
- package/dist/application/update/migration-runtime.d.ts +14 -0
- package/dist/application/update/migration-runtime.js +177 -0
- package/dist/application/update/migration-runtime.js.map +1 -0
- package/dist/application/update/output.d.ts +135 -0
- package/dist/application/update/output.js +182 -0
- package/dist/application/update/output.js.map +1 -0
- package/dist/application/update/preview.d.ts +58 -0
- package/dist/application/update/preview.js +242 -0
- package/dist/application/update/preview.js.map +1 -0
- package/dist/application/update/protected-source.d.ts +25 -0
- package/dist/application/update/protected-source.js +81 -0
- package/dist/application/update/protected-source.js.map +1 -0
- package/dist/application/update/reporting.d.ts +4 -4
- package/dist/application/update/reporting.js +14 -13
- package/dist/application/update/reporting.js.map +1 -1
- package/dist/application/update/revalidation-plan.d.ts +22 -0
- package/dist/application/update/revalidation-plan.js +107 -0
- package/dist/application/update/revalidation-plan.js.map +1 -0
- package/dist/application/update/revalidation.d.ts +70 -0
- package/dist/application/update/revalidation.js +337 -0
- package/dist/application/update/revalidation.js.map +1 -0
- package/dist/application/update/review-plan.d.ts +25 -0
- package/dist/application/update/review-plan.js +89 -0
- package/dist/application/update/review-plan.js.map +1 -0
- package/dist/application/update/transaction-approval.d.ts +29 -0
- package/dist/application/update/transaction-approval.js +82 -0
- package/dist/application/update/transaction-approval.js.map +1 -0
- package/dist/application/update/use-case.d.ts +1 -0
- package/dist/application/update/use-case.js +252 -568
- package/dist/application/update/use-case.js.map +1 -1
- package/dist/application/update/write-plan.d.ts +15 -0
- package/dist/application/update/write-plan.js +115 -0
- package/dist/application/update/write-plan.js.map +1 -0
- package/dist/cli/args/definitions.js +5 -4
- package/dist/cli/args/definitions.js.map +1 -1
- package/dist/cli/args/help.js +13 -1
- package/dist/cli/args/help.js.map +1 -1
- package/dist/cli/args/parser.js +22 -7
- package/dist/cli/args/parser.js.map +1 -1
- package/dist/cli/commands/update.js +1 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/domain/governance/policy/identity.d.ts +1 -1
- package/dist/domain/governance/policy/identity.js +2 -2
- package/dist/domain/governance/policy/identity.js.map +1 -1
- package/dist/domain/project/infrastructure-layout.d.ts +1 -1
- package/dist/domain/project/infrastructure-layout.js +3 -1
- package/dist/domain/project/infrastructure-layout.js.map +1 -1
- package/dist/domain/project/reviewed-update-artifacts.d.ts +2 -0
- package/dist/domain/project/reviewed-update-artifacts.js +3 -0
- package/dist/domain/project/reviewed-update-artifacts.js.map +1 -0
- package/dist/generators/common/base.js +5 -1
- package/dist/generators/common/base.js.map +1 -1
- package/dist/governance-activation/activation-state.js +4 -1
- package/dist/governance-activation/activation-state.js.map +1 -1
- package/dist/governance-activation/commands.d.ts +5 -0
- package/dist/governance-activation/commands.js +65 -3
- package/dist/governance-activation/commands.js.map +1 -1
- package/dist/governance-activation/compatibility.d.ts +21 -4
- package/dist/governance-activation/compatibility.js +47 -8
- package/dist/governance-activation/compatibility.js.map +1 -1
- package/dist/governance-activation/doctor.js +32 -5
- package/dist/governance-activation/doctor.js.map +1 -1
- package/dist/governance-activation/historical-state.d.ts +81 -0
- package/dist/governance-activation/historical-state.js +817 -0
- package/dist/governance-activation/historical-state.js.map +1 -0
- package/dist/governance-activation/history-contracts.d.ts +109 -0
- package/dist/governance-activation/history-contracts.js +303 -0
- package/dist/governance-activation/history-contracts.js.map +1 -0
- package/dist/governance-activation/inputs.d.ts +2 -0
- package/dist/governance-activation/inputs.js +13 -1
- package/dist/governance-activation/inputs.js.map +1 -1
- package/dist/governance-activation/migration-history.d.ts +97 -0
- package/dist/governance-activation/migration-history.js +388 -0
- package/dist/governance-activation/migration-history.js.map +1 -0
- package/dist/governance-activation/migration.js +1 -1
- package/dist/governance-activation/migration.js.map +1 -1
- package/dist/governance-activation/proof-records.d.ts +3 -0
- package/dist/governance-activation/proof-records.js +78 -0
- package/dist/governance-activation/proof-records.js.map +1 -0
- package/dist/governance-activation/read-only.d.ts +4 -4
- package/dist/governance-activation/read-only.js +9 -69
- package/dist/governance-activation/read-only.js.map +1 -1
- package/dist/governance-activation/seed-lifecycle.d.ts +28 -6
- package/dist/governance-activation/seed-lifecycle.js +258 -25
- package/dist/governance-activation/seed-lifecycle.js.map +1 -1
- package/dist/governance-activation/transition-planning.d.ts +2 -0
- package/dist/governance-activation/transition-planning.js +12 -3
- package/dist/governance-activation/transition-planning.js.map +1 -1
- package/dist/governance-activation/transitions.d.ts +8 -2
- package/dist/governance-activation/transitions.js +36 -11
- package/dist/governance-activation/transitions.js.map +1 -1
- package/dist/governance-assessment/engine.js +30 -3
- package/dist/governance-assessment/engine.js.map +1 -1
- package/dist/governance-assessment/project.d.ts +7 -0
- package/dist/governance-assessment/project.js +44 -4
- package/dist/governance-assessment/project.js.map +1 -1
- package/dist/repository-governance.js +25 -12
- package/dist/repository-governance.js.map +1 -1
- package/docs/cli-reference.md +134 -28
- package/docs/configuration-and-manifests.md +27 -15
- package/docs/existing-repositories.md +19 -10
- package/docs/repository-governance.md +9 -5
- package/docs/safety-and-consent.md +27 -18
- package/docs/troubleshooting.md +37 -7
- package/docs/workloads.md +5 -4
- package/package.json +1 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { PhaseEvidenceRecord } from '../domain/governance/activation/types.js';
|
|
2
|
+
export declare function readReviewedTransitionPlans(projectRoot: string): Promise<import("../domain/governance/activation/types.js").SavedTransitionPlan[]>;
|
|
3
|
+
export declare function readActivationEvidence(projectRoot: string): Promise<PhaseEvidenceRecord[]>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { readdir } from 'node:fs/promises';
|
|
2
|
+
import { readProjectFile } from '../adapters/filesystem/project-files.js';
|
|
3
|
+
import { resolveProjectPath } from '../adapters/filesystem/project-paths.js';
|
|
4
|
+
import { isHistoricalActivationIdentity } from '../domain/governance/policy/identity.js';
|
|
5
|
+
import { validateEvidenceHeader, validateLiveReadbackProof, validateSavedTransitionPlan } from '../domain/governance/activation/validators.js';
|
|
6
|
+
async function readJsonDirectory(projectRoot, parts) {
|
|
7
|
+
let entries;
|
|
8
|
+
try {
|
|
9
|
+
entries = await readdir(await resolveProjectPath(projectRoot, parts), { withFileTypes: true });
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT')
|
|
13
|
+
return [];
|
|
14
|
+
throw error;
|
|
15
|
+
}
|
|
16
|
+
const results = [];
|
|
17
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name, 'en'))) {
|
|
18
|
+
if (!entry.name.endsWith('.json'))
|
|
19
|
+
continue;
|
|
20
|
+
if (!entry.isFile())
|
|
21
|
+
throw new Error(`Activation proof ${[...parts, entry.name].join('/')} must be a regular file.`);
|
|
22
|
+
const bytes = await readProjectFile(projectRoot, [...parts, entry.name]);
|
|
23
|
+
if (!bytes)
|
|
24
|
+
throw new Error('Activation proof changed during inspection.');
|
|
25
|
+
const source = [...parts, entry.name].join('/');
|
|
26
|
+
try {
|
|
27
|
+
results.push({ path: source, value: JSON.parse(bytes.toString('utf8')) });
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (!(error instanceof SyntaxError))
|
|
31
|
+
throw error;
|
|
32
|
+
throw new Error(`Unable to parse ${source}: invalid JSON.`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return results;
|
|
36
|
+
}
|
|
37
|
+
export async function readReviewedTransitionPlans(projectRoot) {
|
|
38
|
+
return (await readJsonDirectory(projectRoot, ['governance', 'plans'])).map(({ path, value }) => {
|
|
39
|
+
try {
|
|
40
|
+
return validateSavedTransitionPlan(value);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
throw new Error(`Invalid ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export async function readActivationEvidence(projectRoot) {
|
|
48
|
+
return (await readJsonDirectory(projectRoot, ['governance', 'evidence'])).map(({ path, value }) => {
|
|
49
|
+
try {
|
|
50
|
+
if (typeof value !== 'object' || value === null || !('header' in value) || !('evidenceId' in value) ||
|
|
51
|
+
typeof value.evidenceId !== 'string' || !value.evidenceId) {
|
|
52
|
+
throw new Error('Activation v2 requires a body-bound evidence record; historical headers are diagnostic-only.');
|
|
53
|
+
}
|
|
54
|
+
const record = value;
|
|
55
|
+
const header = record.header;
|
|
56
|
+
if (typeof header === 'object' && header !== null && 'schemaVersion' in header &&
|
|
57
|
+
header.schemaVersion === 1 && 'identity' in header && isHistoricalActivationIdentity(header.identity)) {
|
|
58
|
+
throw new Error('Historical activation v1 evidence is diagnostic-only; its original bytes are preserved and cannot authorize current execution or read scope.');
|
|
59
|
+
}
|
|
60
|
+
if (Object.keys(record).some((key) => !['evidenceId', 'header', 'payload', 'liveReadback'].includes(key))) {
|
|
61
|
+
throw new Error('Unknown activation evidence fields.');
|
|
62
|
+
}
|
|
63
|
+
const rawReadback = record.liveReadback;
|
|
64
|
+
if (rawReadback !== undefined && !Array.isArray(rawReadback)) {
|
|
65
|
+
throw new Error('Evidence liveReadback must be an array.');
|
|
66
|
+
}
|
|
67
|
+
const liveReadback = rawReadback?.map(validateLiveReadbackProof) ?? [];
|
|
68
|
+
return {
|
|
69
|
+
evidenceId: value.evidenceId, header: validateEvidenceHeader(value.header),
|
|
70
|
+
payload: record.payload, liveReadback
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
throw new Error(`Invalid ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=proof-records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-records.js","sourceRoot":"","sources":["../../src/governance-activation/proof-records.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import type { LiftoffManifest } from '../domain/project/contracts.js';
|
|
2
2
|
import type { CommandRunner } from '../process-runner.js';
|
|
3
|
-
|
|
4
|
-
export declare function readReviewedTransitionPlans(projectRoot: string): Promise<import("../domain/governance/activation/types.js").SavedTransitionPlan[]>;
|
|
5
|
-
export declare function readActivationEvidence(projectRoot: string): Promise<PhaseEvidenceRecord[]>;
|
|
3
|
+
export { readActivationEvidence, readReviewedTransitionPlans } from './proof-records.js';
|
|
6
4
|
/** Read-only proof boundary: returned values carry no executor, credential, or mutation port. */
|
|
7
5
|
export declare function inspectCurrentActivationEvidence(projectRoot: string, manifest: LiftoffManifest, options?: {
|
|
8
6
|
runner?: CommandRunner;
|
|
@@ -14,15 +12,17 @@ export declare function inspectCurrentActivationEvidence(projectRoot: string, ma
|
|
|
14
12
|
contexts?: undefined;
|
|
15
13
|
records?: undefined;
|
|
16
14
|
selections?: undefined;
|
|
15
|
+
migration?: undefined;
|
|
17
16
|
} | {
|
|
18
17
|
status: 'inspected';
|
|
19
18
|
state: import("../domain/governance/activation/types.js").UserActivationState;
|
|
20
19
|
snapshot: import("./inputs.js").ActivationInputSnapshot;
|
|
21
20
|
contexts: Record<"activation-approved" | "application-foundation" | "bootstrap-local" | "bootstrap-state-disposed" | "committed" | "credential-ready" | "dev-proof" | "enforcement-approved" | "existing-private-path" | "green-red-proof" | "live-readback" | "phase-0-complete" | "private-backend-proof" | "production-rehearsed" | "provider-ready" | "pushed" | "remote-import-verified" | "remote-ready" | "rulesets-applied" | "runner-ready" | "seed-archived" | "seed-valid" | "seed-verified" | "staging-qualified" | "state-path-selected" | "workflow-source-ready", import("../domain/governance/activation/evidence.js").EvidenceFreshnessContext>;
|
|
22
|
-
records: PhaseEvidenceRecord[];
|
|
21
|
+
records: import("../domain/governance/activation/types.js").PhaseEvidenceRecord[];
|
|
23
22
|
selections: {
|
|
24
23
|
[k: string]: import("../domain/governance/activation/evidence.js").EvidenceSelectionResult;
|
|
25
24
|
};
|
|
25
|
+
migration: import("./history-contracts.js").MigrationJournal | null;
|
|
26
26
|
}>;
|
|
27
27
|
export { evidenceBodyDigest, evidenceHeaderDigest, selectLatestPhaseEvidence, validateEvidenceFreshness } from '../domain/governance/activation/evidence.js';
|
|
28
28
|
export { activationEvidenceContexts, readActivationInputSnapshot } from './inputs.js';
|
|
@@ -1,82 +1,19 @@
|
|
|
1
|
-
import { readdir } from 'node:fs/promises';
|
|
2
|
-
import { readProjectFile } from '../adapters/filesystem/project-files.js';
|
|
3
|
-
import { resolveProjectPath } from '../adapters/filesystem/project-paths.js';
|
|
4
1
|
import { loadActivationState } from './activation-state.js';
|
|
5
2
|
import { activationEvidenceContexts, readActivationInputSnapshot } from './inputs.js';
|
|
6
3
|
import { canonicalPhaseGraph } from '../domain/governance/activation/graph.js';
|
|
7
4
|
import { selectLatestPhaseEvidence } from '../domain/governance/activation/evidence.js';
|
|
8
|
-
import {
|
|
5
|
+
import { validateManifestActivationForExecution } from '../domain/governance/activation/validators.js';
|
|
9
6
|
import { phaseIds } from '../domain/governance/activation/types.js';
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
entries = await readdir(await resolveProjectPath(projectRoot, parts), { withFileTypes: true });
|
|
15
|
-
}
|
|
16
|
-
catch (error) {
|
|
17
|
-
if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT')
|
|
18
|
-
return [];
|
|
19
|
-
throw error;
|
|
20
|
-
}
|
|
21
|
-
const results = [];
|
|
22
|
-
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name, 'en'))) {
|
|
23
|
-
if (!entry.name.endsWith('.json'))
|
|
24
|
-
continue;
|
|
25
|
-
if (!entry.isFile())
|
|
26
|
-
throw new Error(`Activation proof ${[...parts, entry.name].join('/')} must be a regular file.`);
|
|
27
|
-
const bytes = await readProjectFile(projectRoot, [...parts, entry.name]);
|
|
28
|
-
if (!bytes)
|
|
29
|
-
throw new Error('Activation proof changed during inspection.');
|
|
30
|
-
const source = [...parts, entry.name].join('/');
|
|
31
|
-
try {
|
|
32
|
-
results.push({ path: source, value: JSON.parse(bytes.toString('utf8')) });
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
throw new Error(`Unable to parse ${source}: invalid JSON.`);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return results;
|
|
39
|
-
}
|
|
40
|
-
export async function readReviewedTransitionPlans(projectRoot) {
|
|
41
|
-
return (await readJsonDirectory(projectRoot, ['governance', 'plans'])).map(({ path, value }) => {
|
|
42
|
-
try {
|
|
43
|
-
return validateSavedTransitionPlan(value);
|
|
44
|
-
}
|
|
45
|
-
catch (error) {
|
|
46
|
-
throw new Error(`Invalid ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
export async function readActivationEvidence(projectRoot) {
|
|
51
|
-
return (await readJsonDirectory(projectRoot, ['governance', 'evidence'])).map(({ path, value }) => {
|
|
52
|
-
try {
|
|
53
|
-
if (typeof value !== 'object' || value === null || !('header' in value) || !('evidenceId' in value) ||
|
|
54
|
-
typeof value.evidenceId !== 'string' || !value.evidenceId)
|
|
55
|
-
throw new Error('Activation v2 requires a body-bound evidence record; historical headers are diagnostic-only.');
|
|
56
|
-
const record = value;
|
|
57
|
-
const header = record.header;
|
|
58
|
-
if (typeof header === 'object' && header !== null && 'schemaVersion' in header &&
|
|
59
|
-
header.schemaVersion === 1 && 'identity' in header && isHistoricalActivationIdentity(header.identity)) {
|
|
60
|
-
throw new Error('Historical activation v1 evidence is diagnostic-only; its original bytes are preserved and cannot authorize current execution or read scope.');
|
|
61
|
-
}
|
|
62
|
-
if (Object.keys(record).some((key) => !['evidenceId', 'header', 'payload', 'liveReadback'].includes(key)))
|
|
63
|
-
throw new Error('Unknown activation evidence fields.');
|
|
64
|
-
if (record.liveReadback !== undefined && !Array.isArray(record.liveReadback))
|
|
65
|
-
throw new Error('Evidence liveReadback must be an array.');
|
|
66
|
-
return { evidenceId: value.evidenceId, header: validateEvidenceHeader(value.header), payload: record.payload,
|
|
67
|
-
liveReadback: record.liveReadback?.map(validateLiveReadbackProof) ?? [] };
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
throw new Error(`Invalid ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
7
|
+
import { readActivationEvidence, readReviewedTransitionPlans } from './proof-records.js';
|
|
8
|
+
import { inspectActivationMigrationHistory } from './migration-history.js';
|
|
9
|
+
export { readActivationEvidence, readReviewedTransitionPlans } from './proof-records.js';
|
|
74
10
|
/** Read-only proof boundary: returned values carry no executor, credential, or mutation port. */
|
|
75
11
|
export async function inspectCurrentActivationEvidence(projectRoot, manifest, options = {}) {
|
|
76
12
|
validateManifestActivationForExecution(manifest);
|
|
77
13
|
const loaded = await loadActivationState(projectRoot);
|
|
78
14
|
if (!loaded)
|
|
79
15
|
return { status: 'not-started' };
|
|
16
|
+
const migration = await inspectActivationMigrationHistory(projectRoot);
|
|
80
17
|
const snapshot = await readActivationInputSnapshot(projectRoot, manifest, options.runner);
|
|
81
18
|
const contexts = activationEvidenceContexts(canonicalPhaseGraph, loaded.state, snapshot, options.now);
|
|
82
19
|
const plans = await readReviewedTransitionPlans(projectRoot);
|
|
@@ -85,7 +22,10 @@ export async function inspectCurrentActivationEvidence(projectRoot, manifest, op
|
|
|
85
22
|
contexts[phaseId].reviewedPlans = plans;
|
|
86
23
|
const selections = Object.fromEntries(phaseIds.map((phaseId) => [phaseId,
|
|
87
24
|
selectLatestPhaseEvidence(records.filter((record) => record.header.phaseId === phaseId), contexts[phaseId])]));
|
|
88
|
-
return {
|
|
25
|
+
return {
|
|
26
|
+
status: 'inspected', state: loaded.state, snapshot, contexts, records, selections,
|
|
27
|
+
migration: migration.status === 'committed' ? migration.journal : null
|
|
28
|
+
};
|
|
89
29
|
}
|
|
90
30
|
export { evidenceBodyDigest, evidenceHeaderDigest, selectLatestPhaseEvidence, validateEvidenceFreshness } from '../domain/governance/activation/evidence.js';
|
|
91
31
|
export { activationEvidenceContexts, readActivationInputSnapshot } from './inputs.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-only.js","sourceRoot":"","sources":["../../src/governance-activation/read-only.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-only.js","sourceRoot":"","sources":["../../src/governance-activation/read-only.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AACxF,OAAO,EAAE,sCAAsC,EAAE,MAAM,+CAA+C,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,iCAAiC,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEzF,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,WAAmB,EAAE,QAAyB,EAAE,OAAO,GAA2C,EAAE;IACzJ,sCAAsC,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,aAAsB,EAAE,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,iCAAiC,CAAC,WAAW,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAG,0BAA0B,CAAC,mBAAmB,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACtG,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC,WAAW,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC1D,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,aAAa,GAAG,KAAK,CAAC;IACxE,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO;QACtE,yBAAyB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjH,OAAO;QACL,MAAM,EAAE,WAAoB,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU;QAC1F,SAAS,EAAE,SAAS,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;KACvE,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAC7J,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,EAAE,aAAa,EAAwB,MAAM,+CAA+C,CAAC"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { type ProjectFileMutation, type ProjectFileSnapshot } from '../adapters/filesystem/project-transaction.js';
|
|
2
2
|
import type { PhaseAdapterExecutionInput, PhaseAdapterOutcome } from './transition-ports.js';
|
|
3
3
|
import type { CommandResult, CommandRunner } from '../process-runner.js';
|
|
4
|
+
import type { TransitionOperation } from '../domain/governance/activation/types.js';
|
|
4
5
|
import type { ExternalCommand, LiftoffManifest, ManifestWorkload } from '../domain/project/contracts.js';
|
|
5
6
|
export type SeedBaselineCheckId = 'liftoff-validate' | 'backend-tests' | 'worker-tests' | 'frontend-build' | 'docker-compose-config' | 'tofu-fmt' | 'tofu-init' | 'tofu-validate' | 'openspec-strict';
|
|
6
7
|
export type SeedBaselineCheckApplicability = {
|
|
7
8
|
applicable: true;
|
|
8
9
|
command: ExternalCommand;
|
|
9
10
|
cwdPathParts: readonly string[];
|
|
11
|
+
env?: Readonly<Record<string, string>>;
|
|
10
12
|
} | {
|
|
11
13
|
applicable: false;
|
|
12
14
|
reason: string;
|
|
@@ -24,6 +26,7 @@ export type SeedBaselineCheckOutcome = {
|
|
|
24
26
|
status: 'passed';
|
|
25
27
|
command: ExternalCommand;
|
|
26
28
|
cwdPathParts: readonly string[];
|
|
29
|
+
env?: Readonly<Record<string, string>>;
|
|
27
30
|
result: CommandResult;
|
|
28
31
|
} | {
|
|
29
32
|
id: SeedBaselineCheckId;
|
|
@@ -32,6 +35,7 @@ export type SeedBaselineCheckOutcome = {
|
|
|
32
35
|
status: 'failed';
|
|
33
36
|
command: ExternalCommand;
|
|
34
37
|
cwdPathParts: readonly string[];
|
|
38
|
+
env?: Readonly<Record<string, string>>;
|
|
35
39
|
result: CommandResult;
|
|
36
40
|
detail: string;
|
|
37
41
|
} | {
|
|
@@ -119,6 +123,7 @@ export type SeedPhaseArchiveResult = {
|
|
|
119
123
|
archiveSyncBehavior?: string;
|
|
120
124
|
detail: string;
|
|
121
125
|
synchronizedSpecDigest?: string;
|
|
126
|
+
validation?: CommandResult;
|
|
122
127
|
} | {
|
|
123
128
|
status: 'blocked';
|
|
124
129
|
changeName: string;
|
|
@@ -126,17 +131,34 @@ export type SeedPhaseArchiveResult = {
|
|
|
126
131
|
retryableAfterRepair?: boolean;
|
|
127
132
|
archiveCompleted?: boolean;
|
|
128
133
|
};
|
|
134
|
+
export type LocalSeedPhaseId = 'seed-valid' | 'seed-verified' | 'seed-archived';
|
|
135
|
+
export interface LocalSeedCommand {
|
|
136
|
+
command: ExternalCommand;
|
|
137
|
+
cwdPathParts: readonly string[];
|
|
138
|
+
env: Readonly<Record<string, string>>;
|
|
139
|
+
}
|
|
140
|
+
export interface LocalSeedPhasePreview {
|
|
141
|
+
phaseId: LocalSeedPhaseId;
|
|
142
|
+
operation: TransitionOperation;
|
|
143
|
+
commands: readonly LocalSeedCommand[];
|
|
144
|
+
blockers: readonly string[];
|
|
145
|
+
}
|
|
146
|
+
interface SeedExecutionOptions {
|
|
147
|
+
localRevalidation?: boolean;
|
|
148
|
+
}
|
|
129
149
|
export declare function generatedSeedChangeName(manifest: LiftoffManifest): string;
|
|
130
150
|
export declare function generatedSeedCapabilityId(workload: ManifestWorkload): string;
|
|
131
151
|
export declare function seedInfrastructureBaselineBlocker(manifest: LiftoffManifest): string | undefined;
|
|
132
|
-
export declare function selectSeedBaselineChecks(manifest: LiftoffManifest, changeName?: string, seedState?: 'active' | 'archived'): SeedBaselineCheck[];
|
|
152
|
+
export declare function selectSeedBaselineChecks(manifest: LiftoffManifest, changeName?: string, seedState?: 'active' | 'archived', options?: SeedExecutionOptions): SeedBaselineCheck[];
|
|
153
|
+
export declare function previewLocalSeedPhase(projectRoot: string, manifest: LiftoffManifest, phaseId: LocalSeedPhaseId): Promise<LocalSeedPhasePreview>;
|
|
133
154
|
export declare function inspectArchivedSeedIntegrity(projectRoot: string, suppliedManifest?: LiftoffManifest): Promise<ArchivedSeedIntegrity>;
|
|
134
|
-
export declare function discoverGeneratedSeed(projectRoot: string): Promise<GeneratedSeedDiscovery>;
|
|
155
|
+
export declare function discoverGeneratedSeed(projectRoot: string, suppliedManifest?: LiftoffManifest): Promise<GeneratedSeedDiscovery>;
|
|
135
156
|
export declare function runSeedBaselineChecks(projectRoot: string, runner: CommandRunner, checks: readonly SeedBaselineCheck[]): Promise<SeedBaselineCheckOutcome[]>;
|
|
136
157
|
export declare function markSuccessfulSeedTasks(markdown: string, outcomes: readonly SeedBaselineCheckOutcome[]): string;
|
|
137
158
|
export declare function markAllSeedTasksForArchive(markdown: string): string;
|
|
138
|
-
export declare function validateGeneratedSeedForPhase(projectRoot: string, runner: CommandRunner): Promise<SeedPhaseValidationResult>;
|
|
139
|
-
export declare function verifyGeneratedSeedBaselineForPhase(projectRoot: string, runner: CommandRunner): Promise<SeedPhaseVerificationResult>;
|
|
140
|
-
export declare function archiveGeneratedSeedForPhase(projectRoot: string, runner: CommandRunner): Promise<SeedPhaseArchiveResult>;
|
|
141
|
-
export declare function executeSeedOperations(input: PhaseAdapterExecutionInput): Promise<PhaseAdapterOutcome | null>;
|
|
159
|
+
export declare function validateGeneratedSeedForPhase(projectRoot: string, runner: CommandRunner, options?: SeedExecutionOptions): Promise<SeedPhaseValidationResult>;
|
|
160
|
+
export declare function verifyGeneratedSeedBaselineForPhase(projectRoot: string, runner: CommandRunner, options?: SeedExecutionOptions): Promise<SeedPhaseVerificationResult>;
|
|
161
|
+
export declare function archiveGeneratedSeedForPhase(projectRoot: string, runner: CommandRunner, options?: SeedExecutionOptions): Promise<SeedPhaseArchiveResult>;
|
|
162
|
+
export declare function executeSeedOperations(input: PhaseAdapterExecutionInput, options?: SeedExecutionOptions): Promise<PhaseAdapterOutcome | null>;
|
|
142
163
|
export declare function completeGeneratedSeedLifecycle(projectRoot: string, runner: CommandRunner): Promise<GeneratedSeedLifecycleResult>;
|
|
164
|
+
export {};
|