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
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
* - Response caching
|
|
14
14
|
* - Rate limiting
|
|
15
15
|
* - Metrics collection
|
|
16
|
+
*
|
|
17
|
+
* MIGRATION: Now uses IPatternService for pattern operations.
|
|
18
|
+
* The service provides a unified interface with caching and business logic.
|
|
16
19
|
*/
|
|
17
20
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
18
21
|
export interface EnterpriseMCPConfig {
|
|
@@ -21,6 +24,8 @@ export interface EnterpriseMCPConfig {
|
|
|
21
24
|
enableRateLimiting?: boolean;
|
|
22
25
|
enableMetrics?: boolean;
|
|
23
26
|
maxRequestsPerMinute?: number;
|
|
27
|
+
/** Use the new IPatternService instead of direct PatternStore access */
|
|
28
|
+
usePatternService?: boolean;
|
|
24
29
|
}
|
|
25
30
|
export declare function createEnterpriseMCPServer(config: EnterpriseMCPConfig): Server;
|
|
26
31
|
/**
|
|
@@ -31,6 +36,8 @@ export declare function getToolCategories(): {
|
|
|
31
36
|
discovery: string[];
|
|
32
37
|
exploration: string[];
|
|
33
38
|
detail: string[];
|
|
39
|
+
analysis: string[];
|
|
40
|
+
generation: string[];
|
|
34
41
|
};
|
|
35
42
|
/**
|
|
36
43
|
* Get all tools
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enterprise-server.d.ts","sourceRoot":"","sources":["../src/enterprise-server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"enterprise-server.d.ts","sourceRoot":"","sources":["../src/enterprise-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAkEnE,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAwG7E;AAoMD;;GAEG;AACH,wBAAgB,iBAAiB;;;;;;;EAEhC;AAED;;GAEG;AACH,wBAAgB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAE1B"}
|
|
@@ -13,32 +13,46 @@
|
|
|
13
13
|
* - Response caching
|
|
14
14
|
* - Rate limiting
|
|
15
15
|
* - Metrics collection
|
|
16
|
+
*
|
|
17
|
+
* MIGRATION: Now uses IPatternService for pattern operations.
|
|
18
|
+
* The service provides a unified interface with caching and business logic.
|
|
16
19
|
*/
|
|
17
20
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
18
21
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
19
|
-
import { PatternStore, ManifestStore, HistoryStore, DNAStore, BoundaryStore, ContractStore, CallGraphStore, createDataLake, } from 'driftdetect-core';
|
|
22
|
+
import { PatternStore, ManifestStore, HistoryStore, DNAStore, BoundaryStore, ContractStore, CallGraphStore, createDataLake, createPatternServiceFromStore, } from 'driftdetect-core';
|
|
20
23
|
// Infrastructure
|
|
21
24
|
import { handleError, rateLimiter, metrics, createCache, } from './infrastructure/index.js';
|
|
22
25
|
// Tool definitions
|
|
23
26
|
import { ALL_TOOLS, TOOL_CATEGORIES } from './tools/registry.js';
|
|
24
27
|
// Discovery handlers
|
|
25
|
-
import { handleStatus } from './tools/discovery/status.js';
|
|
28
|
+
import { handleStatus, handleStatusWithService } from './tools/discovery/status.js';
|
|
26
29
|
import { handleCapabilities } from './tools/discovery/capabilities.js';
|
|
27
30
|
// Exploration handlers
|
|
28
|
-
import { handlePatternsList } from './tools/exploration/patterns-list.js';
|
|
31
|
+
import { handlePatternsList, handlePatternsListWithService } from './tools/exploration/patterns-list.js';
|
|
29
32
|
import { handleSecuritySummary } from './tools/exploration/security-summary.js';
|
|
30
33
|
import { handleContractsList } from './tools/exploration/contracts-list.js';
|
|
31
34
|
import { handleTrends } from './tools/exploration/trends.js';
|
|
32
35
|
// Detail handlers
|
|
33
|
-
import { handlePatternGet } from './tools/detail/pattern-get.js';
|
|
34
|
-
import { handleCodeExamples } from './tools/detail/code-examples.js';
|
|
36
|
+
import { handlePatternGet, handlePatternGetWithService } from './tools/detail/pattern-get.js';
|
|
37
|
+
import { handleCodeExamples, handleCodeExamplesWithService } from './tools/detail/code-examples.js';
|
|
35
38
|
import { handleFilesList } from './tools/detail/files-list.js';
|
|
36
39
|
import { handleFilePatterns } from './tools/detail/file-patterns.js';
|
|
37
40
|
import { handleImpactAnalysis } from './tools/detail/impact-analysis.js';
|
|
38
41
|
import { handleReachability } from './tools/detail/reachability.js';
|
|
39
42
|
import { handleDNAProfile } from './tools/detail/dna-profile.js';
|
|
43
|
+
import { handleWrappers } from './tools/detail/wrappers.js';
|
|
44
|
+
// Discovery handlers (additional)
|
|
45
|
+
import { handleProjects } from './tools/discovery/projects.js';
|
|
40
46
|
// Orchestration handlers
|
|
41
47
|
import { handleContext } from './tools/orchestration/index.js';
|
|
48
|
+
// Generation handlers (new AI-powered tools)
|
|
49
|
+
import { handleSuggestChanges } from './tools/generation/suggest-changes.js';
|
|
50
|
+
import { handleValidateChange } from './tools/generation/validate-change.js';
|
|
51
|
+
import { handleExplain } from './tools/generation/explain.js';
|
|
52
|
+
// Analysis handlers (L5-L7 layers)
|
|
53
|
+
import { handleTestTopology } from './tools/analysis/test-topology.js';
|
|
54
|
+
import { handleCoupling } from './tools/analysis/coupling.js';
|
|
55
|
+
import { handleErrorHandling } from './tools/analysis/error-handling.js';
|
|
42
56
|
export function createEnterpriseMCPServer(config) {
|
|
43
57
|
const server = new Server({ name: 'drift-enterprise', version: '2.0.0' }, { capabilities: { tools: {} } });
|
|
44
58
|
// Initialize stores
|
|
@@ -51,6 +65,14 @@ export function createEnterpriseMCPServer(config) {
|
|
|
51
65
|
contract: new ContractStore({ rootDir: config.projectRoot }),
|
|
52
66
|
callGraph: new CallGraphStore({ rootDir: config.projectRoot }),
|
|
53
67
|
};
|
|
68
|
+
// Initialize pattern service (wraps PatternStore with unified interface)
|
|
69
|
+
// Default to using the new service for better abstraction
|
|
70
|
+
const usePatternService = config.usePatternService !== false;
|
|
71
|
+
const patternService = usePatternService
|
|
72
|
+
? createPatternServiceFromStore(stores.pattern, config.projectRoot, {
|
|
73
|
+
enableCache: config.enableCache !== false,
|
|
74
|
+
})
|
|
75
|
+
: null;
|
|
54
76
|
// Initialize data lake for optimized queries
|
|
55
77
|
const dataLake = createDataLake({ rootDir: config.projectRoot });
|
|
56
78
|
// Initialize cache if enabled
|
|
@@ -97,7 +119,7 @@ export function createEnterpriseMCPServer(config) {
|
|
|
97
119
|
}
|
|
98
120
|
}
|
|
99
121
|
// Route to handler
|
|
100
|
-
const result = await routeToolCall(name, args, stores, config.projectRoot, dataLake);
|
|
122
|
+
const result = await routeToolCall(name, args, stores, config.projectRoot, dataLake, patternService);
|
|
101
123
|
// Cache result
|
|
102
124
|
if (cache && cacheKey && result && !('isError' in result && result.isError)) {
|
|
103
125
|
await cache.set(cacheKey, result);
|
|
@@ -114,7 +136,7 @@ export function createEnterpriseMCPServer(config) {
|
|
|
114
136
|
});
|
|
115
137
|
return server;
|
|
116
138
|
}
|
|
117
|
-
async function routeToolCall(name, args, stores, projectRoot, dataLake) {
|
|
139
|
+
async function routeToolCall(name, args, stores, projectRoot, dataLake, patternService) {
|
|
118
140
|
// ============================================================================
|
|
119
141
|
// Orchestration Tools (Meta Layer - Start Here)
|
|
120
142
|
// ============================================================================
|
|
@@ -133,15 +155,25 @@ async function routeToolCall(name, args, stores, projectRoot, dataLake) {
|
|
|
133
155
|
// ============================================================================
|
|
134
156
|
switch (name) {
|
|
135
157
|
case 'drift_status':
|
|
158
|
+
// Use new service if available, otherwise fall back to legacy store
|
|
159
|
+
if (patternService) {
|
|
160
|
+
return handleStatusWithService(patternService, args, dataLake);
|
|
161
|
+
}
|
|
136
162
|
return handleStatus(stores.pattern, args, dataLake);
|
|
137
163
|
case 'drift_capabilities':
|
|
138
164
|
return handleCapabilities(args);
|
|
165
|
+
case 'drift_projects':
|
|
166
|
+
return handleProjects(args);
|
|
139
167
|
}
|
|
140
168
|
// ============================================================================
|
|
141
169
|
// Exploration Tools (Layer 2)
|
|
142
170
|
// ============================================================================
|
|
143
171
|
switch (name) {
|
|
144
172
|
case 'drift_patterns_list':
|
|
173
|
+
// Use new service if available, otherwise fall back to legacy store
|
|
174
|
+
if (patternService) {
|
|
175
|
+
return handlePatternsListWithService(patternService, args, dataLake);
|
|
176
|
+
}
|
|
145
177
|
return handlePatternsList(stores.pattern, args, dataLake);
|
|
146
178
|
case 'drift_security_summary':
|
|
147
179
|
return handleSecuritySummary(stores.boundary, args);
|
|
@@ -156,8 +188,16 @@ async function routeToolCall(name, args, stores, projectRoot, dataLake) {
|
|
|
156
188
|
switch (name) {
|
|
157
189
|
// Pattern detail tools
|
|
158
190
|
case 'drift_pattern_get':
|
|
191
|
+
// Use new service if available, otherwise fall back to legacy store
|
|
192
|
+
if (patternService) {
|
|
193
|
+
return handlePatternGetWithService(patternService, args);
|
|
194
|
+
}
|
|
159
195
|
return handlePatternGet(stores.pattern, args);
|
|
160
196
|
case 'drift_code_examples':
|
|
197
|
+
// Use new service if available, otherwise fall back to legacy store
|
|
198
|
+
if (patternService) {
|
|
199
|
+
return handleCodeExamplesWithService(patternService, projectRoot, args);
|
|
200
|
+
}
|
|
161
201
|
return handleCodeExamples(stores.pattern, projectRoot, args);
|
|
162
202
|
// File detail tools
|
|
163
203
|
case 'drift_files_list':
|
|
@@ -172,6 +212,36 @@ async function routeToolCall(name, args, stores, projectRoot, dataLake) {
|
|
|
172
212
|
// DNA tools
|
|
173
213
|
case 'drift_dna_profile':
|
|
174
214
|
return handleDNAProfile(stores.dna, args);
|
|
215
|
+
// Wrapper detection tools
|
|
216
|
+
case 'drift_wrappers':
|
|
217
|
+
return handleWrappers(args, projectRoot);
|
|
218
|
+
}
|
|
219
|
+
// ============================================================================
|
|
220
|
+
// Analysis Tools (L5-L7 Layers)
|
|
221
|
+
// ============================================================================
|
|
222
|
+
switch (name) {
|
|
223
|
+
case 'drift_test_topology':
|
|
224
|
+
return handleTestTopology(projectRoot, args);
|
|
225
|
+
case 'drift_coupling':
|
|
226
|
+
return handleCoupling(projectRoot, args);
|
|
227
|
+
case 'drift_error_handling':
|
|
228
|
+
return handleErrorHandling(projectRoot, args);
|
|
229
|
+
}
|
|
230
|
+
// ============================================================================
|
|
231
|
+
// Generation Tools (AI-Powered Code Intelligence)
|
|
232
|
+
// ============================================================================
|
|
233
|
+
switch (name) {
|
|
234
|
+
case 'drift_suggest_changes':
|
|
235
|
+
return handleSuggestChanges({ pattern: stores.pattern, boundary: stores.boundary }, projectRoot, args);
|
|
236
|
+
case 'drift_validate_change':
|
|
237
|
+
return handleValidateChange(stores.pattern, projectRoot, args);
|
|
238
|
+
case 'drift_explain':
|
|
239
|
+
return handleExplain({
|
|
240
|
+
pattern: stores.pattern,
|
|
241
|
+
manifest: stores.manifest,
|
|
242
|
+
boundary: stores.boundary,
|
|
243
|
+
callGraph: stores.callGraph,
|
|
244
|
+
}, projectRoot, args);
|
|
175
245
|
}
|
|
176
246
|
// Unknown tool
|
|
177
247
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enterprise-server.js","sourceRoot":"","sources":["../src/enterprise-server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"enterprise-server.js","sourceRoot":"","sources":["../src/enterprise-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* drift_coupling - Module Coupling Analysis
|
|
3
|
+
*
|
|
4
|
+
* Analysis tool for module dependencies, cycles, and coupling metrics.
|
|
5
|
+
* Based on Robert C. Martin's coupling metrics (Ca, Ce, Instability, Abstractness, Distance).
|
|
6
|
+
*/
|
|
7
|
+
import { type AggregateCouplingMetrics, type DependencyCycle, type ModuleCouplingAnalysis, type RefactorImpact, type UnusedExportAnalysis, type CouplingMetrics } from 'driftdetect-core';
|
|
8
|
+
export type CouplingAction = 'status' | 'cycles' | 'hotspots' | 'analyze' | 'refactor-impact' | 'unused-exports';
|
|
9
|
+
export interface CouplingArgs {
|
|
10
|
+
action: CouplingAction;
|
|
11
|
+
module?: string;
|
|
12
|
+
limit?: number;
|
|
13
|
+
minCoupling?: number;
|
|
14
|
+
maxCycleLength?: number;
|
|
15
|
+
minSeverity?: 'info' | 'warning' | 'critical';
|
|
16
|
+
}
|
|
17
|
+
export interface CouplingStatusData {
|
|
18
|
+
metrics: AggregateCouplingMetrics;
|
|
19
|
+
generatedAt?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CouplingCyclesData {
|
|
22
|
+
cycles: DependencyCycle[];
|
|
23
|
+
total: number;
|
|
24
|
+
bySeverity: {
|
|
25
|
+
critical: number;
|
|
26
|
+
warning: number;
|
|
27
|
+
info: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface CouplingHotspotsData {
|
|
31
|
+
hotspots: Array<{
|
|
32
|
+
path: string;
|
|
33
|
+
coupling: number;
|
|
34
|
+
metrics: CouplingMetrics;
|
|
35
|
+
}>;
|
|
36
|
+
total: number;
|
|
37
|
+
}
|
|
38
|
+
export interface CouplingAnalyzeData {
|
|
39
|
+
module: string;
|
|
40
|
+
analysis: ModuleCouplingAnalysis;
|
|
41
|
+
}
|
|
42
|
+
export interface CouplingRefactorData {
|
|
43
|
+
module: string;
|
|
44
|
+
impact: RefactorImpact;
|
|
45
|
+
}
|
|
46
|
+
export interface CouplingUnusedData {
|
|
47
|
+
unused: UnusedExportAnalysis[];
|
|
48
|
+
total: number;
|
|
49
|
+
}
|
|
50
|
+
export declare function handleCoupling(projectRoot: string, args: CouplingArgs): Promise<{
|
|
51
|
+
content: Array<{
|
|
52
|
+
type: string;
|
|
53
|
+
text: string;
|
|
54
|
+
}>;
|
|
55
|
+
}>;
|
|
56
|
+
//# sourceMappingURL=coupling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupling.d.ts","sourceRoot":"","sources":["../../../src/tools/analysis/coupling.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAO1B,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,SAAS,GACT,iBAAiB,GACjB,gBAAgB,CAAC;AAErB,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;CAC/C;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,wBAAwB,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACjE;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,sBAAsB,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAaD,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAmB7D"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* drift_coupling - Module Coupling Analysis
|
|
3
|
+
*
|
|
4
|
+
* Analysis tool for module dependencies, cycles, and coupling metrics.
|
|
5
|
+
* Based on Robert C. Martin's coupling metrics (Ca, Ce, Instability, Abstractness, Distance).
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs/promises';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { createModuleCouplingAnalyzer, createCallGraphAnalyzer, } from 'driftdetect-core';
|
|
10
|
+
import { createResponseBuilder, Errors } from '../../infrastructure/index.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Constants
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const DRIFT_DIR = '.drift';
|
|
15
|
+
const COUPLING_DIR = 'module-coupling';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Handler
|
|
18
|
+
// ============================================================================
|
|
19
|
+
export async function handleCoupling(projectRoot, args) {
|
|
20
|
+
const { action } = args;
|
|
21
|
+
switch (action) {
|
|
22
|
+
case 'status':
|
|
23
|
+
return handleStatus(projectRoot);
|
|
24
|
+
case 'cycles':
|
|
25
|
+
return handleCycles(projectRoot, args.maxCycleLength, args.minSeverity);
|
|
26
|
+
case 'hotspots':
|
|
27
|
+
return handleHotspots(projectRoot, args.limit, args.minCoupling);
|
|
28
|
+
case 'analyze':
|
|
29
|
+
return handleAnalyze(projectRoot, args.module);
|
|
30
|
+
case 'refactor-impact':
|
|
31
|
+
return handleRefactorImpact(projectRoot, args.module);
|
|
32
|
+
case 'unused-exports':
|
|
33
|
+
return handleUnusedExports(projectRoot, args.limit);
|
|
34
|
+
default:
|
|
35
|
+
throw Errors.invalidArgument('action', `Invalid action: ${action}. Valid: status, cycles, hotspots, analyze, refactor-impact, unused-exports`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// ============================================================================
|
|
39
|
+
// Action Handlers
|
|
40
|
+
// ============================================================================
|
|
41
|
+
async function handleStatus(projectRoot) {
|
|
42
|
+
const builder = createResponseBuilder();
|
|
43
|
+
// Try to load cached data first
|
|
44
|
+
const graphPath = path.join(projectRoot, DRIFT_DIR, COUPLING_DIR, 'graph.json');
|
|
45
|
+
try {
|
|
46
|
+
const data = JSON.parse(await fs.readFile(graphPath, 'utf-8'));
|
|
47
|
+
const { metrics, generatedAt } = data;
|
|
48
|
+
let summaryText = `🔗 ${metrics.totalModules} modules, ${metrics.totalEdges} dependencies. `;
|
|
49
|
+
summaryText += `${metrics.cycleCount} cycles. `;
|
|
50
|
+
summaryText += `Avg instability: ${metrics.avgInstability}, distance: ${metrics.avgDistance}.`;
|
|
51
|
+
const warnings = [];
|
|
52
|
+
if (metrics.cycleCount > 0) {
|
|
53
|
+
warnings.push(`${metrics.cycleCount} dependency cycles detected`);
|
|
54
|
+
}
|
|
55
|
+
if (metrics.zoneOfPain.length > 0) {
|
|
56
|
+
warnings.push(`${metrics.zoneOfPain.length} modules in zone of pain`);
|
|
57
|
+
}
|
|
58
|
+
const hints = {
|
|
59
|
+
nextActions: metrics.cycleCount > 0
|
|
60
|
+
? ['Run drift_coupling action="cycles" to see cycle details']
|
|
61
|
+
: ['Coupling looks healthy'],
|
|
62
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
63
|
+
relatedTools: ['drift_coupling action="cycles"', 'drift_coupling action="hotspots"'],
|
|
64
|
+
};
|
|
65
|
+
return builder
|
|
66
|
+
.withSummary(summaryText)
|
|
67
|
+
.withData({ metrics, generatedAt })
|
|
68
|
+
.withHints(hints)
|
|
69
|
+
.buildContent();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw Errors.custom('NO_COUPLING_GRAPH', 'No coupling graph found. Build it first using the CLI: drift coupling build', ['drift coupling build']);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function handleCycles(projectRoot, maxCycleLength, minSeverity) {
|
|
76
|
+
const builder = createResponseBuilder();
|
|
77
|
+
const graphPath = path.join(projectRoot, DRIFT_DIR, COUPLING_DIR, 'graph.json');
|
|
78
|
+
try {
|
|
79
|
+
const data = JSON.parse(await fs.readFile(graphPath, 'utf-8'));
|
|
80
|
+
let cycles = data.cycles;
|
|
81
|
+
// Filter by length
|
|
82
|
+
if (maxCycleLength) {
|
|
83
|
+
cycles = cycles.filter(c => c.length <= maxCycleLength);
|
|
84
|
+
}
|
|
85
|
+
// Filter by severity
|
|
86
|
+
if (minSeverity) {
|
|
87
|
+
const severityOrder = { critical: 0, warning: 1, info: 2 };
|
|
88
|
+
const minOrder = severityOrder[minSeverity];
|
|
89
|
+
cycles = cycles.filter(c => severityOrder[c.severity] <= minOrder);
|
|
90
|
+
}
|
|
91
|
+
const bySeverity = {
|
|
92
|
+
critical: cycles.filter(c => c.severity === 'critical').length,
|
|
93
|
+
warning: cycles.filter(c => c.severity === 'warning').length,
|
|
94
|
+
info: cycles.filter(c => c.severity === 'info').length,
|
|
95
|
+
};
|
|
96
|
+
let summaryText = `🔄 ${cycles.length} cycles. `;
|
|
97
|
+
if (bySeverity.critical > 0)
|
|
98
|
+
summaryText += `🔴 ${bySeverity.critical} critical. `;
|
|
99
|
+
if (bySeverity.warning > 0)
|
|
100
|
+
summaryText += `🟡 ${bySeverity.warning} warning. `;
|
|
101
|
+
if (bySeverity.info > 0)
|
|
102
|
+
summaryText += `⚪ ${bySeverity.info} info.`;
|
|
103
|
+
const hints = {
|
|
104
|
+
nextActions: bySeverity.critical > 0
|
|
105
|
+
? ['Focus on breaking critical cycles first']
|
|
106
|
+
: cycles.length > 0
|
|
107
|
+
? ['Consider breaking cycles to improve maintainability']
|
|
108
|
+
: ['No cycles - good architecture!'],
|
|
109
|
+
relatedTools: ['drift_coupling action="analyze" module="<path>"'],
|
|
110
|
+
};
|
|
111
|
+
return builder
|
|
112
|
+
.withSummary(summaryText)
|
|
113
|
+
.withData({ cycles, total: cycles.length, bySeverity })
|
|
114
|
+
.withHints(hints)
|
|
115
|
+
.buildContent();
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
throw Errors.custom('NO_COUPLING_GRAPH', 'No coupling graph found. Build it first.', ['drift coupling build']);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function handleHotspots(projectRoot, limit, minCoupling) {
|
|
122
|
+
const builder = createResponseBuilder();
|
|
123
|
+
const graphPath = path.join(projectRoot, DRIFT_DIR, COUPLING_DIR, 'graph.json');
|
|
124
|
+
try {
|
|
125
|
+
const data = JSON.parse(await fs.readFile(graphPath, 'utf-8'));
|
|
126
|
+
const modules = Object.entries(data.modules);
|
|
127
|
+
const hotspots = modules
|
|
128
|
+
.map(([modPath, mod]) => ({
|
|
129
|
+
path: modPath,
|
|
130
|
+
coupling: mod.metrics.Ca + mod.metrics.Ce,
|
|
131
|
+
metrics: mod.metrics,
|
|
132
|
+
}))
|
|
133
|
+
.filter(h => h.coupling >= (minCoupling ?? 3))
|
|
134
|
+
.sort((a, b) => b.coupling - a.coupling)
|
|
135
|
+
.slice(0, limit ?? 15);
|
|
136
|
+
let summaryText = `🔥 ${hotspots.length} coupling hotspots. `;
|
|
137
|
+
if (hotspots.length > 0) {
|
|
138
|
+
summaryText += `Top: ${hotspots[0].path} (${hotspots[0].coupling} connections).`;
|
|
139
|
+
}
|
|
140
|
+
const hints = {
|
|
141
|
+
nextActions: hotspots.length > 0
|
|
142
|
+
? [`Analyze top hotspot: drift_coupling action="analyze" module="${hotspots[0].path}"`]
|
|
143
|
+
: ['No hotspots - coupling is well distributed'],
|
|
144
|
+
relatedTools: ['drift_coupling action="refactor-impact"'],
|
|
145
|
+
};
|
|
146
|
+
return builder
|
|
147
|
+
.withSummary(summaryText)
|
|
148
|
+
.withData({ hotspots, total: hotspots.length })
|
|
149
|
+
.withHints(hints)
|
|
150
|
+
.buildContent();
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
throw Errors.custom('NO_COUPLING_GRAPH', 'No coupling graph found. Build it first.', ['drift coupling build']);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function handleAnalyze(projectRoot, modulePath) {
|
|
157
|
+
const builder = createResponseBuilder();
|
|
158
|
+
if (!modulePath) {
|
|
159
|
+
throw Errors.missingParameter('module');
|
|
160
|
+
}
|
|
161
|
+
// Build analyzer on-demand
|
|
162
|
+
const analyzer = await buildAnalyzer(projectRoot);
|
|
163
|
+
const analysis = analyzer.analyzeModule(modulePath);
|
|
164
|
+
if (!analysis) {
|
|
165
|
+
throw Errors.custom('MODULE_NOT_FOUND', `Module not found: ${modulePath}`, ['Check the module path and ensure call graph is built']);
|
|
166
|
+
}
|
|
167
|
+
const { module, cyclesInvolved, health } = analysis;
|
|
168
|
+
let summaryText = `📦 ${modulePath}: ${module.role} role. `;
|
|
169
|
+
summaryText += `Ca: ${module.metrics.Ca}, Ce: ${module.metrics.Ce}. `;
|
|
170
|
+
summaryText += `Health: ${health.score}/100.`;
|
|
171
|
+
const warnings = [];
|
|
172
|
+
if (cyclesInvolved.length > 0) {
|
|
173
|
+
warnings.push(`Involved in ${cyclesInvolved.length} cycle(s)`);
|
|
174
|
+
}
|
|
175
|
+
if (health.issues.length > 0) {
|
|
176
|
+
warnings.push(...health.issues);
|
|
177
|
+
}
|
|
178
|
+
const hints = {
|
|
179
|
+
nextActions: health.suggestions,
|
|
180
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
181
|
+
relatedTools: ['drift_coupling action="refactor-impact"', 'drift_impact_analysis'],
|
|
182
|
+
};
|
|
183
|
+
return builder
|
|
184
|
+
.withSummary(summaryText)
|
|
185
|
+
.withData({ module: modulePath, analysis })
|
|
186
|
+
.withHints(hints)
|
|
187
|
+
.buildContent();
|
|
188
|
+
}
|
|
189
|
+
async function handleRefactorImpact(projectRoot, modulePath) {
|
|
190
|
+
const builder = createResponseBuilder();
|
|
191
|
+
if (!modulePath) {
|
|
192
|
+
throw Errors.missingParameter('module');
|
|
193
|
+
}
|
|
194
|
+
const analyzer = await buildAnalyzer(projectRoot);
|
|
195
|
+
const impact = analyzer.analyzeRefactorImpact(modulePath);
|
|
196
|
+
if (!impact) {
|
|
197
|
+
throw Errors.custom('MODULE_NOT_FOUND', `Module not found: ${modulePath}`, ['Check the module path']);
|
|
198
|
+
}
|
|
199
|
+
let summaryText = `🔧 Refactoring ${modulePath}: ${impact.totalAffected} affected modules. `;
|
|
200
|
+
summaryText += `Risk: ${impact.risk.toUpperCase()}.`;
|
|
201
|
+
const hints = {
|
|
202
|
+
nextActions: impact.suggestions,
|
|
203
|
+
warnings: impact.risk === 'critical' || impact.risk === 'high'
|
|
204
|
+
? [`High risk refactor - ${impact.totalAffected} modules affected`]
|
|
205
|
+
: undefined,
|
|
206
|
+
relatedTools: ['drift_coupling action="analyze"', 'drift_impact_analysis'],
|
|
207
|
+
};
|
|
208
|
+
return builder
|
|
209
|
+
.withSummary(summaryText)
|
|
210
|
+
.withData({ module: modulePath, impact })
|
|
211
|
+
.withHints(hints)
|
|
212
|
+
.buildContent();
|
|
213
|
+
}
|
|
214
|
+
async function handleUnusedExports(projectRoot, limit) {
|
|
215
|
+
const builder = createResponseBuilder();
|
|
216
|
+
const analyzer = await buildAnalyzer(projectRoot);
|
|
217
|
+
const unused = analyzer.getUnusedExports().slice(0, limit ?? 20);
|
|
218
|
+
const totalExports = unused.reduce((sum, u) => sum + u.unusedExports.length, 0);
|
|
219
|
+
let summaryText = `📤 ${unused.length} modules with unused exports. `;
|
|
220
|
+
summaryText += `${totalExports} total unused exports.`;
|
|
221
|
+
const hints = {
|
|
222
|
+
nextActions: unused.length > 0
|
|
223
|
+
? ['Review unused exports - may be dead code or public API']
|
|
224
|
+
: ['No unused exports found'],
|
|
225
|
+
relatedTools: ['drift_dead_code'],
|
|
226
|
+
};
|
|
227
|
+
return builder
|
|
228
|
+
.withSummary(summaryText)
|
|
229
|
+
.withData({ unused, total: unused.length })
|
|
230
|
+
.withHints(hints)
|
|
231
|
+
.buildContent();
|
|
232
|
+
}
|
|
233
|
+
// ============================================================================
|
|
234
|
+
// Helpers
|
|
235
|
+
// ============================================================================
|
|
236
|
+
async function buildAnalyzer(projectRoot) {
|
|
237
|
+
const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir: projectRoot });
|
|
238
|
+
await callGraphAnalyzer.initialize();
|
|
239
|
+
const callGraph = callGraphAnalyzer.getGraph();
|
|
240
|
+
if (!callGraph) {
|
|
241
|
+
throw Errors.custom('NO_CALL_GRAPH', 'Call graph required for coupling analysis', ['drift callgraph build']);
|
|
242
|
+
}
|
|
243
|
+
const analyzer = createModuleCouplingAnalyzer({ rootDir: projectRoot });
|
|
244
|
+
analyzer.setCallGraph(callGraph);
|
|
245
|
+
analyzer.build();
|
|
246
|
+
return analyzer;
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=coupling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coupling.js","sourceRoot":"","sources":["../../../src/tools/analysis/coupling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* drift_error_handling - Error Handling Analysis
|
|
3
|
+
*
|
|
4
|
+
* Analysis tool for error handling patterns, boundaries, and gaps.
|
|
5
|
+
* Detects unhandled error paths and swallowed exceptions.
|
|
6
|
+
*/
|
|
7
|
+
import { type ErrorHandlingSummary, type ErrorHandlingMetrics, type ErrorHandlingGap, type ErrorBoundary, type UnhandledErrorPath, type FunctionErrorAnalysis, type ErrorSeverity } from 'driftdetect-core';
|
|
8
|
+
export type ErrorHandlingAction = 'status' | 'gaps' | 'boundaries' | 'unhandled' | 'analyze';
|
|
9
|
+
export interface ErrorHandlingArgs {
|
|
10
|
+
action: ErrorHandlingAction;
|
|
11
|
+
function?: string;
|
|
12
|
+
limit?: number;
|
|
13
|
+
minSeverity?: ErrorSeverity;
|
|
14
|
+
}
|
|
15
|
+
export interface ErrorHandlingStatusData {
|
|
16
|
+
summary: ErrorHandlingSummary;
|
|
17
|
+
metrics: ErrorHandlingMetrics;
|
|
18
|
+
generatedAt?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ErrorHandlingGapsData {
|
|
21
|
+
gaps: ErrorHandlingGap[];
|
|
22
|
+
total: number;
|
|
23
|
+
bySeverity: Record<ErrorSeverity, number>;
|
|
24
|
+
}
|
|
25
|
+
export interface ErrorHandlingBoundariesData {
|
|
26
|
+
boundaries: ErrorBoundary[];
|
|
27
|
+
total: number;
|
|
28
|
+
frameworkBoundaries: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ErrorHandlingUnhandledData {
|
|
31
|
+
paths: UnhandledErrorPath[];
|
|
32
|
+
total: number;
|
|
33
|
+
bySeverity: Record<ErrorSeverity, number>;
|
|
34
|
+
}
|
|
35
|
+
export interface ErrorHandlingAnalyzeData {
|
|
36
|
+
function: string;
|
|
37
|
+
analysis: FunctionErrorAnalysis;
|
|
38
|
+
}
|
|
39
|
+
export declare function handleErrorHandling(projectRoot: string, args: ErrorHandlingArgs): Promise<{
|
|
40
|
+
content: Array<{
|
|
41
|
+
type: string;
|
|
42
|
+
text: string;
|
|
43
|
+
}>;
|
|
44
|
+
}>;
|
|
45
|
+
//# sourceMappingURL=error-handling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handling.d.ts","sourceRoot":"","sources":["../../../src/tools/analysis/error-handling.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAO1B,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAaD,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAiB7D"}
|