@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.
- package/DEVELOPER.md +142 -0
- package/README.md +26 -18
- package/assets/governance/single-maintainer-gitflow/policy.md +62 -13
- package/dist/args.js +21 -0
- package/dist/args.js.map +1 -1
- package/dist/artifact-lifecycle.d.ts +1 -1
- package/dist/artifact-lifecycle.js +5 -0
- package/dist/artifact-lifecycle.js.map +1 -1
- package/dist/commands.js +355 -13
- package/dist/commands.js.map +1 -1
- package/dist/file-system.js +100 -13
- package/dist/file-system.js.map +1 -1
- package/dist/governance-activation/activation-state.d.ts +32 -0
- package/dist/governance-activation/activation-state.js +165 -0
- package/dist/governance-activation/activation-state.js.map +1 -0
- package/dist/governance-activation/approvals.d.ts +188 -0
- package/dist/governance-activation/approvals.js +508 -0
- package/dist/governance-activation/approvals.js.map +1 -0
- package/dist/governance-activation/canonical-json.d.ts +3 -0
- package/dist/governance-activation/canonical-json.js +36 -0
- package/dist/governance-activation/canonical-json.js.map +1 -0
- package/dist/governance-activation/commands.d.ts +10 -0
- package/dist/governance-activation/commands.js +1023 -0
- package/dist/governance-activation/commands.js.map +1 -0
- package/dist/governance-activation/compatibility.d.ts +68 -0
- package/dist/governance-activation/compatibility.js +447 -0
- package/dist/governance-activation/compatibility.js.map +1 -0
- package/dist/governance-activation/credentials.d.ts +160 -0
- package/dist/governance-activation/credentials.js +403 -0
- package/dist/governance-activation/credentials.js.map +1 -0
- package/dist/governance-activation/doctor.d.ts +10 -0
- package/dist/governance-activation/doctor.js +379 -0
- package/dist/governance-activation/doctor.js.map +1 -0
- package/dist/governance-activation/evidence.d.ts +49 -0
- package/dist/governance-activation/evidence.js +246 -0
- package/dist/governance-activation/evidence.js.map +1 -0
- package/dist/governance-activation/graph.d.ts +397 -0
- package/dist/governance-activation/graph.js +441 -0
- package/dist/governance-activation/graph.js.map +1 -0
- package/dist/governance-activation/identity.d.ts +35 -0
- package/dist/governance-activation/identity.js +89 -0
- package/dist/governance-activation/identity.js.map +1 -0
- package/dist/governance-activation/index.d.ts +18 -0
- package/dist/governance-activation/index.js +19 -0
- package/dist/governance-activation/index.js.map +1 -0
- package/dist/governance-activation/migration.d.ts +44 -0
- package/dist/governance-activation/migration.js +268 -0
- package/dist/governance-activation/migration.js.map +1 -0
- package/dist/governance-activation/readiness.d.ts +23 -0
- package/dist/governance-activation/readiness.js +158 -0
- package/dist/governance-activation/readiness.js.map +1 -0
- package/dist/governance-activation/reconciliation.d.ts +11 -0
- package/dist/governance-activation/reconciliation.js +58 -0
- package/dist/governance-activation/reconciliation.js.map +1 -0
- package/dist/governance-activation/release-integrity.d.ts +11 -0
- package/dist/governance-activation/release-integrity.js +49 -0
- package/dist/governance-activation/release-integrity.js.map +1 -0
- package/dist/governance-activation/seed-lifecycle.d.ts +116 -0
- package/dist/governance-activation/seed-lifecycle.js +609 -0
- package/dist/governance-activation/seed-lifecycle.js.map +1 -0
- package/dist/governance-activation/source-of-truth.d.ts +164 -0
- package/dist/governance-activation/source-of-truth.js +986 -0
- package/dist/governance-activation/source-of-truth.js.map +1 -0
- package/dist/governance-activation/task-projection.d.ts +21 -0
- package/dist/governance-activation/task-projection.js +75 -0
- package/dist/governance-activation/task-projection.js.map +1 -0
- package/dist/governance-activation/transitions.d.ts +163 -0
- package/dist/governance-activation/transitions.js +2128 -0
- package/dist/governance-activation/transitions.js.map +1 -0
- package/dist/governance-activation/type-contract.d.ts +1 -0
- package/dist/governance-activation/type-contract.js +27 -0
- package/dist/governance-activation/type-contract.js.map +1 -0
- package/dist/governance-activation/types.d.ts +390 -0
- package/dist/governance-activation/types.js +108 -0
- package/dist/governance-activation/types.js.map +1 -0
- package/dist/governance-activation/validators.d.ts +17 -0
- package/dist/governance-activation/validators.js +1305 -0
- package/dist/governance-activation/validators.js.map +1 -0
- package/dist/init-filesystem.js +5 -1
- package/dist/init-filesystem.js.map +1 -1
- package/dist/planner.js +3 -3
- package/dist/planner.js.map +1 -1
- package/dist/power-apps-templates.js +14 -1
- package/dist/power-apps-templates.js.map +1 -1
- package/dist/process-runner.d.ts +3 -0
- package/dist/process-runner.js +68 -10
- package/dist/process-runner.js.map +1 -1
- package/dist/repository-governance.d.ts +13 -3
- package/dist/repository-governance.js +385 -52
- package/dist/repository-governance.js.map +1 -1
- package/dist/telemetry/contract.d.ts +1 -1
- package/dist/telemetry/contract.js +6 -0
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/templates.js +320 -25
- package/dist/templates.js.map +1 -1
- package/dist/types.d.ts +14 -6
- package/docs/cli-reference.md +60 -12
- package/docs/configuration-and-manifests.md +40 -16
- package/docs/existing-repositories.md +22 -11
- package/docs/getting-started.md +46 -10
- package/docs/prerequisites.md +5 -0
- package/docs/project-structure.md +34 -5
- package/docs/repository-governance.md +200 -203
- package/docs/safety-and-consent.md +29 -2
- package/docs/troubleshooting.md +74 -4
- package/docs/workloads.md +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { canonicalSha256 } from './canonical-json.js';
|
|
2
|
+
import { phaseContractDigests } from './graph.js';
|
|
3
|
+
function digestEntries(graph) {
|
|
4
|
+
return Object.entries(phaseContractDigests(graph));
|
|
5
|
+
}
|
|
6
|
+
function equalDigestMaps(left, right) {
|
|
7
|
+
const leftEntries = digestEntries(left);
|
|
8
|
+
const rightEntries = digestEntries(right);
|
|
9
|
+
return leftEntries.length === rightEntries.length &&
|
|
10
|
+
leftEntries.every(([phaseId, digest]) => rightEntries.some(([otherPhaseId, otherDigest]) => otherPhaseId === phaseId && otherDigest === digest));
|
|
11
|
+
}
|
|
12
|
+
function changedPhaseDigests(left, right) {
|
|
13
|
+
const rightDigests = phaseContractDigests(right);
|
|
14
|
+
return digestEntries(left)
|
|
15
|
+
.filter(([phaseId, digest]) => rightDigests[phaseId] !== digest)
|
|
16
|
+
.map(([phaseId]) => phaseId);
|
|
17
|
+
}
|
|
18
|
+
export function validateReleaseIntegrity(input) {
|
|
19
|
+
if (input.currentIdentity.setupSkillVersion !== undefined) {
|
|
20
|
+
throw new Error('Setup wrapper content must not introduce an independent skill version.');
|
|
21
|
+
}
|
|
22
|
+
const previousHash = canonicalSha256(input.previousGraph);
|
|
23
|
+
const currentHash = canonicalSha256(input.currentGraph);
|
|
24
|
+
if (input.previousIdentity.phaseGraphHash !== previousHash) {
|
|
25
|
+
throw new Error('Previous activation identity does not match previous graph hash.');
|
|
26
|
+
}
|
|
27
|
+
if (input.currentIdentity.phaseGraphHash !== currentHash) {
|
|
28
|
+
throw new Error('Current activation identity does not match current graph hash.');
|
|
29
|
+
}
|
|
30
|
+
const graphBytesChanged = previousHash !== currentHash;
|
|
31
|
+
const schemaChanged = input.previousGraph.schemaVersion !== input.currentGraph.schemaVersion;
|
|
32
|
+
const behaviorChanged = changedPhaseDigests(input.previousGraph, input.currentGraph);
|
|
33
|
+
if (!graphBytesChanged && behaviorChanged.length === 0 && !schemaChanged) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (schemaChanged && input.currentIdentity.phaseGraphSchemaVersion <= input.previousIdentity.phaseGraphSchemaVersion) {
|
|
37
|
+
throw new Error('Phase-graph schema drift requires a phaseGraphSchemaVersion bump.');
|
|
38
|
+
}
|
|
39
|
+
if (behaviorChanged.length > 0 && input.currentIdentity.activationContractVersion <= input.previousIdentity.activationContractVersion) {
|
|
40
|
+
throw new Error(`Phase behavior drift requires an activation-contract bump: ${behaviorChanged.join(', ')}.`);
|
|
41
|
+
}
|
|
42
|
+
if (graphBytesChanged && equalDigestMaps(input.previousGraph, input.currentGraph)) {
|
|
43
|
+
const mapped = input.compatibleGraphHashes.get(previousHash);
|
|
44
|
+
if (mapped !== currentHash) {
|
|
45
|
+
throw new Error('Nonsemantic phase-graph byte drift requires an explicit compatible hash mapping.');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=release-integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-integrity.js","sourceRoot":"","sources":["../../src/governance-activation/release-integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { CommandResult, CommandRunner } from '../process-runner.js';
|
|
2
|
+
import type { ExternalCommand, LiftoffManifest, ManifestWorkload } from '../types.js';
|
|
3
|
+
export type SeedBaselineCheckId = 'liftoff-validate' | 'backend-tests' | 'worker-tests' | 'frontend-build' | 'docker-compose-config' | 'tofu-fmt' | 'tofu-init' | 'tofu-validate' | 'openspec-strict';
|
|
4
|
+
export type SeedBaselineCheckApplicability = {
|
|
5
|
+
applicable: true;
|
|
6
|
+
command: ExternalCommand;
|
|
7
|
+
cwdPathParts: readonly string[];
|
|
8
|
+
} | {
|
|
9
|
+
applicable: false;
|
|
10
|
+
reason: string;
|
|
11
|
+
};
|
|
12
|
+
export interface SeedBaselineCheck {
|
|
13
|
+
id: SeedBaselineCheckId;
|
|
14
|
+
taskId: string;
|
|
15
|
+
label: string;
|
|
16
|
+
applicability: SeedBaselineCheckApplicability;
|
|
17
|
+
}
|
|
18
|
+
export type SeedBaselineCheckOutcome = {
|
|
19
|
+
id: SeedBaselineCheckId;
|
|
20
|
+
taskId: string;
|
|
21
|
+
label: string;
|
|
22
|
+
status: 'passed';
|
|
23
|
+
command: ExternalCommand;
|
|
24
|
+
cwdPathParts: readonly string[];
|
|
25
|
+
result: CommandResult;
|
|
26
|
+
} | {
|
|
27
|
+
id: SeedBaselineCheckId;
|
|
28
|
+
taskId: string;
|
|
29
|
+
label: string;
|
|
30
|
+
status: 'failed';
|
|
31
|
+
command: ExternalCommand;
|
|
32
|
+
cwdPathParts: readonly string[];
|
|
33
|
+
result: CommandResult;
|
|
34
|
+
detail: string;
|
|
35
|
+
} | {
|
|
36
|
+
id: SeedBaselineCheckId;
|
|
37
|
+
taskId: string;
|
|
38
|
+
label: string;
|
|
39
|
+
status: 'inapplicable';
|
|
40
|
+
reason: string;
|
|
41
|
+
};
|
|
42
|
+
export type GeneratedSeedDiscovery = {
|
|
43
|
+
state: 'active';
|
|
44
|
+
changeName: string;
|
|
45
|
+
changePathParts: readonly string[];
|
|
46
|
+
capabilityId: string;
|
|
47
|
+
} | {
|
|
48
|
+
state: 'archived';
|
|
49
|
+
changeName: string;
|
|
50
|
+
detail: string;
|
|
51
|
+
} | {
|
|
52
|
+
state: 'blocked';
|
|
53
|
+
changeName: string;
|
|
54
|
+
issues: readonly string[];
|
|
55
|
+
};
|
|
56
|
+
export type GeneratedSeedLifecycleResult = {
|
|
57
|
+
status: 'archived';
|
|
58
|
+
changeName: string;
|
|
59
|
+
capabilityId: string;
|
|
60
|
+
checks: readonly SeedBaselineCheckOutcome[];
|
|
61
|
+
archive: CommandResult;
|
|
62
|
+
archiveSyncBehavior: string;
|
|
63
|
+
} | {
|
|
64
|
+
status: 'blocked';
|
|
65
|
+
changeName: string;
|
|
66
|
+
issues: readonly string[];
|
|
67
|
+
checks: readonly SeedBaselineCheckOutcome[];
|
|
68
|
+
} | {
|
|
69
|
+
status: 'already-archived';
|
|
70
|
+
changeName: string;
|
|
71
|
+
detail: string;
|
|
72
|
+
};
|
|
73
|
+
export type SeedPhaseValidationResult = {
|
|
74
|
+
status: 'passed';
|
|
75
|
+
changeName: string;
|
|
76
|
+
capabilityId?: string;
|
|
77
|
+
command?: CommandResult;
|
|
78
|
+
detail: string;
|
|
79
|
+
} | {
|
|
80
|
+
status: 'blocked';
|
|
81
|
+
changeName: string;
|
|
82
|
+
issues: readonly string[];
|
|
83
|
+
};
|
|
84
|
+
export type SeedPhaseVerificationResult = {
|
|
85
|
+
status: 'passed';
|
|
86
|
+
changeName: string;
|
|
87
|
+
checks: readonly SeedBaselineCheckOutcome[];
|
|
88
|
+
} | {
|
|
89
|
+
status: 'blocked';
|
|
90
|
+
changeName: string;
|
|
91
|
+
issues: readonly string[];
|
|
92
|
+
checks: readonly SeedBaselineCheckOutcome[];
|
|
93
|
+
};
|
|
94
|
+
export type SeedPhaseArchiveResult = {
|
|
95
|
+
status: 'archived' | 'already-archived';
|
|
96
|
+
changeName: string;
|
|
97
|
+
capabilityId?: string;
|
|
98
|
+
archive?: CommandResult;
|
|
99
|
+
archiveSyncBehavior?: string;
|
|
100
|
+
detail: string;
|
|
101
|
+
} | {
|
|
102
|
+
status: 'blocked';
|
|
103
|
+
changeName: string;
|
|
104
|
+
issues: readonly string[];
|
|
105
|
+
};
|
|
106
|
+
export declare function generatedSeedChangeName(manifest: LiftoffManifest): string;
|
|
107
|
+
export declare function generatedSeedCapabilityId(workload: ManifestWorkload): string;
|
|
108
|
+
export declare function selectSeedBaselineChecks(manifest: LiftoffManifest, changeName?: string): SeedBaselineCheck[];
|
|
109
|
+
export declare function discoverGeneratedSeed(projectRoot: string): Promise<GeneratedSeedDiscovery>;
|
|
110
|
+
export declare function runSeedBaselineChecks(projectRoot: string, runner: CommandRunner, checks: readonly SeedBaselineCheck[]): Promise<SeedBaselineCheckOutcome[]>;
|
|
111
|
+
export declare function markSuccessfulSeedTasks(markdown: string, outcomes: readonly SeedBaselineCheckOutcome[]): string;
|
|
112
|
+
export declare function markAllSeedTasksForArchive(markdown: string): string;
|
|
113
|
+
export declare function validateGeneratedSeedForPhase(projectRoot: string, runner: CommandRunner): Promise<SeedPhaseValidationResult>;
|
|
114
|
+
export declare function verifyGeneratedSeedBaselineForPhase(projectRoot: string, runner: CommandRunner): Promise<SeedPhaseVerificationResult>;
|
|
115
|
+
export declare function archiveGeneratedSeedForPhase(projectRoot: string, runner: CommandRunner): Promise<SeedPhaseArchiveResult>;
|
|
116
|
+
export declare function completeGeneratedSeedLifecycle(projectRoot: string, runner: CommandRunner): Promise<GeneratedSeedLifecycleResult>;
|