@mitre/hdf-diff 3.0.0 → 3.1.0-rc.1

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 (91) hide show
  1. package/LICENSE.md +55 -0
  2. package/README.md +49 -17
  3. package/dist/index.d.ts +622 -16
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +2037 -18
  6. package/dist/index.js.map +1 -1
  7. package/package.json +19 -20
  8. package/dist/diff.d.ts +0 -49
  9. package/dist/diff.d.ts.map +0 -1
  10. package/dist/diff.js +0 -791
  11. package/dist/diff.js.map +0 -1
  12. package/dist/exit-codes.d.ts +0 -42
  13. package/dist/exit-codes.d.ts.map +0 -1
  14. package/dist/exit-codes.js +0 -74
  15. package/dist/exit-codes.js.map +0 -1
  16. package/dist/matching/cci-match.d.ts +0 -14
  17. package/dist/matching/cci-match.d.ts.map +0 -1
  18. package/dist/matching/cci-match.js +0 -102
  19. package/dist/matching/cci-match.js.map +0 -1
  20. package/dist/matching/exact-id.d.ts +0 -9
  21. package/dist/matching/exact-id.d.ts.map +0 -1
  22. package/dist/matching/exact-id.js +0 -88
  23. package/dist/matching/exact-id.js.map +0 -1
  24. package/dist/matching/fuzzy-match.d.ts +0 -26
  25. package/dist/matching/fuzzy-match.d.ts.map +0 -1
  26. package/dist/matching/fuzzy-match.js +0 -145
  27. package/dist/matching/fuzzy-match.js.map +0 -1
  28. package/dist/matching/index.d.ts +0 -36
  29. package/dist/matching/index.d.ts.map +0 -1
  30. package/dist/matching/index.js +0 -71
  31. package/dist/matching/index.js.map +0 -1
  32. package/dist/matching/mapped-id.d.ts +0 -13
  33. package/dist/matching/mapped-id.d.ts.map +0 -1
  34. package/dist/matching/mapped-id.js +0 -101
  35. package/dist/matching/mapped-id.js.map +0 -1
  36. package/dist/matching/types.d.ts +0 -34
  37. package/dist/matching/types.d.ts.map +0 -1
  38. package/dist/matching/types.js +0 -2
  39. package/dist/matching/types.js.map +0 -1
  40. package/dist/normalize.d.ts +0 -20
  41. package/dist/normalize.d.ts.map +0 -1
  42. package/dist/normalize.js +0 -120
  43. package/dist/normalize.js.map +0 -1
  44. package/dist/renderers/csv.d.ts +0 -15
  45. package/dist/renderers/csv.d.ts.map +0 -1
  46. package/dist/renderers/csv.js +0 -77
  47. package/dist/renderers/csv.js.map +0 -1
  48. package/dist/renderers/filter.d.ts +0 -11
  49. package/dist/renderers/filter.d.ts.map +0 -1
  50. package/dist/renderers/filter.js +0 -29
  51. package/dist/renderers/filter.js.map +0 -1
  52. package/dist/renderers/index.d.ts +0 -17
  53. package/dist/renderers/index.d.ts.map +0 -1
  54. package/dist/renderers/index.js +0 -29
  55. package/dist/renderers/index.js.map +0 -1
  56. package/dist/renderers/json.d.ts +0 -13
  57. package/dist/renderers/json.d.ts.map +0 -1
  58. package/dist/renderers/json.js +0 -41
  59. package/dist/renderers/json.js.map +0 -1
  60. package/dist/renderers/markdown.d.ts +0 -13
  61. package/dist/renderers/markdown.d.ts.map +0 -1
  62. package/dist/renderers/markdown.js +0 -133
  63. package/dist/renderers/markdown.js.map +0 -1
  64. package/dist/renderers/terminal.d.ts +0 -14
  65. package/dist/renderers/terminal.d.ts.map +0 -1
  66. package/dist/renderers/terminal.js +0 -173
  67. package/dist/renderers/terminal.js.map +0 -1
  68. package/dist/renderers/types.d.ts +0 -12
  69. package/dist/renderers/types.d.ts.map +0 -1
  70. package/dist/renderers/types.js +0 -2
  71. package/dist/renderers/types.js.map +0 -1
  72. package/dist/sbom.d.ts +0 -42
  73. package/dist/sbom.d.ts.map +0 -1
  74. package/dist/sbom.js +0 -203
  75. package/dist/sbom.js.map +0 -1
  76. package/dist/status.d.ts +0 -27
  77. package/dist/status.d.ts.map +0 -1
  78. package/dist/status.js +0 -137
  79. package/dist/status.js.map +0 -1
  80. package/dist/summary.d.ts +0 -6
  81. package/dist/summary.d.ts.map +0 -1
  82. package/dist/summary.js +0 -47
  83. package/dist/summary.js.map +0 -1
  84. package/dist/types.d.ts +0 -208
  85. package/dist/types.d.ts.map +0 -1
  86. package/dist/types.js +0 -2
  87. package/dist/types.js.map +0 -1
  88. package/dist/validate.d.ts +0 -20
  89. package/dist/validate.d.ts.map +0 -1
  90. package/dist/validate.js +0 -108
  91. package/dist/validate.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,17 +1,623 @@
