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.
- package/COMPLIANCE_DELIVERY.md +161 -0
- package/dist/acknowledgments.d.ts +1 -1
- package/dist/acknowledgments.d.ts.map +1 -1
- package/dist/acknowledgments.js +29 -11
- package/dist/acknowledgments.js.map +1 -1
- package/dist/baseline.d.ts +50 -12
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +165 -23
- package/dist/baseline.js.map +1 -1
- package/dist/delivery/diff.d.ts +10 -0
- package/dist/delivery/diff.d.ts.map +1 -0
- package/dist/delivery/diff.js +41 -0
- package/dist/delivery/diff.js.map +1 -0
- package/dist/delivery/evidence.d.ts +11 -0
- package/dist/delivery/evidence.d.ts.map +1 -0
- package/dist/delivery/evidence.js +87 -0
- package/dist/delivery/evidence.js.map +1 -0
- package/dist/delivery/git.d.ts +8 -0
- package/dist/delivery/git.d.ts.map +1 -0
- package/dist/delivery/git.js +98 -0
- package/dist/delivery/git.js.map +1 -0
- package/dist/delivery/governance.d.ts +23 -0
- package/dist/delivery/governance.d.ts.map +1 -0
- package/dist/delivery/governance.js +118 -0
- package/dist/delivery/governance.js.map +1 -0
- package/dist/delivery/graph.d.ts +11 -0
- package/dist/delivery/graph.d.ts.map +1 -0
- package/dist/delivery/graph.js +130 -0
- package/dist/delivery/graph.js.map +1 -0
- package/dist/delivery/index.d.ts +14 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +10 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/delivery/policy.d.ts +13 -0
- package/dist/delivery/policy.d.ts.map +1 -0
- package/dist/delivery/policy.js +100 -0
- package/dist/delivery/policy.js.map +1 -0
- package/dist/delivery/remediation.d.ts +9 -0
- package/dist/delivery/remediation.d.ts.map +1 -0
- package/dist/delivery/remediation.js +60 -0
- package/dist/delivery/remediation.js.map +1 -0
- package/dist/delivery/runner.d.ts +26 -0
- package/dist/delivery/runner.d.ts.map +1 -0
- package/dist/delivery/runner.js +79 -0
- package/dist/delivery/runner.js.map +1 -0
- package/dist/delivery/types.d.ts +156 -0
- package/dist/delivery/types.d.ts.map +1 -0
- package/dist/delivery/types.js +2 -0
- package/dist/delivery/types.js.map +1 -0
- package/dist/delivery/upload.d.ts +20 -0
- package/dist/delivery/upload.d.ts.map +1 -0
- package/dist/delivery/upload.js +72 -0
- package/dist/delivery/upload.js.map +1 -0
- package/dist/delivery-cli.d.ts +3 -0
- package/dist/delivery-cli.d.ts.map +1 -0
- package/dist/delivery-cli.js +306 -0
- package/dist/delivery-cli.js.map +1 -0
- package/dist/delivery-upload-cli.d.ts +3 -0
- package/dist/delivery-upload-cli.d.ts.map +1 -0
- package/dist/delivery-upload-cli.js +37 -0
- package/dist/delivery-upload-cli.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/rule-catalog.json +1 -1
- package/package.json +15 -9
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-cli.d.ts","sourceRoot":"","sources":["../src/delivery-cli.ts"],"names":[],"mappings":""}
|