driftdetect-core 0.1.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 (221) hide show
  1. package/dist/analyzers/ast-analyzer.d.ts +251 -0
  2. package/dist/analyzers/ast-analyzer.d.ts.map +1 -0
  3. package/dist/analyzers/ast-analyzer.js +548 -0
  4. package/dist/analyzers/ast-analyzer.js.map +1 -0
  5. package/dist/analyzers/flow-analyzer.d.ts +241 -0
  6. package/dist/analyzers/flow-analyzer.d.ts.map +1 -0
  7. package/dist/analyzers/flow-analyzer.js +1219 -0
  8. package/dist/analyzers/flow-analyzer.js.map +1 -0
  9. package/dist/analyzers/index.d.ts +18 -0
  10. package/dist/analyzers/index.d.ts.map +1 -0
  11. package/dist/analyzers/index.js +19 -0
  12. package/dist/analyzers/index.js.map +1 -0
  13. package/dist/analyzers/semantic-analyzer.d.ts +252 -0
  14. package/dist/analyzers/semantic-analyzer.d.ts.map +1 -0
  15. package/dist/analyzers/semantic-analyzer.js +1182 -0
  16. package/dist/analyzers/semantic-analyzer.js.map +1 -0
  17. package/dist/analyzers/type-analyzer.d.ts +289 -0
  18. package/dist/analyzers/type-analyzer.d.ts.map +1 -0
  19. package/dist/analyzers/type-analyzer.js +1269 -0
  20. package/dist/analyzers/type-analyzer.js.map +1 -0
  21. package/dist/analyzers/types.d.ts +537 -0
  22. package/dist/analyzers/types.d.ts.map +1 -0
  23. package/dist/analyzers/types.js +11 -0
  24. package/dist/analyzers/types.js.map +1 -0
  25. package/dist/config/config-loader.d.ts +166 -0
  26. package/dist/config/config-loader.d.ts.map +1 -0
  27. package/dist/config/config-loader.js +429 -0
  28. package/dist/config/config-loader.js.map +1 -0
  29. package/dist/config/config-validator.d.ts +204 -0
  30. package/dist/config/config-validator.d.ts.map +1 -0
  31. package/dist/config/config-validator.js +632 -0
  32. package/dist/config/config-validator.js.map +1 -0
  33. package/dist/config/defaults.d.ts +8 -0
  34. package/dist/config/defaults.d.ts.map +1 -0
  35. package/dist/config/defaults.js +26 -0
  36. package/dist/config/defaults.js.map +1 -0
  37. package/dist/config/index.d.ts +10 -0
  38. package/dist/config/index.d.ts.map +1 -0
  39. package/dist/config/index.js +10 -0
  40. package/dist/config/index.js.map +1 -0
  41. package/dist/config/types.d.ts +47 -0
  42. package/dist/config/types.d.ts.map +1 -0
  43. package/dist/config/types.js +7 -0
  44. package/dist/config/types.js.map +1 -0
  45. package/dist/index.d.ts +37 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +39 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/manifest/exporter.d.ts +21 -0
  50. package/dist/manifest/exporter.d.ts.map +1 -0
  51. package/dist/manifest/exporter.js +339 -0
  52. package/dist/manifest/exporter.js.map +1 -0
  53. package/dist/manifest/index.d.ts +14 -0
  54. package/dist/manifest/index.d.ts.map +1 -0
  55. package/dist/manifest/index.js +15 -0
  56. package/dist/manifest/index.js.map +1 -0
  57. package/dist/manifest/manifest-store.d.ts +111 -0
  58. package/dist/manifest/manifest-store.d.ts.map +1 -0
  59. package/dist/manifest/manifest-store.js +418 -0
  60. package/dist/manifest/manifest-store.js.map +1 -0
  61. package/dist/manifest/types.d.ts +238 -0
  62. package/dist/manifest/types.d.ts.map +1 -0
  63. package/dist/manifest/types.js +11 -0
  64. package/dist/manifest/types.js.map +1 -0
  65. package/dist/matcher/confidence-scorer.d.ts +188 -0
  66. package/dist/matcher/confidence-scorer.d.ts.map +1 -0
  67. package/dist/matcher/confidence-scorer.js +302 -0
  68. package/dist/matcher/confidence-scorer.js.map +1 -0
  69. package/dist/matcher/index.d.ts +24 -0
  70. package/dist/matcher/index.d.ts.map +1 -0
  71. package/dist/matcher/index.js +26 -0
  72. package/dist/matcher/index.js.map +1 -0
  73. package/dist/matcher/outlier-detector.d.ts +252 -0
  74. package/dist/matcher/outlier-detector.d.ts.map +1 -0
  75. package/dist/matcher/outlier-detector.js +544 -0
  76. package/dist/matcher/outlier-detector.js.map +1 -0
  77. package/dist/matcher/pattern-matcher.d.ts +169 -0
  78. package/dist/matcher/pattern-matcher.d.ts.map +1 -0
  79. package/dist/matcher/pattern-matcher.js +692 -0
  80. package/dist/matcher/pattern-matcher.js.map +1 -0
  81. package/dist/matcher/types.d.ts +476 -0
  82. package/dist/matcher/types.d.ts.map +1 -0
  83. package/dist/matcher/types.js +36 -0
  84. package/dist/matcher/types.js.map +1 -0
  85. package/dist/parsers/base-parser.d.ts +282 -0
  86. package/dist/parsers/base-parser.d.ts.map +1 -0
  87. package/dist/parsers/base-parser.js +421 -0
  88. package/dist/parsers/base-parser.js.map +1 -0
  89. package/dist/parsers/css-parser.d.ts +225 -0
  90. package/dist/parsers/css-parser.d.ts.map +1 -0
  91. package/dist/parsers/css-parser.js +477 -0
  92. package/dist/parsers/css-parser.js.map +1 -0
  93. package/dist/parsers/index.d.ts +15 -0
  94. package/dist/parsers/index.d.ts.map +1 -0
  95. package/dist/parsers/index.js +15 -0
  96. package/dist/parsers/index.js.map +1 -0
  97. package/dist/parsers/json-parser.d.ts +219 -0
  98. package/dist/parsers/json-parser.d.ts.map +1 -0
  99. package/dist/parsers/json-parser.js +602 -0
  100. package/dist/parsers/json-parser.js.map +1 -0
  101. package/dist/parsers/markdown-parser.d.ts +276 -0
  102. package/dist/parsers/markdown-parser.d.ts.map +1 -0
  103. package/dist/parsers/markdown-parser.js +731 -0
  104. package/dist/parsers/markdown-parser.js.map +1 -0
  105. package/dist/parsers/parser-manager.d.ts +294 -0
  106. package/dist/parsers/parser-manager.d.ts.map +1 -0
  107. package/dist/parsers/parser-manager.js +738 -0
  108. package/dist/parsers/parser-manager.js.map +1 -0
  109. package/dist/parsers/python-parser.d.ts +204 -0
  110. package/dist/parsers/python-parser.d.ts.map +1 -0
  111. package/dist/parsers/python-parser.js +517 -0
  112. package/dist/parsers/python-parser.js.map +1 -0
  113. package/dist/parsers/types.d.ts +43 -0
  114. package/dist/parsers/types.d.ts.map +1 -0
  115. package/dist/parsers/types.js +7 -0
  116. package/dist/parsers/types.js.map +1 -0
  117. package/dist/parsers/typescript-parser.d.ts +264 -0
  118. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  119. package/dist/parsers/typescript-parser.js +658 -0
  120. package/dist/parsers/typescript-parser.js.map +1 -0
  121. package/dist/rules/evaluator.d.ts +305 -0
  122. package/dist/rules/evaluator.d.ts.map +1 -0
  123. package/dist/rules/evaluator.js +579 -0
  124. package/dist/rules/evaluator.js.map +1 -0
  125. package/dist/rules/index.d.ts +13 -0
  126. package/dist/rules/index.d.ts.map +1 -0
  127. package/dist/rules/index.js +13 -0
  128. package/dist/rules/index.js.map +1 -0
  129. package/dist/rules/quick-fix-generator.d.ts +334 -0
  130. package/dist/rules/quick-fix-generator.d.ts.map +1 -0
  131. package/dist/rules/quick-fix-generator.js +1075 -0
  132. package/dist/rules/quick-fix-generator.js.map +1 -0
  133. package/dist/rules/rule-engine.d.ts +241 -0
  134. package/dist/rules/rule-engine.d.ts.map +1 -0
  135. package/dist/rules/rule-engine.js +585 -0
  136. package/dist/rules/rule-engine.js.map +1 -0
  137. package/dist/rules/severity-manager.d.ts +394 -0
  138. package/dist/rules/severity-manager.d.ts.map +1 -0
  139. package/dist/rules/severity-manager.js +619 -0
  140. package/dist/rules/severity-manager.js.map +1 -0
  141. package/dist/rules/types.d.ts +370 -0
  142. package/dist/rules/types.d.ts.map +1 -0
  143. package/dist/rules/types.js +133 -0
  144. package/dist/rules/types.js.map +1 -0
  145. package/dist/rules/variant-manager.d.ts +388 -0
  146. package/dist/rules/variant-manager.d.ts.map +1 -0
  147. package/dist/rules/variant-manager.js +777 -0
  148. package/dist/rules/variant-manager.js.map +1 -0
  149. package/dist/scanner/change-detector.d.ts +164 -0
  150. package/dist/scanner/change-detector.d.ts.map +1 -0
  151. package/dist/scanner/change-detector.js +263 -0
  152. package/dist/scanner/change-detector.js.map +1 -0
  153. package/dist/scanner/dependency-graph.d.ts +270 -0
  154. package/dist/scanner/dependency-graph.d.ts.map +1 -0
  155. package/dist/scanner/dependency-graph.js +436 -0
  156. package/dist/scanner/dependency-graph.js.map +1 -0
  157. package/dist/scanner/file-walker.d.ts +127 -0
  158. package/dist/scanner/file-walker.d.ts.map +1 -0
  159. package/dist/scanner/file-walker.js +526 -0
  160. package/dist/scanner/file-walker.js.map +1 -0
  161. package/dist/scanner/index.d.ts +12 -0
  162. package/dist/scanner/index.d.ts.map +1 -0
  163. package/dist/scanner/index.js +12 -0
  164. package/dist/scanner/index.js.map +1 -0
  165. package/dist/scanner/types.d.ts +218 -0
  166. package/dist/scanner/types.d.ts.map +1 -0
  167. package/dist/scanner/types.js +10 -0
  168. package/dist/scanner/types.js.map +1 -0
  169. package/dist/scanner/worker-pool.d.ts +317 -0
  170. package/dist/scanner/worker-pool.d.ts.map +1 -0
  171. package/dist/scanner/worker-pool.js +571 -0
  172. package/dist/scanner/worker-pool.js.map +1 -0
  173. package/dist/store/cache-manager.d.ts +179 -0
  174. package/dist/store/cache-manager.d.ts.map +1 -0
  175. package/dist/store/cache-manager.js +391 -0
  176. package/dist/store/cache-manager.js.map +1 -0
  177. package/dist/store/history-store.d.ts +314 -0
  178. package/dist/store/history-store.d.ts.map +1 -0
  179. package/dist/store/history-store.js +707 -0
  180. package/dist/store/history-store.js.map +1 -0
  181. package/dist/store/index.d.ts +20 -0
  182. package/dist/store/index.d.ts.map +1 -0
  183. package/dist/store/index.js +26 -0
  184. package/dist/store/index.js.map +1 -0
  185. package/dist/store/lock-file-manager.d.ts +202 -0
  186. package/dist/store/lock-file-manager.d.ts.map +1 -0
  187. package/dist/store/lock-file-manager.js +475 -0
  188. package/dist/store/lock-file-manager.js.map +1 -0
  189. package/dist/store/pattern-store.d.ts +289 -0
  190. package/dist/store/pattern-store.d.ts.map +1 -0
  191. package/dist/store/pattern-store.js +936 -0
  192. package/dist/store/pattern-store.js.map +1 -0
  193. package/dist/store/schema-validator.d.ts +159 -0
  194. package/dist/store/schema-validator.d.ts.map +1 -0
  195. package/dist/store/schema-validator.js +1096 -0
  196. package/dist/store/schema-validator.js.map +1 -0
  197. package/dist/store/types.d.ts +585 -0
  198. package/dist/store/types.d.ts.map +1 -0
  199. package/dist/store/types.js +82 -0
  200. package/dist/store/types.js.map +1 -0
  201. package/dist/types/analysis.d.ts +19 -0
  202. package/dist/types/analysis.d.ts.map +1 -0
  203. package/dist/types/analysis.js +5 -0
  204. package/dist/types/analysis.js.map +1 -0
  205. package/dist/types/common.d.ts +7 -0
  206. package/dist/types/common.d.ts.map +1 -0
  207. package/dist/types/common.js +5 -0
  208. package/dist/types/common.js.map +1 -0
  209. package/dist/types/index.d.ts +12 -0
  210. package/dist/types/index.d.ts.map +1 -0
  211. package/dist/types/index.js +10 -0
  212. package/dist/types/index.js.map +1 -0
  213. package/dist/types/patterns.d.ts +40 -0
  214. package/dist/types/patterns.d.ts.map +1 -0
  215. package/dist/types/patterns.js +7 -0
  216. package/dist/types/patterns.js.map +1 -0
  217. package/dist/types/violations.d.ts +7 -0
  218. package/dist/types/violations.d.ts.map +1 -0
  219. package/dist/types/violations.js +7 -0
  220. package/dist/types/violations.js.map +1 -0
  221. package/package.json +46 -0