1
- export type { ChangeReason, RequirementState, FieldChange, RequirementDiff, ComponentDiff, ComparisonSummary, BaselineDiff, Source, Annotation, MatchingConfig, HdfComparison, } from './types.js';
2
- export type { DiffStatus, DiffSummary, HdfDiff, } from './types.js';
3
- export { diffHdf, diffBaselines, diffSystems } from './diff.js';
4
- export type { DiffOptions } from './diff.js';
5
- export { computeEffectiveStatus, classifyChangeReasons, classifyDiffStatus, } from './status.js';
6
- export { computeSummary } from './summary.js';
7
- export { isV1Format, normalizeToV2 } from './normalize.js';
8
- export { matchRequirements, createExactIdStrategy, createMappedIdStrategy, createCciMatchStrategy, createFuzzyTitleStrategy, tokenize, jaccardSimilarity, } from './matching/index.js';
9
- export type { MatchResult, MatchPair, MatchStrategy, MatchOptions, } from './matching/index.js';
10
- export { validateComparison } from './validate.js';
11
- export type { ValidationResult } from './validate.js';
12
- export { EXIT_IDENTICAL, EXIT_DIFFERENCES, EXIT_ERROR, EXIT_DETAILED_IDENTICAL, EXIT_DETAILED_ERROR, EXIT_DETAILED_FIXES_ONLY, EXIT_DETAILED_REGRESSIONS_ONLY, EXIT_DETAILED_MIXED, EXIT_DETAILED_BASELINE_CHANGED, EXIT_DETAILED_DRIFT_ONLY, computeExitCode, computeDetailedExitCode, } from './exit-codes.js';
13
- export { render, renderJson, renderMarkdown, renderTerminal, renderCsv } from './renderers/index.js';
14
- export type { DetailLevel, RenderOptions } from './renderers/types.js';
15
- export { diffSboms } from './sbom.js';
16
- export type { PackageDiff, SbomDiffResult } from './sbom.js';
1
+ //#region src/sbom.d.ts
2
+ /**
3
+ * SBOM comparison for the HDF diff engine.
4
+ *
5
+ * Compares two SBOM documents (CycloneDX or SPDX JSON) and produces
6
+ * package-level diffs: added, removed, updated, unchanged packages.
7
+ *
8
+ * Format auto-detection:
9
+ * - CycloneDX: has `bomFormat: "CycloneDX"`, packages in `components[]`
10
+ * - SPDX: has `spdxVersion`, packages in `packages[]`
11
+ */
12
+ /**
13
+ * The comparison result for a single package between two SBOMs.
14
+ */
15
+ interface PackageDiff {
16
+ purl: string;
17
+ name: string;
18
+ state: 'added' | 'removed' | 'updated' | 'unchanged';
19
+ oldVersion?: string;
20
+ newVersion?: string;
21
+ licenses?: string[];
22
+ }
23
+ /**
24
+ * The complete result of comparing two SBOM documents.
25
+ */
26
+ interface SbomDiffResult {
27
+ packageDiffs: PackageDiff[];
28
+ added: number;
29
+ removed: number;
30
+ updated: number;
31
+ unchanged: number;
32
+ }
33
+ /**
34
+ * Compare two SBOM documents (CycloneDX or SPDX JSON strings) and return
35
+ * package-level diffs.
36
+ *
37
+ * @param oldJson - JSON string of the old SBOM document
38
+ * @param newJson - JSON string of the new SBOM document
39
+ * @returns Structured diff result with per-package state and aggregate counts
40
+ * @throws Error if either input is not valid JSON or not a recognized SBOM format
41
+ */
42
+ declare function diffSboms(oldJson: string, newJson: string): SbomDiffResult;
43
+ //#endregion
44
+ //#region src/types.d.ts
45
+ /**
46
+ * Why a requirement's effective status changed between two evaluations.
47
+ *
48
+ * Aligned with the hdf-comparison schema's Change_Reason enum:
49
+ * - resultChanged: The underlying test results differ (e.g., a fix was deployed)
50
+ * - overrideAdded: A new statusOverride (waiver/attestation) was added
51
+ * - overrideExpired: A statusOverride present in the old scan has expired by the new scan's timestamp
52
+ * - overrideRemoved: A statusOverride was removed between scans
53
+ * - overrideModified: An existing statusOverride was modified (reserved for future use)
54
+ * - impactChanged: The impact score changed (e.g., from 0.7 to 0.0 means N/A)
55
+ * - baselineUpgraded: The baseline version changed (reserved for future use)
56
+ * - controlMapped: A control was mapped to a different framework (reserved for future use)
57
+ * - scannerChanged: A different scanner was used (reserved for future use)
58
+ * - targetChanged: The scan target changed (reserved for future use)
59
+ * - configChanged: The scan configuration changed (reserved for future use)
60
+ * - metadataChanged: Non-impact baseline metadata changed (tags, descriptions, title, etc.)
61
+ */
62
+ type ChangeReason = 'resultChanged' | 'overrideAdded' | 'overrideExpired' | 'overrideRemoved' | 'overrideModified' | 'impactChanged' | 'baselineUpgraded' | 'controlMapped' | 'scannerChanged' | 'targetChanged' | 'configChanged' | 'metadataChanged' | 'dispositionChanged' | 'effectiveImpactChanged';
63
+ /**
64
+ * Classification of how a requirement's state changed between evaluations.
65
+ * Uses SARIF-inspired vocabulary.
66
+ *
67
+ * - new: Requirement exists only in the new evaluation (was "added")
68
+ * - absent: Requirement exists only in the old evaluation (was "removed")
69
+ * - unchanged: Same effective status in both evaluations
70
+ * - updated: Status changed but doesn't fit fixed/regressed (was "changed")
71
+ * - fixed: Was failing/error, now passing
72
+ * - regressed: Was passing, now failing/error
73
+ * - moved: Requirement ID changed but content is the same (future use)
74
+ * - split: One requirement became multiple (future use)
75
+ * - merged: Multiple requirements became one (future use)
76
+ */
77
+ type RequirementState = 'new' | 'absent' | 'unchanged' | 'updated' | 'fixed' | 'regressed' | 'moved' | 'split' | 'merged';
78
+ /**
79
+ * A field-level difference on a requirement, following JSON Patch-like conventions.
80
+ */
81
+ interface FieldChange {
82
+ /** The operation type: add, remove, or replace */
83
+ op: 'add' | 'remove' | 'replace';
84
+ /** Dot-notation path to the changed field (e.g., 'impact', 'tags.cci') */
85
+ path: string;
86
+ /** Value in the old evaluation (undefined for 'add' operations) */
87
+ oldValue?: unknown;
88
+ /** Value in the new evaluation (undefined for 'remove' operations) */
89
+ newValue?: unknown;
90
+ }
91
+ /**
92
+ * The diff for a single requirement across two evaluations.
93
+ */
94
+ interface RequirementDiff {
95
+ /** The requirement ID (e.g., 'SV-238196') */
96
+ id: string;
97
+ /** Classification of the change */
98
+ state: RequirementState;
99
+ /** Why the status changed — empty array if unchanged */
100
+ changeReasons: ChangeReason[];
101
+ /** Full snapshot of the requirement from the old evaluation (null when state = 'new') */
102
+ before: Record<string, unknown> | null;
103
+ /** Full snapshot of the requirement from the new evaluation (null when state = 'absent') */
104
+ after: Record<string, unknown> | null;
105
+ /** The requirement title (from whichever evaluation has it) */
106
+ title?: string;
107
+ /** Effective status in the old evaluation (undefined if new) */
108
+ oldEffectiveStatus?: string;
109
+ /** Effective status in the new evaluation (undefined if absent) */
110
+ newEffectiveStatus?: string;
111
+ /** Impact in the old evaluation */
112
+ oldImpact?: number;
113
+ /** Impact in the new evaluation */
114
+ newImpact?: number;
115
+ /** Field-level diffs for non-status fields */
116
+ fieldChanges: FieldChange[];
117
+ /** The matching strategy that paired this requirement (e.g., 'exactId') */
118
+ matchStrategy?: string;
119
+ /** Confidence of the match (0.0-1.0) */
120
+ matchConfidence?: number;
121
+ /** Index into the sources array for fleet mode */
122
+ sourceIndex?: number;
123
+ }
124
+ /**
125
+ * Summary counts for the comparison.
126
+ */
127
+ interface ComparisonSummary {
128
+ /** Requirements that went from failing/error to passing */
129
+ fixed: number;
130
+ /** Requirements that went from passing to failing/error */
131
+ regressed: number;
132
+ /** Requirements present only in the new evaluation (was "added") */
133
+ new: number;
134
+ /** Requirements present only in the old evaluation (was "removed") */
135
+ absent: number;
136
+ /** Requirements with the same effective status */
137
+ unchanged: number;
138
+ /** Requirements whose status changed in a way other than fixed/regressed (was "changed") */
139
+ updated: number;
140
+ /** Total unique requirements across both evaluations */
141
+ total: number;
142
+ /** Number of requirements matched between old and new */
143
+ matchedCount: number;
144
+ /** Number of requirements only in old (unmatched) */
145
+ unmatchedOldCount: number;
146
+ /** Number of requirements only in new (unmatched) */
147
+ unmatchedNewCount: number;
148
+ }
149
+ /**
150
+ * The diff for a single component across two system documents.
151
+ * Used in systemDrift comparison mode.
152
+ */
153
+ interface ComponentDiff {
154
+ /** Component name */
155
+ name: string;
156
+ /** Classification of the change: new, absent, unchanged, or updated */
157
+ state: 'new' | 'absent' | 'unchanged' | 'updated';
158
+ /** Component snapshot from the old system (null when state = 'new') */
159
+ before: Record<string, unknown> | null;
160
+ /** Component snapshot from the new system (null when state = 'absent') */
161
+ after: Record<string, unknown> | null;
162
+ /** Field-level diffs between old and new component */
163
+ fieldChanges: FieldChange[];
164
+ }
165
+ /**
166
+ * The diff for a single baseline across two evaluations.
167
+ */
168
+ interface BaselineDiff {
169
+ /** Baseline name */
170
+ name: string;
171
+ /** Version in the old evaluation */
172
+ oldVersion?: string;
173
+ /** Version in the new evaluation */
174
+ newVersion?: string;
175
+ /** Whether this baseline was new, absent, updated, or unchanged */
176
+ state: 'new' | 'absent' | 'updated' | 'unchanged';
177
+ }
178
+ /**
179
+ * Metadata about a source document used in the comparison.
180
+ */
181
+ interface Source {
182
+ /** Role of the source in the comparison */
183
+ role: 'old' | 'new' | 'golden' | 'reference' | 'system';
184
+ /** Human-readable label */
185
+ label: string;
186
+ /** URI to the source document */
187
+ uri?: string;
188
+ /** Original format of the source (e.g., 'hdf-results-v2', 'inspec-exec-json-v1') */
189
+ originalFormat?: string;
190
+ /** Assessment timestamp from the source document */
191
+ assessmentTimestamp?: string;
192
+ }
193
+ /**
194
+ * An annotation attached to a requirement diff.
195
+ */
196
+ interface Annotation {
197
+ /** Human-readable label */
198
+ label: string;
199
+ /** Description of the annotation */
200
+ text: string;
201
+ /** When the annotation was created */
202
+ timestamp?: string;
203
+ }
204
+ /**
205
+ * The top-level comparison result comparing two or more HDF evaluations.
206
+ */
207
+ interface HdfComparison {
208
+ /** Schema version for the comparison format */
209
+ formatVersion: '1.0.0';
210
+ /** The mode of comparison */
211
+ comparisonMode: 'temporal' | 'baseline' | 'fleet' | 'multiSource' | 'baselineEvolution' | 'systemDrift';
212
+ /** When the comparison was generated */
213
+ timestamp?: string;
214
+ /** Source documents used in the comparison */
215
+ sources: Source[];
216
+ /** Matching configuration used */
217
+ matching?: MatchingConfig;
218
+ /** Aggregate counts */
219
+ summary: ComparisonSummary;
220
+ /** Per-baseline diffs */
221
+ baselineDiffs: BaselineDiff[];
222
+ /** Per-requirement diffs, sorted by id */
223
+ requirementDiffs: RequirementDiff[];
224
+ /** Per-component diffs (systemDrift mode only) */
225
+ componentDiffs?: ComponentDiff[];
226
+ /** Per-package diffs from embedded SBOM comparison (systemDrift mode only) */
227
+ packageDiffs?: PackageDiff[];
228
+ /** URI identifying the system being compared (systemDrift mode only) */
229
+ systemRef?: string;
230
+ /** Requirements that drifted from a golden baseline (future use) */
231
+ drift?: RequirementDiff[];
232
+ /** Annotations keyed by requirement ID */
233
+ annotations?: Record<string, Annotation>;
234
+ /** Extension data for custom integrations */
235
+ extensions?: Record<string, unknown>;
236
+ }
237
+ /**
238
+ * Configuration for how requirements are matched between evaluations.
239
+ */
240
+ interface MatchingConfig {
241
+ /** The primary strategy used for matching requirements across sources */
242
+ primaryStrategy: string;
243
+ /** Minimum confidence threshold for a match */
244
+ confidenceThreshold?: number;
245
+ }
246
+ /** @deprecated Use RequirementState instead */
247
+ type DiffStatus = RequirementState;
248
+ /** @deprecated Use ComparisonSummary instead */
249
+ type DiffSummary = ComparisonSummary;
250
+ /** @deprecated Use HdfComparison instead */
251
+ type HdfDiff = HdfComparison;
252
+ //#endregion
253
+ //#region src/diff.d.ts
254
+ /**
255
+ * Options for configuring the diff behavior.
256
+ */
257
+ interface DiffOptions {
258
+ /** Fields to track for field-level diffs (default: ['impact', 'severity', 'tags']) */
259
+ trackedFields?: string[];
260
+ /** Comparison mode (default: 'temporal') */
261
+ comparisonMode?: 'temporal' | 'baseline' | 'fleet' | 'multiSource' | 'baselineEvolution' | 'systemDrift';
262
+ /** Primary matching strategy name (default: 'exactId') */
263
+ matchStrategy?: string;
264
+ /** Fallback strategy names, applied in order to remaining unmatched requirements */
265
+ fallbackStrategies?: string[];
266
+ /** Mapping table for the 'mappedId' strategy (old ID -> new ID) */
267
+ mappingTable?: Record<string, string>;
268
+ /** Minimum confidence threshold for fuzzy matching (default: 0.6) */
269
+ minConfidence?: number;
270
+ /** Validate output against hdf-comparison schema. Default: false (performance). */
271
+ validateOutput?: boolean;
272
+ }
273
+ /**
274
+ * Compare two HDF results documents and produce a structured comparison.
275
+ *
276
+ * Requirements are matched using a configurable matching strategy (default: exact ID).
277
+ * Baselines are matched by `name`.
278
+ *
279
+ * For fleet mode, `newResults` can be an array of documents, each compared
280
+ * pairwise against `oldResults` (the reference).
281
+ */
282
+ declare function diffHdf(oldResults: Record<string, unknown>, newResults: Record<string, unknown> | Record<string, unknown>[], options?: DiffOptions): HdfComparison;
283
+ /**
284
+ * Compare two HDF baseline documents and produce a structured comparison
285
+ * showing requirement changes between baseline versions.
286
+ *
287
+ * Unlike diffHdf (which compares results/evaluations), this compares baseline
288
+ * definitions — requirements without results. There is no status-based classification
289
+ * (fixed/regressed); only metadata changes (title, impact, descriptions, tags) are tracked.
290
+ */
291
+ declare function diffBaselines(oldBaseline: Record<string, unknown>, newBaseline: Record<string, unknown>, options?: DiffOptions): HdfComparison;
292
+ /**
293
+ * Compare two HDF system documents and produce a structured comparison
294
+ * showing component-level changes between system versions.
295
+ *
296
+ * Components are matched by componentId (UUID) when available, falling back
297
+ * to exact name matching. Top-level system fields, data flows, and embedded
298
+ * SBOMs are also compared.
299
+ */
300
+ declare function diffSystems(oldSystem: Record<string, unknown>, newSystem: Record<string, unknown>, options?: DiffOptions): HdfComparison;
301
+ //#endregion
302
+ //#region src/status.d.ts
303
+ /**
304
+ * Determine the effective status of a requirement from its results and overrides.
305
+ *
306
+ * Priority:
307
+ * 1. impact === 0 → notApplicable (regardless of results)
308
+ * 2. effectiveStatus field set (and no statusOverrides) → use it
309
+ * 3. Non-expired statusOverrides → use first non-expired
310
+ * 4. Aggregate results using worst-wins
311
+ * 5. Empty results → notReviewed
312
+ */
313
+ declare function computeEffectiveStatus(requirement: Record<string, unknown>, referenceTimestamp?: string): string;
314
+ /**
315
+ * Classify why the status changed between two requirements.
316
+ * Returns an array of change reasons (a status change can have multiple causes).
317
+ */
318
+ declare function classifyChangeReasons(oldReq: Record<string, unknown>, newReq: Record<string, unknown>, oldTimestamp?: string, newTimestamp?: string): ChangeReason[];
319
+ /**
320
+ * Classify the overall diff status based on old and new effective statuses.
321
+ *
322
+ * - If old is failing and new is passing → 'fixed'
323
+ * - If old is passing and new is failing → 'regressed'
324
+ * - If statuses are equal → 'unchanged'
325
+ * - Otherwise → 'updated'
326
+ */
327
+ declare function classifyDiffStatus(oldEffectiveStatus: string, newEffectiveStatus: string): RequirementState;
328
+ //#endregion
329
+ //#region src/summary.d.ts
330
+ /**
331
+ * Compute summary counts from an array of RequirementDiff entries.
332
+ */
333
+ declare function computeSummary(requirements: RequirementDiff[]): ComparisonSummary;
334
+ //#endregion
335
+ //#region src/normalize.d.ts
336
+ /**
337
+ * Normalize InSpec exec-json v1 format to HDF v2 structure for diffing.
338
+ *
339
+ * V1 uses: profiles[].controls[].results[].code_desc, source_location, start_time
340
+ * V2 uses: baselines[].requirements[].results[].codeDesc, sourceLocation, startTime
341
+ *
342
+ * This module detects v1 documents and converts them in-memory to v2 shape
343
+ * so the diff engine only needs to handle one format.
344
+ */
345
+ /**
346
+ * Detect whether a document is v1 (InSpec exec-json) format.
347
+ * V1 has `profiles` at the top level; v2 has `baselines`.
348
+ */
349
+ declare function isV1Format(doc: Record<string, unknown>): boolean;
350
+ /**
351
+ * Normalize a document to v2-like structure. If already v2, returns as-is.
352
+ * If v1, converts profiles→baselines, controls→requirements, and snake_case→camelCase.
353
+ */
354
+ declare function normalizeToV2(doc: Record<string, unknown>): Record<string, unknown>;
355
+ //#endregion
356
+ //#region src/matching/types.d.ts
357
+ /**
358
+ * Result of matching requirements between two evaluations.
359
+ */
360
+ interface MatchResult {
361
+ /** Paired requirements with their match metadata */
362
+ matched: MatchPair[];
363
+ /** Requirements only in the old evaluation (unmatched) */
364
+ unmatchedOld: Record<string, unknown>[];
365
+ /** Requirements only in the new evaluation (unmatched) */
366
+ unmatchedNew: Record<string, unknown>[];
367
+ }
368
+ /**
369
+ * A single matched pair of requirements.
370
+ */
371
+ interface MatchPair {
372
+ /** The requirement from the old evaluation */
373
+ oldReq: Record<string, unknown>;
374
+ /** The requirement from the new evaluation */
375
+ newReq: Record<string, unknown>;
376
+ /** Name of the strategy that produced this match */
377
+ strategy: string;
378
+ /** Confidence score for the match (0.0 - 1.0) */
379
+ confidence: number;
380
+ }
381
+ /**
382
+ * A pluggable strategy for matching requirements between evaluations.
383
+ */
384
+ interface MatchStrategy {
385
+ /** Unique name for this strategy */
386
+ name: string;
387
+ /** Match old requirements against new requirements */
388
+ match(oldReqs: Record<string, unknown>[], newReqs: Record<string, unknown>[]): MatchResult;
389
+ }
390
+ //#endregion
391
+ //#region src/matching/exact-id.d.ts
392
+ /**
393
+ * Create an exact ID matching strategy.
394
+ *
395
+ * Matches requirements by their `id` field with exact string equality.
396
+ * Confidence is always 1.0 for matches.
397
+ */
398
+ declare function createExactIdStrategy(): MatchStrategy;
399
+ //#endregion
400
+ //#region src/matching/mapped-id.d.ts
401
+ /**
402
+ * Create a mapped ID matching strategy.
403
+ *
404
+ * Translates old requirement IDs using a mapping table before matching.
405
+ * Only matches requirements whose old ID appears in the mapping table and
406
+ * whose mapped new ID exists in the new requirements.
407
+ *
408
+ * Confidence is 0.95 for mapped matches (slightly less than exact ID
409
+ * because the match depends on the accuracy of the mapping table).
410
+ */
411
+ declare function createMappedIdStrategy(mapping: Record<string, string>): MatchStrategy;
412
+ //#endregion
413
+ //#region src/matching/cci-match.d.ts
414
+ /**
415
+ * Create a CCI-based matching strategy.
416
+ *
417
+ * Matches requirements that share the same CCI identifier in `tags.cci`.
418
+ * Only produces a match when exactly one old requirement and exactly one
419
+ * new requirement share a given CCI (unambiguous). Ambiguous CCIs (shared
420
+ * by multiple old or multiple new requirements) are skipped, and those
421
+ * requirements are left unmatched.
422
+ *
423
+ * Confidence is 0.8 for unambiguous matches.
424
+ */
425
+ declare function createCciMatchStrategy(): MatchStrategy;
426
+ //#endregion
427
+ //#region src/matching/fuzzy-match.d.ts
428
+ /**
429
+ * Tokenize a title string into a set of meaningful tokens.
430
+ *
431
+ * - Lowercases the string
432
+ * - Splits on whitespace and punctuation
433
+ * - Filters out common stop words
434
+ * - Returns unique tokens as a Set
435
+ */
436
+ declare function tokenize(text: string): Set<string>;
437
+ /**
438
+ * Compute Jaccard similarity between two sets.
439
+ * Returns |intersection| / |union|, or 0 if both sets are empty.
440
+ */
441
+ declare function jaccardSimilarity(a: Set<string>, b: Set<string>): number;
442
+ /**
443
+ * Create a fuzzy title matching strategy.
444
+ *
445
+ * Matches requirements by token-based Jaccard similarity on the `title` field.
446
+ * Uses greedy best-match: for each unmatched old requirement, finds the
447
+ * best-matching unmatched new requirement above the confidence threshold.
448
+ *
449
+ * @param minConfidence Minimum Jaccard similarity to accept a match (default: 0.6)
450
+ */
451
+ declare function createFuzzyTitleStrategy(minConfidence?: number): MatchStrategy;
452
+ //#endregion
453
+ //#region src/matching/index.d.ts
454
+ /**
455
+ * Options for configuring requirement matching.
456
+ */
457
+ interface MatchOptions {
458
+ /** Primary matching strategy name (default: 'exactId') */
459
+ strategy?: string;
460
+ /** Fallback strategy names, applied in order to remaining unmatched requirements */
461
+ fallbackStrategies?: string[];
462
+ /** Mapping table for the 'mappedId' strategy (old ID -> new ID) */
463
+ mappingTable?: Record<string, string>;
464
+ /** Minimum confidence threshold for fuzzy matching (default: 0.6) */
465
+ minConfidence?: number;
466
+ }
467
+ /**
468
+ * Match requirements between two evaluations using a primary strategy
469
+ * and optional fallback strategies.
470
+ *
471
+ * The registry applies strategies in order:
472
+ * 1. Primary strategy matches what it can
473
+ * 2. Unmatched requirements pass to the next fallback strategy
474
+ * 3. Process continues until all strategies are exhausted or all
475
+ * requirements are matched
476
+ *
477
+ * @param oldReqs Requirements from the old evaluation
478
+ * @param newReqs Requirements from the new evaluation
479
+ * @param options Matching configuration
480
+ * @returns Combined match result from all strategies
481
+ */
482
+ declare function matchRequirements(oldReqs: Record<string, unknown>[], newReqs: Record<string, unknown>[], options?: MatchOptions): MatchResult;
483
+ //#endregion
484
+ //#region src/validate.d.ts
485
+ /**
486
+ * Result of validating a document against the hdf-comparison schema.
487
+ */
488
+ interface ValidationResult {
489
+ /** Whether the document conforms to the schema */
490
+ valid: boolean;
491
+ /** Human-readable error messages (only present when valid is false) */
492
+ errors?: string[];
493
+ }
494
+ /**
495
+ * Validate a document against the hdf-comparison schema.
496
+ *
497
+ * Delegates to @mitre/hdf-validators which loads schemas from embedded
498
+ * bundled JSON (no filesystem access, no hardcoded version URLs).
499
+ *
500
+ * @param doc - The document to validate (typically the output of `diffHdf()`)
501
+ * @returns Validation result with `valid` boolean and optional `errors` array
502
+ */
503
+ declare function validateComparison(doc: unknown): ValidationResult;
504
+ //#endregion
505
+ //#region src/exit-codes.d.ts
506
+ /** GNU diff compatible exit codes (--exit-code mode) */
507
+ declare const EXIT_IDENTICAL = 0;
508
+ declare const EXIT_DIFFERENCES = 1;
509
+ declare const EXIT_ERROR = 2;
510
+ /** Detailed exit codes (--detailed-exitcode mode) */
511
+ declare const EXIT_DETAILED_IDENTICAL = 0;
512
+ declare const EXIT_DETAILED_ERROR = 1;
513
+ declare const EXIT_DETAILED_FIXES_ONLY = 10;
514
+ declare const EXIT_DETAILED_REGRESSIONS_ONLY = 11;
515
+ declare const EXIT_DETAILED_MIXED = 12;
516
+ declare const EXIT_DETAILED_BASELINE_CHANGED = 13;
517
+ declare const EXIT_DETAILED_DRIFT_ONLY = 14;
518
+ /**
519
+ * Compute the GNU diff compatible exit code from a comparison summary.
520
+ *
521
+ * Returns:
522
+ * 0 = identical (no differences found)
523
+ * 1 = differences found (any kind)
524
+ *
525
+ * Note: error (exit code 2) is not computed from the summary — callers
526
+ * should return EXIT_ERROR directly when I/O or parse errors occur.
527
+ */
528
+ declare function computeExitCode(summary: ComparisonSummary): number;
529
+ /**
530
+ * Compute the detailed exit code from a comparison summary.
531
+ *
532
+ * Returns:
533
+ * 0 = identical (no differences found)
534
+ * 10 = differences found, fixes only (security posture improved)
535
+ * 11 = differences found, regressions only (security posture degraded)
536
+ * 12 = differences found, mixed fixes and regressions
537
+ * 13 = differences found, only new/absent controls (baseline changed)
538
+ * 14 = differences found, only metadata drift (no status changes)
539
+ *
540
+ * Note: error (exit code 1) is not computed from the summary — callers
541
+ * should return EXIT_DETAILED_ERROR directly when I/O or parse errors occur.
542
+ *
543
+ * Priority order: mixed(12) > regressions(11) > fixes(10) > baseline(13) > drift(14)
544
+ */
545
+ declare function computeDetailedExitCode(summary: ComparisonSummary): number;
546
+ //#endregion
547
+ //#region src/renderers/types.d.ts
548
+ type DetailLevel = 'summary' | 'control' | 'full';
549
+ interface RenderOptions {
550
+ /** What detail to show. Default: 'control' */
551
+ detail?: DetailLevel;
552
+ /** Only show requirements matching these states */
553
+ filterStates?: string[];
554
+ /** Only show requirements matching this severity */
555
+ filterSeverity?: string;
556
+ /** Use color codes (for terminal). Default: true */
557
+ color?: boolean;
558
+ }
559
+ //#endregion
560
+ //#region src/renderers/json.d.ts
561
+ /**
562
+ * Render an HdfComparison as a JSON string.
563
+ *
564
+ * - `detail: 'summary'` -- only `{ formatVersion, comparisonMode, summary }`
565
+ * - `detail: 'control'` -- full document but `before`/`after` stripped from requirementDiffs
566
+ * - `detail: 'full'` -- `JSON.stringify(comparison, null, 2)` (the complete document)
567
+ *
568
+ * Default detail level: `'control'`.
569
+ */
570
+ declare function renderJson(comparison: HdfComparison, options?: RenderOptions): string;
571
+ //#endregion
572
+ //#region src/renderers/markdown.d.ts
573
+ /**
574
+ * Render an HdfComparison as a Markdown string.
575
+ *
576
+ * - `detail: 'summary'` -- summary table only
577
+ * - `detail: 'control'` -- summary + per-requirement tables by state
578
+ * - `detail: 'full'` -- summary + per-requirement tables with changeReasons and fieldChanges
579
+ *
580
+ * Default detail level: `'control'`.
581
+ */
582
+ declare function renderMarkdown(comparison: HdfComparison, options?: RenderOptions): string;
583
+ //#endregion
584
+ //#region src/renderers/terminal.d.ts
585
+ /**
586
+ * Render an HdfComparison for terminal display with optional ANSI colors.
587
+ *
588
+ * - `detail: 'summary'` -- just the summary line
589
+ * - `detail: 'control'` -- requirement list + summary (excludes unchanged)
590
+ * - `detail: 'full'` -- all requirements including unchanged, with changeReasons and fieldChanges
591
+ *
592
+ * When `color: false`, no ANSI escape codes are emitted.
593
+ * Default detail level: `'control'`. Default color: `true`.
594
+ */
595
+ declare function renderTerminal(comparison: HdfComparison, options?: RenderOptions): string;
596
+ //#endregion
597
+ //#region src/renderers/csv.d.ts
598
+ /**
599
+ * Render an HdfComparison as a CSV string.
600
+ *
601
+ * One row per requirement. Columns:
602
+ * - ID, Title, State, Old Status, New Status, Impact (Old), Impact (New), Change Reasons
603
+ *
604
+ * When `detail: 'full'`, an additional Field Changes column is included.
605
+ *
606
+ * Header row is always included. Standard CSV escaping (RFC 4180).
607
+ * Default detail level: `'control'`.
608
+ */
609
+ declare function renderCsv(comparison: HdfComparison, options?: RenderOptions): string;
610
+ //#endregion
611
+ //#region src/renderers/index.d.ts
612
+ /**
613
+ * Convenience function to render a comparison in any supported format.
614
+ *
615
+ * @param comparison - The HdfComparison document to render
616
+ * @param format - Output format: 'json', 'markdown', 'terminal', or 'csv'
617
+ * @param options - Rendering options (detail level, filters, color)
618
+ * @returns The rendered string
619
+ */
620
+ declare function render(comparison: HdfComparison, format: 'json' | 'markdown' | 'terminal' | 'csv', options?: RenderOptions): string;
621
+ //#endregion
622
+ export { type Annotation, type BaselineDiff, type ChangeReason, type ComparisonSummary, type ComponentDiff, type DetailLevel, type DiffOptions, type DiffStatus, type DiffSummary, EXIT_DETAILED_BASELINE_CHANGED, EXIT_DETAILED_DRIFT_ONLY, EXIT_DETAILED_ERROR, EXIT_DETAILED_FIXES_ONLY, EXIT_DETAILED_IDENTICAL, EXIT_DETAILED_MIXED, EXIT_DETAILED_REGRESSIONS_ONLY, EXIT_DIFFERENCES, EXIT_ERROR, EXIT_IDENTICAL, type FieldChange, type HdfComparison, type HdfDiff, type MatchOptions, type MatchPair, type MatchResult, type MatchStrategy, type MatchingConfig, type PackageDiff, type RenderOptions, type RequirementDiff, type RequirementState, type SbomDiffResult, type Source, type ValidationResult, classifyChangeReasons, classifyDiffStatus, computeDetailedExitCode, computeEffectiveStatus, computeExitCode, computeSummary, createCciMatchStrategy, createExactIdStrategy, createFuzzyTitleStrategy, createMappedIdStrategy, diffBaselines, diffHdf, diffSboms, diffSystems, isV1Format, jaccardSimilarity, matchRequirements, normalizeToV2, render, renderCsv, renderJson, renderMarkdown, renderTerminal, tokenize, validateComparison };
17
623
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,MAAM,EACN,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,UAAU,EACV,WAAW,EACX,OAAO,GACR,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG3D,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,QAAQ,EACR,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,YAAY,GACb,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,8BAA8B,EAC9B,mBAAmB,EACnB,8BAA8B,EAC9B,wBAAwB,EACxB,eAAe,EACf,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACrG,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGvE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/sbom.ts","../src/types.ts","../src/diff.ts","../src/status.ts","../src/summary.ts","../src/normalize.ts","../src/matching/types.ts","../src/matching/exact-id.ts","../src/matching/mapped-id.ts","../src/matching/cci-match.ts","../src/matching/fuzzy-match.ts","../src/matching/index.ts","../src/validate.ts","../src/exit-codes.ts","../src/renderers/types.ts","../src/renderers/json.ts","../src/renderers/markdown.ts","../src/renderers/terminal.ts","../src/renderers/csv.ts","../src/renderers/index.ts"],"mappings":"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"}