@msn-control/liftoff 0.10.3 → 0.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/DEVELOPER.md +201 -0
  2. package/README.md +1 -1
  3. package/assets/governance/single-maintainer-gitflow/assessment-controls.json +39 -0
  4. package/assets/supported-stack.json +4 -2
  5. package/dist/args.d.ts +2 -2
  6. package/dist/args.js +41 -10
  7. package/dist/args.js.map +1 -1
  8. package/dist/artifact-lifecycle.d.ts +1 -1
  9. package/dist/artifact-lifecycle.js +3 -1
  10. package/dist/artifact-lifecycle.js.map +1 -1
  11. package/dist/cli.js +2 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands.js +214 -57
  14. package/dist/commands.js.map +1 -1
  15. package/dist/file-system.d.ts +3 -0
  16. package/dist/file-system.js +51 -10
  17. package/dist/file-system.js.map +1 -1
  18. package/dist/governance-activation/commands.js +40 -2
  19. package/dist/governance-activation/commands.js.map +1 -1
  20. package/dist/governance-activation/readiness.d.ts +1 -0
  21. package/dist/governance-activation/readiness.js +3 -1
  22. package/dist/governance-activation/readiness.js.map +1 -1
  23. package/dist/governance-activation/seed-lifecycle.d.ts +1 -1
  24. package/dist/governance-activation/seed-lifecycle.js +47 -3
  25. package/dist/governance-activation/seed-lifecycle.js.map +1 -1
  26. package/dist/governance-activation/transitions.d.ts +8 -0
  27. package/dist/governance-activation/transitions.js +12 -1
  28. package/dist/governance-activation/transitions.js.map +1 -1
  29. package/dist/governance-assessment/catalog.d.ts +8 -0
  30. package/dist/governance-assessment/catalog.js +98 -0
  31. package/dist/governance-assessment/catalog.js.map +1 -0
  32. package/dist/governance-assessment/command.d.ts +10 -0
  33. package/dist/governance-assessment/command.js +81 -0
  34. package/dist/governance-assessment/command.js.map +1 -0
  35. package/dist/governance-assessment/engine.d.ts +19 -0
  36. package/dist/governance-assessment/engine.js +586 -0
  37. package/dist/governance-assessment/engine.js.map +1 -0
  38. package/dist/governance-assessment/index.d.ts +5 -0
  39. package/dist/governance-assessment/index.js +6 -0
  40. package/dist/governance-assessment/index.js.map +1 -0
  41. package/dist/governance-assessment/live-normalize.d.ts +19 -0
  42. package/dist/governance-assessment/live-normalize.js +403 -0
  43. package/dist/governance-assessment/live-normalize.js.map +1 -0
  44. package/dist/governance-assessment/live-transport.d.ts +38 -0
  45. package/dist/governance-assessment/live-transport.js +467 -0
  46. package/dist/governance-assessment/live-transport.js.map +1 -0
  47. package/dist/governance-assessment/live.d.ts +2 -0
  48. package/dist/governance-assessment/live.js +639 -0
  49. package/dist/governance-assessment/live.js.map +1 -0
  50. package/dist/governance-assessment/predicates.d.ts +27 -0
  51. package/dist/governance-assessment/predicates.js +330 -0
  52. package/dist/governance-assessment/predicates.js.map +1 -0
  53. package/dist/governance-assessment/project.d.ts +37 -0
  54. package/dist/governance-assessment/project.js +268 -0
  55. package/dist/governance-assessment/project.js.map +1 -0
  56. package/dist/governance-assessment/readers.d.ts +18 -0
  57. package/dist/governance-assessment/readers.js +130 -0
  58. package/dist/governance-assessment/readers.js.map +1 -0
  59. package/dist/governance-assessment/report.d.ts +23 -0
  60. package/dist/governance-assessment/report.js +266 -0
  61. package/dist/governance-assessment/report.js.map +1 -0
  62. package/dist/governance-assessment/sanitize.d.ts +8 -0
  63. package/dist/governance-assessment/sanitize.js +57 -0
  64. package/dist/governance-assessment/sanitize.js.map +1 -0
  65. package/dist/governance-assessment/types.d.ts +178 -0
  66. package/dist/governance-assessment/types.js +13 -0
  67. package/dist/governance-assessment/types.js.map +1 -0
  68. package/dist/governance-assessment/yaml.d.ts +6 -0
  69. package/dist/governance-assessment/yaml.js +30 -0
  70. package/dist/governance-assessment/yaml.js.map +1 -0
  71. package/dist/migrate-plan.d.ts +4 -0
  72. package/dist/migrate-plan.js +73 -2
  73. package/dist/migrate-plan.js.map +1 -1
  74. package/dist/power-apps-templates.js +4 -0
  75. package/dist/power-apps-templates.js.map +1 -1
  76. package/dist/process-runner.d.ts +4 -0
  77. package/dist/process-runner.js +164 -8
  78. package/dist/process-runner.js.map +1 -1
  79. package/dist/published-verifier.js +6 -0
  80. package/dist/published-verifier.js.map +1 -1
  81. package/dist/release-identity.js +19 -0
  82. package/dist/release-identity.js.map +1 -1
  83. package/dist/repository-governance.d.ts +5 -0
  84. package/dist/repository-governance.js +128 -1
  85. package/dist/repository-governance.js.map +1 -1
  86. package/dist/telemetry/contract.d.ts +2 -0
  87. package/dist/telemetry/contract.js +7 -0
  88. package/dist/telemetry/contract.js.map +1 -1
  89. package/dist/templates.js +48 -25
  90. package/dist/templates.js.map +1 -1
  91. package/docs/cli-reference.md +80 -0
  92. package/docs/configuration-and-manifests.md +11 -1
  93. package/docs/project-structure.md +8 -3
  94. package/docs/repository-governance.md +119 -2
  95. package/docs/telemetry.md +9 -3
  96. package/docs/workloads.md +7 -0
  97. package/package.json +3 -2
