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,529 @@
1
+ /**
2
+ * Scale Assessment Types
3
+ *
4
+ * Types for load profiling, bottleneck detection, and capacity estimation.
5
+ *
6
+ * @module scanners/scale/types
7
+ */
8
+ import { z } from "zod";
9
+ /**
10
+ * Load testing tool
11
+ */
12
+ export type LoadTool = "k6" | "artillery" | "autocannon" | "wrk";
13
+ /**
14
+ * Load scenario type
15
+ */
16
+ export type ScenarioType = "ramp" | "spike" | "soak" | "stress" | "breakpoint";
17
+ /**
18
+ * Endpoint definition for load testing
19
+ */
20
+ export declare const EndpointSchema: z.ZodObject<{
21
+ path: z.ZodString;
22
+ method: z.ZodDefault<z.ZodEnum<["GET", "POST", "PUT", "DELETE", "PATCH"]>>;
23
+ weight: z.ZodDefault<z.ZodNumber>;
24
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
25
+ body: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
26
+ thresholds: z.ZodOptional<z.ZodObject<{
27
+ p95: z.ZodOptional<z.ZodNumber>;
28
+ p99: z.ZodOptional<z.ZodNumber>;
29
+ errorRate: z.ZodOptional<z.ZodNumber>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ p95?: number | undefined;
32
+ p99?: number | undefined;
33
+ errorRate?: number | undefined;
34
+ }, {
35
+ p95?: number | undefined;
36
+ p99?: number | undefined;
37
+ errorRate?: number | undefined;
38
+ }>>;
39
+ }, "strip", z.ZodTypeAny, {
40
+ path: string;
41
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
42
+ weight: number;
43
+ headers?: Record<string, string> | undefined;
44
+ body?: Record<string, unknown> | undefined;
45
+ thresholds?: {
46
+ p95?: number | undefined;
47
+ p99?: number | undefined;
48
+ errorRate?: number | undefined;
49
+ } | undefined;
50
+ }, {
51
+ path: string;
52
+ headers?: Record<string, string> | undefined;
53
+ body?: Record<string, unknown> | undefined;
54
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
55
+ thresholds?: {
56
+ p95?: number | undefined;
57
+ p99?: number | undefined;
58
+ errorRate?: number | undefined;
59
+ } | undefined;
60
+ weight?: number | undefined;
61
+ }>;
62
+ export type Endpoint = z.infer<typeof EndpointSchema>;
63
+ /**
64
+ * Load scenario definition
65
+ */
66
+ export declare const ScenarioSchema: z.ZodObject<{
67
+ name: z.ZodString;
68
+ type: z.ZodDefault<z.ZodEnum<["ramp", "spike", "soak", "stress", "breakpoint"]>>;
69
+ duration: z.ZodString;
70
+ vus: z.ZodUnion<[z.ZodNumber, z.ZodObject<{
71
+ start: z.ZodNumber;
72
+ end: z.ZodNumber;
73
+ }, "strip", z.ZodTypeAny, {
74
+ end: number;
75
+ start: number;
76
+ }, {
77
+ end: number;
78
+ start: number;
79
+ }>]>;
80
+ endpoints: z.ZodOptional<z.ZodArray<z.ZodObject<{
81
+ path: z.ZodString;
82
+ method: z.ZodDefault<z.ZodEnum<["GET", "POST", "PUT", "DELETE", "PATCH"]>>;
83
+ weight: z.ZodDefault<z.ZodNumber>;
84
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
85
+ body: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
86
+ thresholds: z.ZodOptional<z.ZodObject<{
87
+ p95: z.ZodOptional<z.ZodNumber>;
88
+ p99: z.ZodOptional<z.ZodNumber>;
89
+ errorRate: z.ZodOptional<z.ZodNumber>;
90
+ }, "strip", z.ZodTypeAny, {
91
+ p95?: number | undefined;
92
+ p99?: number | undefined;
93
+ errorRate?: number | undefined;
94
+ }, {
95
+ p95?: number | undefined;
96
+ p99?: number | undefined;
97
+ errorRate?: number | undefined;
98
+ }>>;
99
+ }, "strip", z.ZodTypeAny, {
100
+ path: string;
101
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
102
+ weight: number;
103
+ headers?: Record<string, string> | undefined;
104
+ body?: Record<string, unknown> | undefined;
105
+ thresholds?: {
106
+ p95?: number | undefined;
107
+ p99?: number | undefined;
108
+ errorRate?: number | undefined;
109
+ } | undefined;
110
+ }, {
111
+ path: string;
112
+ headers?: Record<string, string> | undefined;
113
+ body?: Record<string, unknown> | undefined;
114
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
115
+ thresholds?: {
116
+ p95?: number | undefined;
117
+ p99?: number | undefined;
118
+ errorRate?: number | undefined;
119
+ } | undefined;
120
+ weight?: number | undefined;
121
+ }>, "many">>;
122
+ }, "strip", z.ZodTypeAny, {
123
+ name: string;
124
+ duration: string;
125
+ type: "ramp" | "spike" | "soak" | "stress" | "breakpoint";
126
+ vus: number | {
127
+ end: number;
128
+ start: number;
129
+ };
130
+ endpoints?: {
131
+ path: string;
132
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
133
+ weight: number;
134
+ headers?: Record<string, string> | undefined;
135
+ body?: Record<string, unknown> | undefined;
136
+ thresholds?: {
137
+ p95?: number | undefined;
138
+ p99?: number | undefined;
139
+ errorRate?: number | undefined;
140
+ } | undefined;
141
+ }[] | undefined;
142
+ }, {
143
+ name: string;
144
+ duration: string;
145
+ vus: number | {
146
+ end: number;
147
+ start: number;
148
+ };
149
+ type?: "ramp" | "spike" | "soak" | "stress" | "breakpoint" | undefined;
150
+ endpoints?: {
151
+ path: string;
152
+ headers?: Record<string, string> | undefined;
153
+ body?: Record<string, unknown> | undefined;
154
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
155
+ thresholds?: {
156
+ p95?: number | undefined;
157
+ p99?: number | undefined;
158
+ errorRate?: number | undefined;
159
+ } | undefined;
160
+ weight?: number | undefined;
161
+ }[] | undefined;
162
+ }>;
163
+ export type Scenario = z.infer<typeof ScenarioSchema>;
164
+ /**
165
+ * Load profile definition (YAML schema)
166
+ */
167
+ export declare const LoadProfileSchema: z.ZodObject<{
168
+ name: z.ZodString;
169
+ description: z.ZodOptional<z.ZodString>;
170
+ baseUrl: z.ZodOptional<z.ZodString>;
171
+ tool: z.ZodDefault<z.ZodEnum<["k6", "artillery", "autocannon", "wrk"]>>;
172
+ scenarios: z.ZodArray<z.ZodObject<{
173
+ name: z.ZodString;
174
+ type: z.ZodDefault<z.ZodEnum<["ramp", "spike", "soak", "stress", "breakpoint"]>>;
175
+ duration: z.ZodString;
176
+ vus: z.ZodUnion<[z.ZodNumber, z.ZodObject<{
177
+ start: z.ZodNumber;
178
+ end: z.ZodNumber;
179
+ }, "strip", z.ZodTypeAny, {
180
+ end: number;
181
+ start: number;
182
+ }, {
183
+ end: number;
184
+ start: number;
185
+ }>]>;
186
+ endpoints: z.ZodOptional<z.ZodArray<z.ZodObject<{
187
+ path: z.ZodString;
188
+ method: z.ZodDefault<z.ZodEnum<["GET", "POST", "PUT", "DELETE", "PATCH"]>>;
189
+ weight: z.ZodDefault<z.ZodNumber>;
190
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
191
+ body: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
192
+ thresholds: z.ZodOptional<z.ZodObject<{
193
+ p95: z.ZodOptional<z.ZodNumber>;
194
+ p99: z.ZodOptional<z.ZodNumber>;
195
+ errorRate: z.ZodOptional<z.ZodNumber>;
196
+ }, "strip", z.ZodTypeAny, {
197
+ p95?: number | undefined;
198
+ p99?: number | undefined;
199
+ errorRate?: number | undefined;
200
+ }, {
201
+ p95?: number | undefined;
202
+ p99?: number | undefined;
203
+ errorRate?: number | undefined;
204
+ }>>;
205
+ }, "strip", z.ZodTypeAny, {
206
+ path: string;
207
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
208
+ weight: number;
209
+ headers?: Record<string, string> | undefined;
210
+ body?: Record<string, unknown> | undefined;
211
+ thresholds?: {
212
+ p95?: number | undefined;
213
+ p99?: number | undefined;
214
+ errorRate?: number | undefined;
215
+ } | undefined;
216
+ }, {
217
+ path: string;
218
+ headers?: Record<string, string> | undefined;
219
+ body?: Record<string, unknown> | undefined;
220
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
221
+ thresholds?: {
222
+ p95?: number | undefined;
223
+ p99?: number | undefined;
224
+ errorRate?: number | undefined;
225
+ } | undefined;
226
+ weight?: number | undefined;
227
+ }>, "many">>;
228
+ }, "strip", z.ZodTypeAny, {
229
+ name: string;
230
+ duration: string;
231
+ type: "ramp" | "spike" | "soak" | "stress" | "breakpoint";
232
+ vus: number | {
233
+ end: number;
234
+ start: number;
235
+ };
236
+ endpoints?: {
237
+ path: string;
238
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
239
+ weight: number;
240
+ headers?: Record<string, string> | undefined;
241
+ body?: Record<string, unknown> | undefined;
242
+ thresholds?: {
243
+ p95?: number | undefined;
244
+ p99?: number | undefined;
245
+ errorRate?: number | undefined;
246
+ } | undefined;
247
+ }[] | undefined;
248
+ }, {
249
+ name: string;
250
+ duration: string;
251
+ vus: number | {
252
+ end: number;
253
+ start: number;
254
+ };
255
+ type?: "ramp" | "spike" | "soak" | "stress" | "breakpoint" | undefined;
256
+ endpoints?: {
257
+ path: string;
258
+ headers?: Record<string, string> | undefined;
259
+ body?: Record<string, unknown> | undefined;
260
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
261
+ thresholds?: {
262
+ p95?: number | undefined;
263
+ p99?: number | undefined;
264
+ errorRate?: number | undefined;
265
+ } | undefined;
266
+ weight?: number | undefined;
267
+ }[] | undefined;
268
+ }>, "many">;
269
+ thresholds: z.ZodOptional<z.ZodObject<{
270
+ p95: z.ZodOptional<z.ZodNumber>;
271
+ p99: z.ZodOptional<z.ZodNumber>;
272
+ errorRate: z.ZodOptional<z.ZodNumber>;
273
+ throughput: z.ZodOptional<z.ZodNumber>;
274
+ }, "strip", z.ZodTypeAny, {
275
+ p95?: number | undefined;
276
+ p99?: number | undefined;
277
+ errorRate?: number | undefined;
278
+ throughput?: number | undefined;
279
+ }, {
280
+ p95?: number | undefined;
281
+ p99?: number | undefined;
282
+ errorRate?: number | undefined;
283
+ throughput?: number | undefined;
284
+ }>>;
285
+ endpoints: z.ZodOptional<z.ZodArray<z.ZodObject<{
286
+ path: z.ZodString;
287
+ method: z.ZodDefault<z.ZodEnum<["GET", "POST", "PUT", "DELETE", "PATCH"]>>;
288
+ weight: z.ZodDefault<z.ZodNumber>;
289
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
290
+ body: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
291
+ thresholds: z.ZodOptional<z.ZodObject<{
292
+ p95: z.ZodOptional<z.ZodNumber>;
293
+ p99: z.ZodOptional<z.ZodNumber>;
294
+ errorRate: z.ZodOptional<z.ZodNumber>;
295
+ }, "strip", z.ZodTypeAny, {
296
+ p95?: number | undefined;
297
+ p99?: number | undefined;
298
+ errorRate?: number | undefined;
299
+ }, {
300
+ p95?: number | undefined;
301
+ p99?: number | undefined;
302
+ errorRate?: number | undefined;
303
+ }>>;
304
+ }, "strip", z.ZodTypeAny, {
305
+ path: string;
306
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
307
+ weight: number;
308
+ headers?: Record<string, string> | undefined;
309
+ body?: Record<string, unknown> | undefined;
310
+ thresholds?: {
311
+ p95?: number | undefined;
312
+ p99?: number | undefined;
313
+ errorRate?: number | undefined;
314
+ } | undefined;
315
+ }, {
316
+ path: string;
317
+ headers?: Record<string, string> | undefined;
318
+ body?: Record<string, unknown> | undefined;
319
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
320
+ thresholds?: {
321
+ p95?: number | undefined;
322
+ p99?: number | undefined;
323
+ errorRate?: number | undefined;
324
+ } | undefined;
325
+ weight?: number | undefined;
326
+ }>, "many">>;
327
+ }, "strip", z.ZodTypeAny, {
328
+ name: string;
329
+ tool: "k6" | "artillery" | "autocannon" | "wrk";
330
+ scenarios: {
331
+ name: string;
332
+ duration: string;
333
+ type: "ramp" | "spike" | "soak" | "stress" | "breakpoint";
334
+ vus: number | {
335
+ end: number;
336
+ start: number;
337
+ };
338
+ endpoints?: {
339
+ path: string;
340
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
341
+ weight: number;
342
+ headers?: Record<string, string> | undefined;
343
+ body?: Record<string, unknown> | undefined;
344
+ thresholds?: {
345
+ p95?: number | undefined;
346
+ p99?: number | undefined;
347
+ errorRate?: number | undefined;
348
+ } | undefined;
349
+ }[] | undefined;
350
+ }[];
351
+ description?: string | undefined;
352
+ thresholds?: {
353
+ p95?: number | undefined;
354
+ p99?: number | undefined;
355
+ errorRate?: number | undefined;
356
+ throughput?: number | undefined;
357
+ } | undefined;
358
+ baseUrl?: string | undefined;
359
+ endpoints?: {
360
+ path: string;
361
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
362
+ weight: number;
363
+ headers?: Record<string, string> | undefined;
364
+ body?: Record<string, unknown> | undefined;
365
+ thresholds?: {
366
+ p95?: number | undefined;
367
+ p99?: number | undefined;
368
+ errorRate?: number | undefined;
369
+ } | undefined;
370
+ }[] | undefined;
371
+ }, {
372
+ name: string;
373
+ scenarios: {
374
+ name: string;
375
+ duration: string;
376
+ vus: number | {
377
+ end: number;
378
+ start: number;
379
+ };
380
+ type?: "ramp" | "spike" | "soak" | "stress" | "breakpoint" | undefined;
381
+ endpoints?: {
382
+ path: string;
383
+ headers?: Record<string, string> | undefined;
384
+ body?: Record<string, unknown> | undefined;
385
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
386
+ thresholds?: {
387
+ p95?: number | undefined;
388
+ p99?: number | undefined;
389
+ errorRate?: number | undefined;
390
+ } | undefined;
391
+ weight?: number | undefined;
392
+ }[] | undefined;
393
+ }[];
394
+ description?: string | undefined;
395
+ tool?: "k6" | "artillery" | "autocannon" | "wrk" | undefined;
396
+ thresholds?: {
397
+ p95?: number | undefined;
398
+ p99?: number | undefined;
399
+ errorRate?: number | undefined;
400
+ throughput?: number | undefined;
401
+ } | undefined;
402
+ baseUrl?: string | undefined;
403
+ endpoints?: {
404
+ path: string;
405
+ headers?: Record<string, string> | undefined;
406
+ body?: Record<string, unknown> | undefined;
407
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
408
+ thresholds?: {
409
+ p95?: number | undefined;
410
+ p99?: number | undefined;
411
+ errorRate?: number | undefined;
412
+ } | undefined;
413
+ weight?: number | undefined;
414
+ }[] | undefined;
415
+ }>;
416
+ export type LoadProfile = z.infer<typeof LoadProfileSchema>;
417
+ /**
418
+ * Latency percentiles
419
+ */
420
+ export interface LatencyMetrics {
421
+ min: number;
422
+ max: number;
423
+ mean: number;
424
+ median: number;
425
+ p90: number;
426
+ p95: number;
427
+ p99: number;
428
+ }
429
+ /**
430
+ * Endpoint result from load test
431
+ */
432
+ export interface EndpointResult {
433
+ path: string;
434
+ method: string;
435
+ requests: number;
436
+ failures: number;
437
+ errorRate: number;
438
+ latency: LatencyMetrics;
439
+ throughput: number;
440
+ passed: boolean;
441
+ }
442
+ /**
443
+ * Scenario result from load test
444
+ */
445
+ export interface ScenarioResult {
446
+ name: string;
447
+ type: ScenarioType;
448
+ duration: number;
449
+ vusMax: number;
450
+ totalRequests: number;
451
+ failedRequests: number;
452
+ errorRate: number;
453
+ latency: LatencyMetrics;
454
+ throughput: number;
455
+ endpoints: EndpointResult[];
456
+ passed: boolean;
457
+ }
458
+ /**
459
+ * Full load test result
460
+ */
461
+ export interface LoadTestResult {
462
+ profile: string;
463
+ tool: LoadTool;
464
+ startTime: string;
465
+ endTime: string;
466
+ duration: number;
467
+ scenarios: ScenarioResult[];
468
+ summary: {
469
+ totalRequests: number;
470
+ failedRequests: number;
471
+ errorRate: number;
472
+ avgThroughput: number;
473
+ peakThroughput: number;
474
+ latency: LatencyMetrics;
475
+ };
476
+ passed: boolean;
477
+ score: number;
478
+ }
479
+ /**
480
+ * Bottleneck detection result
481
+ */
482
+ export interface Bottleneck {
483
+ type: "endpoint" | "database" | "memory" | "cpu" | "network" | "external";
484
+ location: string;
485
+ severity: "critical" | "high" | "medium" | "low";
486
+ description: string;
487
+ metrics: {
488
+ current: number;
489
+ threshold: number;
490
+ unit: string;
491
+ };
492
+ recommendation: string;
493
+ }
494
+ /**
495
+ * Capacity estimation result
496
+ */
497
+ export interface CapacityEstimate {
498
+ maxConcurrentUsers: number;
499
+ maxRequestsPerSecond: number;
500
+ estimatedBreakpoint: {
501
+ vus: number;
502
+ confidence: number;
503
+ };
504
+ recommendations: string[];
505
+ costProjection?: {
506
+ provider: string;
507
+ monthlyCost: number;
508
+ instanceType: string;
509
+ instances: number;
510
+ };
511
+ }
512
+ /**
513
+ * Full scale assessment result
514
+ */
515
+ export interface ScaleAssessmentResult {
516
+ success: boolean;
517
+ loadTest?: LoadTestResult;
518
+ bottlenecks: Bottleneck[];
519
+ capacity: CapacityEstimate;
520
+ score: {
521
+ loadTestScore: number;
522
+ bottleneckScore: number;
523
+ capacityScore: number;
524
+ overallScore: number;
525
+ };
526
+ duration: number;
527
+ error?: string;
528
+ }
529
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scanners/scale/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,WAAW,GAAG,YAAY,GAAG,KAAK,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE/E;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,cAAc,CAAC;KACzB,CAAC;IACF,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Scale Assessment Types
3
+ *
4
+ * Types for load profiling, bottleneck detection, and capacity estimation.
5
+ *
6
+ * @module scanners/scale/types
7
+ */
8
+ import { z } from "zod";
9
+ /**
10
+ * Endpoint definition for load testing
11
+ */
12
+ export const EndpointSchema = z.object({
13
+ path: z.string().describe("URL path to test"),
14
+ method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]).default("GET"),
15
+ weight: z.number().min(0).max(100).default(100).describe("Relative weight for traffic distribution"),
16
+ headers: z.record(z.string()).optional(),
17
+ body: z.record(z.unknown()).optional(),
18
+ thresholds: z.object({
19
+ p95: z.number().optional().describe("95th percentile latency threshold (ms)"),
20
+ p99: z.number().optional().describe("99th percentile latency threshold (ms)"),
21
+ errorRate: z.number().optional().describe("Maximum error rate (0-1)"),
22
+ }).optional(),
23
+ });
24
+ /**
25
+ * Load scenario definition
26
+ */
27
+ export const ScenarioSchema = z.object({
28
+ name: z.string().describe("Scenario name"),
29
+ type: z.enum(["ramp", "spike", "soak", "stress", "breakpoint"]).default("ramp"),
30
+ duration: z.string().describe("Duration (e.g., '5m', '1h')"),
31
+ vus: z.union([
32
+ z.number().describe("Fixed number of virtual users"),
33
+ z.object({
34
+ start: z.number().describe("Starting VUs"),
35
+ end: z.number().describe("Ending VUs"),
36
+ }).describe("Ramp VUs from start to end"),
37
+ ]),
38
+ endpoints: z.array(EndpointSchema).optional(),
39
+ });
40
+ /**
41
+ * Load profile definition (YAML schema)
42
+ */
43
+ export const LoadProfileSchema = z.object({
44
+ name: z.string().describe("Profile name"),
45
+ description: z.string().optional(),
46
+ baseUrl: z.string().optional().describe("Base URL for endpoints"),
47
+ tool: z.enum(["k6", "artillery", "autocannon", "wrk"]).default("k6"),
48
+ scenarios: z.array(ScenarioSchema),
49
+ thresholds: z.object({
50
+ p95: z.number().optional().describe("Global 95th percentile threshold (ms)"),
51
+ p99: z.number().optional().describe("Global 99th percentile threshold (ms)"),
52
+ errorRate: z.number().optional().describe("Global max error rate (0-1)"),
53
+ throughput: z.number().optional().describe("Minimum requests/sec"),
54
+ }).optional(),
55
+ endpoints: z.array(EndpointSchema).optional().describe("Default endpoints for all scenarios"),
56
+ });
57
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/scanners/scale/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/scanners/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAwB,aAAa,EAAE,MAAM,YAAY,CAAC;AA4ItE;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgBnF;AA8OD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAwBD"}
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/scanners/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAwB,aAAa,EAAE,MAAM,YAAY,CAAC;AA4ItE;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgBnF;AA0PD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAwBD"}
@@ -10,7 +10,7 @@
10
10
  * @module scanners/secrets