@@ -0,0 +1,475 @@
1
+ /**
2
+ * Lock File Manager - Generates and manages drift.lock files
3
+ *
4
+ * The drift.lock file contains a snapshot of approved patterns for version control.
5
+ * It provides a deterministic, version-control-friendly format that allows teams
6
+ * to track pattern changes over time.
7
+ *
8
+ * @requirements 4.7 - THE drift.lock file SHALL contain a snapshot of approved patterns for version control
9
+ */
10
+ import * as fs from 'node:fs/promises';
11
+ import * as path from 'node:path';
12
+ import * as crypto from 'node:crypto';
13
+ import { LOCK_FILE_VERSION } from './types.js';
14
+ // ============================================================================
15
+ // Constants
16
+ // ============================================================================
17
+ /** Directory name for drift configuration */
18
+ const DRIFT_DIR = '.drift';
19
+ /** Lock file name */
20
+ const LOCK_FILE_NAME = 'drift.lock';
21
+ // ============================================================================
22
+ // Error Classes
23
+ // ============================================================================
24
+ /**
25
+ * Error thrown when lock file operations fail
26
+ */
27
+ export class LockFileError extends Error {
28
+ errorCause;
29
+ constructor(message, errorCause) {
30
+ super(message);
31
+ this.name = 'LockFileError';
32
+ this.errorCause = errorCause;
33
+ }
34
+ }
35
+ /**
36
+ * Error thrown when lock file validation fails
37
+ */
38
+ export class LockFileValidationError extends Error {
39
+ differences;
40
+ constructor(message, differences) {
41
+ super(message);
42
+ this.differences = differences;
43
+ this.name = 'LockFileValidationError';
44
+ }
45
+ }
46
+ /**
47
+ * Default lock file manager configuration
48
+ */
49
+ export const DEFAULT_LOCK_FILE_MANAGER_CONFIG = {
50
+ rootDir: '.',
51
+ };
52
+ // ============================================================================
53
+ // Helper Functions
54
+ // ============================================================================
55
+ /**
56
+ * Generate a deterministic hash for a pattern definition
57
+ *
58
+ * This hash is used to detect changes in pattern definitions.
59
+ * It includes all fields that affect pattern behavior.
60
+ */
61
+ function generatePatternHash(pattern) {
62
+ // Create a deterministic representation of the pattern
63
+ const hashInput = {
64
+ id: pattern.id,
65
+ category: pattern.category,
66
+ subcategory: pattern.subcategory,
67
+ name: pattern.name,
68
+ description: pattern.description,
69
+ detector: pattern.detector,
70
+ severity: pattern.severity,
71
+ autoFixable: pattern.autoFixable,
72
+ };
73
+ // Sort keys for deterministic output
74
+ const content = JSON.stringify(hashInput, Object.keys(hashInput).sort());
75
+ return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
76
+ }
77
+ /**
78
+ * Generate a checksum for the entire lock file
79
+ */
80
+ function generateLockFileChecksum(patterns, generatedAt) {
81
+ const content = JSON.stringify({
82
+ patterns: patterns.map(p => ({
83
+ id: p.id,
84
+ category: p.category,
85
+ name: p.name,
86
+ confidenceScore: p.confidenceScore,
87
+ severity: p.severity,
88
+ definitionHash: p.definitionHash,
89
+ lockedAt: p.lockedAt,
90
+ })),
91
+ generatedAt,
92
+ });
93
+ return crypto.createHash('sha256').update(content).digest('hex');
94
+ }
95
+ /**
96
+ * Check if a file exists
97
+ */
98
+ async function fileExists(filePath) {
99
+ try {
100
+ await fs.access(filePath);
101
+ return true;
102
+ }
103
+ catch {
104
+ return false;
105
+ }
106
+ }
107
+ /**
108
+ * Ensure a directory exists
109
+ */
110
+ async function ensureDir(dirPath) {
111
+ await fs.mkdir(dirPath, { recursive: true });
112
+ }
113
+ /**
114
+ * Sort patterns deterministically by category then by id
115
+ */
116
+ function sortPatterns(patterns) {
117
+ return [...patterns].sort((a, b) => {
118
+ // First sort by category
119
+ const categoryCompare = a.category.localeCompare(b.category);
120
+ if (categoryCompare !== 0) {
121
+ return categoryCompare;
122
+ }
123
+ // Then sort by id within category
124
+ return a.id.localeCompare(b.id);
125
+ });
126
+ }
127
+ // ============================================================================
128
+ // Lock File Manager Class
129
+ // ============================================================================
130
+ /**
131
+ * Lock File Manager - Manages drift.lock file generation and validation
132
+ *
133
+ * The lock file provides:
134
+ * - A snapshot of approved patterns for version control
135
+ * - Deterministic format for clean diffs
136
+ * - Integrity verification via checksums
137
+ * - Change detection between lock file and current patterns
138
+ *
139
+ * @requirements 4.7 - drift.lock snapshots approved patterns
140
+ */
141
+ export class LockFileManager {
142
+ config;
143
+ lockFilePath;
144
+ constructor(config = {}) {
145
+ this.config = { ...DEFAULT_LOCK_FILE_MANAGER_CONFIG, ...config };
146
+ this.lockFilePath = path.join(this.config.rootDir, DRIFT_DIR, LOCK_FILE_NAME);
147
+ }
148
+ // ==========================================================================
149
+ // Lock File Generation
150
+ // ==========================================================================
151
+ /**
152
+ * Generate a lock file from approved patterns
153
+ *
154
+ * Creates a deterministic snapshot of all approved patterns.
155
+ * The output is sorted and formatted for version control friendliness.
156
+ *
157
+ * @param approvedPatterns - Array of approved patterns to lock
158
+ * @returns The generated lock file
159
+ *
160
+ * @requirements 4.7 - Snapshot approved patterns
161
+ */
162
+ generateLockFile(approvedPatterns) {
163
+ const now = new Date().toISOString();
164
+ // Convert patterns to locked format and sort deterministically
165
+ const lockedPatterns = sortPatterns(approvedPatterns.map((pattern) => this.patternToLocked(pattern, now)));
166
+ // Generate checksum for integrity verification
167
+ const checksum = generateLockFileChecksum(lockedPatterns, now);
168
+ return {
169
+ version: LOCK_FILE_VERSION,
170
+ patterns: lockedPatterns,
171
+ generatedAt: now,
172
+ checksum,
173
+ };
174
+ }
175
+ /**
176
+ * Convert a Pattern to a LockedPattern
177
+ */
178
+ patternToLocked(pattern, lockedAt) {
179
+ return {
180
+ id: pattern.id,
181
+ category: pattern.category,
182
+ name: pattern.name,
183
+ confidenceScore: pattern.confidence.score,
184
+ severity: pattern.severity,
185
+ definitionHash: generatePatternHash(pattern),
186
+ lockedAt,
187
+ };
188
+ }
189
+ // ==========================================================================
190
+ // Lock File Persistence
191
+ // ==========================================================================
192
+ /**
193
+ * Save a lock file to disk
194
+ *
195
+ * Writes the lock file in a deterministic, version-control-friendly format.
196
+ *
197
+ * @param lockFile - The lock file to save
198
+ *
199
+ * @requirements 4.7 - Version control friendly format
200
+ */
201
+ async save(lockFile) {
202
+ try {
203
+ // Ensure .drift directory exists
204
+ await ensureDir(path.dirname(this.lockFilePath));
205
+ // Format with sorted keys and consistent indentation
206
+ const content = this.formatLockFile(lockFile);
207
+ await fs.writeFile(this.lockFilePath, content, 'utf-8');
208
+ }
209
+ catch (error) {
210
+ throw new LockFileError(`Failed to save lock file: ${this.lockFilePath}`, error);
211
+ }
212
+ }
213
+ /**
214
+ * Format lock file for version control friendly output
215
+ *
216
+ * Uses consistent formatting with sorted keys for clean diffs.
217
+ */
218
+ formatLockFile(lockFile) {
219
+ // Create a formatted output with consistent ordering
220
+ const output = {
221
+ version: lockFile.version,
222
+ generatedAt: lockFile.generatedAt,
223
+ checksum: lockFile.checksum,
224
+ patterns: lockFile.patterns.map((p) => ({
225
+ id: p.id,
226
+ category: p.category,
227
+ name: p.name,
228
+ confidenceScore: p.confidenceScore,
229
+ severity: p.severity,
230
+ definitionHash: p.definitionHash,
231
+ lockedAt: p.lockedAt,
232
+ })),
233
+ };
234
+ return JSON.stringify(output, null, 2) + '\n';
235
+ }
236
+ /**
237
+ * Load a lock file from disk
238
+ *
239
+ * @returns The loaded lock file or null if it doesn't exist
240
+ */
241
+ async load() {
242
+ if (!(await fileExists(this.lockFilePath))) {
243
+ return null;
244
+ }
245
+ try {
246
+ const content = await fs.readFile(this.lockFilePath, 'utf-8');
247
+ const data = JSON.parse(content);
248
+ // Validate basic structure
249
+ if (!data.version || !data.patterns || !data.generatedAt || !data.checksum) {
250
+ throw new LockFileError('Invalid lock file format: missing required fields');
251
+ }
252
+ return data;
253
+ }
254
+ catch (error) {
255
+ if (error instanceof LockFileError) {
256
+ throw error;
257
+ }
258
+ throw new LockFileError(`Failed to load lock file: ${this.lockFilePath}`, error);
259
+ }
260
+ }
261
+ /**
262
+ * Check if a lock file exists
263
+ */
264
+ async exists() {
265
+ return fileExists(this.lockFilePath);
266
+ }
267
+ /**
268
+ * Delete the lock file
269
+ */
270
+ async delete() {
271
+ if (!(await fileExists(this.lockFilePath))) {
272
+ return false;
273
+ }
274
+ try {
275
+ await fs.unlink(this.lockFilePath);
276
+ return true;
277
+ }
278
+ catch (error) {
279
+ throw new LockFileError(`Failed to delete lock file: ${this.lockFilePath}`, error);
280
+ }
281
+ }
282
+ // ==========================================================================
283
+ // Lock File Validation
284
+ // ==========================================================================
285
+ /**
286
+ * Verify the integrity of a lock file
287
+ *
288
+ * Checks that the checksum matches the content.
289
+ *
290
+ * @param lockFile - The lock file to verify
291
+ * @returns True if the checksum is valid
292
+ */
293
+ verifyIntegrity(lockFile) {
294
+ const expectedChecksum = generateLockFileChecksum(lockFile.patterns, lockFile.generatedAt);
295
+ return lockFile.checksum === expectedChecksum;
296
+ }
297
+ /**
298
+ * Compare a lock file with current approved patterns
299
+ *
300
+ * Identifies patterns that have been added, removed, or modified
301
+ * since the lock file was generated.
302
+ *
303
+ * @param lockFile - The lock file to compare against
304
+ * @param currentPatterns - Current approved patterns
305
+ * @returns Comparison result with differences
306
+ */
307
+ compare(lockFile, currentPatterns) {
308
+ const differences = [];
309
+ // Create maps for efficient lookup
310
+ const lockedMap = new Map(lockFile.patterns.map((p) => [p.id, p]));
311
+ const currentMap = new Map(currentPatterns.map((p) => [p.id, p]));
312
+ // Find removed patterns (in lock but not in current)
313
+ for (const locked of lockFile.patterns) {
314
+ if (!currentMap.has(locked.id)) {
315
+ differences.push({
316
+ type: 'removed',
317
+ patternId: locked.id,
318
+ category: locked.category,
319
+ name: locked.name,
320
+ });
321
+ }
322
+ }
323
+ // Find added and modified patterns
324
+ for (const current of currentPatterns) {
325
+ const locked = lockedMap.get(current.id);
326
+ if (!locked) {
327
+ // Pattern was added
328
+ differences.push({
329
+ type: 'added',
330
+ patternId: current.id,
331
+ category: current.category,
332
+ name: current.name,
333
+ });
334
+ }
335
+ else {
336
+ // Check for modifications
337
+ const currentHash = generatePatternHash(current);
338
+ if (locked.definitionHash !== currentHash) {
339
+ differences.push({
340
+ type: 'modified',
341
+ patternId: current.id,
342
+ category: current.category,
343
+ name: current.name,
344
+ details: 'Pattern definition has changed',
345
+ previousValue: locked.definitionHash,
346
+ currentValue: currentHash,
347
+ });
348
+ }
349
+ // Check for severity changes
350
+ if (locked.severity !== current.severity) {
351
+ differences.push({
352
+ type: 'modified',
353
+ patternId: current.id,
354
+ category: current.category,
355
+ name: current.name,
356
+ details: 'Severity has changed',
357
+ previousValue: locked.severity,
358
+ currentValue: current.severity,
359
+ });
360
+ }
361
+ // Check for significant confidence changes (more than 10%)
362
+ const confidenceDiff = Math.abs(locked.confidenceScore - current.confidence.score);
363
+ if (confidenceDiff > 0.1) {
364
+ differences.push({
365
+ type: 'modified',
366
+ patternId: current.id,
367
+ category: current.category,
368
+ name: current.name,
369
+ details: 'Confidence score has changed significantly',
370
+ previousValue: locked.confidenceScore,
371
+ currentValue: current.confidence.score,
372
+ });
373
+ }
374
+ }
375
+ }
376
+ // Sort differences for deterministic output
377
+ differences.sort((a, b) => {
378
+ const typeOrder = { removed: 0, added: 1, modified: 2 };
379
+ const typeCompare = typeOrder[a.type] - typeOrder[b.type];
380
+ if (typeCompare !== 0)
381
+ return typeCompare;
382
+ return a.patternId.localeCompare(b.patternId);
383
+ });
384
+ return {
385
+ isMatch: differences.length === 0,
386
+ differences,
387
+ lockedCount: lockFile.patterns.length,
388
+ currentCount: currentPatterns.length,
389
+ };
390
+ }
391
+ /**
392
+ * Validate that current patterns match the lock file
393
+ *
394
+ * Throws an error if there are any differences.
395
+ *
396
+ * @param lockFile - The lock file to validate against
397
+ * @param currentPatterns - Current approved patterns
398
+ * @throws LockFileValidationError if patterns don't match
399
+ */
400
+ validate(lockFile, currentPatterns) {
401
+ const result = this.compare(lockFile, currentPatterns);
402
+ if (!result.isMatch) {
403
+ throw new LockFileValidationError(`Lock file validation failed: ${result.differences.length} difference(s) found`, result.differences);
404
+ }
405
+ }
406
+ // ==========================================================================
407
+ // Convenience Methods
408
+ // ==========================================================================
409
+ /**
410
+ * Generate and save a lock file from approved patterns
411
+ *
412
+ * Convenience method that combines generation and saving.
413
+ *
414
+ * @param approvedPatterns - Array of approved patterns to lock
415
+ * @returns The generated lock file
416
+ */
417
+ async generateAndSave(approvedPatterns) {
418
+ const lockFile = this.generateLockFile(approvedPatterns);
419
+ await this.save(lockFile);
420
+ return lockFile;
421
+ }
422
+ /**
423
+ * Load and validate a lock file against current patterns
424
+ *
425
+ * @param currentPatterns - Current approved patterns
426
+ * @returns Comparison result
427
+ * @throws LockFileError if lock file doesn't exist or can't be loaded
428
+ */
429
+ async loadAndCompare(currentPatterns) {
430
+ const lockFile = await this.load();
431
+ if (!lockFile) {
432
+ throw new LockFileError('Lock file does not exist');
433
+ }
434
+ return this.compare(lockFile, currentPatterns);
435
+ }
436
+ /**
437
+ * Load and validate a lock file, throwing if there are differences
438
+ *
439
+ * @param currentPatterns - Current approved patterns
440
+ * @throws LockFileError if lock file doesn't exist
441
+ * @throws LockFileValidationError if patterns don't match
442
+ */
443
+ async loadAndValidate(currentPatterns) {
444
+ const lockFile = await this.load();
445
+ if (!lockFile) {
446
+ throw new LockFileError('Lock file does not exist');
447
+ }
448
+ this.validate(lockFile, currentPatterns);
449
+ }
450
+ // ==========================================================================
451
+ // Utility Methods
452
+ // ==========================================================================
453
+ /**
454
+ * Get the lock file path
455
+ */
456
+ get path() {
457
+ return this.lockFilePath;
458
+ }
459
+ /**
460
+ * Get a summary of a lock file
461
+ */
462
+ getSummary(lockFile) {
463
+ const categories = {};
464
+ for (const pattern of lockFile.patterns) {
465
+ categories[pattern.category] = (categories[pattern.category] || 0) + 1;
466
+ }
467
+ return {
468
+ version: lockFile.version,
469
+ patternCount: lockFile.patterns.length,
470
+ generatedAt: lockFile.generatedAt,
471
+ categories,
472
+ };
473
+ }
474
+ }
475
+ //# sourceMappingURL=lock-file-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock-file-manager.js","sourceRoot":"","sources":["../../src/store/lock-file-manager.ts"],"names":[],"mappings":"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"}