verification-layer 0.27.13 → 0.28.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.
Files changed (68) hide show
  1. package/COMPLIANCE_DELIVERY.md +161 -0
  2. package/dist/acknowledgments.d.ts +1 -1
  3. package/dist/acknowledgments.d.ts.map +1 -1
  4. package/dist/acknowledgments.js +29 -11
  5. package/dist/acknowledgments.js.map +1 -1
  6. package/dist/baseline.d.ts +50 -12
  7. package/dist/baseline.d.ts.map +1 -1
  8. package/dist/baseline.js +165 -23
  9. package/dist/baseline.js.map +1 -1
  10. package/dist/delivery/diff.d.ts +10 -0
  11. package/dist/delivery/diff.d.ts.map +1 -0
  12. package/dist/delivery/diff.js +41 -0
  13. package/dist/delivery/diff.js.map +1 -0
  14. package/dist/delivery/evidence.d.ts +11 -0
  15. package/dist/delivery/evidence.d.ts.map +1 -0
  16. package/dist/delivery/evidence.js +87 -0
  17. package/dist/delivery/evidence.js.map +1 -0
  18. package/dist/delivery/git.d.ts +8 -0
  19. package/dist/delivery/git.d.ts.map +1 -0
  20. package/dist/delivery/git.js +98 -0
  21. package/dist/delivery/git.js.map +1 -0
  22. package/dist/delivery/governance.d.ts +23 -0
  23. package/dist/delivery/governance.d.ts.map +1 -0
  24. package/dist/delivery/governance.js +118 -0
  25. package/dist/delivery/governance.js.map +1 -0
  26. package/dist/delivery/graph.d.ts +11 -0
  27. package/dist/delivery/graph.d.ts.map +1 -0
  28. package/dist/delivery/graph.js +130 -0
  29. package/dist/delivery/graph.js.map +1 -0
  30. package/dist/delivery/index.d.ts +14 -0
  31. package/dist/delivery/index.d.ts.map +1 -0
  32. package/dist/delivery/index.js +10 -0
  33. package/dist/delivery/index.js.map +1 -0
  34. package/dist/delivery/policy.d.ts +13 -0
  35. package/dist/delivery/policy.d.ts.map +1 -0
  36. package/dist/delivery/policy.js +100 -0
  37. package/dist/delivery/policy.js.map +1 -0
  38. package/dist/delivery/remediation.d.ts +9 -0
  39. package/dist/delivery/remediation.d.ts.map +1 -0
  40. package/dist/delivery/remediation.js +60 -0
  41. package/dist/delivery/remediation.js.map +1 -0
  42. package/dist/delivery/runner.d.ts +26 -0
  43. package/dist/delivery/runner.d.ts.map +1 -0
  44. package/dist/delivery/runner.js +79 -0
  45. package/dist/delivery/runner.js.map +1 -0
  46. package/dist/delivery/types.d.ts +156 -0
  47. package/dist/delivery/types.d.ts.map +1 -0
  48. package/dist/delivery/types.js +2 -0
  49. package/dist/delivery/types.js.map +1 -0
  50. package/dist/delivery/upload.d.ts +20 -0
  51. package/dist/delivery/upload.d.ts.map +1 -0
  52. package/dist/delivery/upload.js +72 -0
  53. package/dist/delivery/upload.js.map +1 -0
  54. package/dist/delivery-cli.d.ts +3 -0
  55. package/dist/delivery-cli.d.ts.map +1 -0
  56. package/dist/delivery-cli.js +306 -0
  57. package/dist/delivery-cli.js.map +1 -0
  58. package/dist/delivery-upload-cli.d.ts +3 -0
  59. package/dist/delivery-upload-cli.d.ts.map +1 -0
  60. package/dist/delivery-upload-cli.js +37 -0
  61. package/dist/delivery-upload-cli.js.map +1 -0
  62. package/dist/index.d.ts +2 -1
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +2 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/rule-catalog.json +1 -1
  67. package/package.json +15 -9
  68. package/templates/github-actions/compliance-gate.yml +61 -0