@@ -0,0 +1,268 @@
1
+ import { lstat, realpath } from 'node:fs/promises';
2
+ import { devNull } from 'node:os';
3
+ import path from 'node:path';
4
+ import { normalizeManifestFramework, normalizeManifestProject, parseManifest, resolveProjectPath, validateArtifactPathParts } from '../file-system.js';
5
+ import { buildProjectPlan } from '../planner.js';
6
+ import { buildRepositoryGovernanceArtifacts } from '../repository-governance.js';
7
+ import { activationCompatibility, currentActivationIdentity } from '../governance-activation/graph.js';
8
+ import { canonicalJson } from '../governance-activation/canonical-json.js';
9
+ import { validateApprovalEnvelope, validateEvidenceHeader, validateLiveReadbackProof, validateUserActivationState, validateSavedTransitionPlan } from '../governance-activation/validators.js';
10
+ import { NodeCommandRunner } from '../process-runner.js';
11
+ import { AssessmentInputError, errorCode, parseAssessmentJson } from './readers.js';
12
+ import { containsSensitiveText, isRecord, jsonValue, sanitizeAssessmentText } from './sanitize.js';
13
+ function diagnostic(code, message, source) {
14
+ return { code, message: sanitizeAssessmentText(message), source: sanitizeAssessmentText(source), severity: 'warning' };
15
+ }
16
+ function exactKeys(value, allowed, label) {
17
+ if (Object.keys(value).some((key) => !allowed.includes(key)))
18
+ throw new AssessmentInputError('malformed-manifest', `${label} contains unsupported fields.`, 'liftoff.manifest.json');
19
+ }
20
+ function identityHeader(value, label) {
21
+ if (!isRecord(value))
22
+ throw new AssessmentInputError('malformed-identity', `${label} must be an object.`, label);
23
+ const fields = Object.keys(currentActivationIdentity);
24
+ if (fields.some((key) => !Object.hasOwn(value, key)) || Object.keys(value).some((key) => !fields.includes(key))) {
25
+ throw new AssessmentInputError('malformed-identity', `${label} has incomplete or unknown identity fields.`, label);
26
+ }
27
+ for (const [key, sample] of Object.entries(currentActivationIdentity)) {
28
+ const member = value[key];
29
+ if (typeof sample === 'number' ? !Number.isInteger(member) || Number(member) < 1 : typeof member !== 'string' || !member) {
30
+ throw new AssessmentInputError('malformed-identity', `${label}.${key} has an invalid value type.`, label);
31
+ }
32
+ }
33
+ if (typeof value.phaseGraphHash !== 'string' || !/^[a-f0-9]{64}$/u.test(value.phaseGraphHash)) {
34
+ throw new AssessmentInputError('malformed-identity', `${label}.phaseGraphHash is not a SHA-256 digest.`, label);
35
+ }
36
+ return containsSensitiveText(JSON.stringify(value)) ? '[withheld: sensitive identity]' : jsonValue(value);
37
+ }
38
+ function compatibleIdentity(value) {
39
+ return [...activationCompatibility.values()].some((identity) => canonicalJson(value) === canonicalJson(identity));
40
+ }
41
+ function rawArtifactPaths(raw) {
42
+ const lists = Number(raw.artifactVersion) >= 6 ? ['managedArtifacts', 'projectArtifacts'] : ['artifacts'];
43
+ for (const key of lists) {
44
+ const list = raw[key];
45
+ if (!Array.isArray(list))
46
+ throw new AssessmentInputError('malformed-manifest', `${key} must be an array.`, 'liftoff.manifest.json');
47
+ for (const entry of list) {
48
+ if (!isRecord(entry) || typeof entry.logicalName !== 'string' || !entry.logicalName ||
49
+ typeof entry.category !== 'string' || !Array.isArray(entry.pathParts)) {
50
+ throw new AssessmentInputError('malformed-manifest', `${key} contains malformed artifact metadata.`, 'liftoff.manifest.json');
51
+ }
52
+ validateArtifactPathParts(entry.pathParts, 'Assessment manifest path');
53
+ const hash = key === 'projectArtifacts' ? entry.generationHash : entry.contentHash;
54
+ if (typeof hash !== 'string' || !/^sha256:[a-f0-9]{64}$/u.test(hash)) {
55
+ throw new AssessmentInputError('malformed-manifest', `${key} contains an invalid content digest.`, 'liftoff.manifest.json');
56
+ }
57
+ }
58
+ }
59
+ }
60
+ export async function inspectAssessmentProject(files) {
61
+ const text = await files.read(['liftoff.manifest.json']);
62
+ if (text === null)
63
+ throw new AssessmentInputError('project-not-found', 'No liftoff.manifest.json was found in the selected project.');
64
+ const raw = parseAssessmentJson(text, 'liftoff.manifest.json');
65
+ if (!isRecord(raw) || typeof raw.artifactVersion !== 'number' || ![2, 3, 4, 5, 6, 7].includes(raw.artifactVersion)) {
66
+ throw new AssessmentInputError('unsupported-manifest', 'Manifest schema is unknown; no artifact paths were accessed.', 'liftoff.manifest.json');
67
+ }
68
+ rawArtifactPaths(raw);
69
+ const gov = raw.artifactVersion >= 5 && isRecord(raw.governance) ? raw.governance : {};
70
+ const recordedIdentity = gov.activationIdentity === undefined ? null : identityHeader(gov.activationIdentity, 'manifest activation identity');
71
+ const unsupported = recordedIdentity !== null && !compatibleIdentity(recordedIdentity) ||
72
+ (typeof gov.policyVersion === 'string' && !['1', '2', '3', '4', '5', '6'].includes(gov.policyVersion));
73
+ let manifest;
74
+ let project;
75
+ if (unsupported) {
76
+ if (raw.generatedBy !== 'Mission Control Liftoff' || typeof raw.liftoffVersion !== 'string' ||
77
+ !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u.test(raw.liftoffVersion)) {
78
+ throw new AssessmentInputError('malformed-manifest', 'Manifest producer/version fields are invalid.', 'liftoff.manifest.json');
79
+ }
80
+ exactKeys(raw, ['artifactVersion', 'generatedBy', 'liftoffVersion', 'project', 'framework', 'governance', 'managedArtifacts', 'projectArtifacts', 'artifacts'], 'Manifest');
81
+ exactKeys(gov, ['profile', 'policyVersion', 'state', 'activationIdentity'], 'Governance metadata');
82
+ if (gov.profile !== 'single-maintainer-gitflow' || !['handoff-generated', 'handoff-partial'].includes(String(gov.state)) ||
83
+ typeof gov.policyVersion !== 'string' || !/^[1-9]\d*$/u.test(gov.policyVersion)) {
84
+ throw new AssessmentInputError('malformed-manifest', 'Governance metadata is invalid.', 'liftoff.manifest.json');
85
+ }
86
+ if (isRecord(recordedIdentity) && recordedIdentity.policyVersion !== gov.policyVersion) {
87
+ throw new AssessmentInputError('malformed-manifest', 'Recorded policy and activation identity contradict one another.', 'liftoff.manifest.json');
88
+ }
89
+ project = normalizeManifestProject(raw.project, raw.artifactVersion);
90
+ normalizeManifestFramework(raw.framework, raw.artifactVersion, project);
91
+ manifest = null;
92
+ }
93
+ else {
94
+ const parsed = parseManifest(raw);
95
+ manifest = parsed;
96
+ project = parsed.project;
97
+ }
98
+ const diagnostics = [];
99
+ if (unsupported)
100
+ diagnostics.push(diagnostic('unsupported-activation', 'The recorded activation tuple is not supported. Independent local facts remain assessable; no migration mapping is being inferred.', 'liftoff.manifest.json'));
101
+ const profile = manifest?.governance.profile ?? String(gov.profile);
102
+ const identity = {
103
+ availability: unsupported ? 'unsupported' : 'known', manifestVersion: raw.artifactVersion,
104
+ cliVersion: typeof raw.liftoffVersion === 'string' ? raw.liftoffVersion : null,
105
+ profile, policyVersion: typeof gov.policyVersion === 'string' ? sanitizeAssessmentText(gov.policyVersion, 64) : null,
106
+ recordedActivationIdentity: recordedIdentity, stateSource: 'not-started'
107
+ };
108
+ const workload = project.workload;
109
+ const plan = project.agents.length === 0 ? null : buildProjectPlan({
110
+ projectName: project.name, projectType: workload.kind,
111
+ ...(workload.kind === 'power-apps-code-app' ? { codeAppsPlugin: workload.codeAppsPlugin } : {
112
+ apiStack: workload.apiStack, cloud: workload.cloud, region: workload.region,
113
+ includeFrontend: workload.frontend, environments: workload.environments,
114
+ ...(workload.kind === 'genai' ? { pattern: workload.pattern } : {})
115
+ }),
116
+ agents: project.agents, defaultAgent: project.defaultAgent, specWorkflow: project.specWorkflow,
117
+ governanceProfile: profile === 'none' ? 'none' : 'single-maintainer-gitflow'
118
+ }, { requireProjectName: true });
119
+ const renderedCore = plan ? buildRepositoryGovernanceArtifacts(plan) : [];
120
+ if (!plan)
121
+ diagnostics.push(diagnostic('unobserved-agent-selection', 'This historical manifest does not identify configured agents. Current managed handoff rendering is not inferred.', 'liftoff.manifest.json'));
122
+ const managedEntries = manifest?.managedArtifacts.map((entry) => ({
123
+ logicalName: entry.logicalName, pathParts: entry.pathParts, contentHash: entry.contentHash
124
+ })) ?? [];
125
+ const input = {
126
+ manifest, project, identity, managedEntries, renderedCore, state: null,
127
+ stateIdentity: null, evidence: [], approvals: [], plans: [], bindingBaseline: null, invalidEvidence: false, diagnostics
128
+ };
129
+ if (profile === 'none')
130
+ return input;
131
+ const stateText = await files.read(['governance', 'activation-state.json']);
132
+ if (stateText !== null) {
133
+ const rawState = parseAssessmentJson(stateText, 'governance/activation-state.json');
134
+ if (!isRecord(rawState))
135
+ throw new AssessmentInputError('malformed-state', 'Activation state must be an object.', 'governance/activation-state.json');
136
+ if (rawState.schemaVersion === 1) {
137
+ input.stateIdentity = identityHeader(rawState.identity, 'activation state identity');
138
+ if (compatibleIdentity(input.stateIdentity)) {
139
+ input.state = validateUserActivationState(rawState);
140
+ input.identity.stateSource = 'user';
141
+ }
142
+ else {
143
+ input.identity.stateSource = 'unsupported';
144
+ }
145
+ }
146
+ else {
147
+ input.identity.stateSource = 'unsupported';
148
+ }
149
+ if (input.identity.stateSource === 'unsupported') {
150
+ input.identity.availability = 'unsupported';
151
+ diagnostics.push(diagnostic('unsupported-state', 'State schema or identity is unsupported; its execution state remains opaque and unchanged.', 'governance/activation-state.json'));
152
+ }
153
+ }
154
+ const evidenceIds = new Set();
155
+ for (const parts of await files.list(['governance', 'evidence'], ['.json'])) {
156
+ const label = parts.join('/');
157
+ const text = await files.read(parts);
158
+ if (text === null)
159
+ throw new AssessmentInputError('inputs-changed', 'Evidence disappeared during collection.', label);
160
+ const value = parseAssessmentJson(text, label);
161
+ if (containsSensitiveText(text)) {
162
+ input.invalidEvidence = true;
163
+ diagnostics.push(diagnostic('sensitive-evidence', 'Evidence with sensitive content was withheld.', label));
164
+ continue;
165
+ }
166
+ try {
167
+ if (!isRecord(value))
168
+ throw new Error('Evidence must be an object.');
169
+ const header = validateEvidenceHeader(Object.hasOwn(value, 'header') ? value.header : value);
170
+ const evidenceId = typeof value.evidenceId === 'string' ? value.evidenceId : parts.at(-1).slice(0, -5);
171
+ if (evidenceIds.has(evidenceId)) {
172
+ input.invalidEvidence = true;
173
+ input.evidence = input.evidence.filter((record) => record.evidenceId !== evidenceId);
174
+ diagnostics.push(diagnostic('ambiguous-evidence', `Duplicate evidence identity ${evidenceId} was excluded from assessment bindings.`, label));
175
+ continue;
176
+ }
177
+ evidenceIds.add(evidenceId);
178
+ if (value.liveReadback !== undefined && !Array.isArray(value.liveReadback))
179
+ throw new Error('Live proof must be an array.');
180
+ input.evidence.push({
181
+ evidenceId, header,
182
+ ...(Array.isArray(value.liveReadback) ? { liveReadback: value.liveReadback.map(validateLiveReadbackProof) } : {}),
183
+ ...(Object.hasOwn(value, 'payload') ? { payload: value.payload } : {})
184
+ });
185
+ }
186
+ catch (error) {
187
+ input.invalidEvidence = true;
188
+ diagnostics.push(diagnostic('unsupported-evidence', error instanceof Error ? error.message : 'Evidence could not be interpreted.', label));
189
+ }
190
+ }
191
+ for (const parts of await files.list(['governance', 'approvals'], ['.json'])) {
192
+ const label = parts.join('/');
193
+ const text = await files.read(parts);
194
+ if (text === null)
195
+ throw new AssessmentInputError('inputs-changed', 'Approval disappeared during collection.', label);
196
+ const value = parseAssessmentJson(text, label);
197
+ try {
198
+ if (containsSensitiveText(text))
199
+ throw new Error('Approval with sensitive content was withheld.');
200
+ input.approvals.push(validateApprovalEnvelope(value));
201
+ }
202
+ catch (error) {
203
+ diagnostics.push(diagnostic('unsupported-approval', error instanceof Error ? error.message : 'Approval could not be interpreted.', label));
204
+ }
205
+ }
206
+ for (const parts of await files.list(['governance', 'plans'], ['.json'])) {
207
+ const label = parts.join('/');
208
+ const text = await files.read(parts);
209
+ if (text === null)
210
+ throw new AssessmentInputError('inputs-changed', 'Plan disappeared during collection.', label);
211
+ const value = parseAssessmentJson(text, label);
212
+ try {
213
+ if (containsSensitiveText(text))
214
+ throw new Error('Plan with sensitive content was withheld.');
215
+ input.plans.push(validateSavedTransitionPlan(value));
216
+ }
217
+ catch (error) {
218
+ diagnostics.push(diagnostic('unsupported-plan', error instanceof Error ? error.message : 'Plan could not be interpreted.', label));
219
+ }
220
+ }
221
+ return input;
222
+ }
223
+ export function repositoryName(value, id = null) {
224
+ const match = value.match(/^([A-Za-z0-9][A-Za-z0-9-]{0,38})\/([A-Za-z0-9_.-]+)$/u);
225
+ if (!match || match[2] === '.' || match[2] === '..' || containsSensitiveText(value))
226
+ return null;
227
+ return { owner: match[1], name: match[2], id };
228
+ }
229
+ export async function inspectAssessmentGit(root, runner = new NodeCommandRunner()) {
230
+ try {
231
+ await lstat(path.join(root, '.git'));
232
+ }
233
+ catch (error) {
234
+ if (errorCode(error) === 'ENOENT')
235
+ return { repository: null, head: null, issues: [], originState: 'none' };
236
+ throw error;
237
+ }
238
+ await resolveProjectPath(root, ['.git']);
239
+ const issues = [];
240
+ const prefix = ['--no-pager', '--no-optional-locks', '-c', 'core.fsmonitor=false', '-c', `core.hooksPath=${devNull}`, '-c', 'diff.external=', '-c', 'core.pager=cat'];
241
+ async function git(args) {
242
+ const result = await runner.run({ executable: 'git', args: [...prefix, ...args] }, { cwd: root, timeoutMs: 10_000 });
243
+ if (result.status === 0 && !result.timedOut && !result.errorCode)
244
+ return result.stdout.trim();
245
+ issues.push(`Local Git ${args[0]} metadata was not observed (${result.timedOut ? 'timeout' : result.errorCode ?? `exit ${result.status}`}).`);
246
+ return null;
247
+ }
248
+ const toplevel = await git(['rev-parse', '--show-toplevel']);
249
+ if (!toplevel || await realpath(toplevel) !== await realpath(root)) {
250
+ return { repository: null, head: null, issues: [...issues, 'Git root does not match the assessed project.'], originState: 'unavailable' };
251
+ }
252
+ const headText = await git(['rev-parse', '--verify', 'HEAD']);
253
+ const remote = await git(['config', '--local', '--get', 'remote.origin.url']);
254
+ let repository = null;
255
+ if (remote) {
256
+ const ssh = remote.match(/^git@github\.com:([^/\s]+\/[^/\s]+?)(?:\.git)?$/u);
257
+ const https = remote.match(/^https:\/\/github\.com\/([^/\s]+\/[^/\s]+?)(?:\.git)?\/?$/u);
258
+ repository = repositoryName(ssh?.[1] ?? https?.[1] ?? '');
259
+ if (!repository)
260
+ issues.push('Git origin is not a supported credential-free GitHub repository binding.');
261
+ }
262
+ return {
263
+ repository, head: headText && /^[a-f0-9]{40,64}$/u.test(headText) ? headText : null,
264
+ issues,
265
+ originState: repository ? 'verified' : 'unavailable'
266
+ };
267
+ }
268
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/governance-assessment/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare class AssessmentInputError extends Error {
2
+ readonly code: string;
3
+ readonly source: string | null;
4
+ constructor(code: string, message: string, source?: string | null);
5
+ }
6
+ export declare function errorCode(error: unknown): string | undefined;
7
+ export declare class AssessmentFiles {
8
+ readonly root: string;
9
+ private readonly files;
10
+ private readonly directories;
11
+ private bytesRead;
12
+ constructor(root: string);
13
+ read(parts: readonly string[]): Promise<string | null>;
14
+ list(parts: readonly string[], extensions: readonly string[]): Promise<string[][]>;
15
+ digest(): string;
16
+ stable(): Promise<boolean>;
17
+ }
18
+ export declare function parseAssessmentJson(text: string, label: string): unknown;
@@ -0,0 +1,130 @@
1
+ import { lstat, open, readdir } from 'node:fs/promises';
2
+ import { constants } from 'node:fs';
3
+ import { resolveProjectPath, validateArtifactPathParts } from '../file-system.js';
4
+ import { canonicalSha256, sha256Hex } from '../governance-activation/canonical-json.js';
5
+ import { assessmentLimits } from './types.js';
6
+ import { sanitizeAssessmentText } from './sanitize.js';
7
+ export class AssessmentInputError extends Error {
8
+ code;
9
+ source;
10
+ constructor(code, message, source = null) {
11
+ super(sanitizeAssessmentText(message));
12
+ this.code = code;
13
+ this.source = source;
14
+ this.name = 'AssessmentInputError';
15
+ }
16
+ }
17
+ export function errorCode(error) {
18
+ return typeof error === 'object' && error !== null && 'code' in error && typeof error.code === 'string'
19
+ ? error.code : undefined;
20
+ }
21
+ export class AssessmentFiles {
22
+ root;
23
+ files = new Map();
24
+ directories = new Map();
25
+ bytesRead = 0;
26
+ constructor(root) {
27
+ this.root = root;
28
+ }
29
+ async read(parts) {
30
+ const normalized = validateArtifactPathParts([...parts], 'Assessment artifact');
31
+ const label = normalized.join('/');
32
+ const resolved = await resolveProjectPath(this.root, normalized);
33
+ if (!this.files.has(label) && this.files.size >= assessmentLimits.maxFiles) {
34
+ throw new AssessmentInputError('input-limit', 'Assessment input file limit exceeded.', label);
35
+ }
36
+ let file;
37
+ try {
38
+ const entry = await lstat(resolved);
39
+ if (!entry.isFile())
40
+ throw new AssessmentInputError('unsafe-input', `Assessment artifact ${label} is not a regular file.`, label);
41
+ file = await open(resolved, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
42
+ }
43
+ catch (error) {
44
+ if (error instanceof AssessmentInputError)
45
+ throw error;
46
+ if (errorCode(error) === 'ENOENT') {
47
+ this.files.set(label, { parts: normalized, digest: null });
48
+ return null;
49
+ }
50
+ throw new AssessmentInputError('unreadable-input', `Cannot read assessment artifact ${label}.`, label);
51
+ }
52
+ try {
53
+ const stat = await file.stat();
54
+ if (!stat.isFile())
55
+ throw new AssessmentInputError('invalid-input', `Assessment artifact ${label} is not a regular file.`, label);
56
+ if (stat.size > assessmentLimits.fileBytes)
57
+ throw new AssessmentInputError('input-limit', `Assessment artifact ${label} exceeds the 1 MiB limit.`, label);
58
+ const buffer = Buffer.alloc(assessmentLimits.fileBytes + 1);
59
+ let length = 0;
60
+ while (length < buffer.length) {
61
+ const { bytesRead } = await file.read(buffer, length, buffer.length - length, length);
62
+ if (bytesRead === 0)
63
+ break;
64
+ length += bytesRead;
65
+ }
66
+ this.bytesRead += length;
67
+ if (length > assessmentLimits.fileBytes || this.bytesRead > 20 * assessmentLimits.fileBytes) {
68
+ throw new AssessmentInputError('input-limit', `Assessment input budget exceeded while reading ${label}.`, label);
69
+ }
70
+ const contents = buffer.subarray(0, length).toString('utf8');
71
+ this.files.set(label, { parts: normalized, digest: sha256Hex(contents) });
72
+ return contents;
73
+ }
74
+ finally {
75
+ await file.close();
76
+ }
77
+ }
78
+ async list(parts, extensions) {
79
+ const normalized = validateArtifactPathParts([...parts], 'Assessment directory');
80
+ const label = normalized.join('/');
81
+ const resolved = await resolveProjectPath(this.root, normalized);
82
+ let entries;
83
+ try {
84
+ entries = await readdir(resolved, { withFileTypes: true });
85
+ }
86
+ catch (error) {
87
+ if (errorCode(error) === 'ENOENT') {
88
+ this.directories.set(label, { parts: normalized, entries: [] });
89
+ return [];
90
+ }
91
+ throw new AssessmentInputError('unreadable-input', `Cannot enumerate ${label}.`, label);
92
+ }
93
+ const files = entries.filter((entry) => extensions.some((extension) => entry.name.endsWith(extension)));
94
+ if (files.length > assessmentLimits.maxFiles)
95
+ throw new AssessmentInputError('input-limit', `${label} exceeds the file inventory limit.`, label);
96
+ const result = files.map((entry) => {
97
+ if (!entry.isFile())
98
+ throw new AssessmentInputError('unsafe-input', `${label} contains a non-regular assessment artifact.`, label);
99
+ return validateArtifactPathParts([...normalized, entry.name], 'Assessment file');
100
+ }).sort((a, b) => a.join('/').localeCompare(b.join('/'), 'en'));
101
+ this.directories.set(label, { parts: normalized, entries: entries.map((entry) => entry.name).sort() });
102
+ return result;
103
+ }
104
+ digest() {
105
+ return canonicalSha256({
106
+ files: [...this.files.entries()].map(([name, value]) => [name, value.digest]).sort(([a], [b]) => String(a).localeCompare(String(b), 'en')),
107
+ directories: [...this.directories.entries()].map(([name, value]) => [name, value.entries]).sort(([a], [b]) => String(a).localeCompare(String(b), 'en'))
108
+ });
109
+ }
110
+ async stable() {
111
+ const before = this.digest();
112
+ const files = [...this.files.values()];
113
+ const directories = [...this.directories.values()];
114
+ this.bytesRead = 0;
115
+ for (const file of files)
116
+ await this.read(file.parts);
117
+ for (const directory of directories)
118
+ await this.list(directory.parts, []);
119
+ return before === this.digest();
120
+ }
121
+ }
122
+ export function parseAssessmentJson(text, label) {
123
+ try {
124
+ return JSON.parse(text);
125
+ }
126
+ catch {
127
+ throw new AssessmentInputError('malformed-json', `Invalid JSON in ${label}.`, label);
128
+ }
129
+ }
130
+ //# sourceMappingURL=readers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readers.js","sourceRoot":"","sources":["../../src/governance-assessment/readers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AssessmentDiagnostic, AssessmentFinding, AssessmentProjectIdentity, AssessmentReport, AssessmentTarget, ControlDefinition, FindingScope, JsonValue, Layer, Observation } from './types.js';
2
+ export declare function classifyFinding(input: {
3
+ control: ControlDefinition;
4
+ scope: FindingScope;
5
+ expected?: JsonValue;
6
+ applicability: AssessmentFinding['applicability'];
7
+ observations: Partial<Record<Layer, Observation>>;
8
+ difference?: 'outdated' | 'conflicting' | 'missing';
9
+ exception?: AssessmentFinding['exception'];
10
+ }): AssessmentFinding;
11
+ export declare function reportCoverage(findings: readonly AssessmentFinding[]): AssessmentReport['coverage'];
12
+ export declare function assembleAssessmentReport(input: {
13
+ projectRoot: string;
14
+ mode: 'local' | 'live';
15
+ target: AssessmentTarget | null;
16
+ projectIdentity: AssessmentProjectIdentity;
17
+ snapshot: AssessmentReport['snapshot'];
18
+ findings: AssessmentFinding[];
19
+ diagnostics: AssessmentDiagnostic[];
20
+ disabled?: boolean;
21
+ failed?: boolean;
22
+ }): AssessmentReport;
23
+ export declare function validateAssessmentReport(value: unknown): AssessmentReport;