11
11
  */
12
12
  import spawn from "cross-spawn";
13
- import { readFile, readdir } from "fs/promises";
13
+ import { readFile, readdir, stat } from "fs/promises";
14
14
  import { join, relative, extname } from "path";
15
15
  import { logger } from "../logger.js";
16
16
  /**
@@ -141,8 +141,19 @@ export async function runSecretsScanner(projectPath) {
141
141
  */
142
142
  async function runGitleaks(projectPath, startTime) {
143
143
  const findings = [];
144
+ // Check for custom config file
145
+ const configPath = join(projectPath, ".gitleaks.toml");
146
+ const args = ["detect", "--source", projectPath, "--report-format", "json", "--report-path", "-", "--no-git"];
147
+ try {
148
+ await stat(configPath);
149
+ args.push("--config", configPath);
150
+ logger.debug("scanners.gitleaks_using_config", { configPath });
151
+ }
152
+ catch {
153
+ // No config file, use defaults
154
+ }
144
155
  return new Promise((resolve) => {
145
- const child = spawn("gitleaks", ["detect", "--source", projectPath, "--report-format", "json", "--report-path", "-", "--no-git"], {
156
+ const child = spawn("gitleaks", args, {
146
157
  cwd: projectPath,
147
158
  timeout: 120000, // 2 minute timeout
148
159
  });