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,13 @@
1
+ import type { Finding, Severity } from '../types.js';
2
+ import type { DeliveryPolicy, FindingDelta, PolicyDecision, SeverityBudget } from './types.js';
3
+ export declare const DEFAULT_DELIVERY_POLICY: Required<Pick<DeliveryPolicy, 'changedFilesOnly' | 'minimumScore' | 'requireBaseline' | 'failOnExpiredAcknowledgments'>> & {
4
+ blockOn: Severity[];
5
+ maxNew: SeverityBudget;
6
+ };
7
+ export declare function resolveDeliveryPolicy(policy?: DeliveryPolicy): PolicyDecision['policy'];
8
+ /**
9
+ * Decide whether a software change is allowed to ship. The policy deliberately
10
+ * evaluates new active risk instead of the repository's historical debt.
11
+ */
12
+ export declare function evaluateDeliveryPolicy(delta: FindingDelta, allFindings: Finding[], complianceScore: number | undefined, baselineLoaded: boolean, gitAvailable: boolean, policy?: DeliveryPolicy, expiredAcknowledgmentCount?: number): PolicyDecision;
13
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/delivery/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EAEd,cAAc,EACf,MAAM,YAAY,CAAC;AAIpB,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,IAAI,CACjD,cAAc,EACd,kBAAkB,GAAG,cAAc,GAAG,iBAAiB,GAAG,8BAA8B,CACzF,CAAC,GAAG;IACH,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;CAQxB,CAAC;AAYF,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,cAAmB,GAAG,cAAc,CAAC,QAAQ,CAAC,CAU3F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,OAAO,EAAE,EACtB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,cAAc,EAAE,OAAO,EACvB,YAAY,EAAE,OAAO,EACrB,MAAM,GAAE,cAAmB,EAC3B,0BAA0B,SAAI,GAC7B,cAAc,CAuEhB"}
@@ -0,0 +1,100 @@
1
+ const SEVERITIES = ['critical', 'high', 'medium', 'low', 'info'];
2
+ export const DEFAULT_DELIVERY_POLICY = {
3
+ blockOn: ['critical', 'high'],
4
+ maxNew: {},
5
+ changedFilesOnly: true,
6
+ minimumScore: 0,
7
+ requireBaseline: false,
8
+ failOnExpiredAcknowledgments: true,
9
+ };
10
+ function countsFor(findings) {
11
+ return {
12
+ critical: findings.filter(f => f.severity === 'critical').length,
13
+ high: findings.filter(f => f.severity === 'high').length,
14
+ medium: findings.filter(f => f.severity === 'medium').length,
15
+ low: findings.filter(f => f.severity === 'low').length,
16
+ info: findings.filter(f => f.severity === 'info').length,
17
+ };
18
+ }
19
+ export function resolveDeliveryPolicy(policy = {}) {
20
+ return {
21
+ blockOn: policy.blockOn ?? DEFAULT_DELIVERY_POLICY.blockOn,
22
+ maxNew: policy.maxNew ?? DEFAULT_DELIVERY_POLICY.maxNew,
23
+ changedFilesOnly: policy.changedFilesOnly ?? DEFAULT_DELIVERY_POLICY.changedFilesOnly,
24
+ minimumScore: policy.minimumScore ?? DEFAULT_DELIVERY_POLICY.minimumScore,
25
+ requireBaseline: policy.requireBaseline ?? DEFAULT_DELIVERY_POLICY.requireBaseline,
26
+ failOnExpiredAcknowledgments: policy.failOnExpiredAcknowledgments ?? DEFAULT_DELIVERY_POLICY.failOnExpiredAcknowledgments,
27
+ };
28
+ }
29
+ /**
30
+ * Decide whether a software change is allowed to ship. The policy deliberately
31
+ * evaluates new active risk instead of the repository's historical debt.
32
+ */
33
+ export function evaluateDeliveryPolicy(delta, allFindings, complianceScore, baselineLoaded, gitAvailable, policy = {}, expiredAcknowledgmentCount = 0) {
34
+ const resolved = resolveDeliveryPolicy(policy);
35
+ const useChangedFiles = resolved.changedFilesOnly && gitAvailable;
36
+ const considered = useChangedFiles
37
+ ? delta.newFindingsInChangedFiles
38
+ : delta.newFindings;
39
+ const counts = countsFor(considered);
40
+ const reasons = [];
41
+ for (const severity of resolved.blockOn) {
42
+ const count = counts[severity];
43
+ if (count > 0) {
44
+ reasons.push({
45
+ code: 'BLOCKING_SEVERITY',
46
+ severity,
47
+ count,
48
+ message: `${count} new ${severity} finding${count === 1 ? '' : 's'} in the evaluated change`,
49
+ });
50
+ }
51
+ }
52
+ for (const severity of SEVERITIES) {
53
+ const limit = resolved.maxNew[severity];
54
+ if (limit === undefined)
55
+ continue;
56
+ const count = counts[severity];
57
+ if (count > limit) {
58
+ reasons.push({
59
+ code: 'SEVERITY_BUDGET_EXCEEDED',
60
+ severity,
61
+ count,
62
+ limit,
63
+ message: `${severity} budget exceeded: ${count} new finding${count === 1 ? '' : 's'} (limit ${limit})`,
64
+ });
65
+ }
66
+ }
67
+ if (resolved.minimumScore > 0 && (complianceScore ?? 0) < resolved.minimumScore) {
68
+ reasons.push({
69
+ code: 'MINIMUM_SCORE',
70
+ message: `Compliance score ${complianceScore ?? 0} is below required minimum ${resolved.minimumScore}`,
71
+ });
72
+ }
73
+ if (resolved.requireBaseline && !baselineLoaded) {
74
+ reasons.push({
75
+ code: 'BASELINE_REQUIRED',
76
+ message: 'A committed baseline is required by delivery policy',
77
+ });
78
+ }
79
+ const expiredInFindings = allFindings.filter(f => f.acknowledgment?.expired === true).length;
80
+ const expired = Math.max(expiredAcknowledgmentCount, expiredInFindings);
81
+ if (resolved.failOnExpiredAcknowledgments && expired > 0) {
82
+ reasons.push({
83
+ code: 'EXPIRED_ACKNOWLEDGMENT',
84
+ count: expired,
85
+ message: `${expired} acknowledgment${expired === 1 ? '' : 's'} expired and require re-review`,
86
+ });
87
+ }
88
+ const deployAllowed = reasons.length === 0;
89
+ return {
90
+ status: deployAllowed ? 'pass' : 'fail',
91
+ deployAllowed,
92
+ evaluatedAt: new Date().toISOString(),
93
+ consideredScope: useChangedFiles ? 'changed-files' : 'all-files',
94
+ counts,
95
+ totalConsidered: considered.length,
96
+ reasons,
97
+ policy: resolved,
98
+ };
99
+ }
100
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/delivery/policy.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,GAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,uBAAuB,GAMhC;IACF,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,EAAE;IACV,gBAAgB,EAAE,IAAI;IACtB,YAAY,EAAE,CAAC;IACf,eAAe,EAAE,KAAK;IACtB,4BAA4B,EAAE,IAAI;CACnC,CAAC;AAEF,SAAS,SAAS,CAAC,QAAmB;IACpC,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM;QAChE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;QACxD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM;QAC5D,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM;QACtD,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;KACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAyB,EAAE;IAC/D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,uBAAuB,CAAC,OAAO;QAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,uBAAuB,CAAC,MAAM;QACvD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,uBAAuB,CAAC,gBAAgB;QACrF,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,uBAAuB,CAAC,YAAY;QACzE,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,uBAAuB,CAAC,eAAe;QAClF,4BAA4B,EAC1B,MAAM,CAAC,4BAA4B,IAAI,uBAAuB,CAAC,4BAA4B;KAC9F,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAmB,EACnB,WAAsB,EACtB,eAAmC,EACnC,cAAuB,EACvB,YAAqB,EACrB,SAAyB,EAAE,EAC3B,0BAA0B,GAAG,CAAC;IAE9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,QAAQ,CAAC,gBAAgB,IAAI,YAAY,CAAC;IAClE,MAAM,UAAU,GAAG,eAAe;QAChC,CAAC,CAAC,KAAK,CAAC,yBAAyB;QACjC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;IACtB,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,mBAAmB;gBACzB,QAAQ;gBACR,KAAK;gBACL,OAAO,EAAE,GAAG,KAAK,QAAQ,QAAQ,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,0BAA0B;aAC7F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,0BAA0B;gBAChC,QAAQ;gBACR,KAAK;gBACL,KAAK;gBACL,OAAO,EAAE,GAAG,QAAQ,qBAAqB,KAAK,eAAe,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,KAAK,GAAG;aACvG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,oBAAoB,eAAe,IAAI,CAAC,8BAA8B,QAAQ,CAAC,YAAY,EAAE;SACvG,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,CAAC,eAAe,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,qDAAqD;SAC/D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAC;IACxE,IAAI,QAAQ,CAAC,4BAA4B,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,wBAAwB;YAC9B,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,GAAG,OAAO,kBAAkB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,gCAAgC;SAC9F,CAAC,CAAC;IACL,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IAC3C,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACvC,aAAa;QACb,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW;QAChE,MAAM;QACN,eAAe,EAAE,UAAU,CAAC,MAAM;QAClC,OAAO;QACP,MAAM,EAAE,QAAQ;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { GuardResult, RemediationPlan } from './types.js';
2
+ /**
3
+ * Convert a policy decision into a developer-facing remediation plan. The plan
4
+ * never mutates source; it only advertises a safe-fix command when the scanner
5
+ * has a registered fix type for the finding.
6
+ */
7
+ export declare function buildRemediationPlan(projectPath: string, guard: GuardResult): RemediationPlan;
8
+ export declare function remediationToMarkdown(plan: RemediationPlan): string;
9
+ //# sourceMappingURL=remediation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remediation.d.ts","sourceRoot":"","sources":["../../src/delivery/remediation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAmB,eAAe,EAAE,MAAM,YAAY,CAAC;AAQhF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,GACjB,eAAe,CAoCjB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CA2BnE"}
@@ -0,0 +1,60 @@
1
+ import { generateFindingHash, normalizeFindingFile } from '../baseline.js';
2
+ function consideredNewFindings(guard) {
3
+ return guard.decision.consideredScope === 'changed-files'
4
+ ? guard.delta.newFindingsInChangedFiles
5
+ : guard.delta.newFindings;
6
+ }
7
+ /**
8
+ * Convert a policy decision into a developer-facing remediation plan. The plan
9
+ * never mutates source; it only advertises a safe-fix command when the scanner
10
+ * has a registered fix type for the finding.
11
+ */
12
+ export function buildRemediationPlan(projectPath, guard) {
13
+ const blockingSeverities = new Set(guard.decision.reasons
14
+ .filter(reason => reason.code === 'BLOCKING_SEVERITY' && reason.severity)
15
+ .map(reason => reason.severity));
16
+ const budgetSeverities = new Set(guard.decision.reasons
17
+ .filter(reason => reason.code === 'SEVERITY_BUDGET_EXCEEDED' && reason.severity)
18
+ .map(reason => reason.severity));
19
+ const considered = consideredNewFindings(guard);
20
+ const relevant = considered.filter(finding => blockingSeverities.has(finding.severity) || budgetSeverities.has(finding.severity));
21
+ const items = relevant.map(finding => {
22
+ const autoFixAvailable = Boolean(finding.fixType);
23
+ return {
24
+ fingerprint: generateFindingHash(finding, projectPath),
25
+ severity: finding.severity,
26
+ title: finding.title,
27
+ file: normalizeFindingFile(finding, projectPath),
28
+ line: finding.line,
29
+ recommendation: finding.recommendation,
30
+ autoFixAvailable,
31
+ command: autoFixAvailable ? `vlayer scan ${JSON.stringify(projectPath)} --fix` : undefined,
32
+ };
33
+ });
34
+ return {
35
+ deployAllowed: guard.decision.deployAllowed,
36
+ blockingCount: items.length,
37
+ items,
38
+ };
39
+ }
40
+ export function remediationToMarkdown(plan) {
41
+ const lines = [
42
+ plan.deployAllowed ? '# Deployment approved' : '# Deployment blocked',
43
+ '',
44
+ ];
45
+ if (plan.items.length === 0) {
46
+ lines.push(plan.deployAllowed
47
+ ? 'No blocking remediation is required.'
48
+ : 'The policy failed for a non-finding condition. Review the policy reasons.');
49
+ return lines.join('\n');
50
+ }
51
+ lines.push(`Blocking findings: ${plan.items.length}`, '');
52
+ for (const item of plan.items) {
53
+ lines.push(`## ${item.severity.toUpperCase()} — ${item.title}`, '', `- Location: \`${item.file}${item.line ? `:${item.line}` : ''}\``, `- Recommendation: ${item.recommendation}`, `- Auto-fix registered: ${item.autoFixAvailable ? 'yes' : 'no'}`);
54
+ if (item.command)
55
+ lines.push(`- Safe-fix command: \`${item.command}\``);
56
+ lines.push('');
57
+ }
58
+ return lines.join('\n');
59
+ }
60
+ //# sourceMappingURL=remediation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remediation.js","sourceRoot":"","sources":["../../src/delivery/remediation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Confidence } from '../types.js';
2
+ import { getAcknowledgmentLifecycle } from './governance.js';
3
+ import type { DeliveryPolicy, GuardResult } from './types.js';
4
+ export interface RunGuardOptions {
5
+ path: string;
6
+ baselineFile?: string;
7
+ configFile?: string;
8
+ policyFile?: string;
9
+ baseRef?: string;
10
+ headRef?: string;
11
+ changedFilesOnly?: boolean;
12
+ enableAI?: boolean;
13
+ minConfidence?: Confidence;
14
+ policy?: DeliveryPolicy;
15
+ }
16
+ export interface GuardExecution extends GuardResult {
17
+ policySource?: string;
18
+ acknowledgmentLifecycle: Awaited<ReturnType<typeof getAcknowledgmentLifecycle>>;
19
+ baselinePath?: string;
20
+ }
21
+ /**
22
+ * Execute a deterministic compliance delivery gate. AI triage is disabled by
23
+ * default so CI decisions are reproducible unless the caller explicitly opts in.
24
+ */
25
+ export declare function runComplianceGuard(options: RunGuardOptions): Promise<GuardExecution>;
26
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/delivery/runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAI3D,OAAO,EAAE,0BAA0B,EAAsB,MAAM,iBAAiB,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA6BD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAkD1F"}
@@ -0,0 +1,79 @@
1
+ import { isAbsolute, resolve } from 'path';
2
+ import { access } from 'fs/promises';
3
+ import { scan } from '../scan.js';
4
+ import { loadBaseline } from '../baseline.js';
5
+ import { getGitContext } from './git.js';
6
+ import { buildFindingDelta } from './diff.js';
7
+ import { evaluateDeliveryPolicy } from './policy.js';
8
+ import { getAcknowledgmentLifecycle, loadDeliveryPolicy } from './governance.js';
9
+ async function existingFile(path) {
10
+ try {
11
+ await access(path);
12
+ return path;
13
+ }
14
+ catch {
15
+ return undefined;
16
+ }
17
+ }
18
+ async function resolveBaselinePath(root, explicit) {
19
+ if (explicit) {
20
+ const candidate = isAbsolute(explicit) ? explicit : resolve(root, explicit);
21
+ return existingFile(candidate);
22
+ }
23
+ return existingFile(resolve(root, '.vlayer-baseline.json'));
24
+ }
25
+ function mergePolicy(base, override) {
26
+ if (!override)
27
+ return base;
28
+ return {
29
+ ...base,
30
+ ...override,
31
+ maxNew: override.maxNew ?? base.maxNew,
32
+ blockOn: override.blockOn ?? base.blockOn,
33
+ };
34
+ }
35
+ /**
36
+ * Execute a deterministic compliance delivery gate. AI triage is disabled by
37
+ * default so CI decisions are reproducible unless the caller explicitly opts in.
38
+ */
39
+ export async function runComplianceGuard(options) {
40
+ const projectPath = resolve(options.path);
41
+ const git = await getGitContext(projectPath, options.baseRef, options.headRef ?? 'HEAD');
42
+ const scanRoot = git.available ? git.root : projectPath;
43
+ const baselinePath = await resolveBaselinePath(scanRoot, options.baselineFile);
44
+ const configPath = options.configFile
45
+ ? (isAbsolute(options.configFile) ? options.configFile : resolve(scanRoot, options.configFile))
46
+ : undefined;
47
+ let baseline = null;
48
+ if (baselinePath)
49
+ baseline = await loadBaseline(baselinePath);
50
+ const scanOptions = {
51
+ path: scanRoot,
52
+ configFile: configPath,
53
+ baselineFile: baselinePath,
54
+ enableAI: options.enableAI === true,
55
+ minConfidence: options.minConfidence,
56
+ };
57
+ const result = await scan(scanOptions);
58
+ const delta = buildFindingDelta(result.findings, scanRoot, git.changedFiles, baseline);
59
+ const loadedPolicy = await loadDeliveryPolicy(scanRoot, options.policyFile, configPath);
60
+ const acknowledgmentLifecycle = await getAcknowledgmentLifecycle(scanRoot, configPath);
61
+ let policy = mergePolicy(loadedPolicy.policy, options.policy);
62
+ if (options.changedFilesOnly !== undefined) {
63
+ policy = { ...policy, changedFilesOnly: options.changedFilesOnly };
64
+ }
65
+ const decision = evaluateDeliveryPolicy(delta, result.findings, result.complianceScore?.score, baseline !== null, git.available, policy, acknowledgmentLifecycle.expired.length);
66
+ return {
67
+ git,
68
+ delta,
69
+ decision,
70
+ findings: result.findings,
71
+ scannedFiles: result.scannedFiles,
72
+ complianceScore: result.complianceScore?.score,
73
+ baselineLoaded: baseline !== null,
74
+ baselinePath,
75
+ policySource: loadedPolicy.source,
76
+ acknowledgmentLifecycle,
77
+ };
78
+ }
79
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/delivery/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ import type { Finding, Severity } from '../types.js';
2
+ import type { BaselineEntry } from '../baseline.js';
3
+ export interface GitContext {
4
+ available: boolean;
5
+ root: string;
6
+ branch?: string;
7
+ headSha?: string;
8
+ baseSha?: string;
9
+ author?: string;
10
+ changedFiles: string[];
11
+ repository?: string;
12
+ commitUrl?: string;
13
+ }
14
+ export interface FindingDelta {
15
+ newFindings: Finding[];
16
+ newFindingsInChangedFiles: Finding[];
17
+ baselineFindings: Finding[];
18
+ resolvedFindings: BaselineEntry[];
19
+ changedFiles: string[];
20
+ }
21
+ export interface SeverityBudget {
22
+ critical?: number;
23
+ high?: number;
24
+ medium?: number;
25
+ low?: number;
26
+ info?: number;
27
+ }
28
+ export interface DeliveryPolicy {
29
+ /** Severities that always block when a new active finding is considered. */
30
+ blockOn?: Severity[];
31
+ /** Maximum number of new findings allowed by severity. */
32
+ maxNew?: SeverityBudget;
33
+ /** Evaluate only findings in files changed by the git comparison. Default true when git is available. */
34
+ changedFilesOnly?: boolean;
35
+ /** Optional minimum overall compliance score. */
36
+ minimumScore?: number;
37
+ /** Require a baseline file before the gate can pass. */
38
+ requireBaseline?: boolean;
39
+ /** Expired acknowledgments are governance failures even when the underlying finding is low severity. */
40
+ failOnExpiredAcknowledgments?: boolean;
41
+ }
42
+ export interface PolicyReason {
43
+ code: 'BLOCKING_SEVERITY' | 'SEVERITY_BUDGET_EXCEEDED' | 'MINIMUM_SCORE' | 'BASELINE_REQUIRED' | 'EXPIRED_ACKNOWLEDGMENT';
44
+ message: string;
45
+ severity?: Severity;
46
+ count?: number;
47
+ limit?: number;
48
+ }
49
+ export interface PolicyDecision {
50
+ status: 'pass' | 'fail';
51
+ deployAllowed: boolean;
52
+ evaluatedAt: string;
53
+ consideredScope: 'changed-files' | 'all-files';
54
+ counts: Record<Severity, number>;
55
+ totalConsidered: number;
56
+ reasons: PolicyReason[];
57
+ policy: Required<Pick<DeliveryPolicy, 'changedFilesOnly' | 'minimumScore' | 'requireBaseline' | 'failOnExpiredAcknowledgments'>> & {
58
+ blockOn: Severity[];
59
+ maxNew: SeverityBudget;
60
+ };
61
+ }
62
+ export type ComplianceGraphNodeType = 'code' | 'finding' | 'control' | 'policy' | 'owner' | 'evidence';
63
+ export interface ComplianceGraphNode {
64
+ id: string;
65
+ type: ComplianceGraphNodeType;
66
+ label: string;
67
+ metadata?: Record<string, string | number | boolean | null>;
68
+ }
69
+ export interface ComplianceGraphEdge {
70
+ from: string;
71
+ to: string;
72
+ relation: 'contains' | 'violates' | 'governed-by' | 'owned-by' | 'supports';
73
+ }
74
+ export interface ComplianceGraph {
75
+ schemaVersion: '1.0';
76
+ generatedAt: string;
77
+ nodes: ComplianceGraphNode[];
78
+ edges: ComplianceGraphEdge[];
79
+ }
80
+ export interface EvidenceFinding {
81
+ fingerprint: string;
82
+ ruleId: string;
83
+ id: string;
84
+ severity: Severity;
85
+ category: string;
86
+ title: string;
87
+ file: string;
88
+ line?: number;
89
+ hipaaReference?: string;
90
+ recommendation: string;
91
+ acknowledged: boolean;
92
+ acknowledgment?: {
93
+ reason: string;
94
+ acknowledgedBy: string;
95
+ acknowledgedAt: string;
96
+ ticketUrl?: string;
97
+ expired?: boolean;
98
+ };
99
+ baseline: boolean;
100
+ suppressed: boolean;
101
+ }
102
+ export interface EvidencePackage {
103
+ schemaVersion: '1.0';
104
+ generatedAt: string;
105
+ project: {
106
+ name: string;
107
+ };
108
+ source: {
109
+ repository?: string;
110
+ branch?: string;
111
+ headSha?: string;
112
+ baseSha?: string;
113
+ author?: string;
114
+ commitUrl?: string;
115
+ changedFiles: string[];
116
+ };
117
+ decision: PolicyDecision;
118
+ summary: {
119
+ scannedFiles: number;
120
+ totalFindings: number;
121
+ newFindings: number;
122
+ resolvedFindings: number;
123
+ acknowledged: number;
124
+ suppressed: number;
125
+ complianceScore?: number;
126
+ };
127
+ controls: string[];
128
+ findings: EvidenceFinding[];
129
+ graph: ComplianceGraph;
130
+ packageHash: string;
131
+ }
132
+ export interface RemediationItem {
133
+ fingerprint: string;
134
+ severity: Severity;
135
+ title: string;
136
+ file: string;
137
+ line?: number;
138
+ recommendation: string;
139
+ autoFixAvailable: boolean;
140
+ command?: string;
141
+ }
142
+ export interface RemediationPlan {
143
+ deployAllowed: boolean;
144
+ blockingCount: number;
145
+ items: RemediationItem[];
146
+ }
147
+ export interface GuardResult {
148
+ git: GitContext;
149
+ delta: FindingDelta;
150
+ decision: PolicyDecision;
151
+ findings: Finding[];
152
+ scannedFiles: number;
153
+ complianceScore?: number;
154
+ baselineLoaded: boolean;
155
+ }
156
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/delivery/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/delivery/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { EvidencePackage } from './types.js';
2
+ export interface UploadEvidenceOptions {
3
+ url?: string;
4
+ token?: string;
5
+ timeoutMs?: number;
6
+ }
7
+ export interface UploadEvidenceResult {
8
+ ok: boolean;
9
+ status: number;
10
+ scanId?: string;
11
+ projectId?: string;
12
+ message?: string;
13
+ }
14
+ /**
15
+ * Upload an already-verified evidence package. Tokens are accepted only in the
16
+ * Authorization header and are never included in the result or thrown errors.
17
+ */
18
+ export declare function uploadEvidencePackage(evidence: EvidencePackage, options?: UploadEvidenceOptions): Promise<UploadEvidenceResult>;
19
+ export declare function uploadEvidenceFile(path: string, options?: UploadEvidenceOptions): Promise<UploadEvidenceResult>;
20
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/delivery/upload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAeD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,eAAe,EACzB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAmD/B;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAG/B"}
@@ -0,0 +1,72 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { resolve } from 'path';
3
+ import { verifyEvidencePackage } from './evidence.js';
4
+ function resolveIngestUrl(value) {
5
+ const raw = value || process.env.VLAYER_INGEST_URL || 'https://vlayer.app/api/ingest';
6
+ const url = new URL(raw);
7
+ const local = url.hostname === 'localhost' || url.hostname === '127.0.0.1';
8
+ if (url.protocol !== 'https:' && !(local && url.protocol === 'http:')) {
9
+ throw new Error('Evidence uploads require HTTPS (except localhost development)');
10
+ }
11
+ if (url.username || url.password || url.search || url.hash) {
12
+ throw new Error('Ingest URL must not contain credentials, query parameters, or fragments');
13
+ }
14
+ return url;
15
+ }
16
+ /**
17
+ * Upload an already-verified evidence package. Tokens are accepted only in the
18
+ * Authorization header and are never included in the result or thrown errors.
19
+ */
20
+ export async function uploadEvidencePackage(evidence, options = {}) {
21
+ if (!verifyEvidencePackage(evidence)) {
22
+ throw new Error('Evidence package integrity check failed; refusing upload');
23
+ }
24
+ const token = options.token || process.env.VLAYER_TOKEN;
25
+ if (!token)
26
+ throw new Error('VLAYER_TOKEN is required to upload evidence');
27
+ const url = resolveIngestUrl(options.url);
28
+ const controller = new AbortController();
29
+ const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 15_000);
30
+ try {
31
+ const response = await fetch(url, {
32
+ method: 'POST',
33
+ redirect: 'error',
34
+ headers: {
35
+ Authorization: `Bearer ${token}`,
36
+ 'Content-Type': 'application/json',
37
+ 'User-Agent': 'verification-layer',
38
+ },
39
+ body: JSON.stringify(evidence),
40
+ signal: controller.signal,
41
+ });
42
+ let payload;
43
+ try {
44
+ payload = await response.json();
45
+ }
46
+ catch {
47
+ payload = undefined;
48
+ }
49
+ const record = payload && typeof payload === 'object'
50
+ ? payload
51
+ : {};
52
+ if (!response.ok) {
53
+ throw new Error(`Workspace upload failed with HTTP ${response.status}`);
54
+ }
55
+ const safeValue = (value) => typeof value === 'string' && !value.includes(token) ? value : undefined;
56
+ return {
57
+ ok: true,
58
+ status: response.status,
59
+ scanId: safeValue(record.scanId),
60
+ projectId: safeValue(record.projectId),
61
+ message: safeValue(record.message),
62
+ };
63
+ }
64
+ finally {
65
+ clearTimeout(timeout);
66
+ }
67
+ }
68
+ export async function uploadEvidenceFile(path, options = {}) {
69
+ const evidence = JSON.parse(await readFile(resolve(path), 'utf-8'));
70
+ return uploadEvidencePackage(evidence, options);
71
+ }
72
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/delivery/upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=delivery-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-cli.d.ts","sourceRoot":"","sources":["../src/delivery-cli.ts"],"names":[],"mappings":""}