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.
- package/dist/analyzers/ast-analyzer.d.ts +251 -0
- package/dist/analyzers/ast-analyzer.d.ts.map +1 -0
- package/dist/analyzers/ast-analyzer.js +548 -0
- package/dist/analyzers/ast-analyzer.js.map +1 -0
- package/dist/analyzers/flow-analyzer.d.ts +241 -0
- package/dist/analyzers/flow-analyzer.d.ts.map +1 -0
- package/dist/analyzers/flow-analyzer.js +1219 -0
- package/dist/analyzers/flow-analyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +18 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +19 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/semantic-analyzer.d.ts +252 -0
- package/dist/analyzers/semantic-analyzer.d.ts.map +1 -0
- package/dist/analyzers/semantic-analyzer.js +1182 -0
- package/dist/analyzers/semantic-analyzer.js.map +1 -0
- package/dist/analyzers/type-analyzer.d.ts +289 -0
- package/dist/analyzers/type-analyzer.d.ts.map +1 -0
- package/dist/analyzers/type-analyzer.js +1269 -0
- package/dist/analyzers/type-analyzer.js.map +1 -0
- package/dist/analyzers/types.d.ts +537 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +11 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/config/config-loader.d.ts +166 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +429 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-validator.d.ts +204 -0
- package/dist/config/config-validator.d.ts.map +1 -0
- package/dist/config/config-validator.js +632 -0
- package/dist/config/config-validator.js.map +1 -0
- package/dist/config/defaults.d.ts +8 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +26 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +10 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +47 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +7 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/exporter.d.ts +21 -0
- package/dist/manifest/exporter.d.ts.map +1 -0
- package/dist/manifest/exporter.js +339 -0
- package/dist/manifest/exporter.js.map +1 -0
- package/dist/manifest/index.d.ts +14 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +15 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/manifest-store.d.ts +111 -0
- package/dist/manifest/manifest-store.d.ts.map +1 -0
- package/dist/manifest/manifest-store.js +418 -0
- package/dist/manifest/manifest-store.js.map +1 -0
- package/dist/manifest/types.d.ts +238 -0
- package/dist/manifest/types.d.ts.map +1 -0
- package/dist/manifest/types.js +11 -0
- package/dist/manifest/types.js.map +1 -0
- package/dist/matcher/confidence-scorer.d.ts +188 -0
- package/dist/matcher/confidence-scorer.d.ts.map +1 -0
- package/dist/matcher/confidence-scorer.js +302 -0
- package/dist/matcher/confidence-scorer.js.map +1 -0
- package/dist/matcher/index.d.ts +24 -0
- package/dist/matcher/index.d.ts.map +1 -0
- package/dist/matcher/index.js +26 -0
- package/dist/matcher/index.js.map +1 -0
- package/dist/matcher/outlier-detector.d.ts +252 -0
- package/dist/matcher/outlier-detector.d.ts.map +1 -0
- package/dist/matcher/outlier-detector.js +544 -0
- package/dist/matcher/outlier-detector.js.map +1 -0
- package/dist/matcher/pattern-matcher.d.ts +169 -0
- package/dist/matcher/pattern-matcher.d.ts.map +1 -0
- package/dist/matcher/pattern-matcher.js +692 -0
- package/dist/matcher/pattern-matcher.js.map +1 -0
- package/dist/matcher/types.d.ts +476 -0
- package/dist/matcher/types.d.ts.map +1 -0
- package/dist/matcher/types.js +36 -0
- package/dist/matcher/types.js.map +1 -0
- package/dist/parsers/base-parser.d.ts +282 -0
- package/dist/parsers/base-parser.d.ts.map +1 -0
- package/dist/parsers/base-parser.js +421 -0
- package/dist/parsers/base-parser.js.map +1 -0
- package/dist/parsers/css-parser.d.ts +225 -0
- package/dist/parsers/css-parser.d.ts.map +1 -0
- package/dist/parsers/css-parser.js +477 -0
- package/dist/parsers/css-parser.js.map +1 -0
- package/dist/parsers/index.d.ts +15 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +15 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/json-parser.d.ts +219 -0
- package/dist/parsers/json-parser.d.ts.map +1 -0
- package/dist/parsers/json-parser.js +602 -0
- package/dist/parsers/json-parser.js.map +1 -0
- package/dist/parsers/markdown-parser.d.ts +276 -0
- package/dist/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/parsers/markdown-parser.js +731 -0
- package/dist/parsers/markdown-parser.js.map +1 -0
- package/dist/parsers/parser-manager.d.ts +294 -0
- package/dist/parsers/parser-manager.d.ts.map +1 -0
- package/dist/parsers/parser-manager.js +738 -0
- package/dist/parsers/parser-manager.js.map +1 -0
- package/dist/parsers/python-parser.d.ts +204 -0
- package/dist/parsers/python-parser.d.ts.map +1 -0
- package/dist/parsers/python-parser.js +517 -0
- package/dist/parsers/python-parser.js.map +1 -0
- package/dist/parsers/types.d.ts +43 -0
- package/dist/parsers/types.d.ts.map +1 -0
- package/dist/parsers/types.js +7 -0
- package/dist/parsers/types.js.map +1 -0
- package/dist/parsers/typescript-parser.d.ts +264 -0
- package/dist/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/parsers/typescript-parser.js +658 -0
- package/dist/parsers/typescript-parser.js.map +1 -0
- package/dist/rules/evaluator.d.ts +305 -0
- package/dist/rules/evaluator.d.ts.map +1 -0
- package/dist/rules/evaluator.js +579 -0
- package/dist/rules/evaluator.js.map +1 -0
- package/dist/rules/index.d.ts +13 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +13 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/quick-fix-generator.d.ts +334 -0
- package/dist/rules/quick-fix-generator.d.ts.map +1 -0
- package/dist/rules/quick-fix-generator.js +1075 -0
- package/dist/rules/quick-fix-generator.js.map +1 -0
- package/dist/rules/rule-engine.d.ts +241 -0
- package/dist/rules/rule-engine.d.ts.map +1 -0
- package/dist/rules/rule-engine.js +585 -0
- package/dist/rules/rule-engine.js.map +1 -0
- package/dist/rules/severity-manager.d.ts +394 -0
- package/dist/rules/severity-manager.d.ts.map +1 -0
- package/dist/rules/severity-manager.js +619 -0
- package/dist/rules/severity-manager.js.map +1 -0
- package/dist/rules/types.d.ts +370 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +133 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/variant-manager.d.ts +388 -0
- package/dist/rules/variant-manager.d.ts.map +1 -0
- package/dist/rules/variant-manager.js +777 -0
- package/dist/rules/variant-manager.js.map +1 -0
- package/dist/scanner/change-detector.d.ts +164 -0
- package/dist/scanner/change-detector.d.ts.map +1 -0
- package/dist/scanner/change-detector.js +263 -0
- package/dist/scanner/change-detector.js.map +1 -0
- package/dist/scanner/dependency-graph.d.ts +270 -0
- package/dist/scanner/dependency-graph.d.ts.map +1 -0
- package/dist/scanner/dependency-graph.js +436 -0
- package/dist/scanner/dependency-graph.js.map +1 -0
- package/dist/scanner/file-walker.d.ts +127 -0
- package/dist/scanner/file-walker.d.ts.map +1 -0
- package/dist/scanner/file-walker.js +526 -0
- package/dist/scanner/file-walker.js.map +1 -0
- package/dist/scanner/index.d.ts +12 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +12 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/types.d.ts +218 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +10 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/scanner/worker-pool.d.ts +317 -0
- package/dist/scanner/worker-pool.d.ts.map +1 -0
- package/dist/scanner/worker-pool.js +571 -0
- package/dist/scanner/worker-pool.js.map +1 -0
- package/dist/store/cache-manager.d.ts +179 -0
- package/dist/store/cache-manager.d.ts.map +1 -0
- package/dist/store/cache-manager.js +391 -0
- package/dist/store/cache-manager.js.map +1 -0
- package/dist/store/history-store.d.ts +314 -0
- package/dist/store/history-store.d.ts.map +1 -0
- package/dist/store/history-store.js +707 -0
- package/dist/store/history-store.js.map +1 -0
- package/dist/store/index.d.ts +20 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +26 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/lock-file-manager.d.ts +202 -0
- package/dist/store/lock-file-manager.d.ts.map +1 -0
- package/dist/store/lock-file-manager.js +475 -0
- package/dist/store/lock-file-manager.js.map +1 -0
- package/dist/store/pattern-store.d.ts +289 -0
- package/dist/store/pattern-store.d.ts.map +1 -0
- package/dist/store/pattern-store.js +936 -0
- package/dist/store/pattern-store.js.map +1 -0
- package/dist/store/schema-validator.d.ts +159 -0
- package/dist/store/schema-validator.d.ts.map +1 -0
- package/dist/store/schema-validator.js +1096 -0
- package/dist/store/schema-validator.js.map +1 -0
- package/dist/store/types.d.ts +585 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +82 -0
- package/dist/store/types.js.map +1 -0
- package/dist/types/analysis.d.ts +19 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +5 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/common.d.ts +7 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +5 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/patterns.d.ts +40 -0
- package/dist/types/patterns.d.ts.map +1 -0
- package/dist/types/patterns.js +7 -0
- package/dist/types/patterns.js.map +1 -0
- package/dist/types/violations.d.ts +7 -0
- package/dist/types/violations.d.ts.map +1 -0
- package/dist/types/violations.js +7 -0
- package/dist/types/violations.js.map +1 -0
- 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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"}
|