driftdetect-mcp 0.4.6 → 0.5.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/enterprise-server.d.ts +7 -0
- package/dist/enterprise-server.d.ts.map +1 -1
- package/dist/enterprise-server.js +77 -7
- package/dist/enterprise-server.js.map +1 -1
- package/dist/tools/analysis/coupling.d.ts +56 -0
- package/dist/tools/analysis/coupling.d.ts.map +1 -0
- package/dist/tools/analysis/coupling.js +248 -0
- package/dist/tools/analysis/coupling.js.map +1 -0
- package/dist/tools/analysis/error-handling.d.ts +45 -0
- package/dist/tools/analysis/error-handling.d.ts.map +1 -0
- package/dist/tools/analysis/error-handling.js +220 -0
- package/dist/tools/analysis/error-handling.js.map +1 -0
- package/dist/tools/analysis/index.d.ts +11 -0
- package/dist/tools/analysis/index.d.ts.map +1 -0
- package/dist/tools/analysis/index.js +111 -0
- package/dist/tools/analysis/index.js.map +1 -0
- package/dist/tools/analysis/test-topology.d.ts +43 -0
- package/dist/tools/analysis/test-topology.d.ts.map +1 -0
- package/dist/tools/analysis/test-topology.js +294 -0
- package/dist/tools/analysis/test-topology.js.map +1 -0
- package/dist/tools/detail/code-examples.d.ts +20 -3
- package/dist/tools/detail/code-examples.d.ts.map +1 -1
- package/dist/tools/detail/code-examples.js +104 -0
- package/dist/tools/detail/code-examples.js.map +1 -1
- package/dist/tools/detail/index.d.ts +6 -4
- package/dist/tools/detail/index.d.ts.map +1 -1
- package/dist/tools/detail/index.js +44 -2
- package/dist/tools/detail/index.js.map +1 -1
- package/dist/tools/detail/pattern-get.d.ts +20 -3
- package/dist/tools/detail/pattern-get.d.ts.map +1 -1
- package/dist/tools/detail/pattern-get.js +87 -0
- package/dist/tools/detail/pattern-get.js.map +1 -1
- package/dist/tools/detail/wrappers.d.ts +97 -0
- package/dist/tools/detail/wrappers.d.ts.map +1 -0
- package/dist/tools/detail/wrappers.js +124 -0
- package/dist/tools/detail/wrappers.js.map +1 -0
- package/dist/tools/discovery/index.d.ts +3 -1
- package/dist/tools/discovery/index.d.ts.map +1 -1
- package/dist/tools/discovery/index.js +36 -1
- package/dist/tools/discovery/index.js.map +1 -1
- package/dist/tools/discovery/status.d.ts +16 -3
- package/dist/tools/discovery/status.d.ts.map +1 -1
- package/dist/tools/discovery/status.js +83 -1
- package/dist/tools/discovery/status.js.map +1 -1
- package/dist/tools/exploration/index.d.ts +2 -2
- package/dist/tools/exploration/index.d.ts.map +1 -1
- package/dist/tools/exploration/index.js +1 -1
- package/dist/tools/exploration/index.js.map +1 -1
- package/dist/tools/exploration/patterns-list.d.ts +21 -4
- package/dist/tools/exploration/patterns-list.d.ts.map +1 -1
- package/dist/tools/exploration/patterns-list.js +70 -0
- package/dist/tools/exploration/patterns-list.js.map +1 -1
- package/dist/tools/generation/__tests__/generation-tools.test.d.ts +6 -0
- package/dist/tools/generation/__tests__/generation-tools.test.d.ts.map +1 -0
- package/dist/tools/generation/__tests__/generation-tools.test.js +119 -0
- package/dist/tools/generation/__tests__/generation-tools.test.js.map +1 -0
- package/dist/tools/generation/explain.d.ts +75 -0
- package/dist/tools/generation/explain.d.ts.map +1 -0
- package/dist/tools/generation/explain.js +238 -0
- package/dist/tools/generation/explain.js.map +1 -0
- package/dist/tools/generation/index.d.ts +12 -0
- package/dist/tools/generation/index.d.ts.map +1 -0
- package/dist/tools/generation/index.js +90 -0
- package/dist/tools/generation/index.js.map +1 -0
- package/dist/tools/generation/suggest-changes.d.ts +64 -0
- package/dist/tools/generation/suggest-changes.d.ts.map +1 -0
- package/dist/tools/generation/suggest-changes.js +342 -0
- package/dist/tools/generation/suggest-changes.js.map +1 -0
- package/dist/tools/generation/validate-change.d.ts +76 -0
- package/dist/tools/generation/validate-change.d.ts.map +1 -0
- package/dist/tools/generation/validate-change.js +415 -0
- package/dist/tools/generation/validate-change.js.map +1 -0
- package/dist/tools/registry.d.ts +5 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +12 -0
- package/dist/tools/registry.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* drift_validate_change - Pre-Commit Pattern Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates proposed code changes against established codebase patterns
|
|
5
|
+
* using SEMANTIC ANALYSIS (not regex!).
|
|
6
|
+
*
|
|
7
|
+
* Uses:
|
|
8
|
+
* - UnifiedLanguageProvider for cross-language semantic extraction
|
|
9
|
+
* - Pattern matchers for ORM/framework validation
|
|
10
|
+
* - LanguageIntelligence for semantic normalization
|
|
11
|
+
*
|
|
12
|
+
* Returns compliance score, violations, and suggestions for improvement.
|
|
13
|
+
*/
|
|
14
|
+
import { PatternStore, createUnifiedScanner, } from 'driftdetect-core';
|
|
15
|
+
import { createResponseBuilder } from '../../infrastructure/index.js';
|
|
16
|
+
import * as fs from 'fs/promises';
|
|
17
|
+
import * as path from 'path';
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// Handler
|
|
20
|
+
// =============================================================================
|
|
21
|
+
export async function handleValidateChange(patternStore, projectRoot, args) {
|
|
22
|
+
const builder = createResponseBuilder();
|
|
23
|
+
const { file, content, diff, strictMode = false } = args;
|
|
24
|
+
// Initialize store
|
|
25
|
+
await patternStore.initialize();
|
|
26
|
+
// Get the content to validate
|
|
27
|
+
let codeToValidate;
|
|
28
|
+
const relativePath = file.startsWith('/') ? path.relative(projectRoot, file) : file;
|
|
29
|
+
if (content) {
|
|
30
|
+
codeToValidate = content;
|
|
31
|
+
}
|
|
32
|
+
else if (diff) {
|
|
33
|
+
// Extract added lines from diff
|
|
34
|
+
codeToValidate = extractAddedLinesFromDiff(diff);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Read from file
|
|
38
|
+
try {
|
|
39
|
+
const fullPath = path.join(projectRoot, relativePath);
|
|
40
|
+
codeToValidate = await fs.readFile(fullPath, 'utf-8');
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return builder
|
|
44
|
+
.withSummary(`Cannot read file: ${file}`)
|
|
45
|
+
.withData({
|
|
46
|
+
summary: `Cannot read file: ${file}`,
|
|
47
|
+
file: relativePath,
|
|
48
|
+
overallScore: 0,
|
|
49
|
+
status: 'fail',
|
|
50
|
+
violations: [{
|
|
51
|
+
patternId: 'file-access',
|
|
52
|
+
patternName: 'File Access',
|
|
53
|
+
severity: 'error',
|
|
54
|
+
message: `File not found or not readable: ${file}`,
|
|
55
|
+
suggestion: 'Provide content directly or check the file path',
|
|
56
|
+
confidence: 1,
|
|
57
|
+
}],
|
|
58
|
+
compliance: [],
|
|
59
|
+
semanticValidation: {
|
|
60
|
+
functions: { total: 0, withErrorHandling: 0, async: 0, exported: 0 },
|
|
61
|
+
dataAccess: { total: 0, rawSql: 0, sensitiveFields: 0 },
|
|
62
|
+
imports: { total: 0, external: 0 },
|
|
63
|
+
},
|
|
64
|
+
suggestions: ['Provide the content parameter with the code to validate'],
|
|
65
|
+
stats: { patternsChecked: 0, compliant: 0, violations: 1, warnings: 0 },
|
|
66
|
+
})
|
|
67
|
+
.buildContent();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ==========================================================================
|
|
71
|
+
// SEMANTIC EXTRACTION using UnifiedScanner
|
|
72
|
+
// ==========================================================================
|
|
73
|
+
const scanner = createUnifiedScanner({ rootDir: projectRoot, autoDetect: true });
|
|
74
|
+
let dataAccessPoints = [];
|
|
75
|
+
try {
|
|
76
|
+
const scanResult = await scanner.scanFiles([relativePath]);
|
|
77
|
+
dataAccessPoints = scanResult.accessPoints.get(relativePath) || [];
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
// Language might not be supported - continue with pattern-only validation
|
|
81
|
+
console.warn(`Semantic extraction failed for ${relativePath}:`, err);
|
|
82
|
+
}
|
|
83
|
+
// Get relevant patterns for this file type
|
|
84
|
+
const allPatterns = patternStore.getAll();
|
|
85
|
+
const fileExtension = path.extname(relativePath);
|
|
86
|
+
const relevantPatterns = filterRelevantPatterns(allPatterns, relativePath, fileExtension);
|
|
87
|
+
// Validate against each pattern
|
|
88
|
+
const violations = [];
|
|
89
|
+
const compliance = [];
|
|
90
|
+
for (const pattern of relevantPatterns) {
|
|
91
|
+
const result = validateAgainstPattern(pattern, codeToValidate, relativePath, dataAccessPoints);
|
|
92
|
+
if (result.violations.length > 0) {
|
|
93
|
+
violations.push(...result.violations);
|
|
94
|
+
}
|
|
95
|
+
compliance.push(result.compliance);
|
|
96
|
+
}
|
|
97
|
+
// Perform semantic validation
|
|
98
|
+
const semanticValidation = performSemanticValidation(dataAccessPoints, codeToValidate);
|
|
99
|
+
// Add semantic-based violations
|
|
100
|
+
const semanticViolations = detectSemanticViolations(dataAccessPoints, relativePath);
|
|
101
|
+
violations.push(...semanticViolations);
|
|
102
|
+
// Calculate overall score
|
|
103
|
+
const compliantCount = compliance.filter(c => c.status === 'compliant').length;
|
|
104
|
+
const partialCount = compliance.filter(c => c.status === 'partial').length;
|
|
105
|
+
const totalPatterns = compliance.length || 1;
|
|
106
|
+
// Factor in semantic validation
|
|
107
|
+
let semanticScore = 100;
|
|
108
|
+
if (semanticValidation.dataAccess.rawSql > 0)
|
|
109
|
+
semanticScore -= 20;
|
|
110
|
+
if (semanticValidation.dataAccess.sensitiveFields > 0)
|
|
111
|
+
semanticScore -= 10;
|
|
112
|
+
const patternScore = Math.round(((compliantCount * 100) + (partialCount * 50)) / totalPatterns);
|
|
113
|
+
const overallScore = Math.round((patternScore + semanticScore) / 2);
|
|
114
|
+
// Determine status
|
|
115
|
+
const errorCount = violations.filter(v => v.severity === 'error').length;
|
|
116
|
+
const warningCount = violations.filter(v => v.severity === 'warning').length;
|
|
117
|
+
let status;
|
|
118
|
+
if (strictMode && (errorCount > 0 || warningCount > 0)) {
|
|
119
|
+
status = 'fail';
|
|
120
|
+
}
|
|
121
|
+
else if (errorCount > 0) {
|
|
122
|
+
status = 'fail';
|
|
123
|
+
}
|
|
124
|
+
else if (warningCount > 0) {
|
|
125
|
+
status = 'warn';
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
status = 'pass';
|
|
129
|
+
}
|
|
130
|
+
// Generate suggestions
|
|
131
|
+
const suggestions = generateSuggestions(violations, compliance, semanticValidation);
|
|
132
|
+
const summary = status === 'pass'
|
|
133
|
+
? `✅ Code validates successfully (${overallScore}% compliance)`
|
|
134
|
+
: status === 'warn'
|
|
135
|
+
? `⚠️ Code has ${warningCount} warning(s) (${overallScore}% compliance)`
|
|
136
|
+
: `❌ Code has ${errorCount} violation(s) (${overallScore}% compliance)`;
|
|
137
|
+
return builder
|
|
138
|
+
.withSummary(summary)
|
|
139
|
+
.withData({
|
|
140
|
+
summary,
|
|
141
|
+
file: relativePath,
|
|
142
|
+
overallScore,
|
|
143
|
+
status,
|
|
144
|
+
violations,
|
|
145
|
+
compliance,
|
|
146
|
+
semanticValidation,
|
|
147
|
+
suggestions,
|
|
148
|
+
stats: {
|
|
149
|
+
patternsChecked: relevantPatterns.length,
|
|
150
|
+
compliant: compliantCount,
|
|
151
|
+
violations: errorCount,
|
|
152
|
+
warnings: warningCount,
|
|
153
|
+
},
|
|
154
|
+
})
|
|
155
|
+
.withHints({
|
|
156
|
+
nextActions: status === 'pass'
|
|
157
|
+
? ['Code is ready to commit!']
|
|
158
|
+
: [
|
|
159
|
+
'Review violations and apply suggested fixes',
|
|
160
|
+
'Use drift_suggest_changes for detailed fix suggestions',
|
|
161
|
+
'Use drift_code_examples to see correct implementations',
|
|
162
|
+
],
|
|
163
|
+
relatedTools: ['drift_suggest_changes', 'drift_code_examples', 'drift_pattern_get'],
|
|
164
|
+
})
|
|
165
|
+
.buildContent();
|
|
166
|
+
}
|
|
167
|
+
// =============================================================================
|
|
168
|
+
// Helper Functions
|
|
169
|
+
// =============================================================================
|
|
170
|
+
function extractAddedLinesFromDiff(diff) {
|
|
171
|
+
const lines = diff.split('\n');
|
|
172
|
+
const addedLines = [];
|
|
173
|
+
for (const line of lines) {
|
|
174
|
+
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
175
|
+
addedLines.push(line.substring(1));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return addedLines.join('\n');
|
|
179
|
+
}
|
|
180
|
+
function filterRelevantPatterns(patterns, _file, extension) {
|
|
181
|
+
// Filter patterns that are relevant to this file type
|
|
182
|
+
const languagePatterns = {
|
|
183
|
+
'.ts': ['api', 'errors', 'logging', 'types', 'structural'],
|
|
184
|
+
'.tsx': ['components', 'styling', 'accessibility', 'api', 'errors'],
|
|
185
|
+
'.js': ['api', 'errors', 'logging', 'structural'],
|
|
186
|
+
'.jsx': ['components', 'styling', 'accessibility'],
|
|
187
|
+
'.py': ['api', 'errors', 'logging', 'data-access'],
|
|
188
|
+
'.java': ['api', 'errors', 'logging', 'data-access', 'structural'],
|
|
189
|
+
'.cs': ['api', 'errors', 'logging', 'data-access', 'structural'],
|
|
190
|
+
'.php': ['api', 'errors', 'logging', 'data-access'],
|
|
191
|
+
};
|
|
192
|
+
const relevantCategories = languagePatterns[extension] || ['structural', 'errors'];
|
|
193
|
+
return patterns.filter(p => {
|
|
194
|
+
// Include if pattern category is relevant
|
|
195
|
+
if (relevantCategories.includes(p.category))
|
|
196
|
+
return true;
|
|
197
|
+
// Include if pattern has locations in similar files
|
|
198
|
+
const hasRelevantLocations = p.locations.some(l => path.extname(l.file) === extension);
|
|
199
|
+
return hasRelevantLocations;
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Validate code against a pattern using semantic analysis
|
|
204
|
+
*/
|
|
205
|
+
function validateAgainstPattern(pattern, _content, file, dataAccessPoints) {
|
|
206
|
+
const violations = [];
|
|
207
|
+
// Check if this file should follow this pattern
|
|
208
|
+
const patternFiles = pattern.locations.map(l => l.file);
|
|
209
|
+
const isInPatternScope = patternFiles.some(f => {
|
|
210
|
+
// Check if file is in same directory or similar structure
|
|
211
|
+
const patternDir = path.dirname(f);
|
|
212
|
+
const fileDir = path.dirname(file);
|
|
213
|
+
return patternDir === fileDir || f.includes(path.basename(file));
|
|
214
|
+
});
|
|
215
|
+
if (!isInPatternScope && pattern.locations.length > 3) {
|
|
216
|
+
// Pattern is well-established but this file isn't in scope
|
|
217
|
+
return {
|
|
218
|
+
violations: [],
|
|
219
|
+
compliance: {
|
|
220
|
+
patternId: pattern.id,
|
|
221
|
+
patternName: pattern.name,
|
|
222
|
+
status: 'compliant',
|
|
223
|
+
score: 100,
|
|
224
|
+
details: 'File not in pattern scope',
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
// Use semantic analysis for validation when available
|
|
229
|
+
let matchCount = 0;
|
|
230
|
+
let totalChecks = 1; // At least one check
|
|
231
|
+
if (dataAccessPoints.length > 0) {
|
|
232
|
+
const semanticResult = validateSemanticPattern(pattern, dataAccessPoints);
|
|
233
|
+
matchCount = semanticResult.matches;
|
|
234
|
+
totalChecks = semanticResult.total;
|
|
235
|
+
violations.push(...semanticResult.violations.map(v => ({
|
|
236
|
+
...v,
|
|
237
|
+
patternId: pattern.id,
|
|
238
|
+
patternName: pattern.name,
|
|
239
|
+
confidence: pattern.confidence.score,
|
|
240
|
+
})));
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
// Fallback: check if file is an outlier for this pattern
|
|
244
|
+
const isOutlier = pattern.outliers.some(o => o.file === file);
|
|
245
|
+
if (isOutlier) {
|
|
246
|
+
violations.push({
|
|
247
|
+
patternId: pattern.id,
|
|
248
|
+
patternName: pattern.name,
|
|
249
|
+
severity: 'warning',
|
|
250
|
+
message: `File deviates from pattern "${pattern.name}"`,
|
|
251
|
+
suggestion: `Review pattern at ${pattern.locations[0]?.file}:${pattern.locations[0]?.line}`,
|
|
252
|
+
confidence: pattern.confidence.score,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
matchCount = 1;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Calculate compliance
|
|
260
|
+
const score = totalChecks > 0 ? Math.round((matchCount / totalChecks) * 100) : 100;
|
|
261
|
+
const status = score >= 80 ? 'compliant' : score >= 50 ? 'partial' : 'missing';
|
|
262
|
+
return {
|
|
263
|
+
violations,
|
|
264
|
+
compliance: {
|
|
265
|
+
patternId: pattern.id,
|
|
266
|
+
patternName: pattern.name,
|
|
267
|
+
status,
|
|
268
|
+
score,
|
|
269
|
+
details: `${matchCount}/${totalChecks} semantic checks passed`,
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Validate pattern using semantic data access results
|
|
275
|
+
*/
|
|
276
|
+
function validateSemanticPattern(pattern, dataAccessPoints) {
|
|
277
|
+
const violations = [];
|
|
278
|
+
let matches = 0;
|
|
279
|
+
let total = dataAccessPoints.length || 1;
|
|
280
|
+
switch (pattern.category) {
|
|
281
|
+
case 'data-access':
|
|
282
|
+
for (const access of dataAccessPoints) {
|
|
283
|
+
if (!access.isRawSql && access.confidence > 0.7) {
|
|
284
|
+
matches++;
|
|
285
|
+
}
|
|
286
|
+
else if (access.isRawSql) {
|
|
287
|
+
violations.push({
|
|
288
|
+
severity: 'warning',
|
|
289
|
+
message: `Raw SQL detected for table "${access.table}"`,
|
|
290
|
+
line: access.line,
|
|
291
|
+
suggestion: 'Use ORM methods instead of raw SQL',
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
break;
|
|
296
|
+
case 'security':
|
|
297
|
+
// Check for sensitive data access patterns
|
|
298
|
+
const sensitivePatterns = ['password', 'secret', 'token', 'api_key'];
|
|
299
|
+
for (const access of dataAccessPoints) {
|
|
300
|
+
const sensitiveFields = access.fields.filter(f => sensitivePatterns.some(p => f.toLowerCase().includes(p)));
|
|
301
|
+
if (sensitiveFields.length > 0) {
|
|
302
|
+
violations.push({
|
|
303
|
+
severity: 'info',
|
|
304
|
+
message: `Accessing sensitive fields: ${sensitiveFields.join(', ')}`,
|
|
305
|
+
line: access.line,
|
|
306
|
+
suggestion: 'Ensure proper authorization for sensitive data access',
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
matches++;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
break;
|
|
314
|
+
default:
|
|
315
|
+
// Generic check - just verify data access is using ORM
|
|
316
|
+
for (const access of dataAccessPoints) {
|
|
317
|
+
if (!access.isRawSql) {
|
|
318
|
+
matches++;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return { matches, total, violations };
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Perform semantic validation on data access points
|
|
326
|
+
*/
|
|
327
|
+
function performSemanticValidation(dataAccessPoints, _content) {
|
|
328
|
+
const sensitivePatterns = ['password', 'secret', 'token', 'api_key', 'ssn', 'credit'];
|
|
329
|
+
return {
|
|
330
|
+
functions: {
|
|
331
|
+
total: 0,
|
|
332
|
+
withErrorHandling: 0,
|
|
333
|
+
async: 0,
|
|
334
|
+
exported: 0,
|
|
335
|
+
},
|
|
336
|
+
dataAccess: {
|
|
337
|
+
total: dataAccessPoints.length,
|
|
338
|
+
rawSql: dataAccessPoints.filter(a => a.isRawSql).length,
|
|
339
|
+
sensitiveFields: dataAccessPoints.filter(a => a.fields.some(f => sensitivePatterns.some(p => f.toLowerCase().includes(p)))).length,
|
|
340
|
+
},
|
|
341
|
+
imports: {
|
|
342
|
+
total: 0,
|
|
343
|
+
external: 0,
|
|
344
|
+
},
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Detect violations using semantic analysis
|
|
349
|
+
*/
|
|
350
|
+
function detectSemanticViolations(dataAccessPoints, _file) {
|
|
351
|
+
const violations = [];
|
|
352
|
+
// Check for raw SQL
|
|
353
|
+
for (const access of dataAccessPoints) {
|
|
354
|
+
if (access.isRawSql) {
|
|
355
|
+
violations.push({
|
|
356
|
+
patternId: 'semantic-raw-sql',
|
|
357
|
+
patternName: 'Raw SQL Detection',
|
|
358
|
+
severity: 'warning',
|
|
359
|
+
message: `Raw SQL query detected accessing "${access.table}"`,
|
|
360
|
+
line: access.line,
|
|
361
|
+
suggestion: 'Use parameterized queries or ORM methods to prevent SQL injection',
|
|
362
|
+
confidence: access.confidence,
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// Check for sensitive data access without apparent protection
|
|
367
|
+
const sensitivePatterns = ['password', 'secret', 'token', 'api_key', 'ssn', 'credit_card'];
|
|
368
|
+
for (const access of dataAccessPoints) {
|
|
369
|
+
const sensitiveFields = access.fields.filter(f => sensitivePatterns.some(p => f.toLowerCase().includes(p)));
|
|
370
|
+
if (sensitiveFields.length > 0) {
|
|
371
|
+
violations.push({
|
|
372
|
+
patternId: 'semantic-sensitive-data',
|
|
373
|
+
patternName: 'Sensitive Data Access',
|
|
374
|
+
severity: 'info',
|
|
375
|
+
message: `Accessing sensitive fields: ${sensitiveFields.join(', ')}`,
|
|
376
|
+
line: access.line,
|
|
377
|
+
suggestion: 'Ensure proper authorization and audit logging for sensitive data access',
|
|
378
|
+
confidence: 0.9,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return violations;
|
|
383
|
+
}
|
|
384
|
+
function generateSuggestions(violations, compliance, semanticValidation) {
|
|
385
|
+
const suggestions = [];
|
|
386
|
+
// Add suggestions based on violations
|
|
387
|
+
const errorViolations = violations.filter(v => v.severity === 'error');
|
|
388
|
+
if (errorViolations.length > 0) {
|
|
389
|
+
suggestions.push(`Fix ${errorViolations.length} critical violation(s) before committing`);
|
|
390
|
+
}
|
|
391
|
+
// Add suggestions based on low compliance
|
|
392
|
+
const lowCompliance = compliance.filter(c => c.status === 'missing');
|
|
393
|
+
if (lowCompliance.length > 0) {
|
|
394
|
+
suggestions.push(`Review ${lowCompliance.length} pattern(s) with low compliance`);
|
|
395
|
+
}
|
|
396
|
+
// Add semantic-based suggestions
|
|
397
|
+
if (semanticValidation.dataAccess.rawSql > 0) {
|
|
398
|
+
suggestions.push('Replace raw SQL queries with parameterized queries or ORM methods');
|
|
399
|
+
}
|
|
400
|
+
if (semanticValidation.dataAccess.sensitiveFields > 0) {
|
|
401
|
+
suggestions.push('Review sensitive data access for proper authorization');
|
|
402
|
+
}
|
|
403
|
+
// Add pattern-specific suggestions
|
|
404
|
+
const uniqueSuggestions = new Set(violations.map(v => v.suggestion));
|
|
405
|
+
for (const suggestion of uniqueSuggestions) {
|
|
406
|
+
if (suggestion && !suggestions.includes(suggestion)) {
|
|
407
|
+
suggestions.push(suggestion);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
if (suggestions.length === 0) {
|
|
411
|
+
suggestions.push('Code follows established patterns - ready to commit!');
|
|
412
|
+
}
|
|
413
|
+
return suggestions.slice(0, 5); // Limit to 5 suggestions
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=validate-change.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-change.js","sourceRoot":"","sources":["../../../src/tools/generation/validate-change.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/registry.d.ts
CHANGED
|
@@ -15,6 +15,8 @@ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
|
15
15
|
* 2. Discovery (quick health checks)
|
|
16
16
|
* 3. Exploration (browsing/listing)
|
|
17
17
|
* 4. Detail (deep inspection)
|
|
18
|
+
* 5. Analysis (deeper analysis)
|
|
19
|
+
* 6. Generation (AI-powered code intelligence)
|
|
18
20
|
*/
|
|
19
21
|
export declare const ALL_TOOLS: Tool[];
|
|
20
22
|
/**
|
|
@@ -25,6 +27,8 @@ export declare const TOOL_CATEGORIES: {
|
|
|
25
27
|
discovery: string[];
|
|
26
28
|
exploration: string[];
|
|
27
29
|
detail: string[];
|
|
30
|
+
analysis: string[];
|
|
31
|
+
generation: string[];
|
|
28
32
|
};
|
|
29
33
|
/**
|
|
30
34
|
* Get tool by name
|
|
@@ -37,5 +41,5 @@ export declare function hasTool(name: string): boolean;
|
|
|
37
41
|
/**
|
|
38
42
|
* Get tools by category
|
|
39
43
|
*/
|
|
40
|
-
export declare function getToolsByCategory(category: 'orchestration' | 'discovery' | 'exploration' | 'detail'): Tool[];
|
|
44
|
+
export declare function getToolsByCategory(category: 'orchestration' | 'discovery' | 'exploration' | 'detail' | 'analysis' | 'generation'): Tool[];
|
|
41
45
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAQ/D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,EAAE,IAAI,EAO3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;CAO3B,CAAC;AAEF;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAEtD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,WAAW,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI,EAAE,CAezI"}
|
package/dist/tools/registry.js
CHANGED
|
@@ -10,6 +10,8 @@ import { DISCOVERY_TOOLS } from './discovery/index.js';
|
|
|
10
10
|
import { EXPLORATION_TOOLS } from './exploration/index.js';
|
|
11
11
|
import { DETAIL_TOOLS } from './detail/index.js';
|
|
12
12
|
import { ORCHESTRATION_TOOLS } from './orchestration/index.js';
|
|
13
|
+
import { ANALYSIS_TOOLS } from './analysis/index.js';
|
|
14
|
+
import { GENERATION_TOOLS } from './generation/index.js';
|
|
13
15
|
/**
|
|
14
16
|
* All registered tools
|
|
15
17
|
*
|
|
@@ -18,12 +20,16 @@ import { ORCHESTRATION_TOOLS } from './orchestration/index.js';
|
|
|
18
20
|
* 2. Discovery (quick health checks)
|
|
19
21
|
* 3. Exploration (browsing/listing)
|
|
20
22
|
* 4. Detail (deep inspection)
|
|
23
|
+
* 5. Analysis (deeper analysis)
|
|
24
|
+
* 6. Generation (AI-powered code intelligence)
|
|
21
25
|
*/
|
|
22
26
|
export const ALL_TOOLS = [
|
|
23
27
|
...ORCHESTRATION_TOOLS, // Start here
|
|
24
28
|
...DISCOVERY_TOOLS,
|
|
25
29
|
...EXPLORATION_TOOLS,
|
|
26
30
|
...DETAIL_TOOLS,
|
|
31
|
+
...ANALYSIS_TOOLS,
|
|
32
|
+
...GENERATION_TOOLS, // AI-powered tools
|
|
27
33
|
];
|
|
28
34
|
/**
|
|
29
35
|
* Tool categories for documentation
|
|
@@ -33,6 +39,8 @@ export const TOOL_CATEGORIES = {
|
|
|
33
39
|
discovery: DISCOVERY_TOOLS.map(t => t.name),
|
|
34
40
|
exploration: EXPLORATION_TOOLS.map(t => t.name),
|
|
35
41
|
detail: DETAIL_TOOLS.map(t => t.name),
|
|
42
|
+
analysis: ANALYSIS_TOOLS.map(t => t.name),
|
|
43
|
+
generation: GENERATION_TOOLS.map(t => t.name),
|
|
36
44
|
};
|
|
37
45
|
/**
|
|
38
46
|
* Get tool by name
|
|
@@ -59,6 +67,10 @@ export function getToolsByCategory(category) {
|
|
|
59
67
|
return EXPLORATION_TOOLS;
|
|
60
68
|
case 'detail':
|
|
61
69
|
return DETAIL_TOOLS;
|
|
70
|
+
case 'analysis':
|
|
71
|
+
return ANALYSIS_TOOLS;
|
|
72
|
+
case 'generation':
|
|
73
|
+
return GENERATION_TOOLS;
|
|
62
74
|
}
|
|
63
75
|
}
|
|
64
76
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,SAAS,GAAW;IAC/B,GAAG,mBAAmB,EAAG,aAAa;IACtC,GAAG,eAAe;IAClB,GAAG,iBAAiB;IACpB,GAAG,YAAY;IACf,GAAG,cAAc;IACjB,GAAG,gBAAgB,EAAM,mBAAmB;CAC7C,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,WAAW,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;CAC9C,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAA8F;IAC/H,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,eAAe;YAClB,OAAO,mBAAmB,CAAC;QAC7B,KAAK,WAAW;YACd,OAAO,eAAe,CAAC;QACzB,KAAK,aAAa;YAChB,OAAO,iBAAiB,CAAC;QAC3B,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC;QACtB,KAAK,UAAU;YACb,OAAO,cAAc,CAAC;QACxB,KAAK,YAAY;YACf,OAAO,gBAAgB,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "driftdetect-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "MCP (Model Context Protocol) server for Drift - enables AI agents to query codebase patterns",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Geoffrey Fernald",
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
],
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
36
|
-
"driftdetect-core": "0.
|
|
37
|
-
"driftdetect-detectors": "0.
|
|
36
|
+
"driftdetect-core": "0.5.0",
|
|
37
|
+
"driftdetect-detectors": "0.5.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^20.10.0",
|