@msn-control/liftoff 0.11.1 → 0.11.2
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 +28 -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 +613 -0
- package/dist/adapters/filesystem/update-previews.js.map +1 -0
- package/dist/adapters/process/shell-command.d.ts +1 -0
- package/dist/adapters/process/shell-command.js +7 -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 +2 -0
- package/dist/application/update/command-guidance.js +14 -0
- package/dist/application/update/command-guidance.js.map +1 -0
- package/dist/application/update/inspection.d.ts +37 -0
- package/dist/application/update/inspection.js +235 -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 +178 -0
- package/dist/application/update/migration-runtime.js.map +1 -0
- package/dist/application/update/output.d.ts +134 -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 +49 -0
- package/dist/application/update/preview.js +220 -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 +108 -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 +240 -569
- 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 +2 -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 +101 -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 +9 -7
- package/docs/workloads.md +5 -4
- package/package.json +1 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { manifestDisplayPath } from '../../domain/project/paths.js';
|
|
2
|
+
import { liftoffVersion } from '../../version.js';
|
|
3
|
+
import { isUnownedUpdateConflict, provisioningJson } from './planning.js';
|
|
4
|
+
import { entryDisplay, entryMarker, manifestChanges } from './reporting.js';
|
|
5
|
+
import { formatUpdateCommand } from './command-guidance.js';
|
|
6
|
+
import { commandShellForPlatform, formatShellCommand } from '../../adapters/process/shell-command.js';
|
|
7
|
+
export const updateReportSchemaVersion = 3;
|
|
8
|
+
export function buildUpdateReport(input, inspection, writePlan) {
|
|
9
|
+
const entries = (inspection?.entries ?? [])
|
|
10
|
+
.filter((entry) => entry.status !== 'unchanged' || entry.refreshHash)
|
|
11
|
+
.map((entry) => ({
|
|
12
|
+
logicalName: entry.logicalName,
|
|
13
|
+
status: entry.status,
|
|
14
|
+
path: manifestDisplayPath(entry.pathParts),
|
|
15
|
+
...(entry.previousPathParts ? { previousPath: manifestDisplayPath(entry.previousPathParts) } : {}),
|
|
16
|
+
...(entry.status === 'retired' || entry.status === 'retired-conflict'
|
|
17
|
+
? { fileDeleted: entry.destinationOccupied !== false } : {}),
|
|
18
|
+
reason: entry.reason
|
|
19
|
+
}));
|
|
20
|
+
const written = input.committed
|
|
21
|
+
? (writePlan?.written ?? []).map((entry) => manifestDisplayPath(entry.pathParts))
|
|
22
|
+
: [];
|
|
23
|
+
const removed = input.committed ? (writePlan?.retired ?? []).map((entry) => ({
|
|
24
|
+
logicalName: entry.logicalName,
|
|
25
|
+
status: entry.status === 'retired-conflict' ? 'force-retired' :
|
|
26
|
+
entry.destinationOccupied === false ? 'retired-absent' : 'retired',
|
|
27
|
+
path: manifestDisplayPath(entry.pathParts),
|
|
28
|
+
fileDeleted: entry.destinationOccupied !== false,
|
|
29
|
+
reason: entry.reason
|
|
30
|
+
})) : [];
|
|
31
|
+
const skipped = (writePlan?.skipped ?? []).map((entry) => ({
|
|
32
|
+
logicalName: entry.logicalName, status: entry.status,
|
|
33
|
+
path: manifestDisplayPath(entry.pathParts), reason: entry.reason
|
|
34
|
+
}));
|
|
35
|
+
const manifest = input.committed ? writePlan?.nextManifest : inspection?.manifest;
|
|
36
|
+
const activationIdentity = manifest && manifest.governance.profile !== 'none' &&
|
|
37
|
+
manifest.governance.profile !== 'unspecified' ? manifest.governance.activationIdentity ?? null : null;
|
|
38
|
+
const migration = input.migration ?? {
|
|
39
|
+
status: 'not-required', sourceIdentity: null, targetIdentity: null, historyPaths: [], issues: []
|
|
40
|
+
};
|
|
41
|
+
const { migration: _migration, ...reportInput } = input;
|
|
42
|
+
return {
|
|
43
|
+
schemaVersion: updateReportSchemaVersion,
|
|
44
|
+
scope: 'project-update',
|
|
45
|
+
...reportInput,
|
|
46
|
+
cliVersion: liftoffVersion,
|
|
47
|
+
projectVersion: inspection?.manifest.liftoffVersion ?? null,
|
|
48
|
+
plans: input.plans ?? [],
|
|
49
|
+
receipt: input.receipt ?? { status: 'not-required' },
|
|
50
|
+
committed: input.committed ?? false,
|
|
51
|
+
entries,
|
|
52
|
+
written,
|
|
53
|
+
removed,
|
|
54
|
+
skipped,
|
|
55
|
+
summary: inspection?.summary ?? null,
|
|
56
|
+
managedCore: { entries, written, removed, skipped, summary: inspection?.summary ?? null },
|
|
57
|
+
provisioning: inspection ? provisioningJson(inspection.provisioningPlans) : [],
|
|
58
|
+
ownershipMigrationPending: inspection?.ownershipMigrationPending ?? false,
|
|
59
|
+
manifestChanges: inspection && writePlan
|
|
60
|
+
? manifestChanges(inspection.manifest, writePlan.nextManifest)
|
|
61
|
+
: inspection?.plannedManifestChanges ?? [],
|
|
62
|
+
activationIdentity,
|
|
63
|
+
activationMigration: migration,
|
|
64
|
+
activationStateMigration: migration,
|
|
65
|
+
revalidation: input.revalidation ?? { status: 'not-required', nextPhase: null, issues: [] },
|
|
66
|
+
reconciliation: inspection?.reconciliation ?? null,
|
|
67
|
+
...(input.mode === 'check' ? { projectBytesWritten: 0 } : {})
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function migrationReviewDetails(migration) {
|
|
71
|
+
if (migration.status === 'not-required')
|
|
72
|
+
return [];
|
|
73
|
+
return [
|
|
74
|
+
`Status: ${migration.status}; original history is not executable proof.`,
|
|
75
|
+
...(migration.sourceIdentity ? [`Source activation identity: ${JSON.stringify(migration.sourceIdentity)}`] : []),
|
|
76
|
+
...(migration.targetIdentity ? [`Target activation identity: ${JSON.stringify(migration.targetIdentity)}`] : []),
|
|
77
|
+
...(migration.snapshotId ? [`History snapshot: ${migration.snapshotId}`] : []),
|
|
78
|
+
...migration.historyPaths.map((entry) => `Preserve ${entry}`),
|
|
79
|
+
...(migration.operations ?? []).map((entry) => `${entry.type} ${JSON.stringify(entry.path)}`),
|
|
80
|
+
...migration.issues
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
function revalidationReviewDetails(revalidation) {
|
|
84
|
+
if (revalidation.status === 'not-required')
|
|
85
|
+
return [];
|
|
86
|
+
const preview = revalidation.preview;
|
|
87
|
+
const shell = commandShellForPlatform(process.platform);
|
|
88
|
+
const commandDetails = (entry) => `${formatShellCommand(entry.command, shell)} (directory: ${JSON.stringify(entry.cwdPathParts.join('/') || '.')}); environment overrides: ${JSON.stringify(entry.env)}`;
|
|
89
|
+
return [
|
|
90
|
+
`Status: ${revalidation.status}`,
|
|
91
|
+
...revalidation.issues.map((issue) => `Known revalidation gap: ${issue}`),
|
|
92
|
+
...(revalidation.issues.length ? ['Approval may commit v2 while these known revalidation gaps remain blocked.'] : []),
|
|
93
|
+
...(preview ? [
|
|
94
|
+
`Commands are relative to project: ${JSON.stringify(preview.projectRoot)}`,
|
|
95
|
+
`Target activation identity: ${JSON.stringify(preview.targetIdentity)}`,
|
|
96
|
+
...preview.effects,
|
|
97
|
+
...preview.inspectionCommands.map((entry) => `Read-only inspection: ${commandDetails(entry)}`),
|
|
98
|
+
...preview.phases.flatMap((phase) => phase.commands.map((entry) => `${phase.phaseId}: ${commandDetails(entry)}`)),
|
|
99
|
+
...preview.reusedPhases.map((phase) => `Reuse fresh ${phase.phaseId} evidence ${phase.evidenceId} (header: ${phase.headerDigest}).`),
|
|
100
|
+
`Record writes: ${preview.recordWrites.plans}; ${preview.recordWrites.evidence}; ${preview.recordWrites.state}`,
|
|
101
|
+
preview.recordWrites.limit,
|
|
102
|
+
`Command limits: ${preview.commandLimits.timeoutMs} ms; ${preview.commandLimits.maxOutputBytes} output bytes.`,
|
|
103
|
+
...preview.outputPolicy.map((policy) => `Generated-output policy for ${policy.executable} from ${JSON.stringify(policy.cwd.join('/') || '.')}: ${policy.outputs.map((parts) => JSON.stringify(parts.join('/'))).join(', ')}; only after a listed matching command executes.`),
|
|
104
|
+
preview.boundary
|
|
105
|
+
] : []),
|
|
106
|
+
...(revalidation.nextPhase ? [`Next incomplete phase: ${revalidation.nextPhase}`] : [])
|
|
107
|
+
];
|
|
108
|
+
}
|
|
109
|
+
export function renderUpdatePreview(presentation, inspection, plans, migration, revalidation, receiptPath) {
|
|
110
|
+
presentation.definitions('Project versions', [
|
|
111
|
+
{ label: 'Liftoff CLI', value: liftoffVersion },
|
|
112
|
+
{ label: 'Project generated by', value: inspection.manifest.liftoffVersion }
|
|
113
|
+
]);
|
|
114
|
+
const visible = inspection.entries.filter((entry) => entry.status !== 'unchanged' || entry.refreshHash);
|
|
115
|
+
if (visible.length) {
|
|
116
|
+
presentation.table('Liftoff core drift', ['Change', 'Artifact', 'Reason'], visible.map((entry) => [entryMarker(entry), entryDisplay(entry), entry.reason]));
|
|
117
|
+
}
|
|
118
|
+
const unowned = inspection.entries.filter((entry) => isUnownedUpdateConflict(entry, inspection.oldByName));
|
|
119
|
+
if (unowned.length) {
|
|
120
|
+
presentation.bullets('Unowned destinations remain protected', unowned.map((entry) => `${entryDisplay(entry)}: resolve this unowned destination manually; --force cannot overwrite it`));
|
|
121
|
+
}
|
|
122
|
+
for (const group of inspection.provisioningPlans) {
|
|
123
|
+
presentation.bullets(`Project component provisioning: ${group.group}`, [
|
|
124
|
+
...(group.reason ? [group.reason] : []),
|
|
125
|
+
...group.entries.map((entry) => `${entry.status} ${manifestDisplayPath(entry.rendered.pathParts)} ${entry.reason}`)
|
|
126
|
+
]);
|
|
127
|
+
}
|
|
128
|
+
if (inspection.ownershipMigrationPending) {
|
|
129
|
+
presentation.bullets('Manifest maintenance', ['Release legacy project artifacts into provenance; no production file will be written.']);
|
|
130
|
+
}
|
|
131
|
+
if (migration.status !== 'not-required') {
|
|
132
|
+
presentation.bullets('Activation migration', migrationReviewDetails(migration));
|
|
133
|
+
}
|
|
134
|
+
if (revalidation.status !== 'not-required') {
|
|
135
|
+
presentation.bullets('Local revalidation', revalidationReviewDetails(revalidation));
|
|
136
|
+
}
|
|
137
|
+
for (const plan of plans) {
|
|
138
|
+
presentation.definitions(plan.mode === 'force' ? 'Separately reviewed forced plan' : 'Reviewed update plan', [
|
|
139
|
+
{ label: 'Fingerprint', value: plan.fingerprint },
|
|
140
|
+
{ label: 'Static file operations', value: String(plan.writeCount) },
|
|
141
|
+
{ label: 'Eligible', value: plan.eligible ? 'yes; explicit approval still required' : 'no' }
|
|
142
|
+
]);
|
|
143
|
+
if (plan.blockers.length)
|
|
144
|
+
presentation.bullets('Plan blockers', plan.blockers);
|
|
145
|
+
}
|
|
146
|
+
if (receiptPath) {
|
|
147
|
+
presentation.definitions('External preview receipt', [
|
|
148
|
+
{ label: 'Location', value: receiptPath },
|
|
149
|
+
{ label: 'Project bytes', value: 'unchanged; this receipt is not approval' }
|
|
150
|
+
]);
|
|
151
|
+
}
|
|
152
|
+
if (plans.some((plan) => plan.eligible && plan.writeCount > 0)) {
|
|
153
|
+
presentation.command(formatUpdateCommand(inspection.projectRoot));
|
|
154
|
+
const hasForceableConflict = inspection.entries.some((entry) => !isUnownedUpdateConflict(entry, inspection.oldByName) &&
|
|
155
|
+
(entry.status === 'conflict' || entry.status === 'retired-conflict' ||
|
|
156
|
+
entry.status === 'moved' && !entry.cleanMove));
|
|
157
|
+
if (hasForceableConflict && plans.some((plan) => plan.mode === 'force' && plan.eligible && plan.writeCount > 0)) {
|
|
158
|
+
presentation.command(formatUpdateCommand(inspection.projectRoot, 'force'));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export function renderUpdateSkipped(presentation, inspection, writePlan) {
|
|
163
|
+
if (!writePlan.skipped.length)
|
|
164
|
+
return;
|
|
165
|
+
presentation.bullets('Skipped Liftoff core conflicts', writePlan.skipped.map((entry) => isUnownedUpdateConflict(entry, inspection.oldByName)
|
|
166
|
+
? `protected unowned destination ${entryDisplay(entry)}: ${entry.reason}; --force cannot overwrite it`
|
|
167
|
+
: `${entryDisplay(entry)}: ${entry.reason}; review the separate forced plan before any overwrite`));
|
|
168
|
+
}
|
|
169
|
+
export function renderUpdateApprovalScope(presentation, jsonMode, plan, writePlan, migration, revalidation) {
|
|
170
|
+
const lines = [
|
|
171
|
+
`Effective ${plan.mode} plan: ${plan.fingerprint}`,
|
|
172
|
+
...writePlan.mutations.map((mutation) => `${mutation.type} ${JSON.stringify(manifestDisplayPath(mutation.pathParts))}`),
|
|
173
|
+
...migrationReviewDetails(migration),
|
|
174
|
+
...revalidationReviewDetails(revalidation),
|
|
175
|
+
'Only this exact local plan is authorized; future provider actions require separate approval.'
|
|
176
|
+
];
|
|
177
|
+
if (jsonMode)
|
|
178
|
+
presentation.rawStderr(`${lines.join('\n')}\n`);
|
|
179
|
+
else
|
|
180
|
+
presentation.bullets('Review before approval', lines);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/application/update/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export declare const updatePreviewSchemaVersion = 1;
|
|
2
|
+
export declare const updatePreviewDirectoryParts: readonly string[];
|
|
3
|
+
export type UpdatePreviewMode = 'normal' | 'force';
|
|
4
|
+
export type UpdatePreviewErrorCode = 'preview-missing' | 'preview-invalid' | 'preview-unsupported' | 'preview-mismatch' | 'preview-storage' | 'preview-busy';
|
|
5
|
+
export declare class UpdatePreviewError extends Error {
|
|
6
|
+
readonly code: UpdatePreviewErrorCode;
|
|
7
|
+
constructor(code: UpdatePreviewErrorCode, message: string, options?: ErrorOptions);
|
|
8
|
+
}
|
|
9
|
+
export interface UpdatePreviewInput {
|
|
10
|
+
/** The real project root returned by the filesystem adapter, not a display alias. */
|
|
11
|
+
projectRoot: string;
|
|
12
|
+
cliVersion: string;
|
|
13
|
+
mode: UpdatePreviewMode;
|
|
14
|
+
source: unknown;
|
|
15
|
+
target: unknown;
|
|
16
|
+
operations: unknown;
|
|
17
|
+
}
|
|
18
|
+
export interface UpdatePreviewDescriptor {
|
|
19
|
+
readonly projectRoot: string;
|
|
20
|
+
readonly cliVersion: string;
|
|
21
|
+
readonly mode: UpdatePreviewMode;
|
|
22
|
+
readonly sourceDigest: string;
|
|
23
|
+
readonly targetDigest: string;
|
|
24
|
+
readonly operationsDigest: string;
|
|
25
|
+
readonly fingerprint: string;
|
|
26
|
+
}
|
|
27
|
+
export interface UpdatePreviewReceipt {
|
|
28
|
+
readonly schemaVersion: typeof updatePreviewSchemaVersion;
|
|
29
|
+
readonly kind: 'liftoff-update-preview';
|
|
30
|
+
readonly projectRoot: string;
|
|
31
|
+
readonly projectKey: string;
|
|
32
|
+
readonly receiptId: string;
|
|
33
|
+
readonly issuedAt: string;
|
|
34
|
+
readonly variants: readonly UpdatePreviewDescriptor[];
|
|
35
|
+
}
|
|
36
|
+
export interface UpdatePreviewIssuance {
|
|
37
|
+
receiptId: string;
|
|
38
|
+
issuedAt: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function normalizeUpdatePreviewProjectRoot(value: string): string;
|
|
41
|
+
export declare function updatePreviewProjectKey(projectRoot: string): string;
|
|
42
|
+
export declare function createUpdatePreviewDescriptor(input: UpdatePreviewInput): UpdatePreviewDescriptor;
|
|
43
|
+
export declare function validateUpdatePreviewDescriptor(value: unknown): UpdatePreviewDescriptor;
|
|
44
|
+
export declare function createUpdatePreviewReceipt(descriptors: readonly UpdatePreviewDescriptor[], issuance: UpdatePreviewIssuance): UpdatePreviewReceipt;
|
|
45
|
+
export declare function validateUpdatePreviewReceipt(value: unknown, options?: {
|
|
46
|
+
projectRoot?: string;
|
|
47
|
+
now?: Date;
|
|
48
|
+
}): UpdatePreviewReceipt;
|
|
49
|
+
export declare function matchUpdatePreviewReceipt(receipt: unknown, currentDescriptor: UpdatePreviewDescriptor): UpdatePreviewDescriptor;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { canonicalSha256, isRecord } from '../../domain/governance/activation/canonical-json.js';
|
|
3
|
+
import { formatUpdateCommand } from './command-guidance.js';
|
|
4
|
+
export const updatePreviewSchemaVersion = 1;
|
|
5
|
+
export const updatePreviewDirectoryParts = Object.freeze(['liftoff', 'update-previews']);
|
|
6
|
+
export class UpdatePreviewError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
constructor(code, message, options) {
|
|
9
|
+
super(message, options);
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.name = 'UpdatePreviewError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const digestPattern = /^[0-9a-f]{64}$/u;
|
|
15
|
+
const receiptIdPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/u;
|
|
16
|
+
function invalid(message) {
|
|
17
|
+
throw new UpdatePreviewError('preview-invalid', message);
|
|
18
|
+
}
|
|
19
|
+
function strictKeys(value, keys, label) {
|
|
20
|
+
if (Object.keys(value).length !== keys.length || keys.some((key) => !Object.hasOwn(value, key))) {
|
|
21
|
+
invalid(`${label} has missing or unrecognized fields.`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function text(value, label) {
|
|
25
|
+
if (typeof value !== 'string' || value.length === 0 || /[\u0000-\u001f]/u.test(value)) {
|
|
26
|
+
invalid(`${label} must be a nonempty string without control characters.`);
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
function digest(value, label) {
|
|
31
|
+
if (typeof value !== 'string' || !digestPattern.test(value)) {
|
|
32
|
+
invalid(`${label} must be a complete lowercase SHA-256 fingerprint.`);
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
export function normalizeUpdatePreviewProjectRoot(value) {
|
|
37
|
+
const root = text(value, 'Preview project root');
|
|
38
|
+
const paths = /^[a-z]:[\\/]/iu.test(root) || root.startsWith('\\\\') ? path.win32 : path.posix;
|
|
39
|
+
if (!paths.isAbsolute(root) || root.startsWith('\\\\?\\') || root.startsWith('\\\\.\\')) {
|
|
40
|
+
invalid('Preview project root must be an absolute canonical native path.');
|
|
41
|
+
}
|
|
42
|
+
const normalized = paths.normalize(root);
|
|
43
|
+
const boundary = paths.parse(normalized).root;
|
|
44
|
+
if (paths === path.win32 && !/^[a-z]:\\$/iu.test(boundary) &&
|
|
45
|
+
!/^\\\\[^\\]+\\[^\\]+\\$/u.test(boundary)) {
|
|
46
|
+
invalid('Preview project root must include its Windows drive or UNC share.');
|
|
47
|
+
}
|
|
48
|
+
return normalized === boundary ? boundary : normalized.endsWith(paths.sep) ? normalized.slice(0, -1) : normalized;
|
|
49
|
+
}
|
|
50
|
+
export function updatePreviewProjectKey(projectRoot) {
|
|
51
|
+
return canonicalSha256({
|
|
52
|
+
schemaVersion: updatePreviewSchemaVersion,
|
|
53
|
+
kind: 'liftoff-update-project',
|
|
54
|
+
projectRoot: normalizeUpdatePreviewProjectRoot(projectRoot)
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function assertSemanticJson(value, ancestors = new Set()) {
|
|
58
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
59
|
+
return;
|
|
60
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
61
|
+
return;
|
|
62
|
+
if (typeof value !== 'object' || value === null)
|
|
63
|
+
invalid('Preview semantics must contain only finite JSON values.');
|
|
64
|
+
if (ancestors.has(value))
|
|
65
|
+
invalid('Preview semantics cannot contain cycles.');
|
|
66
|
+
if (Array.isArray(value) && Object.getPrototypeOf(value) !== Array.prototype) {
|
|
67
|
+
invalid('Preview semantics must use plain JSON arrays, not runtime objects.');
|
|
68
|
+
}
|
|
69
|
+
if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype &&
|
|
70
|
+
Object.getPrototypeOf(value) !== null) {
|
|
71
|
+
invalid('Preview semantics must use plain JSON objects, not runtime objects.');
|
|
72
|
+
}
|
|
73
|
+
if (Object.getOwnPropertySymbols(value).length)
|
|
74
|
+
invalid('Preview semantics cannot contain symbol keys.');
|
|
75
|
+
const properties = Object.getOwnPropertyDescriptors(value);
|
|
76
|
+
const keys = Object.keys(properties);
|
|
77
|
+
if (Array.isArray(value) &&
|
|
78
|
+
(keys.length !== value.length + 1 || Array.from({ length: value.length }, (_, index) => index)
|
|
79
|
+
.some((index) => !Object.hasOwn(properties, String(index))))) {
|
|
80
|
+
invalid('Preview semantics cannot contain sparse arrays or additional array properties.');
|
|
81
|
+
}
|
|
82
|
+
ancestors.add(value);
|
|
83
|
+
for (const key of keys) {
|
|
84
|
+
if (Array.isArray(value) && key === 'length')
|
|
85
|
+
continue;
|
|
86
|
+
const property = properties[key];
|
|
87
|
+
if (!Object.hasOwn(property, 'value') || !property.enumerable) {
|
|
88
|
+
invalid('Preview semantics cannot contain accessors or hidden properties.');
|
|
89
|
+
}
|
|
90
|
+
assertSemanticJson(property.value, ancestors);
|
|
91
|
+
}
|
|
92
|
+
ancestors.delete(value);
|
|
93
|
+
}
|
|
94
|
+
function semanticDigest(value) {
|
|
95
|
+
assertSemanticJson(value);
|
|
96
|
+
return canonicalSha256(value);
|
|
97
|
+
}
|
|
98
|
+
function descriptorFromDigests(input) {
|
|
99
|
+
const projectRoot = normalizeUpdatePreviewProjectRoot(input.projectRoot);
|
|
100
|
+
const cliVersion = text(input.cliVersion, 'Preview CLI version');
|
|
101
|
+
if (!/^\d+\.\d+\.\d+(?:-[0-9a-z.-]+)?(?:\+[0-9a-z.-]+)?$/iu.test(cliVersion)) {
|
|
102
|
+
invalid('Preview CLI version must be a semantic version.');
|
|
103
|
+
}
|
|
104
|
+
if (input.mode !== 'normal' && input.mode !== 'force')
|
|
105
|
+
invalid('Preview mode must be normal or force.');
|
|
106
|
+
const fields = {
|
|
107
|
+
projectRoot,
|
|
108
|
+
cliVersion,
|
|
109
|
+
mode: input.mode,
|
|
110
|
+
sourceDigest: digest(input.sourceDigest, 'Preview source digest'),
|
|
111
|
+
targetDigest: digest(input.targetDigest, 'Preview target digest'),
|
|
112
|
+
operationsDigest: digest(input.operationsDigest, 'Preview operations digest')
|
|
113
|
+
};
|
|
114
|
+
return Object.freeze({
|
|
115
|
+
...fields,
|
|
116
|
+
fingerprint: canonicalSha256({
|
|
117
|
+
schemaVersion: updatePreviewSchemaVersion,
|
|
118
|
+
kind: 'liftoff-update-plan',
|
|
119
|
+
...fields
|
|
120
|
+
})
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
export function createUpdatePreviewDescriptor(input) {
|
|
124
|
+
// Array order is retained: execution order and command argument order can be semantic.
|
|
125
|
+
return descriptorFromDigests({
|
|
126
|
+
projectRoot: input.projectRoot,
|
|
127
|
+
cliVersion: input.cliVersion,
|
|
128
|
+
mode: input.mode,
|
|
129
|
+
sourceDigest: semanticDigest(input.source),
|
|
130
|
+
targetDigest: semanticDigest(input.target),
|
|
131
|
+
operationsDigest: semanticDigest(input.operations)
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
export function validateUpdatePreviewDescriptor(value) {
|
|
135
|
+
if (!isRecord(value))
|
|
136
|
+
invalid('Preview descriptor must be an object.');
|
|
137
|
+
strictKeys(value, [
|
|
138
|
+
'projectRoot', 'cliVersion', 'mode', 'sourceDigest', 'targetDigest', 'operationsDigest', 'fingerprint'
|
|
139
|
+
], 'Preview descriptor');
|
|
140
|
+
if (value.mode !== 'normal' && value.mode !== 'force')
|
|
141
|
+
invalid('Preview mode must be normal or force.');
|
|
142
|
+
const descriptor = descriptorFromDigests({
|
|
143
|
+
projectRoot: text(value.projectRoot, 'Preview project root'),
|
|
144
|
+
cliVersion: text(value.cliVersion, 'Preview CLI version'),
|
|
145
|
+
mode: value.mode,
|
|
146
|
+
sourceDigest: digest(value.sourceDigest, 'Preview source digest'),
|
|
147
|
+
targetDigest: digest(value.targetDigest, 'Preview target digest'),
|
|
148
|
+
operationsDigest: digest(value.operationsDigest, 'Preview operations digest')
|
|
149
|
+
});
|
|
150
|
+
if (descriptor.projectRoot !== value.projectRoot || descriptor.fingerprint !== value.fingerprint) {
|
|
151
|
+
invalid('Preview descriptor fingerprint or canonical project root is inconsistent.');
|
|
152
|
+
}
|
|
153
|
+
return descriptor;
|
|
154
|
+
}
|
|
155
|
+
export function createUpdatePreviewReceipt(descriptors, issuance) {
|
|
156
|
+
if (descriptors.length < 1 || descriptors.length > 2)
|
|
157
|
+
invalid('A preview receipt needs one or two eligible variants.');
|
|
158
|
+
const variants = descriptors.map(validateUpdatePreviewDescriptor)
|
|
159
|
+
.sort((left, right) => left.mode === right.mode ? 0 : left.mode === 'normal' ? -1 : 1);
|
|
160
|
+
const first = variants[0];
|
|
161
|
+
if (new Set(variants.map((variant) => variant.mode)).size !== variants.length) {
|
|
162
|
+
invalid('A preview receipt cannot repeat an effective mode.');
|
|
163
|
+
}
|
|
164
|
+
if (variants.some((variant) => variant.projectRoot !== first.projectRoot || variant.cliVersion !== first.cliVersion)) {
|
|
165
|
+
invalid('Preview variants must bind the same canonical project and installed CLI.');
|
|
166
|
+
}
|
|
167
|
+
if (!receiptIdPattern.test(issuance.receiptId))
|
|
168
|
+
invalid('Preview receiptId must be a lowercase UUID.');
|
|
169
|
+
const issuedAt = Date.parse(issuance.issuedAt);
|
|
170
|
+
if (!Number.isFinite(issuedAt) || new Date(issuedAt).toISOString() !== issuance.issuedAt) {
|
|
171
|
+
invalid('Preview issuedAt must be an ISO UTC timestamp.');
|
|
172
|
+
}
|
|
173
|
+
return Object.freeze({
|
|
174
|
+
schemaVersion: updatePreviewSchemaVersion,
|
|
175
|
+
kind: 'liftoff-update-preview',
|
|
176
|
+
projectRoot: first.projectRoot,
|
|
177
|
+
projectKey: updatePreviewProjectKey(first.projectRoot),
|
|
178
|
+
receiptId: issuance.receiptId,
|
|
179
|
+
issuedAt: issuance.issuedAt,
|
|
180
|
+
variants: Object.freeze(variants)
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
export function validateUpdatePreviewReceipt(value, options = {}) {
|
|
184
|
+
if (!isRecord(value))
|
|
185
|
+
invalid('Preview receipt must be an object.');
|
|
186
|
+
if (value.schemaVersion !== updatePreviewSchemaVersion) {
|
|
187
|
+
throw new UpdatePreviewError('preview-unsupported', 'Unsupported or missing preview receipt schema; expected schema 1.');
|
|
188
|
+
}
|
|
189
|
+
strictKeys(value, [
|
|
190
|
+
'schemaVersion', 'kind', 'projectRoot', 'projectKey', 'receiptId', 'issuedAt', 'variants'
|
|
191
|
+
], 'Preview receipt');
|
|
192
|
+
if (value.kind !== 'liftoff-update-preview' || !Array.isArray(value.variants))
|
|
193
|
+
invalid('Invalid preview receipt kind or variants.');
|
|
194
|
+
const receipt = createUpdatePreviewReceipt(value.variants.map(validateUpdatePreviewDescriptor), {
|
|
195
|
+
receiptId: text(value.receiptId, 'Preview receiptId'),
|
|
196
|
+
issuedAt: text(value.issuedAt, 'Preview issuedAt')
|
|
197
|
+
});
|
|
198
|
+
if (value.projectRoot !== receipt.projectRoot || value.projectKey !== receipt.projectKey) {
|
|
199
|
+
invalid('Preview receipt project identity is inconsistent.');
|
|
200
|
+
}
|
|
201
|
+
if (options.projectRoot !== undefined &&
|
|
202
|
+
receipt.projectRoot !== normalizeUpdatePreviewProjectRoot(options.projectRoot)) {
|
|
203
|
+
throw new UpdatePreviewError('preview-mismatch', `Preview belongs to a different project or worktree. Run ${formatUpdateCommand(options.projectRoot, 'check')}.`);
|
|
204
|
+
}
|
|
205
|
+
if (options.now !== undefined &&
|
|
206
|
+
(!Number.isFinite(options.now.getTime()) || Date.parse(receipt.issuedAt) > options.now.getTime())) {
|
|
207
|
+
invalid('Preview receipt is dated in the future or the current clock is invalid.');
|
|
208
|
+
}
|
|
209
|
+
return receipt;
|
|
210
|
+
}
|
|
211
|
+
export function matchUpdatePreviewReceipt(receipt, currentDescriptor) {
|
|
212
|
+
const current = validateUpdatePreviewDescriptor(currentDescriptor);
|
|
213
|
+
const validated = validateUpdatePreviewReceipt(receipt, { projectRoot: current.projectRoot });
|
|
214
|
+
const matched = validated.variants.find((variant) => variant.mode === current.mode);
|
|
215
|
+
if (!matched || matched.fingerprint !== current.fingerprint) {
|
|
216
|
+
throw new UpdatePreviewError('preview-mismatch', `The ${current.mode} preview is missing or stale for the current inputs, target, or operations. Run ${formatUpdateCommand(current.projectRoot, 'check')}.`);
|
|
217
|
+
}
|
|
218
|
+
return current;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/application/update/preview.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,sDAAsD,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,2BAA2B,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAW5G,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACtB,IAAI;IAAzB,YAAqB,IAA4B,EAAE,OAAe,EAAE,OAAsB;QACxF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBADL,IAAI;QAEvB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAqCD,MAAM,aAAa,GAAG,iBAAiB,CAAC;AACxC,MAAM,gBAAgB,GAAG,iEAAiE,CAAC;AAE3F,SAAS,OAAO,CAAC,OAAe;IAC9B,MAAM,IAAI,kBAAkB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,KAA8B,EAAE,IAAuB,EAAE,KAAa;IACxF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;QAChG,OAAO,CAAC,GAAG,KAAK,sCAAsC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,KAAc,EAAE,KAAa;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtF,OAAO,CAAC,GAAG,KAAK,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,KAAc,EAAE,KAAa;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,GAAG,KAAK,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,KAAa;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/F,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACxF,OAAO,CAAC,iEAAiE,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IAC9C,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;QACtD,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,mEAAmE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACpH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,WAAmB;IACzD,OAAO,eAAe,CAAC;QACrB,aAAa,EAAE,0BAA0B;QACzC,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,iCAAiC,CAAC,WAAW,CAAC;KAC5D,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,SAAS,GAAG,IAAI,GAAG,EAAU;IACvE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO;IACtF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IAChE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,CAAC,yDAAyD,CAAC,CAAC;IACpH,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,0CAA0C,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QAC7E,OAAO,CAAC,oEAAoE,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS;QAC1E,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,qEAAqE,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,+CAA+C,CAAC,CAAC;IACzG,MAAM,UAAU,GAAG,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC;aAC3F,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,gFAAgF,CAAC,CAAC;IAC5F,CAAC;IACD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,QAAQ;YAAE,SAAS;QACvD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC9D,OAAO,CAAC,kEAAkE,CAAC,CAAC;QAC9E,CAAC;QACD,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAChD,CAAC;IACD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAmD;IAChF,MAAM,WAAW,GAAG,iCAAiC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACjE,IAAI,CAAC,sDAAsD,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7E,OAAO,CAAC,iDAAiD,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;IACxG,MAAM,MAAM,GAAG;QACb,WAAW;QACX,UAAU;QACV,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,uBAAuB,CAAC;QACjE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,uBAAuB,CAAC;QACjE,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;KAC9E,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,MAAM;QACT,WAAW,EAAE,eAAe,CAAC;YAC3B,aAAa,EAAE,0BAA0B;YACzC,IAAI,EAAE,qBAAqB;YAC3B,GAAG,MAAM;SACV,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAyB;IACrE,uFAAuF;IACvF,OAAO,qBAAqB,CAAC;QAC3B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1C,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1C,gBAAgB,EAAE,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC;KACnD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAc;IAC5D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;IACvE,UAAU,CAAC,KAAK,EAAE;QAChB,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa;KACvG,EAAE,oBAAoB,CAAC,CAAC;IACzB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;IACxG,MAAM,UAAU,GAAG,qBAAqB,CAAC;QACvC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,sBAAsB,CAAC;QAC5D,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,qBAAqB,CAAC;QACzD,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,uBAAuB,CAAC;QACjE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,uBAAuB,CAAC;QACjE,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;KAC9E,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;QACjG,OAAO,CAAC,2EAA2E,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,WAA+C,EAC/C,QAA+B;IAE/B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,uDAAuD,CAAC,CAAC;IACvH,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,+BAA+B,CAAC;SAC9D,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9E,OAAO,CAAC,oDAAoD,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACrH,OAAO,CAAC,0EAA0E,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,6CAA6C,CAAC,CAAC;IACvG,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzF,OAAO,CAAC,gDAAgD,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,aAAa,EAAE,0BAA0B;QACzC,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,WAAW,CAAC;QACtD,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;KAClC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAAc,EACd,OAAO,GAAyC,EAAE;IAElD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,oCAAoC,CAAC,CAAC;IACpE,IAAI,KAAK,CAAC,aAAa,KAAK,0BAA0B,EAAE,CAAC;QACvD,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,EAAE,mEAAmE,CAAC,CAAC;IAC3H,CAAC;IACD,UAAU,CAAC,KAAK,EAAE;QAChB,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU;KAC1F,EAAE,iBAAiB,CAAC,CAAC;IACtB,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,2CAA2C,CAAC,CAAC;IACpI,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE;QAC9F,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,mBAAmB,CAAC;QACrD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,kBAAkB,CAAC;KACnD,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;QACzF,OAAO,CAAC,mDAAmD,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QACjC,OAAO,CAAC,WAAW,KAAK,iCAAiC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,kBAAkB,CAAC,kBAAkB,EAC7C,2DAA2D,mBAAmB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS;QACzB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACtG,OAAO,CAAC,yEAAyE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAAgB,EAChB,iBAA0C;IAE1C,MAAM,OAAO,GAAG,+BAA+B,CAAC,iBAAiB,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,4BAA4B,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5D,MAAM,IAAI,kBAAkB,CAC1B,kBAAkB,EAClB,OAAO,OAAO,CAAC,IAAI,mFAAmF,mBAAmB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAC3J,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ExternalCommand } from '../../domain/project/contracts.js';
|
|
2
|
+
import type { RunCommandOptions } from '../../process-runner.js';
|
|
3
|
+
export interface RetainedProjectInput {
|
|
4
|
+
pathParts: string[];
|
|
5
|
+
digest: string;
|
|
6
|
+
mode: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const localValidationOutputPolicy: readonly [{
|
|
9
|
+
readonly executable: 'npm';
|
|
10
|
+
readonly cwd: readonly ['backend'];
|
|
11
|
+
readonly outputs: readonly [readonly ['backend', 'dist'], readonly ['backend', 'build'], readonly ['backend', 'out'], readonly ['backend', 'coverage'], readonly ['backend', '.cache']];
|
|
12
|
+
}, {
|
|
13
|
+
readonly executable: 'npm';
|
|
14
|
+
readonly cwd: readonly ['frontend'];
|
|
15
|
+
readonly outputs: readonly [readonly ['frontend', 'dist'], readonly ['frontend', 'build'], readonly ['frontend', 'out'], readonly ['frontend', 'coverage'], readonly ['frontend', '.next'], readonly ['frontend', '.cache']];
|
|
16
|
+
}, {
|
|
17
|
+
readonly executable: 'uv';
|
|
18
|
+
readonly cwd: readonly [];
|
|
19
|
+
readonly outputs: readonly [readonly ['.coverage'], readonly ['coverage.xml'], readonly ['htmlcov']];
|
|
20
|
+
}];
|
|
21
|
+
export declare function isRetainedProjectInput(parts: readonly string[]): boolean;
|
|
22
|
+
export declare function captureRetainedProjectInputs(projectRoot: string): Promise<RetainedProjectInput[]>;
|
|
23
|
+
export declare function changedRetainedProjectInputs(expected: readonly RetainedProjectInput[], actual: readonly RetainedProjectInput[]): string[];
|
|
24
|
+
export declare function outputsForLocalCommand(projectRoot: string, command: ExternalCommand, options?: RunCommandOptions): readonly (readonly string[])[];
|
|
25
|
+
export declare function acceptDeclaredCommandOutputs(expected: readonly RetainedProjectInput[], actual: readonly RetainedProjectInput[], outputs: readonly (readonly string[])[]): RetainedProjectInput[];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { lstat, readdir, readFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { resolveProjectPath } from '../../adapters/filesystem/project-paths.js';
|
|
5
|
+
import { canonicalSha256 } from '../../domain/governance/activation/canonical-json.js';
|
|
6
|
+
import { isProjectMutationReservationName } from '../../domain/governance/activation/inputs.js';
|
|
7
|
+
import { reviewedUpdateTransactionPathParts } from '../../domain/project/reviewed-update-artifacts.js';
|
|
8
|
+
const dependencyCaches = new Set([
|
|
9
|
+
'.git', 'node_modules', '.venv', 'venv', '.terraform',
|
|
10
|
+
'__pycache__', '.pytest_cache', '.mypy_cache', '.ruff_cache'
|
|
11
|
+
]);
|
|
12
|
+
const mutableRecords = new Set([
|
|
13
|
+
'governance/plans', 'governance/evidence',
|
|
14
|
+
'governance/activation-state.json', 'governance/migration-state.json',
|
|
15
|
+
reviewedUpdateTransactionPathParts.join('/')
|
|
16
|
+
]);
|
|
17
|
+
export const localValidationOutputPolicy = [
|
|
18
|
+
{ executable: 'npm', cwd: ['backend'], outputs: [['backend', 'dist'], ['backend', 'build'], ['backend', 'out'], ['backend', 'coverage'], ['backend', '.cache']] },
|
|
19
|
+
{ executable: 'npm', cwd: ['frontend'], outputs: [['frontend', 'dist'], ['frontend', 'build'], ['frontend', 'out'], ['frontend', 'coverage'], ['frontend', '.next'], ['frontend', '.cache']] },
|
|
20
|
+
{ executable: 'uv', cwd: [], outputs: [['.coverage'], ['coverage.xml'], ['htmlcov']] }
|
|
21
|
+
];
|
|
22
|
+
export function isRetainedProjectInput(parts) {
|
|
23
|
+
if (parts.some((part) => dependencyCaches.has(part) || isProjectMutationReservationName(part)))
|
|
24
|
+
return false;
|
|
25
|
+
for (let length = 1; length <= parts.length; length++) {
|
|
26
|
+
if (mutableRecords.has(parts.slice(0, length).join('/')))
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
export async function captureRetainedProjectInputs(projectRoot) {
|
|
32
|
+
const result = [];
|
|
33
|
+
async function visit(parts) {
|
|
34
|
+
const directory = parts.length ? await resolveProjectPath(projectRoot, parts) : projectRoot;
|
|
35
|
+
for (const entry of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name, 'en'))) {
|
|
36
|
+
const child = [...parts, entry.name];
|
|
37
|
+
if (!isRetainedProjectInput(child))
|
|
38
|
+
continue;
|
|
39
|
+
const absolute = await resolveProjectPath(projectRoot, child);
|
|
40
|
+
const details = await lstat(absolute);
|
|
41
|
+
if (entry.isDirectory() && details.isDirectory()) {
|
|
42
|
+
await visit(child);
|
|
43
|
+
}
|
|
44
|
+
else if (entry.isFile() && details.isFile()) {
|
|
45
|
+
result.push({
|
|
46
|
+
pathParts: child,
|
|
47
|
+
digest: createHash('sha256').update(await readFile(absolute)).digest('hex'),
|
|
48
|
+
mode: details.mode & 0o7777
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new Error(`Protected update source ${child.join('/')} must not be a link or special file.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
await visit([]);
|
|
57
|
+
return result.sort((a, b) => a.pathParts.join('/').localeCompare(b.pathParts.join('/'), 'en'));
|
|
58
|
+
}
|
|
59
|
+
export function changedRetainedProjectInputs(expected, actual) {
|
|
60
|
+
const before = new Map(expected.map((entry) => [entry.pathParts.join('/'), canonicalSha256(entry)]));
|
|
61
|
+
const after = new Map(actual.map((entry) => [entry.pathParts.join('/'), canonicalSha256(entry)]));
|
|
62
|
+
return [...new Set([...before.keys(), ...after.keys()])]
|
|
63
|
+
.filter((key) => before.get(key) !== after.get(key)).sort();
|
|
64
|
+
}
|
|
65
|
+
export function outputsForLocalCommand(projectRoot, command, options) {
|
|
66
|
+
const cwd = path.resolve(options?.cwd ?? projectRoot);
|
|
67
|
+
const policy = localValidationOutputPolicy.find((entry) => command.executable === entry.executable && cwd === path.resolve(projectRoot, ...entry.cwd));
|
|
68
|
+
return policy?.outputs ?? [];
|
|
69
|
+
}
|
|
70
|
+
export function acceptDeclaredCommandOutputs(expected, actual, outputs) {
|
|
71
|
+
const permitted = (name) => outputs.some((parts) => {
|
|
72
|
+
const root = parts.join('/');
|
|
73
|
+
return name === root || name.startsWith(`${root}/`);
|
|
74
|
+
});
|
|
75
|
+
const changed = changedRetainedProjectInputs(expected, actual).filter((name) => !permitted(name));
|
|
76
|
+
if (changed.length) {
|
|
77
|
+
throw new Error(`Protected source changed during validation: ${changed.join(', ')}. Edits were preserved; obtain a fresh preview.`);
|
|
78
|
+
}
|
|
79
|
+
return actual.map((entry) => ({ ...entry, pathParts: [...entry.pathParts] }));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=protected-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protected-source.js","sourceRoot":"","sources":["../../../src/application/update/protected-source.ts"],"names":[],"mappings":"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"}
|