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.
Files changed (77) hide show
  1. package/dist/enterprise-server.d.ts +7 -0
  2. package/dist/enterprise-server.d.ts.map +1 -1
  3. package/dist/enterprise-server.js +77 -7
  4. package/dist/enterprise-server.js.map +1 -1
  5. package/dist/tools/analysis/coupling.d.ts +56 -0
  6. package/dist/tools/analysis/coupling.d.ts.map +1 -0
  7. package/dist/tools/analysis/coupling.js +248 -0
  8. package/dist/tools/analysis/coupling.js.map +1 -0
  9. package/dist/tools/analysis/error-handling.d.ts +45 -0
  10. package/dist/tools/analysis/error-handling.d.ts.map +1 -0
  11. package/dist/tools/analysis/error-handling.js +220 -0
  12. package/dist/tools/analysis/error-handling.js.map +1 -0
  13. package/dist/tools/analysis/index.d.ts +11 -0
  14. package/dist/tools/analysis/index.d.ts.map +1 -0
  15. package/dist/tools/analysis/index.js +111 -0
  16. package/dist/tools/analysis/index.js.map +1 -0
  17. package/dist/tools/analysis/test-topology.d.ts +43 -0
  18. package/dist/tools/analysis/test-topology.d.ts.map +1 -0
  19. package/dist/tools/analysis/test-topology.js +294 -0
  20. package/dist/tools/analysis/test-topology.js.map +1 -0
  21. package/dist/tools/detail/code-examples.d.ts +20 -3
  22. package/dist/tools/detail/code-examples.d.ts.map +1 -1
  23. package/dist/tools/detail/code-examples.js +104 -0
  24. package/dist/tools/detail/code-examples.js.map +1 -1
  25. package/dist/tools/detail/index.d.ts +6 -4
  26. package/dist/tools/detail/index.d.ts.map +1 -1
  27. package/dist/tools/detail/index.js +44 -2
  28. package/dist/tools/detail/index.js.map +1 -1
  29. package/dist/tools/detail/pattern-get.d.ts +20 -3
  30. package/dist/tools/detail/pattern-get.d.ts.map +1 -1
  31. package/dist/tools/detail/pattern-get.js +87 -0
  32. package/dist/tools/detail/pattern-get.js.map +1 -1
  33. package/dist/tools/detail/wrappers.d.ts +97 -0
  34. package/dist/tools/detail/wrappers.d.ts.map +1 -0
  35. package/dist/tools/detail/wrappers.js +124 -0
  36. package/dist/tools/detail/wrappers.js.map +1 -0
  37. package/dist/tools/discovery/index.d.ts +3 -1
  38. package/dist/tools/discovery/index.d.ts.map +1 -1
  39. package/dist/tools/discovery/index.js +36 -1
  40. package/dist/tools/discovery/index.js.map +1 -1
  41. package/dist/tools/discovery/status.d.ts +16 -3
  42. package/dist/tools/discovery/status.d.ts.map +1 -1
  43. package/dist/tools/discovery/status.js +83 -1
  44. package/dist/tools/discovery/status.js.map +1 -1
  45. package/dist/tools/exploration/index.d.ts +2 -2
  46. package/dist/tools/exploration/index.d.ts.map +1 -1
  47. package/dist/tools/exploration/index.js +1 -1
  48. package/dist/tools/exploration/index.js.map +1 -1
  49. package/dist/tools/exploration/patterns-list.d.ts +21 -4
  50. package/dist/tools/exploration/patterns-list.d.ts.map +1 -1
  51. package/dist/tools/exploration/patterns-list.js +70 -0
  52. package/dist/tools/exploration/patterns-list.js.map +1 -1
  53. package/dist/tools/generation/__tests__/generation-tools.test.d.ts +6 -0
  54. package/dist/tools/generation/__tests__/generation-tools.test.d.ts.map +1 -0
  55. package/dist/tools/generation/__tests__/generation-tools.test.js +119 -0
  56. package/dist/tools/generation/__tests__/generation-tools.test.js.map +1 -0
  57. package/dist/tools/generation/explain.d.ts +75 -0
  58. package/dist/tools/generation/explain.d.ts.map +1 -0
  59. package/dist/tools/generation/explain.js +238 -0
  60. package/dist/tools/generation/explain.js.map +1 -0
  61. package/dist/tools/generation/index.d.ts +12 -0
  62. package/dist/tools/generation/index.d.ts.map +1 -0
  63. package/dist/tools/generation/index.js +90 -0
  64. package/dist/tools/generation/index.js.map +1 -0
  65. package/dist/tools/generation/suggest-changes.d.ts +64 -0
  66. package/dist/tools/generation/suggest-changes.d.ts.map +1 -0
  67. package/dist/tools/generation/suggest-changes.js +342 -0
  68. package/dist/tools/generation/suggest-changes.js.map +1 -0
  69. package/dist/tools/generation/validate-change.d.ts +76 -0
  70. package/dist/tools/generation/validate-change.d.ts.map +1 -0
  71. package/dist/tools/generation/validate-change.js +415 -0
  72. package/dist/tools/generation/validate-change.js.map +1 -0
  73. package/dist/tools/registry.d.ts +5 -1
  74. package/dist/tools/registry.d.ts.map +1 -1
  75. package/dist/tools/registry.js +12 -0
  76. package/dist/tools/registry.js.map +1 -1
  77. 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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"}
@@ -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;AAM/D;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,EAAE,IAAI,EAK3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;CAK3B,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,IAAI,EAAE,CAW7G"}
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"}
@@ -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;AAE/D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,SAAS,GAAW;IAC/B,GAAG,mBAAmB,EAAG,aAAa;IACtC,GAAG,eAAe;IAClB,GAAG,iBAAiB;IACpB,GAAG,YAAY;CAChB,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;CACtC,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,QAAkE;IACnG,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;IACxB,CAAC;AACH,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.4.6",
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.4.6",
37
- "driftdetect-detectors": "0.4.6"
36
+ "driftdetect-core": "0.5.0",
37
+ "driftdetect-detectors": "0.5.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^20.10.0",