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.
Files changed (206) hide show
  1. package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts +2 -0
  2. package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts.map +1 -0
  3. package/dist/__tests__/scanners/ai-code/ai-detector.test.js +188 -0
  4. package/dist/__tests__/scanners/ai-code/ai-detector.test.js.map +1 -0
  5. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts +2 -0
  6. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts.map +1 -0
  7. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js +363 -0
  8. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js.map +1 -0
  9. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts +2 -0
  10. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts.map +1 -0
  11. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js +226 -0
  12. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js.map +1 -0
  13. package/dist/__tests__/scanners/ai-code/index.test.d.ts +2 -0
  14. package/dist/__tests__/scanners/ai-code/index.test.d.ts.map +1 -0
  15. package/dist/__tests__/scanners/ai-code/index.test.js +214 -0
  16. package/dist/__tests__/scanners/ai-code/index.test.js.map +1 -0
  17. package/dist/__tests__/scanners/deploy/health-checker.test.d.ts +2 -0
  18. package/dist/__tests__/scanners/deploy/health-checker.test.d.ts.map +1 -0
  19. package/dist/__tests__/scanners/deploy/health-checker.test.js +67 -0
  20. package/dist/__tests__/scanners/deploy/health-checker.test.js.map +1 -0
  21. package/dist/__tests__/scanners/deploy/index.test.d.ts +2 -0
  22. package/dist/__tests__/scanners/deploy/index.test.d.ts.map +1 -0
  23. package/dist/__tests__/scanners/deploy/index.test.js +84 -0
  24. package/dist/__tests__/scanners/deploy/index.test.js.map +1 -0
  25. package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts +2 -0
  26. package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts.map +1 -0
  27. package/dist/__tests__/scanners/deploy/provider-detector.test.js +88 -0
  28. package/dist/__tests__/scanners/deploy/provider-detector.test.js.map +1 -0
  29. package/dist/__tests__/scanners/deploy/types.test.d.ts +2 -0
  30. package/dist/__tests__/scanners/deploy/types.test.d.ts.map +1 -0
  31. package/dist/__tests__/scanners/deploy/types.test.js +126 -0
  32. package/dist/__tests__/scanners/deploy/types.test.js.map +1 -0
  33. package/dist/__tests__/scanners/fp-feedback.test.js +1 -1
  34. package/dist/__tests__/scanners/fp-feedback.test.js.map +1 -1
  35. package/dist/__tests__/scanners/fp-tracker.test.js +1 -1
  36. package/dist/__tests__/scanners/fp-tracker.test.js.map +1 -1
  37. package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts +2 -0
  38. package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts.map +1 -0
  39. package/dist/__tests__/scanners/runtime/app-launcher.test.js +94 -0
  40. package/dist/__tests__/scanners/runtime/app-launcher.test.js.map +1 -0
  41. package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts +2 -0
  42. package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts.map +1 -0
  43. package/dist/__tests__/scanners/runtime/golden-path-runner.test.js +195 -0
  44. package/dist/__tests__/scanners/runtime/golden-path-runner.test.js.map +1 -0
  45. package/dist/__tests__/scanners/runtime/index.test.d.ts +2 -0
  46. package/dist/__tests__/scanners/runtime/index.test.d.ts.map +1 -0
  47. package/dist/__tests__/scanners/runtime/index.test.js +120 -0
  48. package/dist/__tests__/scanners/runtime/index.test.js.map +1 -0
  49. package/dist/__tests__/scanners/runtime/types.test.d.ts +2 -0
  50. package/dist/__tests__/scanners/runtime/types.test.d.ts.map +1 -0
  51. package/dist/__tests__/scanners/runtime/types.test.js +126 -0
  52. package/dist/__tests__/scanners/runtime/types.test.js.map +1 -0
  53. package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts +2 -0
  54. package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts.map +1 -0
  55. package/dist/__tests__/scanners/scale/bottleneck-detector.test.js +187 -0
  56. package/dist/__tests__/scanners/scale/bottleneck-detector.test.js.map +1 -0
  57. package/dist/__tests__/scanners/scale/index.test.d.ts +2 -0
  58. package/dist/__tests__/scanners/scale/index.test.d.ts.map +1 -0
  59. package/dist/__tests__/scanners/scale/index.test.js +87 -0
  60. package/dist/__tests__/scanners/scale/index.test.js.map +1 -0
  61. package/dist/__tests__/scanners/scale/load-profiler.test.d.ts +2 -0
  62. package/dist/__tests__/scanners/scale/load-profiler.test.d.ts.map +1 -0
  63. package/dist/__tests__/scanners/scale/load-profiler.test.js +122 -0
  64. package/dist/__tests__/scanners/scale/load-profiler.test.js.map +1 -0
  65. package/dist/__tests__/scanners/scale/types.test.d.ts +2 -0
  66. package/dist/__tests__/scanners/scale/types.test.d.ts.map +1 -0
  67. package/dist/__tests__/scanners/scale/types.test.js +129 -0
  68. package/dist/__tests__/scanners/scale/types.test.js.map +1 -0
  69. package/dist/action/pr-comment.test.js +8 -0
  70. package/dist/action/pr-comment.test.js.map +1 -1
  71. package/dist/action/sarif-upload.test.js +8 -0
  72. package/dist/action/sarif-upload.test.js.map +1 -1
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +874 -0
  75. package/dist/index.js.map +1 -1
  76. package/dist/install-skills.d.ts +11 -0
  77. package/dist/install-skills.d.ts.map +1 -0
  78. package/dist/install-skills.js +81 -0
  79. package/dist/install-skills.js.map +1 -0
  80. package/dist/scanners/ai-code/ai-detector.d.ts +25 -0
  81. package/dist/scanners/ai-code/ai-detector.d.ts.map +1 -0
  82. package/dist/scanners/ai-code/ai-detector.js +192 -0
  83. package/dist/scanners/ai-code/ai-detector.js.map +1 -0
  84. package/dist/scanners/ai-code/confidence-scorer.d.ts +40 -0
  85. package/dist/scanners/ai-code/confidence-scorer.d.ts.map +1 -0
  86. package/dist/scanners/ai-code/confidence-scorer.js +148 -0
  87. package/dist/scanners/ai-code/confidence-scorer.js.map +1 -0
  88. package/dist/scanners/ai-code/hallucination-checker.d.ts +36 -0
  89. package/dist/scanners/ai-code/hallucination-checker.d.ts.map +1 -0
  90. package/dist/scanners/ai-code/hallucination-checker.js +298 -0
  91. package/dist/scanners/ai-code/hallucination-checker.js.map +1 -0
  92. package/dist/scanners/ai-code/index.d.ts +30 -0
  93. package/dist/scanners/ai-code/index.d.ts.map +1 -0
  94. package/dist/scanners/ai-code/index.js +224 -0
  95. package/dist/scanners/ai-code/index.js.map +1 -0
  96. package/dist/scanners/ai-code/types.d.ts +192 -0
  97. package/dist/scanners/ai-code/types.d.ts.map +1 -0
  98. package/dist/scanners/ai-code/types.js +37 -0
  99. package/dist/scanners/ai-code/types.js.map +1 -0
  100. package/dist/scanners/cache.d.ts.map +1 -1
  101. package/dist/scanners/cache.js +8 -0
  102. package/dist/scanners/cache.js.map +1 -1
  103. package/dist/scanners/dast.d.ts +40 -0
  104. package/dist/scanners/dast.d.ts.map +1 -0
  105. package/dist/scanners/dast.js +228 -0
  106. package/dist/scanners/dast.js.map +1 -0
  107. package/dist/scanners/deploy/health-checker.d.ts +38 -0
  108. package/dist/scanners/deploy/health-checker.d.ts.map +1 -0
  109. package/dist/scanners/deploy/health-checker.js +272 -0
  110. package/dist/scanners/deploy/health-checker.js.map +1 -0
  111. package/dist/scanners/deploy/index.d.ts +44 -0
  112. package/dist/scanners/deploy/index.d.ts.map +1 -0
  113. package/dist/scanners/deploy/index.js +208 -0
  114. package/dist/scanners/deploy/index.js.map +1 -0
  115. package/dist/scanners/deploy/provider-detector.d.ts +25 -0
  116. package/dist/scanners/deploy/provider-detector.d.ts.map +1 -0
  117. package/dist/scanners/deploy/provider-detector.js +177 -0
  118. package/dist/scanners/deploy/provider-detector.js.map +1 -0
  119. package/dist/scanners/deploy/types.d.ts +406 -0
  120. package/dist/scanners/deploy/types.d.ts.map +1 -0
  121. package/dist/scanners/deploy/types.js +58 -0
  122. package/dist/scanners/deploy/types.js.map +1 -0
  123. package/dist/scanners/deploy/vercel-integration.d.ts +52 -0
  124. package/dist/scanners/deploy/vercel-integration.d.ts.map +1 -0
  125. package/dist/scanners/deploy/vercel-integration.js +280 -0
  126. package/dist/scanners/deploy/vercel-integration.js.map +1 -0
  127. package/dist/scanners/index.d.ts +4 -4
  128. package/dist/scanners/index.d.ts.map +1 -1
  129. package/dist/scanners/index.js +133 -15
  130. package/dist/scanners/index.js.map +1 -1
  131. package/dist/scanners/index.test.js +6 -6
  132. package/dist/scanners/index.test.js.map +1 -1
  133. package/dist/scanners/openapi.d.ts +20 -0
  134. package/dist/scanners/openapi.d.ts.map +1 -0
  135. package/dist/scanners/openapi.js +226 -0
  136. package/dist/scanners/openapi.js.map +1 -0
  137. package/dist/scanners/runtime/app-launcher.d.ts +33 -0
  138. package/dist/scanners/runtime/app-launcher.d.ts.map +1 -0
  139. package/dist/scanners/runtime/app-launcher.js +419 -0
  140. package/dist/scanners/runtime/app-launcher.js.map +1 -0
  141. package/dist/scanners/runtime/golden-path-runner.d.ts +48 -0
  142. package/dist/scanners/runtime/golden-path-runner.d.ts.map +1 -0
  143. package/dist/scanners/runtime/golden-path-runner.js +373 -0
  144. package/dist/scanners/runtime/golden-path-runner.js.map +1 -0
  145. package/dist/scanners/runtime/index.d.ts +41 -0
  146. package/dist/scanners/runtime/index.d.ts.map +1 -0
  147. package/dist/scanners/runtime/index.js +164 -0
  148. package/dist/scanners/runtime/index.js.map +1 -0
  149. package/dist/scanners/runtime/playwright-executor.d.ts +50 -0
  150. package/dist/scanners/runtime/playwright-executor.d.ts.map +1 -0
  151. package/dist/scanners/runtime/playwright-executor.js +387 -0
  152. package/dist/scanners/runtime/playwright-executor.js.map +1 -0
  153. package/dist/scanners/runtime/types.d.ts +215 -0
  154. package/dist/scanners/runtime/types.d.ts.map +1 -0
  155. package/dist/scanners/runtime/types.js +40 -0
  156. package/dist/scanners/runtime/types.js.map +1 -0
  157. package/dist/scanners/rust.d.ts +22 -0
  158. package/dist/scanners/rust.d.ts.map +1 -0
  159. package/dist/scanners/rust.js +239 -0
  160. package/dist/scanners/rust.js.map +1 -0
  161. package/dist/scanners/scale/bottleneck-detector.d.ts +17 -0
  162. package/dist/scanners/scale/bottleneck-detector.d.ts.map +1 -0
  163. package/dist/scanners/scale/bottleneck-detector.js +250 -0
  164. package/dist/scanners/scale/bottleneck-detector.js.map +1 -0
  165. package/dist/scanners/scale/capacity-estimator.d.ts +17 -0
  166. package/dist/scanners/scale/capacity-estimator.d.ts.map +1 -0
  167. package/dist/scanners/scale/capacity-estimator.js +197 -0
  168. package/dist/scanners/scale/capacity-estimator.js.map +1 -0
  169. package/dist/scanners/scale/index.d.ts +37 -0
  170. package/dist/scanners/scale/index.d.ts.map +1 -0
  171. package/dist/scanners/scale/index.js +101 -0
  172. package/dist/scanners/scale/index.js.map +1 -0
  173. package/dist/scanners/scale/load-profiler.d.ts +48 -0
  174. package/dist/scanners/scale/load-profiler.d.ts.map +1 -0
  175. package/dist/scanners/scale/load-profiler.js +377 -0
  176. package/dist/scanners/scale/load-profiler.js.map +1 -0
  177. package/dist/scanners/scale/types.d.ts +529 -0
  178. package/dist/scanners/scale/types.d.ts.map +1 -0
  179. package/dist/scanners/scale/types.js +57 -0
  180. package/dist/scanners/scale/types.js.map +1 -0
  181. package/dist/scanners/secrets.d.ts.map +1 -1
  182. package/dist/scanners/secrets.js +13 -2
  183. package/dist/scanners/secrets.js.map +1 -1
  184. package/dist/scanners/terraform.d.ts +23 -0
  185. package/dist/scanners/terraform.d.ts.map +1 -0
  186. package/dist/scanners/terraform.js +207 -0
  187. package/dist/scanners/terraform.js.map +1 -0
  188. package/dist/scanners/types.d.ts +1 -1
  189. package/dist/scanners/types.d.ts.map +1 -1
  190. package/dist/scanners/types.js +8 -0
  191. package/dist/scanners/types.js.map +1 -1
  192. package/package.json +4 -2
  193. package/skills/vaspera-add-tests/SKILL.md +102 -0
  194. package/skills/vaspera-ai-verify/SKILL.md +166 -0
  195. package/skills/vaspera-audit/SKILL.md +67 -0
  196. package/skills/vaspera-certify/SKILL.md +130 -0
  197. package/skills/vaspera-deploy/SKILL.md +152 -0
  198. package/skills/vaspera-fix-critical/SKILL.md +52 -0
  199. package/skills/vaspera-fix-high/SKILL.md +81 -0
  200. package/skills/vaspera-fix-medium/SKILL.md +56 -0
  201. package/skills/vaspera-fix-rls/SKILL.md +85 -0
  202. package/skills/vaspera-harden/SKILL.md +102 -0
  203. package/skills/vaspera-help/SKILL.md +61 -0
  204. package/skills/vaspera-load-test/SKILL.md +167 -0
  205. package/skills/vaspera-verify/SKILL.md +70 -0
  206. 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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"}
@@ -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;AAQ5E,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EAEd,WAAW,EAEZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAkB1D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,oBAAoB,CAAC,CA8H/B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB5E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBtE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BtE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUxE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU3E;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoB3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;IAC5B,gEAAgE;IAChE,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAC9B,GACA,OAAO,CAAC,oBAAoB,GAAG;IAAE,iBAAiB,EAAE,gBAAgB,CAAA;CAAE,CAAC,CA4EzE;AAwLD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CACrD,MAAM,CAAC,WAAW,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAC9E,CAoCA;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAAC,WAAW,EAAE;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CA6LD;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CACpD,UAAU,EAAE,oBAAoB,GAC/B,KAAK,CAAC;IACP,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,GAAG,CAAC;IAChB,cAAc,EAAE,WAAW,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,CAyDD;AA8DD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CA+C3E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanners/index.ts"],"names":[],"mappings":"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"}
@@ -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: false, version: undefined, error: "DAST requires ZAP or Nuclei" },
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: false, version: undefined, error: "Nuclei not installed" },
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++) {