vaspera 2.10.1 → 2.12.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 (166) hide show
  1. package/dist/__tests__/audit-trail.test.d.ts +7 -0
  2. package/dist/__tests__/audit-trail.test.d.ts.map +1 -0
  3. package/dist/__tests__/audit-trail.test.js +336 -0
  4. package/dist/__tests__/audit-trail.test.js.map +1 -0
  5. package/dist/__tests__/property-test-helpers.d.ts +1 -1
  6. package/dist/action/pr-comment.test.js +9 -0
  7. package/dist/action/pr-comment.test.js.map +1 -1
  8. package/dist/action/sarif-upload.test.js +9 -0
  9. package/dist/action/sarif-upload.test.js.map +1 -1
  10. package/dist/autofix/ast/__tests__/typescript.test.d.ts +5 -0
  11. package/dist/autofix/ast/__tests__/typescript.test.d.ts.map +1 -0
  12. package/dist/autofix/ast/__tests__/typescript.test.js +210 -0
  13. package/dist/autofix/ast/__tests__/typescript.test.js.map +1 -0
  14. package/dist/autofix/ast/index.d.ts +11 -0
  15. package/dist/autofix/ast/index.d.ts.map +1 -0
  16. package/dist/autofix/ast/index.js +11 -0
  17. package/dist/autofix/ast/index.js.map +1 -0
  18. package/dist/autofix/ast/types.d.ts +77 -0
  19. package/dist/autofix/ast/types.d.ts.map +1 -0
  20. package/dist/autofix/ast/types.js +9 -0
  21. package/dist/autofix/ast/types.js.map +1 -0
  22. package/dist/autofix/ast/typescript.d.ts +17 -0
  23. package/dist/autofix/ast/typescript.d.ts.map +1 -0
  24. package/dist/autofix/ast/typescript.js +427 -0
  25. package/dist/autofix/ast/typescript.js.map +1 -0
  26. package/dist/autofix/constitution.schema.d.ts +21 -21
  27. package/dist/autofix/index.d.ts +1 -0
  28. package/dist/autofix/index.d.ts.map +1 -1
  29. package/dist/autofix/index.js +2 -0
  30. package/dist/autofix/index.js.map +1 -1
  31. package/dist/config/flags.d.ts +6 -6
  32. package/dist/history/store.d.ts +55 -1
  33. package/dist/history/store.d.ts.map +1 -1
  34. package/dist/history/store.js +152 -4
  35. package/dist/history/store.js.map +1 -1
  36. package/dist/history/types.d.ts +9 -5
  37. package/dist/history/types.d.ts.map +1 -1
  38. package/dist/history/verify.d.ts.map +1 -1
  39. package/dist/history/verify.js +5 -3
  40. package/dist/history/verify.js.map +1 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +627 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/integrations/siem/datadog.d.ts +44 -0
  45. package/dist/integrations/siem/datadog.d.ts.map +1 -0
  46. package/dist/integrations/siem/datadog.js +211 -0
  47. package/dist/integrations/siem/datadog.js.map +1 -0
  48. package/dist/integrations/siem/format.d.ts +59 -0
  49. package/dist/integrations/siem/format.d.ts.map +1 -0
  50. package/dist/integrations/siem/format.js +360 -0
  51. package/dist/integrations/siem/format.js.map +1 -0
  52. package/dist/integrations/siem/index.d.ts +56 -0
  53. package/dist/integrations/siem/index.d.ts.map +1 -0
  54. package/dist/integrations/siem/index.js +117 -0
  55. package/dist/integrations/siem/index.js.map +1 -0
  56. package/dist/integrations/siem/sentinel.d.ts +53 -0
  57. package/dist/integrations/siem/sentinel.d.ts.map +1 -0
  58. package/dist/integrations/siem/sentinel.js +231 -0
  59. package/dist/integrations/siem/sentinel.js.map +1 -0
  60. package/dist/integrations/siem/splunk.d.ts +46 -0
  61. package/dist/integrations/siem/splunk.d.ts.map +1 -0
  62. package/dist/integrations/siem/splunk.js +210 -0
  63. package/dist/integrations/siem/splunk.js.map +1 -0
  64. package/dist/integrations/siem/types.d.ts +210 -0
  65. package/dist/integrations/siem/types.d.ts.map +1 -0
  66. package/dist/integrations/siem/types.js +9 -0
  67. package/dist/integrations/siem/types.js.map +1 -0
  68. package/dist/persistence/__tests__/persistence.test.d.ts +5 -0
  69. package/dist/persistence/__tests__/persistence.test.d.ts.map +1 -0
  70. package/dist/persistence/__tests__/persistence.test.js +369 -0
  71. package/dist/persistence/__tests__/persistence.test.js.map +1 -0
  72. package/dist/persistence/db.d.ts +15 -0
  73. package/dist/persistence/db.d.ts.map +1 -0
  74. package/dist/persistence/db.js +79 -0
  75. package/dist/persistence/db.js.map +1 -0
  76. package/dist/persistence/index.d.ts +66 -0
  77. package/dist/persistence/index.d.ts.map +1 -0
  78. package/dist/persistence/index.js +143 -0
  79. package/dist/persistence/index.js.map +1 -0
  80. package/dist/persistence/migrations/index.d.ts +10 -0
  81. package/dist/persistence/migrations/index.d.ts.map +1 -0
  82. package/dist/persistence/migrations/index.js +125 -0
  83. package/dist/persistence/migrations/index.js.map +1 -0
  84. package/dist/persistence/repositories/findings.d.ts +41 -0
  85. package/dist/persistence/repositories/findings.d.ts.map +1 -0
  86. package/dist/persistence/repositories/findings.js +238 -0
  87. package/dist/persistence/repositories/findings.js.map +1 -0
  88. package/dist/persistence/repositories/projects.d.ts +22 -0
  89. package/dist/persistence/repositories/projects.d.ts.map +1 -0
  90. package/dist/persistence/repositories/projects.js +71 -0
  91. package/dist/persistence/repositories/projects.js.map +1 -0
  92. package/dist/persistence/repositories/scans.d.ts +30 -0
  93. package/dist/persistence/repositories/scans.d.ts.map +1 -0
  94. package/dist/persistence/repositories/scans.js +107 -0
  95. package/dist/persistence/repositories/scans.js.map +1 -0
  96. package/dist/persistence/repositories/trends.d.ts +42 -0
  97. package/dist/persistence/repositories/trends.d.ts.map +1 -0
  98. package/dist/persistence/repositories/trends.js +178 -0
  99. package/dist/persistence/repositories/trends.js.map +1 -0
  100. package/dist/persistence/types.d.ts +105 -0
  101. package/dist/persistence/types.d.ts.map +1 -0
  102. package/dist/persistence/types.js +13 -0
  103. package/dist/persistence/types.js.map +1 -0
  104. package/dist/plugins/types.d.ts +2 -2
  105. package/dist/scanners/ai-code/types.d.ts +12 -12
  106. package/dist/scanners/cache.d.ts.map +1 -1
  107. package/dist/scanners/cache.js +9 -0
  108. package/dist/scanners/cache.js.map +1 -1
  109. package/dist/scanners/dast.d.ts +40 -0
  110. package/dist/scanners/dast.d.ts.map +1 -0
  111. package/dist/scanners/dast.js +228 -0
  112. package/dist/scanners/dast.js.map +1 -0
  113. package/dist/scanners/deploy/types.d.ts +19 -19
  114. package/dist/scanners/detection/__tests__/detection.test.d.ts +5 -0
  115. package/dist/scanners/detection/__tests__/detection.test.d.ts.map +1 -0
  116. package/dist/scanners/detection/__tests__/detection.test.js +265 -0
  117. package/dist/scanners/detection/__tests__/detection.test.js.map +1 -0
  118. package/dist/scanners/detection/engines/ast-query.d.ts +23 -0
  119. package/dist/scanners/detection/engines/ast-query.d.ts.map +1 -0
  120. package/dist/scanners/detection/engines/ast-query.js +232 -0
  121. package/dist/scanners/detection/engines/ast-query.js.map +1 -0
  122. package/dist/scanners/detection/engines/data-flow.d.ts +12 -0
  123. package/dist/scanners/detection/engines/data-flow.d.ts.map +1 -0
  124. package/dist/scanners/detection/engines/data-flow.js +269 -0
  125. package/dist/scanners/detection/engines/data-flow.js.map +1 -0
  126. package/dist/scanners/detection/index.d.ts +29 -0
  127. package/dist/scanners/detection/index.d.ts.map +1 -0
  128. package/dist/scanners/detection/index.js +140 -0
  129. package/dist/scanners/detection/index.js.map +1 -0
  130. package/dist/scanners/detection/rules/builtin.d.ts +14 -0
  131. package/dist/scanners/detection/rules/builtin.d.ts.map +1 -0
  132. package/dist/scanners/detection/rules/builtin.js +307 -0
  133. package/dist/scanners/detection/rules/builtin.js.map +1 -0
  134. package/dist/scanners/detection/rules/loader.d.ts +19 -0
  135. package/dist/scanners/detection/rules/loader.d.ts.map +1 -0
  136. package/dist/scanners/detection/rules/loader.js +111 -0
  137. package/dist/scanners/detection/rules/loader.js.map +1 -0
  138. package/dist/scanners/detection/types.d.ts +171 -0
  139. package/dist/scanners/detection/types.d.ts.map +1 -0
  140. package/dist/scanners/detection/types.js +36 -0
  141. package/dist/scanners/detection/types.js.map +1 -0
  142. package/dist/scanners/index.d.ts +13 -5
  143. package/dist/scanners/index.d.ts.map +1 -1
  144. package/dist/scanners/index.js +197 -15
  145. package/dist/scanners/index.js.map +1 -1
  146. package/dist/scanners/index.test.js +6 -6
  147. package/dist/scanners/index.test.js.map +1 -1
  148. package/dist/scanners/openapi.d.ts +20 -0
  149. package/dist/scanners/openapi.d.ts.map +1 -0
  150. package/dist/scanners/openapi.js +226 -0
  151. package/dist/scanners/openapi.js.map +1 -0
  152. package/dist/scanners/runtime/types.d.ts +4 -4
  153. package/dist/scanners/rust.d.ts +22 -0
  154. package/dist/scanners/rust.d.ts.map +1 -0
  155. package/dist/scanners/rust.js +239 -0
  156. package/dist/scanners/rust.js.map +1 -0
  157. package/dist/scanners/scale/types.d.ts +19 -19
  158. package/dist/scanners/terraform.d.ts +23 -0
  159. package/dist/scanners/terraform.d.ts.map +1 -0
  160. package/dist/scanners/terraform.js +207 -0
  161. package/dist/scanners/terraform.js.map +1 -0
  162. package/dist/scanners/types.d.ts +1 -1
  163. package/dist/scanners/types.d.ts.map +1 -1
  164. package/dist/scanners/types.js +9 -0
  165. package/dist/scanners/types.js.map +1 -1
  166. package/package.json +5 -1
