driftdetect-mcp 0.4.6 → 0.5.1
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 +79 -9
- 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/file-patterns.d.ts +3 -2
- package/dist/tools/detail/file-patterns.d.ts.map +1 -1
- package/dist/tools/detail/file-patterns.js +20 -12
- package/dist/tools/detail/file-patterns.js.map +1 -1
- package/dist/tools/detail/files-list.d.ts +3 -3
- package/dist/tools/detail/files-list.d.ts.map +1 -1
- package/dist/tools/detail/files-list.js +33 -16
- package/dist/tools/detail/files-list.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files-list.d.ts","sourceRoot":"","sources":["../../../src/tools/detail/files-list.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"files-list.d.ts","sourceRoot":"","sources":["../../../src/tools/detail/files-list.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAID,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA2G7D"}
|
|
@@ -3,26 +3,43 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Detail tool that lists files matching a glob pattern with their pattern counts.
|
|
5
5
|
* Supports pagination for large codebases.
|
|
6
|
+
*
|
|
7
|
+
* Uses IndexStore (by-file.json) for file-to-pattern mapping.
|
|
6
8
|
*/
|
|
9
|
+
import { IndexStore, PatternStore } from 'driftdetect-core';
|
|
7
10
|
import { createResponseBuilder, createCursor, parseCursor } from '../../infrastructure/index.js';
|
|
8
11
|
const DEFAULT_LIMIT = 20;
|
|
9
|
-
export async function handleFilesList(
|
|
12
|
+
export async function handleFilesList(projectRoot, args) {
|
|
10
13
|
const builder = createResponseBuilder();
|
|
11
|
-
|
|
12
|
-
const
|
|
14
|
+
// Use IndexStore for file-to-pattern mapping
|
|
15
|
+
const indexStore = new IndexStore({ rootDir: projectRoot });
|
|
16
|
+
await indexStore.initialize();
|
|
17
|
+
const fileIndex = await indexStore.getFileIndex();
|
|
18
|
+
if (!fileIndex || Object.keys(fileIndex.patterns).length === 0) {
|
|
19
|
+
return builder
|
|
20
|
+
.withSummary('0 files with 0 pattern instances.')
|
|
21
|
+
.withData({ files: [], totalFiles: 0, totalPatterns: 0 })
|
|
22
|
+
.withHints({
|
|
23
|
+
nextActions: ['Run drift scan to discover patterns'],
|
|
24
|
+
relatedTools: ['drift_file_patterns', 'drift_patterns_list'],
|
|
25
|
+
})
|
|
26
|
+
.buildContent();
|
|
27
|
+
}
|
|
13
28
|
const limit = args.limit ?? DEFAULT_LIMIT;
|
|
14
29
|
const offset = args.cursor ? parseCursor(args.cursor).offset : 0;
|
|
15
30
|
const pathPattern = args.path ?? '**/*';
|
|
16
|
-
// Get all files from
|
|
17
|
-
const allFiles = Object.entries(
|
|
31
|
+
// Get all files from index
|
|
32
|
+
const allFiles = Object.entries(fileIndex.patterns);
|
|
18
33
|
// Filter by path pattern (simple glob matching)
|
|
19
34
|
let filteredFiles = allFiles.filter(([filePath]) => matchGlob(filePath, pathPattern));
|
|
35
|
+
// Load pattern store to get categories
|
|
36
|
+
const patternStore = new PatternStore({ rootDir: projectRoot });
|
|
37
|
+
await patternStore.initialize();
|
|
20
38
|
// Build file entries with pattern info
|
|
21
|
-
let fileEntries = filteredFiles.map(([filePath,
|
|
22
|
-
const patternIds = fileData.patterns;
|
|
39
|
+
let fileEntries = filteredFiles.map(([filePath, patternIds]) => {
|
|
23
40
|
const categories = new Set();
|
|
24
41
|
for (const patternId of patternIds) {
|
|
25
|
-
const pattern =
|
|
42
|
+
const pattern = patternStore.get(patternId);
|
|
26
43
|
if (pattern) {
|
|
27
44
|
categories.add(pattern.category);
|
|
28
45
|
}
|
|
@@ -31,7 +48,6 @@ export async function handleFilesList(store, args) {
|
|
|
31
48
|
file: filePath,
|
|
32
49
|
patternCount: patternIds.length,
|
|
33
50
|
categories: Array.from(categories).sort(),
|
|
34
|
-
lastScanned: fileData.lastScanned,
|
|
35
51
|
};
|
|
36
52
|
});
|
|
37
53
|
// Filter by category if specified
|
|
@@ -51,12 +67,12 @@ export async function handleFilesList(store, args) {
|
|
|
51
67
|
totalPatterns,
|
|
52
68
|
};
|
|
53
69
|
// Build summary
|
|
54
|
-
let summary =
|
|
70
|
+
let summary = totalFiles + ' files with ' + totalPatterns + ' pattern instances.';
|
|
55
71
|
if (args.path && args.path !== '**/*') {
|
|
56
|
-
summary =
|
|
72
|
+
summary = 'Matching "' + args.path + '": ' + summary;
|
|
57
73
|
}
|
|
58
74
|
if (args.category) {
|
|
59
|
-
summary +=
|
|
75
|
+
summary += ' Filtered to ' + args.category + ' category.';
|
|
60
76
|
}
|
|
61
77
|
// Add pagination
|
|
62
78
|
if (hasMore) {
|
|
@@ -74,7 +90,7 @@ export async function handleFilesList(store, args) {
|
|
|
74
90
|
nextActions: paginatedFiles.length > 0
|
|
75
91
|
? [
|
|
76
92
|
'Use drift_file_patterns with a specific file to see its patterns',
|
|
77
|
-
hasMore ?
|
|
93
|
+
hasMore ? 'Use cursor="' + createCursor(offset + limit, limit) + '" to see more files' : '',
|
|
78
94
|
].filter(Boolean)
|
|
79
95
|
: ['Run drift scan to discover patterns'],
|
|
80
96
|
relatedTools: ['drift_file_patterns', 'drift_patterns_list'],
|
|
@@ -87,13 +103,14 @@ export async function handleFilesList(store, args) {
|
|
|
87
103
|
function matchGlob(filePath, pattern) {
|
|
88
104
|
if (pattern === '**/*' || pattern === '*')
|
|
89
105
|
return true;
|
|
106
|
+
// Escape special regex chars first, then handle glob patterns
|
|
90
107
|
const regexPattern = pattern
|
|
108
|
+
.replace(/\./g, '\\.')
|
|
91
109
|
.replace(/\*\*/g, '{{GLOBSTAR}}')
|
|
92
110
|
.replace(/\*/g, '[^/]*')
|
|
93
111
|
.replace(/{{GLOBSTAR}}/g, '.*')
|
|
94
|
-
.replace(/\?/g, '.')
|
|
95
|
-
|
|
96
|
-
const regex = new RegExp(`^${regexPattern}$`);
|
|
112
|
+
.replace(/\?/g, '.');
|
|
113
|
+
const regex = new RegExp('^' + regexPattern + '$');
|
|
97
114
|
return regex.test(filePath);
|
|
98
115
|
}
|
|
99
116
|
//# sourceMappingURL=files-list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files-list.js","sourceRoot":"","sources":["../../../src/tools/detail/files-list.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"files-list.js","sourceRoot":"","sources":["../../../src/tools/detail/files-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,18 +6,20 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
8
8
|
export declare const DETAIL_TOOLS: Tool[];
|
|
9
|
-
export { handlePatternGet } from './pattern-get.js';
|
|
10
|
-
export { handleCodeExamples } from './code-examples.js';
|
|
9
|
+
export { handlePatternGet, handlePatternGetWithService } from './pattern-get.js';
|
|
10
|
+
export { handleCodeExamples, handleCodeExamplesWithService } from './code-examples.js';
|
|
11
11
|
export { handleFilesList } from './files-list.js';
|
|
12
12
|
export { handleFilePatterns } from './file-patterns.js';
|
|
13
13
|
export { handleImpactAnalysis } from './impact-analysis.js';
|
|
14
14
|
export { handleReachability } from './reachability.js';
|
|
15
15
|
export { handleDNAProfile } from './dna-profile.js';
|
|
16
|
-
export
|
|
17
|
-
export type {
|
|
16
|
+
export { handleWrappers, handleWrappersWithConfig } from './wrappers.js';
|
|
17
|
+
export type { PatternGetData, PatternLocation, PatternOutlier, PatternGetArgs } from './pattern-get.js';
|
|
18
|
+
export type { CodeExamplesData, CodeExample, CodeExamplesArgs } from './code-examples.js';
|
|
18
19
|
export type { FilesListData, FileEntry } from './files-list.js';
|
|
19
20
|
export type { FilePatternData, FilePattern, FilePatternLocation } from './file-patterns.js';
|
|
20
21
|
export type { ImpactData, AffectedCaller, SensitivePath } from './impact-analysis.js';
|
|
21
22
|
export type { ReachabilityData, ForwardReachabilityData, InverseReachabilityData, ReachableData, SensitiveField, AccessPath } from './reachability.js';
|
|
22
23
|
export type { DNAProfileData, GeneProfile } from './dna-profile.js';
|
|
24
|
+
export type { WrappersData, WrappersArgs, ClusterSummary, WrapperSummary } from './wrappers.js';
|
|
23
25
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/detail/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/detail/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAqB/D,eAAO,MAAM,YAAY,EAAE,IAAI,EAiN9B,CAAC;AAGF,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAGzE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACxG,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC5F,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACtF,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACvJ,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -14,6 +14,12 @@ const GENE_IDS = [
|
|
|
14
14
|
'variant-handling', 'responsive-approach', 'state-styling',
|
|
15
15
|
'theming', 'spacing-philosophy', 'animation-approach',
|
|
16
16
|
];
|
|
17
|
+
const WRAPPER_CATEGORIES = [
|
|
18
|
+
'state-management', 'data-fetching', 'side-effects', 'authentication',
|
|
19
|
+
'authorization', 'validation', 'dependency-injection', 'middleware',
|
|
20
|
+
'testing', 'logging', 'caching', 'error-handling', 'async-utilities',
|
|
21
|
+
'form-handling', 'routing', 'factory', 'decorator', 'utility', 'other',
|
|
22
|
+
];
|
|
17
23
|
export const DETAIL_TOOLS = [
|
|
18
24
|
// Pattern Tools
|
|
19
25
|
{
|
|
@@ -184,13 +190,49 @@ export const DETAIL_TOOLS = [
|
|
|
184
190
|
},
|
|
185
191
|
},
|
|
186
192
|
},
|
|
193
|
+
// Wrapper Detection Tools
|
|
194
|
+
{
|
|
195
|
+
name: 'drift_wrappers',
|
|
196
|
+
description: 'Detect framework wrapper patterns. Identifies custom abstractions built on top of framework primitives (React hooks, Express middleware, etc.). Shows clusters of similar wrappers with confidence scores.',
|
|
197
|
+
inputSchema: {
|
|
198
|
+
type: 'object',
|
|
199
|
+
properties: {
|
|
200
|
+
category: {
|
|
201
|
+
type: 'string',
|
|
202
|
+
enum: WRAPPER_CATEGORIES,
|
|
203
|
+
description: 'Filter by wrapper category',
|
|
204
|
+
},
|
|
205
|
+
minConfidence: {
|
|
206
|
+
type: 'number',
|
|
207
|
+
description: 'Minimum cluster confidence 0-1 (default: 0.5)',
|
|
208
|
+
},
|
|
209
|
+
minClusterSize: {
|
|
210
|
+
type: 'number',
|
|
211
|
+
description: 'Minimum wrappers per cluster (default: 2)',
|
|
212
|
+
},
|
|
213
|
+
maxDepth: {
|
|
214
|
+
type: 'number',
|
|
215
|
+
description: 'Maximum wrapper depth to traverse (default: 10)',
|
|
216
|
+
},
|
|
217
|
+
includeTests: {
|
|
218
|
+
type: 'boolean',
|
|
219
|
+
description: 'Include test files in analysis (default: false)',
|
|
220
|
+
},
|
|
221
|
+
limit: {
|
|
222
|
+
type: 'number',
|
|
223
|
+
description: 'Maximum clusters to return (default: 20)',
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
},
|
|
187
228
|
];
|
|
188
229
|
// Handler exports
|
|
189
|
-
export { handlePatternGet } from './pattern-get.js';
|
|
190
|
-
export { handleCodeExamples } from './code-examples.js';
|
|
230
|
+
export { handlePatternGet, handlePatternGetWithService } from './pattern-get.js';
|
|
231
|
+
export { handleCodeExamples, handleCodeExamplesWithService } from './code-examples.js';
|
|
191
232
|
export { handleFilesList } from './files-list.js';
|
|
192
233
|
export { handleFilePatterns } from './file-patterns.js';
|
|
193
234
|
export { handleImpactAnalysis } from './impact-analysis.js';
|
|
194
235
|
export { handleReachability } from './reachability.js';
|
|
195
236
|
export { handleDNAProfile } from './dna-profile.js';
|
|
237
|
+
export { handleWrappers, handleWrappersWithConfig } from './wrappers.js';
|
|
196
238
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/detail/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/detail/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Detail tool that returns complete information for a specific pattern.
|
|
5
5
|
* Use pattern ID from drift_patterns_list.
|
|
6
|
+
*
|
|
7
|
+
* MIGRATION: Now supports both legacy PatternStore and new IPatternService.
|
|
8
|
+
* The service-based approach is preferred for new code.
|
|
6
9
|
*/
|
|
7
|
-
import type { PatternStore } from 'driftdetect-core';
|
|
10
|
+
import type { PatternStore, IPatternService } from 'driftdetect-core';
|
|
8
11
|
export interface PatternLocation {
|
|
9
12
|
file: string;
|
|
10
13
|
line: number;
|
|
@@ -31,12 +34,26 @@ export interface PatternGetData {
|
|
|
31
34
|
locationCount: number;
|
|
32
35
|
outlierCount: number;
|
|
33
36
|
}
|
|
34
|
-
export
|
|
37
|
+
export interface PatternGetArgs {
|
|
35
38
|
id: string;
|
|
36
39
|
includeLocations?: boolean;
|
|
37
40
|
includeOutliers?: boolean;
|
|
38
41
|
maxLocations?: number;
|
|
39
|
-
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Handle pattern get using IPatternService (preferred)
|
|
45
|
+
*/
|
|
46
|
+
export declare function handlePatternGetWithService(service: IPatternService, args: PatternGetArgs): Promise<{
|
|
47
|
+
content: Array<{
|
|
48
|
+
type: string;
|
|
49
|
+
text: string;
|
|
50
|
+
}>;
|
|
51
|
+
}>;
|
|
52
|
+
/**
|
|
53
|
+
* Handle pattern get using legacy PatternStore (backward compatibility)
|
|
54
|
+
* @deprecated Use handlePatternGetWithService instead
|
|
55
|
+
*/
|
|
56
|
+
export declare function handlePatternGet(store: PatternStore, args: PatternGetArgs): Promise<{
|
|
40
57
|
content: Array<{
|
|
41
58
|
type: string;
|
|
42
59
|
text: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-get.d.ts","sourceRoot":"","sources":["../../../src/tools/detail/pattern-get.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pattern-get.d.ts","sourceRoot":"","sources":["../../../src/tools/detail/pattern-get.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGtE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAsF7D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAwF7D"}
|
|
@@ -3,9 +3,96 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Detail tool that returns complete information for a specific pattern.
|
|
5
5
|
* Use pattern ID from drift_patterns_list.
|
|
6
|
+
*
|
|
7
|
+
* MIGRATION: Now supports both legacy PatternStore and new IPatternService.
|
|
8
|
+
* The service-based approach is preferred for new code.
|
|
6
9
|
*/
|
|
7
10
|
import { createResponseBuilder, Errors } from '../../infrastructure/index.js';
|
|
8
11
|
const DEFAULT_MAX_LOCATIONS = 20;
|
|
12
|
+
/**
|
|
13
|
+
* Handle pattern get using IPatternService (preferred)
|
|
14
|
+
*/
|
|
15
|
+
export async function handlePatternGetWithService(service, args) {
|
|
16
|
+
const builder = createResponseBuilder();
|
|
17
|
+
if (!args.id) {
|
|
18
|
+
throw Errors.missingParameter('id');
|
|
19
|
+
}
|
|
20
|
+
const pattern = await service.getPattern(args.id);
|
|
21
|
+
if (!pattern) {
|
|
22
|
+
throw Errors.notFound('pattern', args.id);
|
|
23
|
+
}
|
|
24
|
+
const includeLocations = args.includeLocations !== false;
|
|
25
|
+
const includeOutliers = args.includeOutliers !== false;
|
|
26
|
+
const maxLocations = args.maxLocations ?? DEFAULT_MAX_LOCATIONS;
|
|
27
|
+
// Map locations
|
|
28
|
+
let locations = [];
|
|
29
|
+
if (includeLocations) {
|
|
30
|
+
locations = pattern.locations
|
|
31
|
+
.slice(0, maxLocations)
|
|
32
|
+
.map(loc => ({
|
|
33
|
+
file: loc.file,
|
|
34
|
+
line: loc.line,
|
|
35
|
+
column: loc.column,
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
// Map outliers
|
|
39
|
+
let outliers = [];
|
|
40
|
+
if (includeOutliers) {
|
|
41
|
+
outliers = pattern.outliers.map(out => ({
|
|
42
|
+
file: out.file,
|
|
43
|
+
line: out.line,
|
|
44
|
+
reason: out.reason ?? 'Unknown reason',
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
const data = {
|
|
48
|
+
id: pattern.id,
|
|
49
|
+
name: pattern.name,
|
|
50
|
+
description: pattern.description,
|
|
51
|
+
category: pattern.category,
|
|
52
|
+
subcategory: pattern.subcategory,
|
|
53
|
+
status: pattern.status,
|
|
54
|
+
confidence: {
|
|
55
|
+
score: Math.round(pattern.confidence * 100) / 100,
|
|
56
|
+
level: pattern.confidenceLevel,
|
|
57
|
+
},
|
|
58
|
+
locations,
|
|
59
|
+
outliers,
|
|
60
|
+
locationCount: pattern.locations.length,
|
|
61
|
+
outlierCount: pattern.outliers.length,
|
|
62
|
+
};
|
|
63
|
+
// Build summary
|
|
64
|
+
let summary = `${pattern.name} (${pattern.category}/${pattern.subcategory}). `;
|
|
65
|
+
summary += `Confidence: ${Math.round(pattern.confidence * 100)}% (${pattern.confidenceLevel}). `;
|
|
66
|
+
summary += `${pattern.locations.length} locations`;
|
|
67
|
+
if (pattern.outliers.length > 0) {
|
|
68
|
+
summary += `, ${pattern.outliers.length} outliers`;
|
|
69
|
+
}
|
|
70
|
+
summary += '.';
|
|
71
|
+
const hints = {
|
|
72
|
+
nextActions: [
|
|
73
|
+
'Use drift_code_examples to see implementations',
|
|
74
|
+
pattern.outliers.length > 0
|
|
75
|
+
? 'Review outliers to understand deviations'
|
|
76
|
+
: 'Use drift_patterns_list to explore more patterns',
|
|
77
|
+
],
|
|
78
|
+
relatedTools: ['drift_code_examples', 'drift_patterns_list'],
|
|
79
|
+
};
|
|
80
|
+
if (pattern.outliers.length > 5) {
|
|
81
|
+
hints.warnings = [`High outlier count (${pattern.outliers.length}) may indicate pattern drift`];
|
|
82
|
+
}
|
|
83
|
+
else if (pattern.confidence < 0.7) {
|
|
84
|
+
hints.warnings = ['Low confidence - pattern may need review'];
|
|
85
|
+
}
|
|
86
|
+
return builder
|
|
87
|
+
.withSummary(summary)
|
|
88
|
+
.withData(data)
|
|
89
|
+
.withHints(hints)
|
|
90
|
+
.buildContent();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Handle pattern get using legacy PatternStore (backward compatibility)
|
|
94
|
+
* @deprecated Use handlePatternGetWithService instead
|
|
95
|
+
*/
|
|
9
96
|
export async function handlePatternGet(store, args) {
|
|
10
97
|
const builder = createResponseBuilder();
|
|
11
98
|
if (!args.id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-get.js","sourceRoot":"","sources":["../../../src/tools/detail/pattern-get.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pattern-get.js","sourceRoot":"","sources":["../../../src/tools/detail/pattern-get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrappers Tool
|
|
3
|
+
*
|
|
4
|
+
* MCP tool for detecting framework wrapper patterns.
|
|
5
|
+
* Identifies custom abstractions built on top of framework primitives.
|
|
6
|
+
*/
|
|
7
|
+
import { type WrapperCategory } from 'driftdetect-core/wrappers';
|
|
8
|
+
export interface WrappersArgs {
|
|
9
|
+
/** Filter by category */
|
|
10
|
+
category?: WrapperCategory;
|
|
11
|
+
/** Minimum cluster confidence (0-1) */
|
|
12
|
+
minConfidence?: number;
|
|
13
|
+
/** Minimum cluster size */
|
|
14
|
+
minClusterSize?: number;
|
|
15
|
+
/** Maximum wrapper depth */
|
|
16
|
+
maxDepth?: number;
|
|
17
|
+
/** Include test files */
|
|
18
|
+
includeTests?: boolean;
|
|
19
|
+
/** Maximum clusters to return */
|
|
20
|
+
limit?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface WrappersData {
|
|
23
|
+
/** Summary statistics */
|
|
24
|
+
summary: {
|
|
25
|
+
totalWrappers: number;
|
|
26
|
+
totalClusters: number;
|
|
27
|
+
avgDepth: number;
|
|
28
|
+
maxDepth: number;
|
|
29
|
+
mostWrappedPrimitive: string;
|
|
30
|
+
mostUsedWrapper: string;
|
|
31
|
+
};
|
|
32
|
+
/** Detected frameworks */
|
|
33
|
+
frameworks: Array<{
|
|
34
|
+
name: string;
|
|
35
|
+
primitiveCount: number;
|
|
36
|
+
}>;
|
|
37
|
+
/** Wrapper clusters */
|
|
38
|
+
clusters: ClusterSummary[];
|
|
39
|
+
/** Top wrappers by usage */
|
|
40
|
+
topWrappers: WrapperSummary[];
|
|
41
|
+
/** Category breakdown */
|
|
42
|
+
byCategory: Record<string, number>;
|
|
43
|
+
/** Scan duration */
|
|
44
|
+
duration: number;
|
|
45
|
+
}
|
|
46
|
+
export interface ClusterSummary {
|
|
47
|
+
id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
description: string;
|
|
50
|
+
category: WrapperCategory;
|
|
51
|
+
confidence: number;
|
|
52
|
+
wrapperCount: number;
|
|
53
|
+
avgDepth: number;
|
|
54
|
+
totalUsages: number;
|
|
55
|
+
primitives: string[];
|
|
56
|
+
suggestedNames: string[];
|
|
57
|
+
/** Sample wrappers (first 3) */
|
|
58
|
+
sampleWrappers: Array<{
|
|
59
|
+
name: string;
|
|
60
|
+
file: string;
|
|
61
|
+
line: number;
|
|
62
|
+
depth: number;
|
|
63
|
+
usages: number;
|
|
64
|
+
}>;
|
|
65
|
+
}
|
|
66
|
+
export interface WrapperSummary {
|
|
67
|
+
name: string;
|
|
68
|
+
qualifiedName: string;
|
|
69
|
+
file: string;
|
|
70
|
+
line: number;
|
|
71
|
+
depth: number;
|
|
72
|
+
usages: number;
|
|
73
|
+
primitives: string[];
|
|
74
|
+
category?: WrapperCategory | undefined;
|
|
75
|
+
isFactory: boolean;
|
|
76
|
+
isHigherOrder: boolean;
|
|
77
|
+
isDecorator: boolean;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Handle wrappers tool request
|
|
81
|
+
*/
|
|
82
|
+
export declare function handleWrappers(args: WrappersArgs, rootDir: string): Promise<{
|
|
83
|
+
content: Array<{
|
|
84
|
+
type: string;
|
|
85
|
+
text: string;
|
|
86
|
+
}>;
|
|
87
|
+
}>;
|
|
88
|
+
/**
|
|
89
|
+
* Handle wrappers tool with project config lookup
|
|
90
|
+
*/
|
|
91
|
+
export declare function handleWrappersWithConfig(args: WrappersArgs, rootDir: string): Promise<{
|
|
92
|
+
content: Array<{
|
|
93
|
+
type: string;
|
|
94
|
+
text: string;
|
|
95
|
+
}>;
|
|
96
|
+
}>;
|
|
97
|
+
//# sourceMappingURL=wrappers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrappers.d.ts","sourceRoot":"","sources":["../../../src/tools/detail/wrappers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrappers Tool
|
|
3
|
+
*
|
|
4
|
+
* MCP tool for detecting framework wrapper patterns.
|
|
5
|
+
* Identifies custom abstractions built on top of framework primitives.
|
|
6
|
+
*/
|
|
7
|
+
import { createWrapperScanner, } from 'driftdetect-core/wrappers';
|
|
8
|
+
import { createResponseBuilder } from '../../infrastructure/index.js';
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// Handler
|
|
11
|
+
// =============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Handle wrappers tool request
|
|
14
|
+
*/
|
|
15
|
+
export async function handleWrappers(args, rootDir) {
|
|
16
|
+
const builder = createResponseBuilder();
|
|
17
|
+
const { category, minConfidence = 0.5, minClusterSize = 2, maxDepth = 10, includeTests = false, limit = 20, } = args;
|
|
18
|
+
// Create scanner
|
|
19
|
+
const scanner = createWrapperScanner({
|
|
20
|
+
rootDir,
|
|
21
|
+
includeTestFiles: includeTests,
|
|
22
|
+
verbose: false,
|
|
23
|
+
});
|
|
24
|
+
// Run scan
|
|
25
|
+
const result = await scanner.scan({
|
|
26
|
+
minConfidence,
|
|
27
|
+
minClusterSize,
|
|
28
|
+
maxDepth,
|
|
29
|
+
includeTestFiles: includeTests,
|
|
30
|
+
});
|
|
31
|
+
// Filter by category if specified
|
|
32
|
+
let clusters = result.analysis.clusters;
|
|
33
|
+
if (category) {
|
|
34
|
+
clusters = clusters.filter((c) => c.category === category);
|
|
35
|
+
}
|
|
36
|
+
// Sort by confidence and limit
|
|
37
|
+
clusters = clusters
|
|
38
|
+
.sort((a, b) => b.confidence - a.confidence)
|
|
39
|
+
.slice(0, limit);
|
|
40
|
+
// Build cluster summaries
|
|
41
|
+
const clusterSummaries = clusters.map((c) => ({
|
|
42
|
+
id: c.id,
|
|
43
|
+
name: c.name,
|
|
44
|
+
description: c.description,
|
|
45
|
+
category: c.category,
|
|
46
|
+
confidence: c.confidence,
|
|
47
|
+
wrapperCount: c.wrappers.length,
|
|
48
|
+
avgDepth: c.avgDepth,
|
|
49
|
+
totalUsages: c.totalUsages,
|
|
50
|
+
primitives: c.primitiveSignature.slice(0, 5),
|
|
51
|
+
suggestedNames: c.suggestedNames,
|
|
52
|
+
sampleWrappers: c.wrappers.slice(0, 3).map((w) => ({
|
|
53
|
+
name: w.name,
|
|
54
|
+
file: w.file,
|
|
55
|
+
line: w.line,
|
|
56
|
+
depth: w.depth,
|
|
57
|
+
usages: w.calledBy.length,
|
|
58
|
+
})),
|
|
59
|
+
}));
|
|
60
|
+
// Get top wrappers by usage
|
|
61
|
+
const topWrappers = [...result.analysis.wrappers]
|
|
62
|
+
.sort((a, b) => b.calledBy.length - a.calledBy.length)
|
|
63
|
+
.slice(0, 10)
|
|
64
|
+
.map((w) => {
|
|
65
|
+
// Find which cluster this wrapper belongs to
|
|
66
|
+
const cluster = result.analysis.clusters.find((c) => c.wrappers.some((cw) => cw.qualifiedName === w.qualifiedName));
|
|
67
|
+
return {
|
|
68
|
+
name: w.name,
|
|
69
|
+
qualifiedName: w.qualifiedName,
|
|
70
|
+
file: w.file,
|
|
71
|
+
line: w.line,
|
|
72
|
+
depth: w.depth,
|
|
73
|
+
usages: w.calledBy.length,
|
|
74
|
+
primitives: w.primitiveSignature.slice(0, 3),
|
|
75
|
+
category: cluster?.category,
|
|
76
|
+
isFactory: w.isFactory,
|
|
77
|
+
isHigherOrder: w.isHigherOrder,
|
|
78
|
+
isDecorator: w.isDecorator,
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
// Build category breakdown
|
|
82
|
+
const byCategory = {};
|
|
83
|
+
for (const [cat, count] of Object.entries(result.analysis.summary.wrappersByCategory)) {
|
|
84
|
+
if (count > 0) {
|
|
85
|
+
byCategory[cat] = count;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const data = {
|
|
89
|
+
summary: {
|
|
90
|
+
totalWrappers: result.analysis.summary.totalWrappers,
|
|
91
|
+
totalClusters: result.analysis.summary.totalClusters,
|
|
92
|
+
avgDepth: result.analysis.summary.avgDepth,
|
|
93
|
+
maxDepth: result.analysis.summary.maxDepth,
|
|
94
|
+
mostWrappedPrimitive: result.analysis.summary.mostWrappedPrimitive,
|
|
95
|
+
mostUsedWrapper: result.analysis.summary.mostUsedWrapper,
|
|
96
|
+
},
|
|
97
|
+
frameworks: result.analysis.frameworks.map((f) => ({
|
|
98
|
+
name: f.name,
|
|
99
|
+
primitiveCount: f.primitiveCount,
|
|
100
|
+
})),
|
|
101
|
+
clusters: clusterSummaries,
|
|
102
|
+
topWrappers,
|
|
103
|
+
byCategory,
|
|
104
|
+
duration: result.duration,
|
|
105
|
+
};
|
|
106
|
+
const summary = `Found ${data.summary.totalWrappers} wrappers in ${data.summary.totalClusters} clusters. Avg depth: ${data.summary.avgDepth.toFixed(1)}`;
|
|
107
|
+
return builder
|
|
108
|
+
.withSummary(summary)
|
|
109
|
+
.withData(data)
|
|
110
|
+
.withHints({
|
|
111
|
+
nextActions: data.summary.totalWrappers > 0
|
|
112
|
+
? ['Review wrapper clusters for potential consolidation']
|
|
113
|
+
: ['No wrappers detected'],
|
|
114
|
+
relatedTools: ['drift_patterns_list', 'drift_code_examples'],
|
|
115
|
+
})
|
|
116
|
+
.buildContent();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Handle wrappers tool with project config lookup
|
|
120
|
+
*/
|
|
121
|
+
export async function handleWrappersWithConfig(args, rootDir) {
|
|
122
|
+
return handleWrappers(args, rootDir);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=wrappers.js.map
|