vaspera 2.10.0 → 2.11.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/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.js +188 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js +363 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js +226 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/index.test.js +214 -0
- package/dist/__tests__/scanners/ai-code/index.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.js +67 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/index.test.js +84 -0
- package/dist/__tests__/scanners/deploy/index.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.js +88 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/types.test.js +126 -0
- package/dist/__tests__/scanners/deploy/types.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-feedback.test.js +1 -1
- package/dist/__tests__/scanners/fp-feedback.test.js.map +1 -1
- package/dist/__tests__/scanners/fp-tracker.test.js +1 -1
- package/dist/__tests__/scanners/fp-tracker.test.js.map +1 -1
- package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.js +94 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.js +195 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/index.test.js +120 -0
- package/dist/__tests__/scanners/runtime/index.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/types.test.js +126 -0
- package/dist/__tests__/scanners/runtime/types.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.js +187 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/index.test.js +87 -0
- package/dist/__tests__/scanners/scale/index.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.js +122 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/types.test.js +129 -0
- package/dist/__tests__/scanners/scale/types.test.js.map +1 -0
- package/dist/action/pr-comment.test.js +8 -0
- package/dist/action/pr-comment.test.js.map +1 -1
- package/dist/action/sarif-upload.test.js +8 -0
- package/dist/action/sarif-upload.test.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +874 -0
- package/dist/index.js.map +1 -1
- package/dist/install-skills.d.ts +11 -0
- package/dist/install-skills.d.ts.map +1 -0
- package/dist/install-skills.js +81 -0
- package/dist/install-skills.js.map +1 -0
- package/dist/scanners/ai-code/ai-detector.d.ts +25 -0
- package/dist/scanners/ai-code/ai-detector.d.ts.map +1 -0
- package/dist/scanners/ai-code/ai-detector.js +192 -0
- package/dist/scanners/ai-code/ai-detector.js.map +1 -0
- package/dist/scanners/ai-code/confidence-scorer.d.ts +40 -0
- package/dist/scanners/ai-code/confidence-scorer.d.ts.map +1 -0
- package/dist/scanners/ai-code/confidence-scorer.js +148 -0
- package/dist/scanners/ai-code/confidence-scorer.js.map +1 -0
- package/dist/scanners/ai-code/hallucination-checker.d.ts +36 -0
- package/dist/scanners/ai-code/hallucination-checker.d.ts.map +1 -0
- package/dist/scanners/ai-code/hallucination-checker.js +298 -0
- package/dist/scanners/ai-code/hallucination-checker.js.map +1 -0
- package/dist/scanners/ai-code/index.d.ts +30 -0
- package/dist/scanners/ai-code/index.d.ts.map +1 -0
- package/dist/scanners/ai-code/index.js +224 -0
- package/dist/scanners/ai-code/index.js.map +1 -0
- package/dist/scanners/ai-code/types.d.ts +192 -0
- package/dist/scanners/ai-code/types.d.ts.map +1 -0
- package/dist/scanners/ai-code/types.js +37 -0
- package/dist/scanners/ai-code/types.js.map +1 -0
- package/dist/scanners/cache.d.ts.map +1 -1
- package/dist/scanners/cache.js +8 -0
- package/dist/scanners/cache.js.map +1 -1
- package/dist/scanners/dast.d.ts +40 -0
- package/dist/scanners/dast.d.ts.map +1 -0
- package/dist/scanners/dast.js +228 -0
- package/dist/scanners/dast.js.map +1 -0
- package/dist/scanners/deploy/health-checker.d.ts +38 -0
- package/dist/scanners/deploy/health-checker.d.ts.map +1 -0
- package/dist/scanners/deploy/health-checker.js +272 -0
- package/dist/scanners/deploy/health-checker.js.map +1 -0
- package/dist/scanners/deploy/index.d.ts +44 -0
- package/dist/scanners/deploy/index.d.ts.map +1 -0
- package/dist/scanners/deploy/index.js +208 -0
- package/dist/scanners/deploy/index.js.map +1 -0
- package/dist/scanners/deploy/provider-detector.d.ts +25 -0
- package/dist/scanners/deploy/provider-detector.d.ts.map +1 -0
- package/dist/scanners/deploy/provider-detector.js +177 -0
- package/dist/scanners/deploy/provider-detector.js.map +1 -0
- package/dist/scanners/deploy/types.d.ts +406 -0
- package/dist/scanners/deploy/types.d.ts.map +1 -0
- package/dist/scanners/deploy/types.js +58 -0
- package/dist/scanners/deploy/types.js.map +1 -0
- package/dist/scanners/deploy/vercel-integration.d.ts +52 -0
- package/dist/scanners/deploy/vercel-integration.d.ts.map +1 -0
- package/dist/scanners/deploy/vercel-integration.js +280 -0
- package/dist/scanners/deploy/vercel-integration.js.map +1 -0
- package/dist/scanners/index.d.ts +4 -4
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +133 -15
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/index.test.js +6 -6
- package/dist/scanners/index.test.js.map +1 -1
- package/dist/scanners/openapi.d.ts +20 -0
- package/dist/scanners/openapi.d.ts.map +1 -0
- package/dist/scanners/openapi.js +226 -0
- package/dist/scanners/openapi.js.map +1 -0
- package/dist/scanners/runtime/app-launcher.d.ts +33 -0
- package/dist/scanners/runtime/app-launcher.d.ts.map +1 -0
- package/dist/scanners/runtime/app-launcher.js +419 -0
- package/dist/scanners/runtime/app-launcher.js.map +1 -0
- package/dist/scanners/runtime/golden-path-runner.d.ts +48 -0
- package/dist/scanners/runtime/golden-path-runner.d.ts.map +1 -0
- package/dist/scanners/runtime/golden-path-runner.js +373 -0
- package/dist/scanners/runtime/golden-path-runner.js.map +1 -0
- package/dist/scanners/runtime/index.d.ts +41 -0
- package/dist/scanners/runtime/index.d.ts.map +1 -0
- package/dist/scanners/runtime/index.js +164 -0
- package/dist/scanners/runtime/index.js.map +1 -0
- package/dist/scanners/runtime/playwright-executor.d.ts +50 -0
- package/dist/scanners/runtime/playwright-executor.d.ts.map +1 -0
- package/dist/scanners/runtime/playwright-executor.js +387 -0
- package/dist/scanners/runtime/playwright-executor.js.map +1 -0
- package/dist/scanners/runtime/types.d.ts +215 -0
- package/dist/scanners/runtime/types.d.ts.map +1 -0
- package/dist/scanners/runtime/types.js +40 -0
- package/dist/scanners/runtime/types.js.map +1 -0
- package/dist/scanners/rust.d.ts +22 -0
- package/dist/scanners/rust.d.ts.map +1 -0
- package/dist/scanners/rust.js +239 -0
- package/dist/scanners/rust.js.map +1 -0
- package/dist/scanners/scale/bottleneck-detector.d.ts +17 -0
- package/dist/scanners/scale/bottleneck-detector.d.ts.map +1 -0
- package/dist/scanners/scale/bottleneck-detector.js +250 -0
- package/dist/scanners/scale/bottleneck-detector.js.map +1 -0
- package/dist/scanners/scale/capacity-estimator.d.ts +17 -0
- package/dist/scanners/scale/capacity-estimator.d.ts.map +1 -0
- package/dist/scanners/scale/capacity-estimator.js +197 -0
- package/dist/scanners/scale/capacity-estimator.js.map +1 -0
- package/dist/scanners/scale/index.d.ts +37 -0
- package/dist/scanners/scale/index.d.ts.map +1 -0
- package/dist/scanners/scale/index.js +101 -0
- package/dist/scanners/scale/index.js.map +1 -0
- package/dist/scanners/scale/load-profiler.d.ts +48 -0
- package/dist/scanners/scale/load-profiler.d.ts.map +1 -0
- package/dist/scanners/scale/load-profiler.js +377 -0
- package/dist/scanners/scale/load-profiler.js.map +1 -0
- package/dist/scanners/scale/types.d.ts +529 -0
- package/dist/scanners/scale/types.d.ts.map +1 -0
- package/dist/scanners/scale/types.js +57 -0
- package/dist/scanners/scale/types.js.map +1 -0
- package/dist/scanners/secrets.d.ts.map +1 -1
- package/dist/scanners/secrets.js +13 -2
- package/dist/scanners/secrets.js.map +1 -1
- package/dist/scanners/terraform.d.ts +23 -0
- package/dist/scanners/terraform.d.ts.map +1 -0
- package/dist/scanners/terraform.js +207 -0
- package/dist/scanners/terraform.js.map +1 -0
- package/dist/scanners/types.d.ts +1 -1
- package/dist/scanners/types.d.ts.map +1 -1
- package/dist/scanners/types.js +8 -0
- package/dist/scanners/types.js.map +1 -1
- package/package.json +4 -2
- package/skills/vaspera-add-tests/SKILL.md +102 -0
- package/skills/vaspera-ai-verify/SKILL.md +166 -0
- package/skills/vaspera-audit/SKILL.md +67 -0
- package/skills/vaspera-certify/SKILL.md +130 -0
- package/skills/vaspera-deploy/SKILL.md +152 -0
- package/skills/vaspera-fix-critical/SKILL.md +52 -0
- package/skills/vaspera-fix-high/SKILL.md +81 -0
- package/skills/vaspera-fix-medium/SKILL.md +56 -0
- package/skills/vaspera-fix-rls/SKILL.md +85 -0
- package/skills/vaspera-harden/SKILL.md +102 -0
- package/skills/vaspera-help/SKILL.md +61 -0
- package/skills/vaspera-load-test/SKILL.md +167 -0
- package/skills/vaspera-verify/SKILL.md +70 -0
- package/skills/vaspera-verify-e2e/SKILL.md +117 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vercel Integration
|
|
3
|
+
*
|
|
4
|
+
* Integration with Vercel for deployment verification.
|
|
5
|
+
* Uses the Vercel API for deployment status, promotion, and rollback.
|
|
6
|
+
*
|
|
7
|
+
* @module scanners/deploy/vercel-integration
|
|
8
|
+
*/
|
|
9
|
+
import type { DeploymentInfo, CanaryAnalysis } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Check if Vercel integration is available
|
|
12
|
+
*/
|
|
13
|
+
export declare function isVercelAvailable(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Get latest deployment for a project
|
|
16
|
+
*/
|
|
17
|
+
export declare function getLatestDeployment(projectId: string, options?: {
|
|
18
|
+
target?: string;
|
|
19
|
+
}): Promise<DeploymentInfo | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Get deployment by ID
|
|
22
|
+
*/
|
|
23
|
+
export declare function getDeployment(deploymentId: string): Promise<DeploymentInfo | null>;
|
|
24
|
+
/**
|
|
25
|
+
* List recent deployments
|
|
26
|
+
*/
|
|
27
|
+
export declare function listDeployments(projectId: string, options?: {
|
|
28
|
+
limit?: number;
|
|
29
|
+
target?: string;
|
|
30
|
+
}): Promise<DeploymentInfo[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Promote a preview deployment to production
|
|
33
|
+
*/
|
|
34
|
+
export declare function promoteToProduction(deploymentId: string, projectId: string): Promise<{
|
|
35
|
+
success: boolean;
|
|
36
|
+
error?: string;
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Rollback to a previous deployment
|
|
40
|
+
*/
|
|
41
|
+
export declare function rollback(projectId: string, deploymentId: string): Promise<{
|
|
42
|
+
success: boolean;
|
|
43
|
+
error?: string;
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Analyze canary deployment (simulated - would use Vercel Edge Config in production)
|
|
47
|
+
*/
|
|
48
|
+
export declare function analyzeCanary(deploymentUrl: string, options?: {
|
|
49
|
+
duration?: number;
|
|
50
|
+
checkInterval?: number;
|
|
51
|
+
}): Promise<CanaryAnalysis>;
|
|
52
|
+
//# sourceMappingURL=vercel-integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel-integration.d.ts","sourceRoot":"","sources":["../../../src/scanners/deploy/vercel-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EACV,cAAc,EAGd,cAAc,EACf,MAAM,YAAY,CAAC;AAWpB;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAkED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA8ChC;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA8BxF;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC,cAAc,EAAE,CAAC,CAkC3B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB/C;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAG/C;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GACL,OAAO,CAAC,cAAc,CAAC,CA2DzB"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vercel Integration
|
|
3
|
+
*
|
|
4
|
+
* Integration with Vercel for deployment verification.
|
|
5
|
+
* Uses the Vercel API for deployment status, promotion, and rollback.
|
|
6
|
+
*
|
|
7
|
+
* @module scanners/deploy/vercel-integration
|
|
8
|
+
*/
|
|
9
|
+
import { logger } from "../../logger.js";
|
|
10
|
+
const VERCEL_API_BASE = "https://api.vercel.com";
|
|
11
|
+
/**
|
|
12
|
+
* Get Vercel API token from environment
|
|
13
|
+
*/
|
|
14
|
+
function getVercelToken() {
|
|
15
|
+
return process.env.VERCEL_TOKEN || process.env.VERCEL_ACCESS_TOKEN;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check if Vercel integration is available
|
|
19
|
+
*/
|
|
20
|
+
export function isVercelAvailable() {
|
|
21
|
+
return !!getVercelToken();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Make authenticated request to Vercel API
|
|
25
|
+
*/
|
|
26
|
+
async function vercelFetch(endpoint, options = {}) {
|
|
27
|
+
const token = getVercelToken();
|
|
28
|
+
if (!token) {
|
|
29
|
+
throw new Error("VERCEL_TOKEN not configured");
|
|
30
|
+
}
|
|
31
|
+
const url = `${VERCEL_API_BASE}${endpoint}`;
|
|
32
|
+
const response = await fetch(url, {
|
|
33
|
+
...options,
|
|
34
|
+
headers: {
|
|
35
|
+
Authorization: `Bearer ${token}`,
|
|
36
|
+
"Content-Type": "application/json",
|
|
37
|
+
...options.headers,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
return response;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Map Vercel status to our status
|
|
44
|
+
*/
|
|
45
|
+
function mapVercelStatus(state) {
|
|
46
|
+
switch (state) {
|
|
47
|
+
case "QUEUED":
|
|
48
|
+
case "INITIALIZING":
|
|
49
|
+
return "pending";
|
|
50
|
+
case "BUILDING":
|
|
51
|
+
return "building";
|
|
52
|
+
case "DEPLOYING":
|
|
53
|
+
return "deploying";
|
|
54
|
+
case "READY":
|
|
55
|
+
return "ready";
|
|
56
|
+
case "ERROR":
|
|
57
|
+
return "failed";
|
|
58
|
+
case "CANCELED":
|
|
59
|
+
return "canceled";
|
|
60
|
+
default:
|
|
61
|
+
return "pending";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Map Vercel target to environment
|
|
66
|
+
*/
|
|
67
|
+
function mapVercelTarget(target) {
|
|
68
|
+
switch (target) {
|
|
69
|
+
case "production":
|
|
70
|
+
return "production";
|
|
71
|
+
case "preview":
|
|
72
|
+
return "preview";
|
|
73
|
+
case "development":
|
|
74
|
+
return "development";
|
|
75
|
+
default:
|
|
76
|
+
return "preview";
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get latest deployment for a project
|
|
81
|
+
*/
|
|
82
|
+
export async function getLatestDeployment(projectId, options = {}) {
|
|
83
|
+
try {
|
|
84
|
+
const params = new URLSearchParams({
|
|
85
|
+
projectId,
|
|
86
|
+
limit: "1",
|
|
87
|
+
...(options.target && { target: options.target }),
|
|
88
|
+
});
|
|
89
|
+
const response = await vercelFetch(`/v6/deployments?${params}`);
|
|
90
|
+
if (!response.ok) {
|
|
91
|
+
const error = await response.json();
|
|
92
|
+
logger.error("deploy.vercel_api_error", {
|
|
93
|
+
status: response.status,
|
|
94
|
+
error: error.error?.message,
|
|
95
|
+
});
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const data = await response.json();
|
|
99
|
+
const deployment = data.deployments?.[0];
|
|
100
|
+
if (!deployment)
|
|
101
|
+
return null;
|
|
102
|
+
return {
|
|
103
|
+
id: deployment.uid,
|
|
104
|
+
provider: "vercel",
|
|
105
|
+
environment: mapVercelTarget(deployment.target),
|
|
106
|
+
status: mapVercelStatus(deployment.state),
|
|
107
|
+
url: `https://${deployment.url}`,
|
|
108
|
+
createdAt: new Date(deployment.created).toISOString(),
|
|
109
|
+
readyAt: deployment.ready ? new Date(deployment.ready).toISOString() : undefined,
|
|
110
|
+
meta: {
|
|
111
|
+
commit: deployment.meta?.githubCommitSha,
|
|
112
|
+
branch: deployment.meta?.githubCommitRef,
|
|
113
|
+
buildTime: deployment.buildingAt && deployment.ready
|
|
114
|
+
? deployment.ready - deployment.buildingAt
|
|
115
|
+
: undefined,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
logger.error("deploy.vercel_get_deployment_error", {
|
|
121
|
+
error: error.message,
|
|
122
|
+
});
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get deployment by ID
|
|
128
|
+
*/
|
|
129
|
+
export async function getDeployment(deploymentId) {
|
|
130
|
+
try {
|
|
131
|
+
const response = await vercelFetch(`/v13/deployments/${deploymentId}`);
|
|
132
|
+
if (!response.ok) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const deployment = await response.json();
|
|
136
|
+
return {
|
|
137
|
+
id: deployment.id,
|
|
138
|
+
provider: "vercel",
|
|
139
|
+
environment: mapVercelTarget(deployment.target),
|
|
140
|
+
status: mapVercelStatus(deployment.readyState),
|
|
141
|
+
url: `https://${deployment.url}`,
|
|
142
|
+
createdAt: new Date(deployment.createdAt).toISOString(),
|
|
143
|
+
readyAt: deployment.ready ? new Date(deployment.ready).toISOString() : undefined,
|
|
144
|
+
meta: {
|
|
145
|
+
commit: deployment.meta?.githubCommitSha,
|
|
146
|
+
branch: deployment.meta?.githubCommitRef,
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
logger.error("deploy.vercel_get_deployment_error", {
|
|
152
|
+
deploymentId,
|
|
153
|
+
error: error.message,
|
|
154
|
+
});
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* List recent deployments
|
|
160
|
+
*/
|
|
161
|
+
export async function listDeployments(projectId, options = {}) {
|
|
162
|
+
try {
|
|
163
|
+
const params = new URLSearchParams({
|
|
164
|
+
projectId,
|
|
165
|
+
limit: String(options.limit || 10),
|
|
166
|
+
...(options.target && { target: options.target }),
|
|
167
|
+
});
|
|
168
|
+
const response = await vercelFetch(`/v6/deployments?${params}`);
|
|
169
|
+
if (!response.ok) {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
const data = await response.json();
|
|
173
|
+
return (data.deployments || []).map((deployment) => ({
|
|
174
|
+
id: deployment.uid,
|
|
175
|
+
provider: "vercel",
|
|
176
|
+
environment: mapVercelTarget(deployment.target),
|
|
177
|
+
status: mapVercelStatus(deployment.state),
|
|
178
|
+
url: `https://${deployment.url}`,
|
|
179
|
+
createdAt: new Date(deployment.created).toISOString(),
|
|
180
|
+
meta: {
|
|
181
|
+
commit: deployment.meta?.githubCommitSha,
|
|
182
|
+
branch: deployment.meta?.githubCommitRef,
|
|
183
|
+
},
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
logger.error("deploy.vercel_list_deployments_error", {
|
|
188
|
+
error: error.message,
|
|
189
|
+
});
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Promote a preview deployment to production
|
|
195
|
+
*/
|
|
196
|
+
export async function promoteToProduction(deploymentId, projectId) {
|
|
197
|
+
try {
|
|
198
|
+
const response = await vercelFetch(`/v10/projects/${projectId}/promote/${deploymentId}`, {
|
|
199
|
+
method: "POST",
|
|
200
|
+
});
|
|
201
|
+
if (!response.ok) {
|
|
202
|
+
const error = await response.json();
|
|
203
|
+
return {
|
|
204
|
+
success: false,
|
|
205
|
+
error: error.error?.message || "Promotion failed",
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
logger.info("deploy.vercel_promoted", { deploymentId, projectId });
|
|
209
|
+
return { success: true };
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
return {
|
|
213
|
+
success: false,
|
|
214
|
+
error: error.message,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Rollback to a previous deployment
|
|
220
|
+
*/
|
|
221
|
+
export async function rollback(projectId, deploymentId) {
|
|
222
|
+
// Vercel rollback is essentially promoting an older deployment
|
|
223
|
+
return promoteToProduction(deploymentId, projectId);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Analyze canary deployment (simulated - would use Vercel Edge Config in production)
|
|
227
|
+
*/
|
|
228
|
+
export async function analyzeCanary(deploymentUrl, options = {}) {
|
|
229
|
+
const { duration = 60000, checkInterval = 5000 } = options;
|
|
230
|
+
const startTime = Date.now();
|
|
231
|
+
const checks = [];
|
|
232
|
+
logger.info("deploy.canary_analysis_started", { deploymentUrl, duration });
|
|
233
|
+
// Run health checks for the duration
|
|
234
|
+
while (Date.now() - startTime < duration) {
|
|
235
|
+
try {
|
|
236
|
+
const checkStart = Date.now();
|
|
237
|
+
const response = await fetch(deploymentUrl, {
|
|
238
|
+
signal: AbortSignal.timeout(5000),
|
|
239
|
+
});
|
|
240
|
+
const latency = Date.now() - checkStart;
|
|
241
|
+
checks.push({
|
|
242
|
+
success: response.ok,
|
|
243
|
+
latency,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
checks.push({ success: false, latency: 5000 });
|
|
248
|
+
}
|
|
249
|
+
await new Promise((resolve) => setTimeout(resolve, checkInterval));
|
|
250
|
+
}
|
|
251
|
+
// Calculate metrics
|
|
252
|
+
const successfulChecks = checks.filter((c) => c.success);
|
|
253
|
+
const errorRate = 1 - (successfulChecks.length / checks.length);
|
|
254
|
+
const latencies = successfulChecks.map((c) => c.latency).sort((a, b) => a - b);
|
|
255
|
+
const p95Index = Math.floor(latencies.length * 0.95);
|
|
256
|
+
const p95Latency = latencies[p95Index] || 0;
|
|
257
|
+
const thresholdsPassed = errorRate < 0.01 && p95Latency < 500;
|
|
258
|
+
const analysis = {
|
|
259
|
+
phase: thresholdsPassed ? "passed" : "failed",
|
|
260
|
+
trafficPercent: 10, // Simulated
|
|
261
|
+
duration: Date.now() - startTime,
|
|
262
|
+
metrics: {
|
|
263
|
+
errorRate,
|
|
264
|
+
p95Latency,
|
|
265
|
+
requestCount: checks.length,
|
|
266
|
+
healthChecksPassed: successfulChecks.length,
|
|
267
|
+
healthChecksFailed: checks.length - successfulChecks.length,
|
|
268
|
+
},
|
|
269
|
+
thresholdsPassed,
|
|
270
|
+
recommendation: thresholdsPassed ? "promote" : "rollback",
|
|
271
|
+
};
|
|
272
|
+
logger.info("deploy.canary_analysis_completed", {
|
|
273
|
+
phase: analysis.phase,
|
|
274
|
+
errorRate,
|
|
275
|
+
p95Latency,
|
|
276
|
+
recommendation: analysis.recommendation,
|
|
277
|
+
});
|
|
278
|
+
return analysis;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=vercel-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel-integration.js","sourceRoot":"","sources":["../../../src/scanners/deploy/vercel-integration.ts"],"names":[],"mappings":"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"}
|
package/dist/scanners/index.d.ts
CHANGED
|
@@ -20,6 +20,10 @@ export { runBinaryAnalysis, checkBinaryAnalysisAvailable, detectNativeModules }
|
|
|
20
20
|
export { runMemorySafetyAnalysis, checkCppcheckAvailable, checkCargoGeigerAvailable, detectUnsafeLanguages } from "./memory-safety.js";
|
|
21
21
|
export { runRaceConditionAnalysis } from "./race-condition.js";
|
|
22
22
|
export { runHealthcareScanner, isHealthcareProject } from "./healthcare.js";
|
|
23
|
+
export { runTfsec, runCheckov, runTerraformScanners, checkTfsecAvailable, checkCheckovAvailable, detectTerraform } from "./terraform.js";
|
|
24
|
+
export { runSpectral, runOpenAPIScan, checkSpectralAvailable, findOpenAPISpecs, detectOpenAPI } from "./openapi.js";
|
|
25
|
+
export { runCargoAudit, runClippy, runRustScanners, checkCargoAuditAvailable, checkClippyAvailable, detectRust } from "./rust.js";
|
|
26
|
+
export { runNuclei, runDASTScan, runQuickDASTScan, checkNucleiAvailable, generateDASTReport, formatDASTReport } from "./dast.js";
|
|
23
27
|
import type { AggregatedScanResult, ScannerOptions, ScannerType } from "./types.js";
|
|
24
28
|
import type { Severity } from "../certification/types.js";
|
|
25
29
|
/**
|
|
@@ -54,10 +58,6 @@ export declare function detectJava(projectPath: string): Promise<boolean>;
|
|
|
54
58
|
* Detect if project uses Docker
|
|
55
59
|
*/
|
|
56
60
|
export declare function detectDocker(projectPath: string): Promise<boolean>;
|
|
57
|
-
/**
|
|
58
|
-
* Detect if project uses Terraform
|
|
59
|
-
*/
|
|
60
|
-
export declare function detectTerraform(projectPath: string): Promise<boolean>;
|
|
61
61
|
/**
|
|
62
62
|
* Detect all project languages and technologies
|
|
63
63
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5G,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACvI,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"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"}
|
package/dist/scanners/index.js
CHANGED
|
@@ -22,6 +22,14 @@ export { runMemorySafetyAnalysis, checkCppcheckAvailable, checkCargoGeigerAvaila
|
|
|
22
22
|
export { runRaceConditionAnalysis } from "./race-condition.js";
|
|
23
23
|
// Healthcare compliance scanner (HIPAA, 42 CFR Part 2)
|
|
24
24
|
export { runHealthcareScanner, isHealthcareProject } from "./healthcare.js";
|
|
25
|
+
// IaC scanners (Terraform, Pulumi, CloudFormation)
|
|
26
|
+
export { runTfsec, runCheckov, runTerraformScanners, checkTfsecAvailable, checkCheckovAvailable, detectTerraform } from "./terraform.js";
|
|
27
|
+
// OpenAPI/Swagger security scanner
|
|
28
|
+
export { runSpectral, runOpenAPIScan, checkSpectralAvailable, findOpenAPISpecs, detectOpenAPI } from "./openapi.js";
|
|
29
|
+
// Rust security scanner
|
|
30
|
+
export { runCargoAudit, runClippy, runRustScanners, checkCargoAuditAvailable, checkClippyAvailable, detectRust } from "./rust.js";
|
|
31
|
+
// DAST scanner (Nuclei)
|
|
32
|
+
export { runNuclei, runDASTScan, runQuickDASTScan, checkNucleiAvailable, generateDASTReport, formatDASTReport } from "./dast.js";
|
|
25
33
|
import { DEFAULT_SCANNER_OPTIONS } from "./types.js";
|
|
26
34
|
import { runDependencyAudit } from "./dependencies.js";
|
|
27
35
|
import { runTypeScriptAnalysis } from "./typescript.js";
|
|
@@ -32,6 +40,7 @@ import { runGosec, detectGo } from "./gosec.js";
|
|
|
32
40
|
import { runTrivy } from "./trivy.js";
|
|
33
41
|
import { runEslint } from "./eslint.js";
|
|
34
42
|
import { runBrakeman } from "./brakeman.js";
|
|
43
|
+
import { detectTerraform } from "./terraform.js";
|
|
35
44
|
import { logger } from "../logger.js";
|
|
36
45
|
import { access } from "fs/promises";
|
|
37
46
|
import { join } from "path";
|
|
@@ -116,6 +125,14 @@ export async function runAllScanners(projectPath, options) {
|
|
|
116
125
|
dast: 0,
|
|
117
126
|
zap: 0,
|
|
118
127
|
nuclei: 0,
|
|
128
|
+
terraform: 0,
|
|
129
|
+
tfsec: 0,
|
|
130
|
+
checkov: 0,
|
|
131
|
+
openapi: 0,
|
|
132
|
+
spectral: 0,
|
|
133
|
+
rust: 0,
|
|
134
|
+
"cargo-audit": 0,
|
|
135
|
+
clippy: 0,
|
|
119
136
|
plugin: 0,
|
|
120
137
|
};
|
|
121
138
|
for (const finding of allFindings) {
|
|
@@ -233,18 +250,6 @@ export async function detectDocker(projectPath) {
|
|
|
233
250
|
return false;
|
|
234
251
|
}
|
|
235
252
|
}
|
|
236
|
-
/**
|
|
237
|
-
* Detect if project uses Terraform
|
|
238
|
-
*/
|
|
239
|
-
export async function detectTerraform(projectPath) {
|
|
240
|
-
try {
|
|
241
|
-
const { stdout } = await execAsync(`find "${projectPath}" -maxdepth 3 -name "*.tf" | head -1`, { timeout: 5000 });
|
|
242
|
-
return stdout.trim().length > 0;
|
|
243
|
-
}
|
|
244
|
-
catch {
|
|
245
|
-
return false;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
253
|
/**
|
|
249
254
|
* Detect all project languages and technologies
|
|
250
255
|
*/
|
|
@@ -435,6 +440,14 @@ async function runAllScannersExtended(projectPath, options) {
|
|
|
435
440
|
dast: 0,
|
|
436
441
|
zap: 0,
|
|
437
442
|
nuclei: 0,
|
|
443
|
+
terraform: 0,
|
|
444
|
+
tfsec: 0,
|
|
445
|
+
checkov: 0,
|
|
446
|
+
openapi: 0,
|
|
447
|
+
spectral: 0,
|
|
448
|
+
rust: 0,
|
|
449
|
+
"cargo-audit": 0,
|
|
450
|
+
clippy: 0,
|
|
438
451
|
plugin: 0,
|
|
439
452
|
};
|
|
440
453
|
for (const finding of allFindings) {
|
|
@@ -501,7 +514,7 @@ function deduplicateFindings(findings) {
|
|
|
501
514
|
* Check which scanners are available
|
|
502
515
|
*/
|
|
503
516
|
export async function checkScannersAvailable() {
|
|
504
|
-
const [npm, semgrep, gitleaks, bandit, gosec, trivy, eslint, brakeman, binaryTools] = await Promise.all([
|
|
517
|
+
const [npm, semgrep, gitleaks, bandit, gosec, trivy, eslint, brakeman, binaryTools, tfsec, checkov, spectral, cargoAudit, clippy, nuclei] = await Promise.all([
|
|
505
518
|
import("./dependencies.js").then((m) => m.checkNpmAvailable()),
|
|
506
519
|
import("./semgrep.js").then((m) => m.checkSemgrepAvailable()),
|
|
507
520
|
import("./secrets.js").then((m) => m.checkGitleaksAvailable()),
|
|
@@ -511,6 +524,12 @@ export async function checkScannersAvailable() {
|
|
|
511
524
|
import("./eslint.js").then((m) => m.checkEslintAvailable()),
|
|
512
525
|
import("./brakeman.js").then((m) => m.checkBrakemanAvailable()),
|
|
513
526
|
import("./binary-analysis.js").then((m) => m.checkBinaryAnalysisAvailable()),
|
|
527
|
+
import("./terraform.js").then((m) => m.checkTfsecAvailable()),
|
|
528
|
+
import("./terraform.js").then((m) => m.checkCheckovAvailable()),
|
|
529
|
+
import("./openapi.js").then((m) => m.checkSpectralAvailable()),
|
|
530
|
+
import("./rust.js").then((m) => m.checkCargoAuditAvailable()),
|
|
531
|
+
import("./rust.js").then((m) => m.checkClippyAvailable()),
|
|
532
|
+
import("./dast.js").then((m) => m.checkNucleiAvailable()),
|
|
514
533
|
]);
|
|
515
534
|
// Binary analysis is available if any of its tools are available
|
|
516
535
|
const binaryAvailable = binaryTools.checksec || binaryTools.nm || binaryTools.file;
|
|
@@ -529,9 +548,17 @@ export async function checkScannersAvailable() {
|
|
|
529
548
|
"race-condition": { available: true, version: "1.0.0" }, // Pattern-based analysis always available
|
|
530
549
|
healthcare: { available: true, version: "1.0.0" }, // Pattern-based PHI/consent analysis always available
|
|
531
550
|
logic: { available: true, version: "1.0.0" }, // Logic flow analysis always available
|
|
532
|
-
dast: { available:
|
|
551
|
+
dast: { available: nuclei.available, version: nuclei.version, error: nuclei.error },
|
|
533
552
|
zap: { available: false, version: undefined, error: "ZAP not installed" },
|
|
534
|
-
nuclei: { available:
|
|
553
|
+
nuclei: { available: nuclei.available, version: nuclei.version, error: nuclei.error },
|
|
554
|
+
terraform: { available: tfsec.available || checkov.available, version: tfsec.version || checkov.version },
|
|
555
|
+
tfsec: { available: tfsec.available, version: tfsec.version, error: tfsec.error },
|
|
556
|
+
checkov: { available: checkov.available, version: checkov.version, error: checkov.error },
|
|
557
|
+
openapi: { available: spectral.available, version: spectral.version, error: spectral.error },
|
|
558
|
+
spectral: { available: spectral.available, version: spectral.version, error: spectral.error },
|
|
559
|
+
rust: { available: cargoAudit.available || clippy.available, version: cargoAudit.version || clippy.version },
|
|
560
|
+
"cargo-audit": { available: cargoAudit.available, version: cargoAudit.version, error: cargoAudit.error },
|
|
561
|
+
clippy: { available: clippy.available, version: clippy.version, error: clippy.error },
|
|
535
562
|
plugin: { available: true, version: "1.0.0" }, // Plugin loader is always available
|
|
536
563
|
};
|
|
537
564
|
}
|
|
@@ -716,6 +743,89 @@ export function getScannerInstallCommands() {
|
|
|
716
743
|
},
|
|
717
744
|
documentation: "https://nuclei.projectdiscovery.io/",
|
|
718
745
|
},
|
|
746
|
+
terraform: {
|
|
747
|
+
name: "Terraform Scanner",
|
|
748
|
+
description: "Combined IaC security scanner (tfsec + checkov)",
|
|
749
|
+
installCommands: {
|
|
750
|
+
macos: "brew install tfsec && pip install checkov",
|
|
751
|
+
linux: "brew install tfsec && pip install checkov",
|
|
752
|
+
windows: "choco install tfsec && pip install checkov",
|
|
753
|
+
},
|
|
754
|
+
documentation: "https://github.com/vaspera/hardening-mcp#terraform",
|
|
755
|
+
},
|
|
756
|
+
tfsec: {
|
|
757
|
+
name: "tfsec",
|
|
758
|
+
description: "Terraform static analysis security scanner",
|
|
759
|
+
installCommands: {
|
|
760
|
+
macos: "brew install tfsec",
|
|
761
|
+
linux: "brew install tfsec",
|
|
762
|
+
windows: "choco install tfsec",
|
|
763
|
+
},
|
|
764
|
+
documentation: "https://aquasecurity.github.io/tfsec/",
|
|
765
|
+
},
|
|
766
|
+
checkov: {
|
|
767
|
+
name: "Checkov",
|
|
768
|
+
description: "IaC static analysis for Terraform, CloudFormation, Pulumi",
|
|
769
|
+
installCommands: {
|
|
770
|
+
macos: "pip install checkov",
|
|
771
|
+
linux: "pip install checkov",
|
|
772
|
+
windows: "pip install checkov",
|
|
773
|
+
pip: "pip install checkov",
|
|
774
|
+
},
|
|
775
|
+
documentation: "https://www.checkov.io/",
|
|
776
|
+
},
|
|
777
|
+
openapi: {
|
|
778
|
+
name: "OpenAPI Scanner",
|
|
779
|
+
description: "OpenAPI/Swagger security validation using Spectral",
|
|
780
|
+
installCommands: {
|
|
781
|
+
macos: "npm install -g @stoplight/spectral-cli",
|
|
782
|
+
linux: "npm install -g @stoplight/spectral-cli",
|
|
783
|
+
windows: "npm install -g @stoplight/spectral-cli",
|
|
784
|
+
npm: "npm install -g @stoplight/spectral-cli",
|
|
785
|
+
},
|
|
786
|
+
documentation: "https://github.com/vaspera/hardening-mcp#openapi",
|
|
787
|
+
},
|
|
788
|
+
spectral: {
|
|
789
|
+
name: "Spectral",
|
|
790
|
+
description: "OpenAPI/AsyncAPI linting with custom rulesets",
|
|
791
|
+
installCommands: {
|
|
792
|
+
macos: "npm install -g @stoplight/spectral-cli",
|
|
793
|
+
linux: "npm install -g @stoplight/spectral-cli",
|
|
794
|
+
windows: "npm install -g @stoplight/spectral-cli",
|
|
795
|
+
npm: "npm install -g @stoplight/spectral-cli",
|
|
796
|
+
},
|
|
797
|
+
documentation: "https://stoplight.io/open-source/spectral",
|
|
798
|
+
},
|
|
799
|
+
rust: {
|
|
800
|
+
name: "Rust Scanner",
|
|
801
|
+
description: "Combined Rust security scanner (cargo-audit + clippy)",
|
|
802
|
+
installCommands: {
|
|
803
|
+
macos: "cargo install cargo-audit && rustup component add clippy",
|
|
804
|
+
linux: "cargo install cargo-audit && rustup component add clippy",
|
|
805
|
+
windows: "cargo install cargo-audit && rustup component add clippy",
|
|
806
|
+
},
|
|
807
|
+
documentation: "https://github.com/vaspera/hardening-mcp#rust",
|
|
808
|
+
},
|
|
809
|
+
"cargo-audit": {
|
|
810
|
+
name: "cargo-audit",
|
|
811
|
+
description: "Audit Rust dependencies for security vulnerabilities",
|
|
812
|
+
installCommands: {
|
|
813
|
+
macos: "cargo install cargo-audit",
|
|
814
|
+
linux: "cargo install cargo-audit",
|
|
815
|
+
windows: "cargo install cargo-audit",
|
|
816
|
+
},
|
|
817
|
+
documentation: "https://github.com/rustsec/rustsec",
|
|
818
|
+
},
|
|
819
|
+
clippy: {
|
|
820
|
+
name: "Clippy",
|
|
821
|
+
description: "Rust linter with security-relevant checks",
|
|
822
|
+
installCommands: {
|
|
823
|
+
macos: "rustup component add clippy",
|
|
824
|
+
linux: "rustup component add clippy",
|
|
825
|
+
windows: "rustup component add clippy",
|
|
826
|
+
},
|
|
827
|
+
documentation: "https://github.com/rust-lang/rust-clippy",
|
|
828
|
+
},
|
|
719
829
|
plugin: {
|
|
720
830
|
name: "Custom Plugin",
|
|
721
831
|
description: "Custom scanner plugin loaded from .vaspera/plugins/",
|
|
@@ -764,6 +874,14 @@ export function scannerFindingsToCertificationFindings(scanResult) {
|
|
|
764
874
|
dast: "dst",
|
|
765
875
|
zap: "zap",
|
|
766
876
|
nuclei: "nuc",
|
|
877
|
+
terraform: "tf",
|
|
878
|
+
tfsec: "tfs",
|
|
879
|
+
checkov: "chk",
|
|
880
|
+
openapi: "api",
|
|
881
|
+
spectral: "spc",
|
|
882
|
+
rust: "rs",
|
|
883
|
+
"cargo-audit": "cra",
|
|
884
|
+
clippy: "clp",
|
|
767
885
|
};
|
|
768
886
|
const prefix = prefixMap[scanner];
|
|
769
887
|
for (let i = 0; i < scannerFindings.length; i++) {
|