@@ -0,0 +1,369 @@
1
+ /**
2
+ * Persistence Layer Tests
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
5
+ import { mkdtemp, rm } from "fs/promises";
6
+ import { join } from "path";
7
+ import { tmpdir } from "os";
8
+ import { PersistenceManager } from "../index.js";
9
+ describe("Persistence Layer", () => {
10
+ let manager;
11
+ let tempDir;
12
+ beforeEach(async () => {
13
+ tempDir = await mkdtemp(join(tmpdir(), `persistence-test-${Math.random().toString(36).slice(2, 8)}-`));
14
+ manager = PersistenceManager.createInMemory();
15
+ });
16
+ afterEach(async () => {
17
+ manager.close();
18
+ await rm(tempDir, { recursive: true, force: true });
19
+ });
20
+ describe("Projects Repository", () => {
21
+ it("creates a project", () => {
22
+ const project = manager.projects.create("/test/project", "Test Project");
23
+ expect(project.id).toBeDefined();
24
+ expect(project.path).toBe("/test/project");
25
+ expect(project.name).toBe("Test Project");
26
+ expect(project.createdAt).toBeDefined();
27
+ });
28
+ it("finds project by path", () => {
29
+ manager.projects.create("/test/project", "Test Project");
30
+ const found = manager.projects.findByPath("/test/project");
31
+ expect(found).toBeDefined();
32
+ expect(found?.name).toBe("Test Project");
33
+ });
34
+ it("finds or creates project", () => {
35
+ const first = manager.projects.findOrCreate("/test/project", "Test");
36
+ const second = manager.projects.findOrCreate("/test/project", "Different");
37
+ expect(first.id).toBe(second.id);
38
+ });
39
+ it("lists all projects", () => {
40
+ manager.projects.create("/project1");
41
+ manager.projects.create("/project2");
42
+ const projects = manager.projects.list();
43
+ expect(projects.length).toBe(2);
44
+ });
45
+ });
46
+ describe("Findings Repository", () => {
47
+ let projectId;
48
+ beforeEach(() => {
49
+ const project = manager.projects.create("/test/project");
50
+ projectId = project.id;
51
+ });
52
+ it("creates a finding", () => {
53
+ const finding = manager.findings.create({
54
+ projectId,
55
+ severity: "high",
56
+ category: "sql-injection",
57
+ file: "src/api.ts",
58
+ line: 42,
59
+ description: "SQL injection vulnerability",
60
+ scannerSource: "semgrep",
61
+ status: "open",
62
+ confidence: 95,
63
+ });
64
+ expect(finding.id).toBeDefined();
65
+ expect(finding.severity).toBe("high");
66
+ expect(finding.firstSeenAt).toBeDefined();
67
+ });
68
+ it("upserts finding from scan", () => {
69
+ const first = manager.findings.upsertFromScan({
70
+ projectId,
71
+ severity: "high",
72
+ category: "xss",
73
+ file: "src/ui.ts",
74
+ line: 100,
75
+ description: "XSS vulnerability",
76
+ scannerSource: "semgrep",
77
+ confidence: 90,
78
+ });
79
+ expect(first.isNew).toBe(true);
80
+ const second = manager.findings.upsertFromScan({
81
+ projectId,
82
+ severity: "high",
83
+ category: "xss",
84
+ file: "src/ui.ts",
85
+ line: 100,
86
+ description: "XSS vulnerability",
87
+ scannerSource: "semgrep",
88
+ confidence: 90,
89
+ });
90
+ expect(second.isNew).toBe(false);
91
+ expect(second.finding.id).toBe(first.finding.id);
92
+ });
93
+ it("filters findings", () => {
94
+ manager.findings.create({
95
+ projectId,
96
+ severity: "critical",
97
+ category: "sql-injection",
98
+ file: "src/api.ts",
99
+ line: 10,
100
+ description: "Critical SQL injection",
101
+ scannerSource: "semgrep",
102
+ status: "open",
103
+ confidence: 100,
104
+ });
105
+ manager.findings.create({
106
+ projectId,
107
+ severity: "low",
108
+ category: "code-smell",
109
+ file: "src/utils.ts",
110
+ line: 20,
111
+ description: "Minor issue",
112
+ scannerSource: "eslint",
113
+ status: "open",
114
+ confidence: 80,
115
+ });
116
+ const critical = manager.findings.find({ projectId, severity: "critical" });
117
+ expect(critical.length).toBe(1);
118
+ const semgrep = manager.findings.find({ projectId, scannerSource: "semgrep" });
119
+ expect(semgrep.length).toBe(1);
120
+ });
121
+ it("updates finding status", () => {
122
+ const finding = manager.findings.create({
123
+ projectId,
124
+ severity: "high",
125
+ category: "xss",
126
+ file: "src/ui.ts",
127
+ line: 50,
128
+ description: "XSS",
129
+ scannerSource: "semgrep",
130
+ status: "open",
131
+ confidence: 90,
132
+ });
133
+ const updated = manager.findings.updateStatus(finding.id, "fixed", "developer");
134
+ expect(updated).toBe(true);
135
+ const fetched = manager.findings.findById(finding.id);
136
+ expect(fetched?.status).toBe("fixed");
137
+ expect(fetched?.fixedAt).toBeDefined();
138
+ });
139
+ it("marks finding as false positive", () => {
140
+ const finding = manager.findings.create({
141
+ projectId,
142
+ severity: "medium",
143
+ category: "security",
144
+ file: "src/test.ts",
145
+ line: 1,
146
+ description: "Test finding",
147
+ scannerSource: "semgrep",
148
+ status: "open",
149
+ confidence: 70,
150
+ });
151
+ manager.findings.markFalsePositive(finding.id, "Not applicable in this context");
152
+ const fetched = manager.findings.findById(finding.id);
153
+ expect(fetched?.status).toBe("false_positive");
154
+ expect(fetched?.falsePositive).toBe(true);
155
+ expect(fetched?.falsePositiveReason).toBe("Not applicable in this context");
156
+ });
157
+ it("gets project stats", () => {
158
+ manager.findings.create({
159
+ projectId,
160
+ severity: "critical",
161
+ category: "sql-injection",
162
+ file: "src/api.ts",
163
+ line: 10,
164
+ description: "Critical",
165
+ scannerSource: "semgrep",
166
+ status: "open",
167
+ confidence: 100,
168
+ });
169
+ manager.findings.create({
170
+ projectId,
171
+ severity: "high",
172
+ category: "xss",
173
+ file: "src/ui.ts",
174
+ line: 20,
175
+ description: "High",
176
+ scannerSource: "semgrep",
177
+ status: "open",
178
+ confidence: 90,
179
+ });
180
+ const stats = manager.findings.getStats(projectId);
181
+ expect(stats.totalFindings).toBe(2);
182
+ expect(stats.openFindings).toBe(2);
183
+ expect(stats.bySeverity.critical).toBe(1);
184
+ expect(stats.bySeverity.high).toBe(1);
185
+ });
186
+ });
187
+ describe("Scans Repository", () => {
188
+ let projectId;
189
+ beforeEach(() => {
190
+ const project = manager.projects.create("/test/project");
191
+ projectId = project.id;
192
+ });
193
+ it("creates a scan", () => {
194
+ const scan = manager.scans.create(projectId);
195
+ expect(scan.id).toBeDefined();
196
+ expect(scan.projectId).toBe(projectId);
197
+ expect(scan.status).toBe("running");
198
+ });
199
+ it("completes a scan", () => {
200
+ const scan = manager.scans.create(projectId);
201
+ manager.scans.complete(scan.id, {
202
+ totalFindings: 5,
203
+ newFindings: 3,
204
+ fixedFindings: 1,
205
+ bySeverity: { critical: 1, high: 2, medium: 2, low: 0, info: 0 },
206
+ byScanner: { semgrep: 4, gitleaks: 1 },
207
+ duration: 5000,
208
+ });
209
+ const fetched = manager.scans.findById(scan.id);
210
+ expect(fetched?.status).toBe("completed");
211
+ expect(fetched?.totalFindings).toBe(5);
212
+ expect(fetched?.completedAt).toBeDefined();
213
+ });
214
+ it("fails a scan", () => {
215
+ const scan = manager.scans.create(projectId);
216
+ manager.scans.fail(scan.id, "Scanner crashed");
217
+ const fetched = manager.scans.findById(scan.id);
218
+ expect(fetched?.status).toBe("failed");
219
+ expect(fetched?.error).toBe("Scanner crashed");
220
+ });
221
+ it("lists project scans", () => {
222
+ manager.scans.create(projectId);
223
+ manager.scans.create(projectId);
224
+ manager.scans.create(projectId);
225
+ const scans = manager.scans.findByProject(projectId);
226
+ expect(scans.length).toBe(3);
227
+ });
228
+ });
229
+ describe("Trends Repository", () => {
230
+ let projectId;
231
+ beforeEach(() => {
232
+ const project = manager.projects.create("/test/project");
233
+ projectId = project.id;
234
+ manager.findings.create({
235
+ projectId,
236
+ severity: "high",
237
+ category: "xss",
238
+ file: "src/ui.ts",
239
+ line: 10,
240
+ description: "XSS",
241
+ scannerSource: "semgrep",
242
+ status: "open",
243
+ confidence: 90,
244
+ });
245
+ });
246
+ it("calculates trends", () => {
247
+ const trends = manager.trends.calculateTrends(projectId, "day", 7);
248
+ expect(Array.isArray(trends)).toBe(true);
249
+ });
250
+ it("gets category breakdown", () => {
251
+ const breakdown = manager.trends.getCategoryBreakdown(projectId);
252
+ expect(breakdown.length).toBeGreaterThan(0);
253
+ expect(breakdown[0]).toHaveProperty("category");
254
+ expect(breakdown[0]).toHaveProperty("count");
255
+ expect(breakdown[0]).toHaveProperty("percentage");
256
+ });
257
+ it("gets scanner effectiveness", () => {
258
+ const effectiveness = manager.trends.getScannerEffectiveness(projectId);
259
+ expect(effectiveness.length).toBeGreaterThan(0);
260
+ expect(effectiveness[0]).toHaveProperty("scanner");
261
+ expect(effectiveness[0]).toHaveProperty("found");
262
+ expect(effectiveness[0]).toHaveProperty("accuracy");
263
+ });
264
+ });
265
+ describe("End-to-End Workflow", () => {
266
+ it("complete scan workflow with in-memory database", () => {
267
+ const localManager = PersistenceManager.createInMemory();
268
+ const project = localManager.projects.create("/test/project", "Test Project");
269
+ const scan = localManager.scans.create(project.id);
270
+ const { finding: finding1, isNew: isNew1 } = localManager.findings.upsertFromScan({
271
+ projectId: project.id,
272
+ severity: "high",
273
+ category: "sql-injection",
274
+ file: "src/api.ts",
275
+ line: 42,
276
+ description: "SQL injection",
277
+ scannerSource: "semgrep",
278
+ confidence: 95,
279
+ });
280
+ const { finding: finding2, isNew: isNew2 } = localManager.findings.upsertFromScan({
281
+ projectId: project.id,
282
+ severity: "medium",
283
+ category: "xss",
284
+ file: "src/ui.ts",
285
+ line: 100,
286
+ description: "XSS",
287
+ scannerSource: "semgrep",
288
+ confidence: 85,
289
+ });
290
+ expect(isNew1).toBe(true);
291
+ expect(isNew2).toBe(true);
292
+ localManager.scans.complete(scan.id, {
293
+ totalFindings: 2,
294
+ newFindings: 2,
295
+ fixedFindings: 0,
296
+ bySeverity: { critical: 0, high: 1, medium: 1, low: 0, info: 0 },
297
+ byScanner: { semgrep: 2 },
298
+ duration: 1000,
299
+ });
300
+ const completedScan = localManager.scans.findById(scan.id);
301
+ expect(completedScan?.status).toBe("completed");
302
+ expect(completedScan?.totalFindings).toBe(2);
303
+ const openFindings = localManager.findings.find({ projectId: project.id, status: "open" });
304
+ expect(openFindings.length).toBe(2);
305
+ localManager.findings.updateStatus(finding1.id, "fixed", "developer");
306
+ const afterFix = localManager.findings.find({ projectId: project.id, status: "open" });
307
+ expect(afterFix.length).toBe(1);
308
+ const stats = localManager.findings.getStats(project.id);
309
+ expect(stats.openFindings).toBe(1);
310
+ expect(stats.fixedFindings).toBe(1);
311
+ localManager.close();
312
+ });
313
+ it("tracks finding deduplication across scans", () => {
314
+ const localManager = PersistenceManager.createInMemory();
315
+ const project = localManager.projects.create("/test/project2");
316
+ const first = localManager.findings.upsertFromScan({
317
+ projectId: project.id,
318
+ severity: "critical",
319
+ category: "secrets",
320
+ file: "src/config.ts",
321
+ line: 5,
322
+ description: "Hardcoded secret",
323
+ scannerSource: "gitleaks",
324
+ confidence: 100,
325
+ });
326
+ expect(first.isNew).toBe(true);
327
+ const second = localManager.findings.upsertFromScan({
328
+ projectId: project.id,
329
+ severity: "critical",
330
+ category: "secrets",
331
+ file: "src/config.ts",
332
+ line: 5,
333
+ description: "Hardcoded secret",
334
+ scannerSource: "gitleaks",
335
+ confidence: 100,
336
+ });
337
+ expect(second.isNew).toBe(false);
338
+ expect(second.finding.id).toBe(first.finding.id);
339
+ const allFindings = localManager.findings.find({ projectId: project.id });
340
+ expect(allFindings.length).toBe(1);
341
+ localManager.close();
342
+ });
343
+ it("calculates project trends", () => {
344
+ const localManager = PersistenceManager.createInMemory();
345
+ const project = localManager.projects.create("/test/project3");
346
+ for (let i = 0; i < 5; i++) {
347
+ localManager.findings.create({
348
+ projectId: project.id,
349
+ severity: i < 2 ? "critical" : "high",
350
+ category: "security",
351
+ file: `src/file${i}.ts`,
352
+ line: i * 10,
353
+ description: `Finding ${i}`,
354
+ scannerSource: "semgrep",
355
+ status: "open",
356
+ confidence: 90,
357
+ });
358
+ }
359
+ const trends = localManager.trends.calculateTrends(project.id, "day", 7);
360
+ expect(Array.isArray(trends)).toBe(true);
361
+ const breakdown = localManager.trends.getCategoryBreakdown(project.id);
362
+ expect(breakdown.length).toBeGreaterThan(0);
363
+ expect(breakdown[0].category).toBe("security");
364
+ expect(breakdown[0].count).toBe(5);
365
+ localManager.close();
366
+ });
367
+ });
368
+ });
369
+ //# sourceMappingURL=persistence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.test.js","sourceRoot":"","sources":["../../../src/persistence/__tests__/persistence.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SQLite Database Connection
3
+ *
4
+ * Manages SQLite database connections using better-sqlite3.
5
+ *
6
+ * @module persistence/db
7
+ */
8
+ import Database from "better-sqlite3";
9
+ import type { PersistenceConfig } from "./types.js";
10
+ export declare function getDbPath(projectPath: string, config?: Partial<PersistenceConfig>): string;
11
+ export declare function initDatabase(projectPath: string, config?: Partial<PersistenceConfig>): Promise<Database.Database>;
12
+ export declare function getDatabase(): Database.Database | null;
13
+ export declare function closeDatabase(): void;
14
+ export declare function createInMemoryDatabase(): Database.Database;
15
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/persistence/db.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOpD,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAG1F;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAgC5B;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAEtD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC;AAgCD,wBAAgB,sBAAsB,IAAI,QAAQ,CAAC,QAAQ,CAK1D"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * SQLite Database Connection
3
+ *
4
+ * Manages SQLite database connections using better-sqlite3.
5
+ *
6
+ * @module persistence/db
7
+ */
8
+ import Database from "better-sqlite3";
9
+ import { mkdir } from "fs/promises";
10
+ import { dirname, join, isAbsolute } from "path";
11
+ import { DEFAULT_PERSISTENCE_CONFIG } from "./types.js";
12
+ import { MIGRATIONS } from "./migrations/index.js";
13
+ let dbInstance = null;
14
+ let currentDbPath = null;
15
+ export function getDbPath(projectPath, config) {
16
+ const dbPath = config?.dbPath || DEFAULT_PERSISTENCE_CONFIG.dbPath;
17
+ return isAbsolute(dbPath) ? dbPath : join(projectPath, dbPath);
18
+ }
19
+ export async function initDatabase(projectPath, config) {
20
+ const fullConfig = { ...DEFAULT_PERSISTENCE_CONFIG, ...config };
21
+ const dbPath = getDbPath(projectPath, fullConfig);
22
+ if (dbInstance && currentDbPath === dbPath) {
23
+ return dbInstance;
24
+ }
25
+ if (dbInstance) {
26
+ dbInstance.close();
27
+ dbInstance = null;
28
+ currentDbPath = null;
29
+ }
30
+ await mkdir(dirname(dbPath), { recursive: true });
31
+ dbInstance = new Database(dbPath);
32
+ currentDbPath = dbPath;
33
+ if (fullConfig.enableWAL) {
34
+ dbInstance.pragma("journal_mode = WAL");
35
+ }
36
+ if (fullConfig.busyTimeout) {
37
+ dbInstance.pragma(`busy_timeout = ${fullConfig.busyTimeout}`);
38
+ }
39
+ dbInstance.pragma("foreign_keys = ON");
40
+ runMigrations(dbInstance);
41
+ return dbInstance;
42
+ }
43
+ export function getDatabase() {
44
+ return dbInstance;
45
+ }
46
+ export function closeDatabase() {
47
+ if (dbInstance) {
48
+ dbInstance.close();
49
+ dbInstance = null;
50
+ currentDbPath = null;
51
+ }
52
+ }
53
+ function runMigrations(db) {
54
+ db.exec(`
55
+ CREATE TABLE IF NOT EXISTS migrations (
56
+ version INTEGER PRIMARY KEY,
57
+ name TEXT NOT NULL,
58
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
59
+ )
60
+ `);
61
+ const appliedVersions = new Set(db.prepare("SELECT version FROM migrations").all().map((r) => r.version));
62
+ const sortedMigrations = [...MIGRATIONS].sort((a, b) => a.version - b.version);
63
+ for (const migration of sortedMigrations) {
64
+ if (appliedVersions.has(migration.version)) {
65
+ continue;
66
+ }
67
+ db.transaction(() => {
68
+ db.exec(migration.up);
69
+ db.prepare("INSERT INTO migrations (version, name) VALUES (?, ?)").run(migration.version, migration.name);
70
+ })();
71
+ }
72
+ }
73
+ export function createInMemoryDatabase() {
74
+ const db = new Database(":memory:");
75
+ db.pragma("foreign_keys = ON");
76
+ runMigrations(db);
77
+ return db;
78
+ }
79
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/persistence/db.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,IAAI,UAAU,GAA6B,IAAI,CAAC;AAChD,IAAI,aAAa,GAAkB,IAAI,CAAC;AAExC,MAAM,UAAU,SAAS,CAAC,WAAmB,EAAE,MAAmC;IAChF,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,0BAA0B,CAAC,MAAM,CAAC;IACnE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,WAAmB,EACnB,MAAmC;IAEnC,MAAM,UAAU,GAAG,EAAE,GAAG,0BAA0B,EAAE,GAAG,MAAM,EAAE,CAAC;IAChE,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAElD,IAAI,UAAU,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QAC3C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,UAAU,GAAG,IAAI,CAAC;QAClB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,UAAU,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,GAAG,MAAM,CAAC;IAEvB,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QACzB,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,UAAU,CAAC,MAAM,CAAC,kBAAkB,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAEvC,aAAa,CAAC,UAAU,CAAC,CAAC;IAE1B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,UAAU,GAAG,IAAI,CAAC;QAClB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,EAAqB;IAC1C,EAAE,CAAC,IAAI,CAAC;;;;;;GAMP,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAC9E,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAE/E,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;QACzC,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,SAAS;QACX,CAAC;QAED,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACtB,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CACpE,SAAS,CAAC,OAAO,EACjB,SAAS,CAAC,IAAI,CACf,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;IACpC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Persistence Layer
3
+ *
4
+ * SQLite-backed persistence for findings, scans, and trends.
5
+ * Provides historical data and enterprise dashboards.
6
+ *
7
+ * @module persistence
8
+ */
9
+ import { ProjectsRepository } from "./repositories/projects.js";
10
+ import { FindingsRepository, type FindingFilter } from "./repositories/findings.js";
11
+ import { ScansRepository } from "./repositories/scans.js";
12
+ import { TrendsRepository, type TrendPeriodType } from "./repositories/trends.js";
13
+ import type { PersistenceConfig, Project, PersistedFinding, ProjectStats, TrendData } from "./types.js";
14
+ export * from "./types.js";
15
+ export { FindingFilter } from "./repositories/findings.js";
16
+ export { TrendPeriodType } from "./repositories/trends.js";
17
+ export declare class PersistenceManager {
18
+ private db;
19
+ readonly projects: ProjectsRepository;
20
+ readonly findings: FindingsRepository;
21
+ readonly scans: ScansRepository;
22
+ readonly trends: TrendsRepository;
23
+ private constructor();
24
+ static create(projectPath: string, config?: Partial<PersistenceConfig>): Promise<PersistenceManager>;
25
+ static createInMemory(): PersistenceManager;
26
+ close(): void;
27
+ getDbPath(): string;
28
+ transaction<T>(fn: () => T): T;
29
+ }
30
+ export declare function initPersistence(projectPath: string, config?: Partial<PersistenceConfig>): Promise<PersistenceManager>;
31
+ export declare function getPersistence(): PersistenceManager | null;
32
+ export declare function closePersistence(): void;
33
+ export declare function recordScanResults(projectPath: string, findings: Array<{
34
+ severity: string;
35
+ category: string;
36
+ file: string;
37
+ line: number;
38
+ column?: number;
39
+ description: string;
40
+ scannerSource: string;
41
+ ruleId?: string;
42
+ confidence?: number;
43
+ cweIds?: string[];
44
+ }>, certificationId?: string): Promise<{
45
+ scanId: string;
46
+ projectId: string;
47
+ newFindings: number;
48
+ existingFindings: number;
49
+ totalFindings: number;
50
+ }>;
51
+ export declare function getProjectTrends(projectPath: string, period?: TrendPeriodType, lookbackPeriods?: number): Promise<{
52
+ project: Project;
53
+ stats: ProjectStats;
54
+ trends: TrendData[];
55
+ mttr: {
56
+ period: string;
57
+ mttrHours: number;
58
+ }[];
59
+ fixVelocity: {
60
+ period: string;
61
+ fixesCount: number;
62
+ }[];
63
+ }>;
64
+ export declare function markFindingsFixed(projectPath: string, findingIds: string[], fixedBy?: string): Promise<number>;
65
+ export declare function getOpenFindings(projectPath: string, filter?: Partial<FindingFilter>): Promise<PersistedFinding[]>;
66
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"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"}