@@ -0,0 +1,41 @@
1
+ import { generateFindingHash, normalizeFindingFile, } from '../baseline.js';
2
+ const VIRTUAL_FILES = new Set(['project-level', 'ASSET-INVENTORY', 'PHI-FLOW-MAP']);
3
+ function isActive(finding) {
4
+ return !finding.suppressed && !finding.acknowledged;
5
+ }
6
+ function isChangedFile(finding, projectRoot, changed) {
7
+ const file = normalizeFindingFile(finding, projectRoot);
8
+ if (VIRTUAL_FILES.has(file))
9
+ return true;
10
+ return changed.has(file);
11
+ }
12
+ /**
13
+ * Build the change-oriented view used by CI policy evaluation. Findings already
14
+ * marked by `scan(..., baselineFile)` are treated as existing debt; active
15
+ * findings outside the baseline are new risk.
16
+ */
17
+ export function buildFindingDelta(findings, projectRoot, changedFiles, baseline) {
18
+ const changed = new Set(changedFiles.map(file => file.replace(/\\/g, '/')));
19
+ const active = findings.filter(isActive);
20
+ const baselineFindings = active.filter(finding => finding.isBaseline === true);
21
+ const newFindings = active.filter(finding => finding.isBaseline !== true);
22
+ const newFindingsInChangedFiles = changed.size === 0
23
+ ? newFindings
24
+ : newFindings.filter(finding => isChangedFile(finding, projectRoot, changed));
25
+ let resolvedFindings = baseline?.findings.filter(() => false) ?? [];
26
+ if (baseline?.version.startsWith('2')) {
27
+ const currentFingerprints = new Set(findings.map(finding => generateFindingHash(finding, projectRoot)));
28
+ resolvedFindings = baseline.findings.filter(entry => {
29
+ const fingerprint = entry.fingerprint ?? entry.hash;
30
+ return !currentFingerprints.has(fingerprint);
31
+ });
32
+ }
33
+ return {
34
+ newFindings,
35
+ newFindingsInChangedFiles,
36
+ baselineFindings,
37
+ resolvedFindings,
38
+ changedFiles: [...changed],
39
+ };
40
+ }
41
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/delivery/diff.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAC;AAEpF,SAAS,QAAQ,CAAC,OAAgB;IAChC,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB,EAAE,WAAmB,EAAE,OAAoB;IAChF,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACxD,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAmB,EACnB,WAAmB,EACnB,YAAsB,EACtB,QAAyB;IAEzB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;IAC1E,MAAM,yBAAyB,GAAG,OAAO,CAAC,IAAI,KAAK,CAAC;QAClD,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAEhF,IAAI,gBAAgB,GAAG,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpE,IAAI,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CACjC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CACnE,CAAC;QACF,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAClD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC;YACpD,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,WAAW;QACX,yBAAyB;QACzB,gBAAgB;QAChB,gBAAgB;QAChB,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { EvidencePackage, GuardResult } from './types.js';
2
+ export declare function hashEvidencePayload(value: unknown): string;
3
+ /**
4
+ * Create a machine-readable evidence package without embedding source context
5
+ * lines. This intentionally minimizes the risk of copying PHI or secrets into
6
+ * compliance artifacts while preserving rule, file, decision, and provenance.
7
+ */
8
+ export declare function buildEvidencePackage(projectPath: string, guard: GuardResult): EvidencePackage;
9
+ export declare function saveEvidencePackage(path: string, evidence: EvidencePackage): Promise<void>;
10
+ export declare function verifyEvidencePackage(evidence: EvidencePackage): boolean;
11
+ //# sourceMappingURL=evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/delivery/evidence.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAmB,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAehF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG1D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,GACjB,eAAe,CAuDjB;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhG;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAGxE"}
@@ -0,0 +1,87 @@
1
+ import { createHash } from 'crypto';
2
+ import { writeFile } from 'fs/promises';
3
+ import { basename, resolve } from 'path';
4
+ import { canonicalRuleId, generateFindingHash, normalizeFindingFile, } from '../baseline.js';
5
+ import { buildComplianceGraph, controlForFinding } from './graph.js';
6
+ function canonicalize(value) {
7
+ if (Array.isArray(value))
8
+ return value.map(canonicalize);
9
+ if (value && typeof value === 'object') {
10
+ const record = value;
11
+ return Object.fromEntries(Object.keys(record)
12
+ .sort()
13
+ .map(key => [key, canonicalize(record[key])]));
14
+ }
15
+ return value;
16
+ }
17
+ export function hashEvidencePayload(value) {
18
+ const serialized = JSON.stringify(canonicalize(value));
19
+ return createHash('sha256').update(serialized).digest('hex');
20
+ }
21
+ /**
22
+ * Create a machine-readable evidence package without embedding source context
23
+ * lines. This intentionally minimizes the risk of copying PHI or secrets into
24
+ * compliance artifacts while preserving rule, file, decision, and provenance.
25
+ */
26
+ export function buildEvidencePackage(projectPath, guard) {
27
+ const root = resolve(projectPath);
28
+ const evidenceFindings = guard.findings.map(finding => ({
29
+ fingerprint: generateFindingHash(finding, root),
30
+ ruleId: canonicalRuleId(finding.id),
31
+ id: finding.id,
32
+ severity: finding.severity,
33
+ category: finding.category,
34
+ title: finding.title,
35
+ file: normalizeFindingFile(finding, root),
36
+ line: finding.line,
37
+ hipaaReference: finding.hipaaReference,
38
+ recommendation: finding.recommendation,
39
+ acknowledged: finding.acknowledged === true,
40
+ acknowledgment: finding.acknowledgment,
41
+ baseline: finding.isBaseline === true,
42
+ suppressed: finding.suppressed === true,
43
+ }));
44
+ const controls = [...new Set(guard.findings.map(controlForFinding))].sort();
45
+ const graph = buildComplianceGraph(guard.findings, root, guard.decision, guard.git);
46
+ const body = {
47
+ schemaVersion: '1.0',
48
+ generatedAt: new Date().toISOString(),
49
+ project: {
50
+ name: basename(root),
51
+ },
52
+ source: {
53
+ repository: guard.git.repository,
54
+ branch: guard.git.branch,
55
+ headSha: guard.git.headSha,
56
+ baseSha: guard.git.baseSha,
57
+ author: guard.git.author,
58
+ commitUrl: guard.git.commitUrl,
59
+ changedFiles: guard.git.changedFiles,
60
+ },
61
+ decision: guard.decision,
62
+ summary: {
63
+ scannedFiles: guard.scannedFiles,
64
+ totalFindings: guard.findings.length,
65
+ newFindings: guard.delta.newFindings.length,
66
+ resolvedFindings: guard.delta.resolvedFindings.length,
67
+ acknowledged: guard.findings.filter(finding => finding.acknowledged === true).length,
68
+ suppressed: guard.findings.filter(finding => finding.suppressed === true).length,
69
+ complianceScore: guard.complianceScore,
70
+ },
71
+ controls,
72
+ findings: evidenceFindings,
73
+ graph,
74
+ };
75
+ return {
76
+ ...body,
77
+ packageHash: hashEvidencePayload(body),
78
+ };
79
+ }
80
+ export async function saveEvidencePackage(path, evidence) {
81
+ await writeFile(path, JSON.stringify(evidence, null, 2), 'utf-8');
82
+ }
83
+ export function verifyEvidencePackage(evidence) {
84
+ const { packageHash, ...body } = evidence;
85
+ return hashEvidencePayload(body) === packageHash;
86
+ }
87
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/delivery/evidence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGrE,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAChB,IAAI,EAAE;aACN,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAChD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,KAAkB;IAElB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClC,MAAM,gBAAgB,GAAsB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzE,WAAW,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC;QAC/C,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC;QACzC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,YAAY,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI;QAC3C,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,QAAQ,EAAE,OAAO,CAAC,UAAU,KAAK,IAAI;QACrC,UAAU,EAAE,OAAO,CAAC,UAAU,KAAK,IAAI;KACxC,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5E,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG;QACX,aAAa,EAAE,KAAc;QAC7B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;SACrB;QACD,MAAM,EAAE;YACN,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU;YAChC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM;YACxB,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO;YAC1B,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO;YAC1B,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM;YACxB,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS;YAC9B,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY;SACrC;QACD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE;YACP,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;YACpC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM;YAC3C,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM;YACrD,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,MAAM;YACpF,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,MAAM;YAChF,eAAe,EAAE,KAAK,CAAC,eAAe;SACvC;QACD,QAAQ;QACR,QAAQ,EAAE,gBAAgB;QAC1B,KAAK;KACN,CAAC;IAEF,OAAO;QACL,GAAG,IAAI;QACP,WAAW,EAAE,mBAAmB,CAAC,IAAI,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,QAAyB;IAC/E,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAyB;IAC7D,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IAC1C,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC;AACnD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { GitContext } from './types.js';
2
+ /**
3
+ * Resolve the source-control context used by a deployment decision. Git is a
4
+ * best-effort enhancement: callers can still evaluate all findings when the
5
+ * target directory is not a repository.
6
+ */
7
+ export declare function getGitContext(projectPath: string, baseRef?: string, headRef?: string): Promise<GitContext>;
8
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/delivery/git.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8C7C;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,SAAS,GACf,OAAO,CAAC,UAAU,CAAC,CAsDrB"}
@@ -0,0 +1,98 @@
1
+ import { execFile } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { resolve } from 'path';
4
+ const execFileAsync = promisify(execFile);
5
+ async function runGit(cwd, args) {
6
+ const result = await execFileAsync('git', args, {
7
+ cwd,
8
+ encoding: 'utf8',
9
+ maxBuffer: 5 * 1024 * 1024,
10
+ });
11
+ return String(result.stdout).trim();
12
+ }
13
+ async function tryGit(cwd, args) {
14
+ try {
15
+ const value = await runGit(cwd, args);
16
+ return value || undefined;
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ }
22
+ function validGithubSha(value) {
23
+ if (!value || /^0+$/.test(value))
24
+ return undefined;
25
+ return value;
26
+ }
27
+ async function resolveBaseSha(root, headSha, baseRef) {
28
+ const githubBaseSha = validGithubSha(process.env.GITHUB_BASE_SHA);
29
+ if (!baseRef && githubBaseSha)
30
+ return githubBaseSha;
31
+ const requested = baseRef || process.env.GITHUB_BASE_REF;
32
+ if (requested) {
33
+ const candidates = requested.startsWith('refs/') || requested.startsWith('origin/')
34
+ ? [requested]
35
+ : [`origin/${requested}`, requested];
36
+ for (const candidate of candidates) {
37
+ const mergeBase = await tryGit(root, ['merge-base', candidate, headSha]);
38
+ if (mergeBase)
39
+ return mergeBase;
40
+ }
41
+ }
42
+ return tryGit(root, ['rev-parse', `${headSha}^`]);
43
+ }
44
+ /**
45
+ * Resolve the source-control context used by a deployment decision. Git is a
46
+ * best-effort enhancement: callers can still evaluate all findings when the
47
+ * target directory is not a repository.
48
+ */
49
+ export async function getGitContext(projectPath, baseRef, headRef = 'HEAD') {
50
+ const cwd = resolve(projectPath);
51
+ const root = await tryGit(cwd, ['rev-parse', '--show-toplevel']);
52
+ if (!root) {
53
+ return {
54
+ available: false,
55
+ root: cwd,
56
+ changedFiles: [],
57
+ };
58
+ }
59
+ const headSha = await tryGit(root, ['rev-parse', headRef]);
60
+ if (!headSha) {
61
+ return {
62
+ available: false,
63
+ root,
64
+ changedFiles: [],
65
+ };
66
+ }
67
+ const baseSha = await resolveBaseSha(root, headSha, baseRef);
68
+ let changedFiles = [];
69
+ if (baseSha && baseSha !== headSha) {
70
+ const diff = await tryGit(root, [
71
+ 'diff',
72
+ '--name-only',
73
+ '--diff-filter=ACMR',
74
+ `${baseSha}...${headSha}`,
75
+ ]);
76
+ changedFiles = diff
77
+ ? diff.split('\n').map(file => file.trim()).filter(Boolean).map(file => file.replace(/\\/g, '/'))
78
+ : [];
79
+ }
80
+ const branch = process.env.GITHUB_HEAD_REF
81
+ || await tryGit(root, ['rev-parse', '--abbrev-ref', headSha]);
82
+ const author = await tryGit(root, ['show', '-s', '--format=%an <%ae>', headSha]);
83
+ const repository = process.env.GITHUB_REPOSITORY;
84
+ const serverUrl = process.env.GITHUB_SERVER_URL || 'https://github.com';
85
+ const commitUrl = repository ? `${serverUrl}/${repository}/commit/${headSha}` : undefined;
86
+ return {
87
+ available: true,
88
+ root,
89
+ branch,
90
+ headSha,
91
+ baseSha,
92
+ author,
93
+ changedFiles,
94
+ repository,
95
+ commitUrl,
96
+ };
97
+ }
98
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/delivery/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AcknowledgedFinding } from '../types.js';
2
+ import type { DeliveryPolicy } from './types.js';
3
+ export declare function parseDeliveryPolicy(value: unknown): DeliveryPolicy;
4
+ export interface LoadedDeliveryPolicy {
5
+ policy: DeliveryPolicy;
6
+ source?: string;
7
+ }
8
+ /**
9
+ * Load delivery policy from an explicit file, conventional policy file, or the
10
+ * `deliveryPolicy` block inside the scanner config, in that precedence order.
11
+ */
12
+ export declare function loadDeliveryPolicy(projectPath: string, policyFile?: string, configFile?: string): Promise<LoadedDeliveryPolicy>;
13
+ export interface AcknowledgmentLifecycle {
14
+ total: number;
15
+ active: AcknowledgedFinding[];
16
+ expired: AcknowledgedFinding[];
17
+ expiringSoon: AcknowledgedFinding[];
18
+ }
19
+ /**
20
+ * Summarize exception governance directly from the scanner configuration.
21
+ */
22
+ export declare function getAcknowledgmentLifecycle(projectPath: string, configFile?: string, now?: Date): Promise<AcknowledgmentLifecycle>;
23
+ //# sourceMappingURL=governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.d.ts","sourceRoot":"","sources":["../../src/delivery/governance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAY,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAmCjE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAiBlE;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,CAAC,CA8B/B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,YAAY,EAAE,mBAAmB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,GAAG,OAAa,GACf,OAAO,CAAC,uBAAuB,CAAC,CAgClC"}
@@ -0,0 +1,118 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { isAbsolute, join, resolve } from 'path';
3
+ import { loadConfig } from '../config.js';
4
+ const VALID_SEVERITIES = new Set(['critical', 'high', 'medium', 'low', 'info']);
5
+ function isRecord(value) {
6
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
7
+ }
8
+ async function readJson(path) {
9
+ try {
10
+ return JSON.parse(await readFile(path, 'utf-8'));
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ function parseSeverityArray(value) {
17
+ if (!Array.isArray(value))
18
+ return undefined;
19
+ const values = value.filter((item) => typeof item === 'string' && VALID_SEVERITIES.has(item));
20
+ return values.length > 0 ? values : [];
21
+ }
22
+ function parseSeverityBudget(value) {
23
+ if (!isRecord(value))
24
+ return undefined;
25
+ const budget = {};
26
+ for (const severity of VALID_SEVERITIES) {
27
+ const candidate = value[severity];
28
+ if (typeof candidate === 'number' && Number.isInteger(candidate) && candidate >= 0) {
29
+ budget[severity] = candidate;
30
+ }
31
+ }
32
+ return budget;
33
+ }
34
+ export function parseDeliveryPolicy(value) {
35
+ if (!isRecord(value))
36
+ return {};
37
+ const policy = {};
38
+ const blockOn = parseSeverityArray(value.blockOn);
39
+ const maxNew = parseSeverityBudget(value.maxNew);
40
+ if (blockOn !== undefined)
41
+ policy.blockOn = blockOn;
42
+ if (maxNew !== undefined)
43
+ policy.maxNew = maxNew;
44
+ if (typeof value.changedFilesOnly === 'boolean')
45
+ policy.changedFilesOnly = value.changedFilesOnly;
46
+ if (typeof value.minimumScore === 'number' && value.minimumScore >= 0 && value.minimumScore <= 100) {
47
+ policy.minimumScore = value.minimumScore;
48
+ }
49
+ if (typeof value.requireBaseline === 'boolean')
50
+ policy.requireBaseline = value.requireBaseline;
51
+ if (typeof value.failOnExpiredAcknowledgments === 'boolean') {
52
+ policy.failOnExpiredAcknowledgments = value.failOnExpiredAcknowledgments;
53
+ }
54
+ return policy;
55
+ }
56
+ /**
57
+ * Load delivery policy from an explicit file, conventional policy file, or the
58
+ * `deliveryPolicy` block inside the scanner config, in that precedence order.
59
+ */
60
+ export async function loadDeliveryPolicy(projectPath, policyFile, configFile) {
61
+ const root = resolve(projectPath);
62
+ const explicit = policyFile
63
+ ? (isAbsolute(policyFile) ? policyFile : resolve(root, policyFile))
64
+ : undefined;
65
+ const candidates = [
66
+ explicit,
67
+ join(root, 'vlayer.policy.json'),
68
+ join(root, '.vlayer', 'policy.json'),
69
+ ].filter((value) => Boolean(value));
70
+ for (const candidate of candidates) {
71
+ const raw = await readJson(candidate);
72
+ if (raw !== undefined) {
73
+ return { policy: parseDeliveryPolicy(raw), source: candidate };
74
+ }
75
+ }
76
+ const configPath = configFile
77
+ ? (isAbsolute(configFile) ? configFile : resolve(root, configFile))
78
+ : join(root, '.vlayerrc.json');
79
+ const rawConfig = await readJson(configPath);
80
+ if (isRecord(rawConfig) && rawConfig.deliveryPolicy !== undefined) {
81
+ return {
82
+ policy: parseDeliveryPolicy(rawConfig.deliveryPolicy),
83
+ source: `${configPath}#deliveryPolicy`,
84
+ };
85
+ }
86
+ return { policy: {} };
87
+ }
88
+ /**
89
+ * Summarize exception governance directly from the scanner configuration.
90
+ */
91
+ export async function getAcknowledgmentLifecycle(projectPath, configFile, now = new Date()) {
92
+ const config = await loadConfig(resolve(projectPath), configFile);
93
+ const acknowledgments = config.acknowledgedFindings ?? [];
94
+ const thirtyDays = 30 * 24 * 60 * 60 * 1000;
95
+ const expired = [];
96
+ const active = [];
97
+ const expiringSoon = [];
98
+ for (const acknowledgment of acknowledgments) {
99
+ const expiresAt = acknowledgment.expiresAt ? new Date(acknowledgment.expiresAt) : undefined;
100
+ if (expiresAt && !Number.isNaN(expiresAt.getTime()) && expiresAt.getTime() < now.getTime()) {
101
+ expired.push(acknowledgment);
102
+ continue;
103
+ }
104
+ active.push(acknowledgment);
105
+ if (expiresAt
106
+ && !Number.isNaN(expiresAt.getTime())
107
+ && expiresAt.getTime() - now.getTime() <= thirtyDays) {
108
+ expiringSoon.push(acknowledgment);
109
+ }
110
+ }
111
+ return {
112
+ total: acknowledgments.length,
113
+ active,
114
+ expired,
115
+ expiringSoon,
116
+ };
117
+ }
118
+ //# sourceMappingURL=governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.js","sourceRoot":"","sources":["../../src/delivery/governance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Finding } from '../types.js';
2
+ import type { ComplianceGraph, GitContext, PolicyDecision } from './types.js';
3
+ export declare function controlForFinding(finding: Finding): string;
4
+ /**
5
+ * Materialize the core vlayer knowledge graph:
6
+ * code -> finding -> control -> policy, with optional ownership and evidence.
7
+ */
8
+ export declare function buildComplianceGraph(findings: Finding[], projectRoot: string, decision: PolicyDecision, git?: GitContext): ComplianceGraph;
9
+ /** Render a portable Mermaid view for reports and documentation. */
10
+ export declare function graphToMermaid(graph: ComplianceGraph): string;
11
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/delivery/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAM3C,OAAO,KAAK,EACV,eAAe,EAGf,UAAU,EACV,cAAc,EACf,MAAM,YAAY,CAAC;AA4BpB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,OAAO,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,EACxB,GAAG,CAAC,EAAE,UAAU,GACf,eAAe,CAqFjB;AAMD,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAa7D"}
@@ -0,0 +1,130 @@
1
+ import { createHash } from 'crypto';
2
+ import { canonicalRuleId, generateFindingHash, normalizeFindingFile, } from '../baseline.js';
3
+ const CATEGORY_CONTROLS = {
4
+ 'phi-exposure': 'HIPAA Privacy + §164.312(a)(1)',
5
+ encryption: '§164.312(a)(2)(iv) / §164.312(e)(2)(ii)',
6
+ 'audit-logging': '§164.312(b)',
7
+ 'access-control': '§164.312(a)(1) / §164.312(d)',
8
+ 'data-retention': '§164.316(b)(2)(i)',
9
+ };
10
+ function shortHash(value) {
11
+ return createHash('sha256').update(value).digest('hex').slice(0, 12);
12
+ }
13
+ function addNode(nodes, node) {
14
+ if (!nodes.has(node.id))
15
+ nodes.set(node.id, node);
16
+ }
17
+ function addEdge(edges, edge) {
18
+ if (!edges.some(existing => existing.from === edge.from
19
+ && existing.to === edge.to
20
+ && existing.relation === edge.relation)) {
21
+ edges.push(edge);
22
+ }
23
+ }
24
+ export function controlForFinding(finding) {
25
+ return finding.hipaaReference?.trim() || CATEGORY_CONTROLS[finding.category] || 'HIPAA Security Rule';
26
+ }
27
+ /**
28
+ * Materialize the core vlayer knowledge graph:
29
+ * code -> finding -> control -> policy, with optional ownership and evidence.
30
+ */
31
+ export function buildComplianceGraph(findings, projectRoot, decision, git) {
32
+ const nodes = new Map();
33
+ const edges = [];
34
+ const policyId = 'policy:delivery';
35
+ const evidenceId = `evidence:${shortHash(`${decision.evaluatedAt}|${git?.headSha ?? 'local'}`)}`;
36
+ addNode(nodes, {
37
+ id: policyId,
38
+ type: 'policy',
39
+ label: decision.deployAllowed ? 'Deployment policy: PASS' : 'Deployment policy: FAIL',
40
+ metadata: {
41
+ deployAllowed: decision.deployAllowed,
42
+ scope: decision.consideredScope,
43
+ reasons: decision.reasons.length,
44
+ },
45
+ });
46
+ addNode(nodes, {
47
+ id: evidenceId,
48
+ type: 'evidence',
49
+ label: git?.headSha ? `Evidence for ${git.headSha.slice(0, 8)}` : 'Local scan evidence',
50
+ metadata: {
51
+ headSha: git?.headSha ?? null,
52
+ baseSha: git?.baseSha ?? null,
53
+ },
54
+ });
55
+ addEdge(edges, { from: evidenceId, to: policyId, relation: 'supports' });
56
+ let ownerId;
57
+ if (git?.author) {
58
+ ownerId = `owner:${shortHash(git.author)}`;
59
+ addNode(nodes, {
60
+ id: ownerId,
61
+ type: 'owner',
62
+ label: git.author,
63
+ });
64
+ }
65
+ for (const finding of findings) {
66
+ const file = normalizeFindingFile(finding, projectRoot);
67
+ const fingerprint = generateFindingHash(finding, projectRoot);
68
+ const codeId = `code:${shortHash(file)}`;
69
+ const findingId = `finding:${fingerprint}`;
70
+ const control = controlForFinding(finding);
71
+ const controlId = `control:${shortHash(control)}`;
72
+ addNode(nodes, {
73
+ id: codeId,
74
+ type: 'code',
75
+ label: file,
76
+ metadata: { file },
77
+ });
78
+ addNode(nodes, {
79
+ id: findingId,
80
+ type: 'finding',
81
+ label: finding.title,
82
+ metadata: {
83
+ fingerprint,
84
+ ruleId: canonicalRuleId(finding.id),
85
+ severity: finding.severity,
86
+ category: finding.category,
87
+ line: finding.line ?? null,
88
+ acknowledged: finding.acknowledged === true,
89
+ baseline: finding.isBaseline === true,
90
+ },
91
+ });
92
+ addNode(nodes, {
93
+ id: controlId,
94
+ type: 'control',
95
+ label: control,
96
+ });
97
+ addEdge(edges, { from: codeId, to: findingId, relation: 'contains' });
98
+ addEdge(edges, { from: findingId, to: controlId, relation: 'violates' });
99
+ addEdge(edges, { from: findingId, to: policyId, relation: 'governed-by' });
100
+ addEdge(edges, { from: evidenceId, to: findingId, relation: 'supports' });
101
+ if (ownerId)
102
+ addEdge(edges, { from: findingId, to: ownerId, relation: 'owned-by' });
103
+ }
104
+ return {
105
+ schemaVersion: '1.0',
106
+ generatedAt: new Date().toISOString(),
107
+ nodes: [...nodes.values()],
108
+ edges,
109
+ };
110
+ }
111
+ function mermaidLabel(value) {
112
+ return value.replace(/"/g, "'").replace(/\n/g, ' ');
113
+ }
114
+ /** Render a portable Mermaid view for reports and documentation. */
115
+ export function graphToMermaid(graph) {
116
+ const lines = ['flowchart LR'];
117
+ for (const node of graph.nodes) {
118
+ const id = `n${shortHash(node.id)}`;
119
+ lines.push(` ${id}["${mermaidLabel(node.label)}"]`);
120
+ }
121
+ const ids = new Map(graph.nodes.map(node => [node.id, `n${shortHash(node.id)}`]));
122
+ for (const edge of graph.edges) {
123
+ const from = ids.get(edge.from);
124
+ const to = ids.get(edge.to);
125
+ if (from && to)
126
+ lines.push(` ${from} -->|${edge.relation}| ${to}`);
127
+ }
128
+ return lines.join('\n');
129
+ }
130
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/delivery/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { getGitContext } from './git.js';
2
+ export { buildFindingDelta } from './diff.js';
3
+ export { DEFAULT_DELIVERY_POLICY, evaluateDeliveryPolicy, resolveDeliveryPolicy, } from './policy.js';
4
+ export { getAcknowledgmentLifecycle, loadDeliveryPolicy, parseDeliveryPolicy, } from './governance.js';
5
+ export { buildComplianceGraph, controlForFinding, graphToMermaid, } from './graph.js';
6
+ export { buildEvidencePackage, hashEvidencePayload, saveEvidencePackage, verifyEvidencePackage, } from './evidence.js';
7
+ export { uploadEvidenceFile, uploadEvidencePackage, } from './upload.js';
8
+ export { buildRemediationPlan, remediationToMarkdown, } from './remediation.js';
9
+ export { runComplianceGuard } from './runner.js';
10
+ export type { ComplianceGraph, ComplianceGraphEdge, ComplianceGraphNode, ComplianceGraphNodeType, DeliveryPolicy, EvidenceFinding, EvidencePackage, FindingDelta, GitContext, GuardResult, PolicyDecision, PolicyReason, RemediationItem, RemediationPlan, SeverityBudget, } from './types.js';
11
+ export type { GuardExecution, RunGuardOptions } from './runner.js';
12
+ export type { AcknowledgmentLifecycle, LoadedDeliveryPolicy } from './governance.js';
13
+ export type { UploadEvidenceOptions, UploadEvidenceResult } from './upload.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delivery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,eAAe,EACf,YAAY,EACZ,UAAU,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACrF,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { getGitContext } from './git.js';
2
+ export { buildFindingDelta } from './diff.js';
3
+ export { DEFAULT_DELIVERY_POLICY, evaluateDeliveryPolicy, resolveDeliveryPolicy, } from './policy.js';
4
+ export { getAcknowledgmentLifecycle, loadDeliveryPolicy, parseDeliveryPolicy, } from './governance.js';
5
+ export { buildComplianceGraph, controlForFinding, graphToMermaid, } from './graph.js';
6
+ export { buildEvidencePackage, hashEvidencePayload, saveEvidencePackage, verifyEvidencePackage, } from './evidence.js';
7
+ export { uploadEvidenceFile, uploadEvidencePackage, } from './upload.js';
8
+ export { buildRemediationPlan, remediationToMarkdown, } from './remediation.js';
9
+ export { runComplianceGuard } from './runner.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/delivery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}