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
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrappers.js","sourceRoot":"","sources":["../../../src/tools/detail/wrappers.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
8
8
|
export declare const DISCOVERY_TOOLS: Tool[];
|
|
9
|
-
export { handleStatus } from './status.js';
|
|
9
|
+
export { handleStatus, handleStatusWithService } from './status.js';
|
|
10
10
|
export { handleCapabilities } from './capabilities.js';
|
|
11
|
+
export { handleProjects } from './projects.js';
|
|
11
12
|
export type { StatusData } from './status.js';
|
|
12
13
|
export type { CapabilitiesData } from './capabilities.js';
|
|
14
|
+
export type { ProjectsArgs } from './projects.js';
|
|
13
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/discovery/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,eAAO,MAAM,eAAe,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/discovery/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,eAAO,MAAM,eAAe,EAAE,IAAI,EAmDjC,CAAC;AAGF,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -21,8 +21,43 @@ export const DISCOVERY_TOOLS = [
|
|
|
21
21
|
properties: {},
|
|
22
22
|
},
|
|
23
23
|
},
|
|
24
|
+
{
|
|
25
|
+
name: 'drift_projects',
|
|
26
|
+
description: 'List and manage registered drift projects. Enables working across multiple codebases. Actions: list (show all), info (project details), switch (change active), recent (recently used), register (add new).',
|
|
27
|
+
inputSchema: {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {
|
|
30
|
+
action: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
enum: ['list', 'info', 'switch', 'recent', 'register'],
|
|
33
|
+
description: 'Action to perform (default: list)',
|
|
34
|
+
},
|
|
35
|
+
project: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Project name or ID (for info/switch)',
|
|
38
|
+
},
|
|
39
|
+
path: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'Project path (for register)',
|
|
42
|
+
},
|
|
43
|
+
language: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'Filter by language (for list)',
|
|
46
|
+
},
|
|
47
|
+
framework: {
|
|
48
|
+
type: 'string',
|
|
49
|
+
description: 'Filter by framework (for list)',
|
|
50
|
+
},
|
|
51
|
+
limit: {
|
|
52
|
+
type: 'number',
|
|
53
|
+
description: 'Limit results (default: 10)',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
24
58
|
];
|
|
25
59
|
// Handler exports
|
|
26
|
-
export { handleStatus } from './status.js';
|
|
60
|
+
export { handleStatus, handleStatusWithService } from './status.js';
|
|
27
61
|
export { handleCapabilities } from './capabilities.js';
|
|
62
|
+
export { handleProjects } from './projects.js';
|
|
28
63
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/discovery/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,4KAA4K;QACzL,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,yJAAyJ;QACtK,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;CACF,CAAC;AAEF,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/discovery/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,4KAA4K;QACzL,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,yJAAyJ;QACtK,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,6MAA6M;QAC1N,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC;oBACtD,WAAW,EAAE,mCAAmC;iBACjD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sCAAsC;iBACpD;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6BAA6B;iBAC3C;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+BAA+B;iBAC7C;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6BAA6B;iBAC3C;aACF;SACF;KACF;CACF,CAAC;AAEF,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -9,8 +9,11 @@
|
|
|
9
9
|
*
|
|
10
10
|
* OPTIMIZED: Uses pre-computed views from the data lake for instant response.
|
|
11
11
|
* Falls back to computing from raw data if views are unavailable.
|
|
12
|
+
*
|
|
13
|
+
* MIGRATION: Now supports both legacy PatternStore and new IPatternService.
|
|
14
|
+
* The service-based approach is preferred for new code.
|
|
12
15
|
*/
|
|
13
|
-
import type { PatternStore, DataLake } from 'driftdetect-core';
|
|
16
|
+
import type { PatternStore, DataLake, IPatternService } from 'driftdetect-core';
|
|
14
17
|
export interface StatusData {
|
|
15
18
|
health: {
|
|
16
19
|
score: number;
|
|
@@ -28,10 +31,20 @@ export interface StatusData {
|
|
|
28
31
|
};
|
|
29
32
|
lastScan?: string | undefined;
|
|
30
33
|
/** Response source for debugging */
|
|
31
|
-
_source?: 'view' | 'computed';
|
|
34
|
+
_source?: 'view' | 'computed' | 'service';
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
34
|
-
* Handle status request
|
|
37
|
+
* Handle status request using IPatternService (preferred)
|
|
38
|
+
*/
|
|
39
|
+
export declare function handleStatusWithService(service: IPatternService, _args: Record<string, unknown>, dataLake?: DataLake): Promise<{
|
|
40
|
+
content: Array<{
|
|
41
|
+
type: string;
|
|
42
|
+
text: string;
|
|
43
|
+
}>;
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Handle status request using legacy PatternStore (backward compatibility)
|
|
47
|
+
* @deprecated Use handleStatusWithService instead
|
|
35
48
|
*/
|
|
36
49
|
export declare function handleStatus(store: PatternStore, _args: Record<string, unknown>, dataLake?: DataLake): Promise<{
|
|
37
50
|
content: Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/tools/discovery/status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/tools/discovery/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAc,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG5F,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;KAC7C,CAAC;IACF,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC,CAAC;IACF,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAoF7D;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAwF7D"}
|
|
@@ -9,10 +9,92 @@
|
|
|
9
9
|
*
|
|
10
10
|
* OPTIMIZED: Uses pre-computed views from the data lake for instant response.
|
|
11
11
|
* Falls back to computing from raw data if views are unavailable.
|
|
12
|
+
*
|
|
13
|
+
* MIGRATION: Now supports both legacy PatternStore and new IPatternService.
|
|
14
|
+
* The service-based approach is preferred for new code.
|
|
12
15
|
*/
|
|
13
16
|
import { createResponseBuilder } from '../../infrastructure/index.js';
|
|
14
17
|
/**
|
|
15
|
-
* Handle status request
|
|
18
|
+
* Handle status request using IPatternService (preferred)
|
|
19
|
+
*/
|
|
20
|
+
export async function handleStatusWithService(service, _args, dataLake) {
|
|
21
|
+
const builder = createResponseBuilder();
|
|
22
|
+
try {
|
|
23
|
+
// OPTIMIZATION: Try data lake view first (instant response)
|
|
24
|
+
if (dataLake) {
|
|
25
|
+
const statusView = await tryGetStatusFromLake(dataLake);
|
|
26
|
+
if (statusView) {
|
|
27
|
+
return buildResponseFromView(builder, statusView);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Use the pattern service
|
|
31
|
+
const status = await service.getStatus();
|
|
32
|
+
// Count issues from patterns
|
|
33
|
+
const result = await service.query({
|
|
34
|
+
filter: { statuses: ['approved'] },
|
|
35
|
+
pagination: { offset: 0, limit: 1000 },
|
|
36
|
+
});
|
|
37
|
+
const criticalIssues = result.patterns.filter(p => p.outliers.length > 5).length;
|
|
38
|
+
const warnings = result.patterns.filter(p => p.confidence < 0.7 && p.locations.length > 3).length;
|
|
39
|
+
const data = {
|
|
40
|
+
health: {
|
|
41
|
+
score: status.healthScore,
|
|
42
|
+
trend: 'stable', // TODO: Calculate from history
|
|
43
|
+
},
|
|
44
|
+
patterns: {
|
|
45
|
+
total: status.totalPatterns,
|
|
46
|
+
approved: status.byStatus.approved,
|
|
47
|
+
discovered: status.byStatus.discovered,
|
|
48
|
+
byCategory: status.byCategory,
|
|
49
|
+
},
|
|
50
|
+
issues: {
|
|
51
|
+
critical: criticalIssues,
|
|
52
|
+
warnings,
|
|
53
|
+
},
|
|
54
|
+
lastScan: status.lastScanAt?.toISOString(),
|
|
55
|
+
_source: 'service',
|
|
56
|
+
};
|
|
57
|
+
// Build summary
|
|
58
|
+
let summary = `Health: ${status.healthScore}/100. `;
|
|
59
|
+
summary += `${status.totalPatterns} patterns (${status.byStatus.approved} approved). `;
|
|
60
|
+
if (criticalIssues > 0) {
|
|
61
|
+
summary += `⚠️ ${criticalIssues} critical issues.`;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
summary += 'No critical issues.';
|
|
65
|
+
}
|
|
66
|
+
return builder
|
|
67
|
+
.withSummary(summary)
|
|
68
|
+
.withData(data)
|
|
69
|
+
.withHints({
|
|
70
|
+
nextActions: [
|
|
71
|
+
criticalIssues > 0
|
|
72
|
+
? 'Use drift_patterns_list with status="approved" to see patterns with issues'
|
|
73
|
+
: 'Use drift_patterns_list to explore discovered patterns',
|
|
74
|
+
'Use drift_capabilities to see all available tools',
|
|
75
|
+
],
|
|
76
|
+
...(criticalIssues > 0 ? { warnings: [`${criticalIssues} approved patterns have significant outliers`] } : {}),
|
|
77
|
+
})
|
|
78
|
+
.buildContent();
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
// No patterns found - likely needs scan
|
|
82
|
+
return builder
|
|
83
|
+
.withSummary('No pattern data found. Run drift scan first.')
|
|
84
|
+
.withData({
|
|
85
|
+
health: { score: 0, trend: 'stable' },
|
|
86
|
+
patterns: { total: 0, approved: 0, discovered: 0, byCategory: {} },
|
|
87
|
+
issues: { critical: 0, warnings: 0 },
|
|
88
|
+
})
|
|
89
|
+
.withHints({
|
|
90
|
+
nextActions: ["Run 'drift scan' in the project root to analyze patterns"],
|
|
91
|
+
})
|
|
92
|
+
.buildContent();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Handle status request using legacy PatternStore (backward compatibility)
|
|
97
|
+
* @deprecated Use handleStatusWithService instead
|
|
16
98
|
*/
|
|
17
99
|
export async function handleStatus(store, _args, dataLake) {
|
|
18
100
|
const builder = createResponseBuilder();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/tools/discovery/status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/tools/discovery/status.ts"],"names":[],"mappings":"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"}
|