driftdetect-mcp 0.5.0 → 0.6.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/bin/server.js +0 -0
- package/dist/enterprise-server.d.ts.map +1 -1
- package/dist/enterprise-server.js +17 -2
- package/dist/enterprise-server.js.map +1 -1
- package/dist/tools/analysis/constraints.d.ts +40 -0
- package/dist/tools/analysis/constraints.d.ts.map +1 -0
- package/dist/tools/analysis/constraints.js +236 -0
- package/dist/tools/analysis/constraints.js.map +1 -0
- package/dist/tools/analysis/decisions.d.ts +54 -0
- package/dist/tools/analysis/decisions.d.ts.map +1 -0
- package/dist/tools/analysis/decisions.js +307 -0
- package/dist/tools/analysis/decisions.js.map +1 -0
- package/dist/tools/analysis/go.d.ts +22 -0
- package/dist/tools/analysis/go.d.ts.map +1 -0
- package/dist/tools/analysis/go.js +214 -0
- package/dist/tools/analysis/go.js.map +1 -0
- package/dist/tools/analysis/index.d.ts +5 -0
- package/dist/tools/analysis/index.d.ts.map +1 -1
- package/dist/tools/analysis/index.js +209 -0
- package/dist/tools/analysis/index.js.map +1 -1
- package/dist/tools/analysis/simulate.d.ts +27 -0
- package/dist/tools/analysis/simulate.d.ts.map +1 -0
- package/dist/tools/analysis/simulate.js +89 -0
- package/dist/tools/analysis/simulate.js.map +1 -0
- package/dist/tools/analysis/wpf.d.ts +23 -0
- package/dist/tools/analysis/wpf.d.ts.map +1 -0
- package/dist/tools/analysis/wpf.js +240 -0
- package/dist/tools/analysis/wpf.js.map +1 -0
- 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 +28 -11
- package/dist/tools/detail/files-list.js.map +1 -1
- package/dist/tools/orchestration/context.d.ts +15 -1
- package/dist/tools/orchestration/context.d.ts.map +1 -1
- package/dist/tools/orchestration/context.js +248 -4
- package/dist/tools/orchestration/context.js.map +1 -1
- package/package.json +31 -16
- package/LICENSE +0 -21
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* drift_decisions - Decision Mining Analysis
|
|
3
|
+
*
|
|
4
|
+
* Analysis tool for mining architectural decisions from git history.
|
|
5
|
+
* Answers: "What architectural decisions were made?" and "Why was this code structured this way?"
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs/promises';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { createDecisionMiningAnalyzer, } from 'driftdetect-core';
|
|
10
|
+
import { createResponseBuilder, Errors } from '../../infrastructure/index.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Constants
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const DRIFT_DIR = '.drift';
|
|
15
|
+
const DECISIONS_DIR = 'decisions';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Handler
|
|
18
|
+
// ============================================================================
|
|
19
|
+
export async function handleDecisions(projectRoot, args) {
|
|
20
|
+
const { action } = args;
|
|
21
|
+
switch (action) {
|
|
22
|
+
case 'status':
|
|
23
|
+
return handleStatus(projectRoot);
|
|
24
|
+
case 'list':
|
|
25
|
+
return handleList(projectRoot, args.category, args.limit);
|
|
26
|
+
case 'get':
|
|
27
|
+
return handleGet(projectRoot, args.id);
|
|
28
|
+
case 'for-file':
|
|
29
|
+
return handleForFile(projectRoot, args.file);
|
|
30
|
+
case 'timeline':
|
|
31
|
+
return handleTimeline(projectRoot, args.limit);
|
|
32
|
+
case 'search':
|
|
33
|
+
return handleSearch(projectRoot, args.query, args.limit);
|
|
34
|
+
case 'mine':
|
|
35
|
+
return handleMine(projectRoot, args.since, args.until, args.minConfidence);
|
|
36
|
+
default:
|
|
37
|
+
throw Errors.invalidArgument('action', `Invalid action: ${action}. Valid actions: status, list, get, for-file, timeline, search, mine`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// Action Handlers
|
|
42
|
+
// ============================================================================
|
|
43
|
+
async function handleStatus(projectRoot) {
|
|
44
|
+
const builder = createResponseBuilder();
|
|
45
|
+
const indexPath = path.join(projectRoot, DRIFT_DIR, DECISIONS_DIR, 'index.json');
|
|
46
|
+
try {
|
|
47
|
+
const data = JSON.parse(await fs.readFile(indexPath, 'utf-8'));
|
|
48
|
+
const { summary } = data;
|
|
49
|
+
let summaryText = `📜 ${summary.totalDecisions} decisions mined. `;
|
|
50
|
+
summaryText += `${summary.byStatus.draft} draft, ${summary.byStatus.confirmed} confirmed. `;
|
|
51
|
+
summaryText += `${summary.byConfidence.high} high confidence.`;
|
|
52
|
+
const hints = {
|
|
53
|
+
nextActions: [
|
|
54
|
+
summary.byStatus.draft > 0
|
|
55
|
+
? 'Review draft decisions with drift_decisions action="list"'
|
|
56
|
+
: 'All decisions confirmed',
|
|
57
|
+
],
|
|
58
|
+
relatedTools: ['drift_decisions action="list"', 'drift_decisions action="timeline"'],
|
|
59
|
+
};
|
|
60
|
+
return builder
|
|
61
|
+
.withSummary(summaryText)
|
|
62
|
+
.withData({ summary, generatedAt: data.lastUpdated })
|
|
63
|
+
.withHints(hints)
|
|
64
|
+
.buildContent();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
throw Errors.custom('NO_DECISIONS', 'No decisions found. Mine them first using the CLI: drift decisions mine', ['drift decisions mine']);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function handleList(projectRoot, category, limit) {
|
|
71
|
+
const builder = createResponseBuilder();
|
|
72
|
+
const decisions = await loadDecisions(projectRoot);
|
|
73
|
+
if (!decisions) {
|
|
74
|
+
throw Errors.custom('NO_DECISIONS', 'No decisions found. Mine them first.', ['drift decisions mine']);
|
|
75
|
+
}
|
|
76
|
+
let filtered = decisions;
|
|
77
|
+
// Filter by category
|
|
78
|
+
if (category) {
|
|
79
|
+
filtered = filtered.filter(d => d.category === category);
|
|
80
|
+
}
|
|
81
|
+
// Sort by confidence
|
|
82
|
+
filtered.sort((a, b) => b.confidenceScore - a.confidenceScore);
|
|
83
|
+
// Apply limit
|
|
84
|
+
const limitedDecisions = filtered.slice(0, limit ?? 20);
|
|
85
|
+
let summaryText = `📜 ${limitedDecisions.length} decisions`;
|
|
86
|
+
if (category) {
|
|
87
|
+
summaryText += ` in ${category}`;
|
|
88
|
+
}
|
|
89
|
+
summaryText += `. Showing top by confidence.`;
|
|
90
|
+
const hints = {
|
|
91
|
+
nextActions: limitedDecisions.length > 0
|
|
92
|
+
? [`View details: drift_decisions action="get" id="${limitedDecisions[0]?.id}"`]
|
|
93
|
+
: ['Mine decisions first'],
|
|
94
|
+
relatedTools: ['drift_decisions action="get"', 'drift_decisions action="for-file"'],
|
|
95
|
+
};
|
|
96
|
+
return builder
|
|
97
|
+
.withSummary(summaryText)
|
|
98
|
+
.withData({ decisions: limitedDecisions, total: filtered.length })
|
|
99
|
+
.withHints(hints)
|
|
100
|
+
.buildContent();
|
|
101
|
+
}
|
|
102
|
+
async function handleGet(projectRoot, id) {
|
|
103
|
+
const builder = createResponseBuilder();
|
|
104
|
+
if (!id) {
|
|
105
|
+
throw Errors.missingParameter('id');
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const decisionPath = path.join(projectRoot, DRIFT_DIR, DECISIONS_DIR, `${id}.json`);
|
|
109
|
+
const decision = JSON.parse(await fs.readFile(decisionPath, 'utf-8'));
|
|
110
|
+
let summaryText = `📜 ${decision.id}: ${decision.title}. `;
|
|
111
|
+
summaryText += `${decision.status} | ${decision.confidence} confidence | ${decision.category}.`;
|
|
112
|
+
const hints = {
|
|
113
|
+
nextActions: decision.status === 'draft'
|
|
114
|
+
? ['Confirm with: drift decisions confirm ' + id]
|
|
115
|
+
: ['View related decisions'],
|
|
116
|
+
relatedTools: ['drift_decisions action="for-file"', 'drift_decisions action="timeline"'],
|
|
117
|
+
};
|
|
118
|
+
return builder
|
|
119
|
+
.withSummary(summaryText)
|
|
120
|
+
.withData({ decision })
|
|
121
|
+
.withHints(hints)
|
|
122
|
+
.buildContent();
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
throw Errors.custom('DECISION_NOT_FOUND', `Decision not found: ${id}`, ['drift_decisions action="list"']);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function handleForFile(projectRoot, file) {
|
|
129
|
+
const builder = createResponseBuilder();
|
|
130
|
+
if (!file) {
|
|
131
|
+
throw Errors.missingParameter('file');
|
|
132
|
+
}
|
|
133
|
+
const decisions = await loadDecisions(projectRoot);
|
|
134
|
+
if (!decisions) {
|
|
135
|
+
throw Errors.custom('NO_DECISIONS', 'No decisions found. Mine them first.', ['drift decisions mine']);
|
|
136
|
+
}
|
|
137
|
+
// Find decisions affecting this file
|
|
138
|
+
const matching = decisions.filter(d => d.cluster.filesAffected.some(f => f.includes(file) || file.includes(f)));
|
|
139
|
+
let summaryText = `📜 ${matching.length} decisions affect ${file}.`;
|
|
140
|
+
const hints = {
|
|
141
|
+
nextActions: matching.length > 0
|
|
142
|
+
? [`View decision: drift_decisions action="get" id="${matching[0]?.id}"`]
|
|
143
|
+
: ['No decisions found for this file'],
|
|
144
|
+
relatedTools: ['drift_decisions action="get"', 'drift_impact_analysis'],
|
|
145
|
+
};
|
|
146
|
+
return builder
|
|
147
|
+
.withSummary(summaryText)
|
|
148
|
+
.withData({ file, decisions: matching })
|
|
149
|
+
.withHints(hints)
|
|
150
|
+
.buildContent();
|
|
151
|
+
}
|
|
152
|
+
async function handleTimeline(projectRoot, limit) {
|
|
153
|
+
const builder = createResponseBuilder();
|
|
154
|
+
const decisions = await loadDecisions(projectRoot);
|
|
155
|
+
if (!decisions) {
|
|
156
|
+
throw Errors.custom('NO_DECISIONS', 'No decisions found. Mine them first.', ['drift decisions mine']);
|
|
157
|
+
}
|
|
158
|
+
// Sort by date (newest first)
|
|
159
|
+
const sorted = [...decisions].sort((a, b) => new Date(b.dateRange.end).getTime() - new Date(a.dateRange.end).getTime()).slice(0, limit ?? 20);
|
|
160
|
+
// Group by month
|
|
161
|
+
const byMonth = new Map();
|
|
162
|
+
for (const decision of sorted) {
|
|
163
|
+
const date = new Date(decision.dateRange.end);
|
|
164
|
+
const month = date.toLocaleDateString('en-US', { year: 'numeric', month: 'long' });
|
|
165
|
+
if (!byMonth.has(month)) {
|
|
166
|
+
byMonth.set(month, []);
|
|
167
|
+
}
|
|
168
|
+
byMonth.get(month).push(decision);
|
|
169
|
+
}
|
|
170
|
+
const timeline = Array.from(byMonth.entries()).map(([month, decisions]) => ({
|
|
171
|
+
month,
|
|
172
|
+
decisions,
|
|
173
|
+
}));
|
|
174
|
+
let summaryText = `📅 ${sorted.length} decisions across ${timeline.length} months.`;
|
|
175
|
+
const hints = {
|
|
176
|
+
nextActions: ['View specific decision for details'],
|
|
177
|
+
relatedTools: ['drift_decisions action="get"', 'drift_trends'],
|
|
178
|
+
};
|
|
179
|
+
return builder
|
|
180
|
+
.withSummary(summaryText)
|
|
181
|
+
.withData({ timeline })
|
|
182
|
+
.withHints(hints)
|
|
183
|
+
.buildContent();
|
|
184
|
+
}
|
|
185
|
+
async function handleSearch(projectRoot, query, limit) {
|
|
186
|
+
const builder = createResponseBuilder();
|
|
187
|
+
if (!query) {
|
|
188
|
+
throw Errors.missingParameter('query');
|
|
189
|
+
}
|
|
190
|
+
const decisions = await loadDecisions(projectRoot);
|
|
191
|
+
if (!decisions) {
|
|
192
|
+
throw Errors.custom('NO_DECISIONS', 'No decisions found. Mine them first.', ['drift decisions mine']);
|
|
193
|
+
}
|
|
194
|
+
const queryLower = query.toLowerCase();
|
|
195
|
+
// Search in title, ADR content, and tags
|
|
196
|
+
const results = decisions.filter(d => d.title.toLowerCase().includes(queryLower) ||
|
|
197
|
+
d.adr.context.toLowerCase().includes(queryLower) ||
|
|
198
|
+
d.adr.decision.toLowerCase().includes(queryLower) ||
|
|
199
|
+
d.tags.some(t => t.toLowerCase().includes(queryLower)) ||
|
|
200
|
+
d.category.toLowerCase().includes(queryLower)).slice(0, limit ?? 10);
|
|
201
|
+
let summaryText = `🔍 ${results.length} decisions match "${query}".`;
|
|
202
|
+
const hints = {
|
|
203
|
+
nextActions: results.length > 0
|
|
204
|
+
? [`View: drift_decisions action="get" id="${results[0]?.id}"`]
|
|
205
|
+
: ['Try a different search term'],
|
|
206
|
+
relatedTools: ['drift_decisions action="list"'],
|
|
207
|
+
};
|
|
208
|
+
return builder
|
|
209
|
+
.withSummary(summaryText)
|
|
210
|
+
.withData({ query, results })
|
|
211
|
+
.withHints(hints)
|
|
212
|
+
.buildContent();
|
|
213
|
+
}
|
|
214
|
+
async function handleMine(projectRoot, since, until, minConfidence) {
|
|
215
|
+
const builder = createResponseBuilder();
|
|
216
|
+
// Build options conditionally to satisfy exactOptionalPropertyTypes
|
|
217
|
+
const options = {
|
|
218
|
+
rootDir: projectRoot,
|
|
219
|
+
minConfidence: minConfidence ?? 0.5,
|
|
220
|
+
};
|
|
221
|
+
if (since) {
|
|
222
|
+
options.since = new Date(since);
|
|
223
|
+
}
|
|
224
|
+
if (until) {
|
|
225
|
+
options.until = new Date(until);
|
|
226
|
+
}
|
|
227
|
+
// Create analyzer
|
|
228
|
+
const analyzer = createDecisionMiningAnalyzer(options);
|
|
229
|
+
// Run mining
|
|
230
|
+
const result = await analyzer.mine();
|
|
231
|
+
// Save results
|
|
232
|
+
await saveDecisions(projectRoot, result);
|
|
233
|
+
let summaryText = `📜 Mined ${result.decisions.length} decisions from ${result.summary.totalCommitsAnalyzed} commits. `;
|
|
234
|
+
summaryText += `${result.summary.byConfidence.high} high confidence.`;
|
|
235
|
+
const hints = {
|
|
236
|
+
nextActions: result.decisions.length > 0
|
|
237
|
+
? ['View decisions with drift_decisions action="list"']
|
|
238
|
+
: ['Try adjusting date range or confidence threshold'],
|
|
239
|
+
warnings: result.errors.length > 0
|
|
240
|
+
? [`${result.errors.length} errors during mining`]
|
|
241
|
+
: undefined,
|
|
242
|
+
relatedTools: ['drift_decisions action="status"', 'drift_decisions action="timeline"'],
|
|
243
|
+
};
|
|
244
|
+
return builder
|
|
245
|
+
.withSummary(summaryText)
|
|
246
|
+
.withData({ result })
|
|
247
|
+
.withHints(hints)
|
|
248
|
+
.buildContent();
|
|
249
|
+
}
|
|
250
|
+
// ============================================================================
|
|
251
|
+
// Helpers
|
|
252
|
+
// ============================================================================
|
|
253
|
+
async function loadDecisions(projectRoot) {
|
|
254
|
+
try {
|
|
255
|
+
const indexPath = path.join(projectRoot, DRIFT_DIR, DECISIONS_DIR, 'index.json');
|
|
256
|
+
const indexData = JSON.parse(await fs.readFile(indexPath, 'utf-8'));
|
|
257
|
+
const decisions = [];
|
|
258
|
+
for (const id of indexData.decisionIds) {
|
|
259
|
+
const decisionPath = path.join(projectRoot, DRIFT_DIR, DECISIONS_DIR, `${id}.json`);
|
|
260
|
+
try {
|
|
261
|
+
const decision = JSON.parse(await fs.readFile(decisionPath, 'utf-8'));
|
|
262
|
+
decisions.push(decision);
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
// Skip missing decisions
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return decisions;
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async function saveDecisions(projectRoot, result) {
|
|
275
|
+
const decisionsDir = path.join(projectRoot, DRIFT_DIR, DECISIONS_DIR);
|
|
276
|
+
await fs.mkdir(decisionsDir, { recursive: true });
|
|
277
|
+
// Save each decision
|
|
278
|
+
for (const decision of result.decisions) {
|
|
279
|
+
const decisionPath = path.join(decisionsDir, `${decision.id}.json`);
|
|
280
|
+
await fs.writeFile(decisionPath, JSON.stringify(decision, null, 2));
|
|
281
|
+
}
|
|
282
|
+
// Build and save index
|
|
283
|
+
const index = {
|
|
284
|
+
version: '1.0.0',
|
|
285
|
+
decisionIds: result.decisions.map(d => d.id),
|
|
286
|
+
byStatus: {
|
|
287
|
+
draft: result.decisions.filter(d => d.status === 'draft').map(d => d.id),
|
|
288
|
+
confirmed: result.decisions.filter(d => d.status === 'confirmed').map(d => d.id),
|
|
289
|
+
superseded: result.decisions.filter(d => d.status === 'superseded').map(d => d.id),
|
|
290
|
+
rejected: result.decisions.filter(d => d.status === 'rejected').map(d => d.id),
|
|
291
|
+
},
|
|
292
|
+
byCategory: {},
|
|
293
|
+
summary: result.summary,
|
|
294
|
+
lastUpdated: new Date().toISOString(),
|
|
295
|
+
};
|
|
296
|
+
const categories = [
|
|
297
|
+
'technology-adoption', 'technology-removal', 'pattern-introduction',
|
|
298
|
+
'pattern-migration', 'architecture-change', 'api-change',
|
|
299
|
+
'security-enhancement', 'performance-optimization', 'refactoring',
|
|
300
|
+
'testing-strategy', 'infrastructure', 'other'
|
|
301
|
+
];
|
|
302
|
+
for (const category of categories) {
|
|
303
|
+
index.byCategory[category] = result.decisions.filter(d => d.category === category).map(d => d.id);
|
|
304
|
+
}
|
|
305
|
+
await fs.writeFile(path.join(decisionsDir, 'index.json'), JSON.stringify(index, null, 2));
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../../src/tools/analysis/decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Go Analysis MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Analyze Go projects: routes, error handling, interfaces, data access, goroutines.
|
|
5
|
+
*/
|
|
6
|
+
export type GoAction = 'status' | 'routes' | 'errors' | 'interfaces' | 'data-access' | 'goroutines';
|
|
7
|
+
export interface GoArgs {
|
|
8
|
+
action: GoAction;
|
|
9
|
+
path?: string;
|
|
10
|
+
framework?: string;
|
|
11
|
+
limit?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ToolContext {
|
|
14
|
+
projectRoot: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function executeGoTool(args: GoArgs, context: ToolContext): Promise<{
|
|
17
|
+
content: Array<{
|
|
18
|
+
type: string;
|
|
19
|
+
text: string;
|
|
20
|
+
}>;
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=go.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../../src/tools/analysis/go.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,aAAa,GACb,YAAY,CAAC;AAEjB,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA0D7D"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Go Analysis MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Analyze Go projects: routes, error handling, interfaces, data access, goroutines.
|
|
5
|
+
*/
|
|
6
|
+
import { createGoAnalyzer, } from 'driftdetect-core';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Tool Implementation
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export async function executeGoTool(args, context) {
|
|
11
|
+
const projectPath = args.path ?? context.projectRoot;
|
|
12
|
+
const limit = args.limit ?? 50;
|
|
13
|
+
const analyzer = createGoAnalyzer({
|
|
14
|
+
rootDir: projectPath,
|
|
15
|
+
verbose: false,
|
|
16
|
+
});
|
|
17
|
+
let result;
|
|
18
|
+
switch (args.action) {
|
|
19
|
+
case 'status': {
|
|
20
|
+
const analysisResult = await analyzer.analyze();
|
|
21
|
+
result = formatStatusResult(analysisResult, limit);
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
case 'routes': {
|
|
25
|
+
const routesResult = await analyzer.analyzeRoutes();
|
|
26
|
+
result = formatRoutesResult(routesResult, args.framework, limit);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
case 'errors': {
|
|
30
|
+
const errorsResult = await analyzer.analyzeErrorHandling();
|
|
31
|
+
result = formatErrorsResult(errorsResult, limit);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
case 'interfaces': {
|
|
35
|
+
const interfacesResult = await analyzer.analyzeInterfaces();
|
|
36
|
+
result = formatInterfacesResult(interfacesResult, limit);
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case 'data-access': {
|
|
40
|
+
const dataAccessResult = await analyzer.analyzeDataAccess();
|
|
41
|
+
result = formatDataAccessResult(dataAccessResult, limit);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case 'goroutines': {
|
|
45
|
+
const goroutinesResult = await analyzer.analyzeGoroutines();
|
|
46
|
+
result = formatGoroutinesResult(goroutinesResult, limit);
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
default:
|
|
50
|
+
throw new Error(`Unknown action: ${args.action}`);
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
content: [{
|
|
54
|
+
type: 'text',
|
|
55
|
+
text: JSON.stringify(result, null, 2),
|
|
56
|
+
}],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// ============================================================================
|
|
60
|
+
// Result Formatters
|
|
61
|
+
// ============================================================================
|
|
62
|
+
function formatStatusResult(result, limit) {
|
|
63
|
+
return {
|
|
64
|
+
project: {
|
|
65
|
+
moduleName: result.moduleName,
|
|
66
|
+
goVersion: result.goVersion,
|
|
67
|
+
packages: result.packages.length,
|
|
68
|
+
files: result.stats.fileCount,
|
|
69
|
+
functions: result.stats.functionCount,
|
|
70
|
+
structs: result.stats.structCount,
|
|
71
|
+
interfaces: result.stats.interfaceCount,
|
|
72
|
+
},
|
|
73
|
+
frameworks: result.detectedFrameworks,
|
|
74
|
+
stats: {
|
|
75
|
+
linesOfCode: result.stats.linesOfCode,
|
|
76
|
+
testFiles: result.stats.testFileCount,
|
|
77
|
+
testFunctions: result.stats.testFunctionCount,
|
|
78
|
+
analysisTimeMs: Math.round(result.stats.analysisTimeMs),
|
|
79
|
+
},
|
|
80
|
+
topPackages: result.packages
|
|
81
|
+
.slice(0, limit)
|
|
82
|
+
.map((pkg) => ({
|
|
83
|
+
name: pkg.name,
|
|
84
|
+
path: pkg.path,
|
|
85
|
+
files: pkg.files.length,
|
|
86
|
+
functions: pkg.functions.length,
|
|
87
|
+
})),
|
|
88
|
+
summary: `Go project with ${result.stats.fileCount} files, ${result.stats.functionCount} functions, ${result.stats.structCount} structs`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function formatRoutesResult(result, framework, limit) {
|
|
92
|
+
let routes = result.routes;
|
|
93
|
+
if (framework) {
|
|
94
|
+
routes = routes.filter((r) => r.framework === framework);
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
total: routes.length,
|
|
98
|
+
byFramework: result.byFramework,
|
|
99
|
+
routes: routes.slice(0, limit).map((r) => ({
|
|
100
|
+
method: r.method,
|
|
101
|
+
path: r.path,
|
|
102
|
+
handler: r.handler,
|
|
103
|
+
framework: r.framework,
|
|
104
|
+
file: r.file,
|
|
105
|
+
line: r.line,
|
|
106
|
+
middleware: r.middleware,
|
|
107
|
+
})),
|
|
108
|
+
truncated: routes.length > limit,
|
|
109
|
+
summary: `${routes.length} HTTP routes across ${Object.keys(result.byFramework).length} framework(s)`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function formatErrorsResult(result, limit) {
|
|
113
|
+
return {
|
|
114
|
+
stats: {
|
|
115
|
+
errorChecks: result.stats.errorChecks,
|
|
116
|
+
wrappedErrors: result.stats.wrappedErrors,
|
|
117
|
+
sentinelErrors: result.stats.sentinelErrors,
|
|
118
|
+
customErrorTypes: result.stats.customErrorTypes,
|
|
119
|
+
uncheckedErrors: result.stats.uncheckedErrors,
|
|
120
|
+
},
|
|
121
|
+
patterns: {
|
|
122
|
+
propagated: result.patterns.filter((p) => p.type === 'propagated').length,
|
|
123
|
+
wrapped: result.patterns.filter((p) => p.type === 'wrapped').length,
|
|
124
|
+
logged: result.patterns.filter((p) => p.type === 'logged').length,
|
|
125
|
+
ignored: result.patterns.filter((p) => p.type === 'ignored').length,
|
|
126
|
+
},
|
|
127
|
+
issues: result.issues.slice(0, limit).map((i) => ({
|
|
128
|
+
type: i.type,
|
|
129
|
+
file: i.file,
|
|
130
|
+
line: i.line,
|
|
131
|
+
message: i.message,
|
|
132
|
+
suggestion: i.suggestion,
|
|
133
|
+
})),
|
|
134
|
+
sentinelErrors: result.sentinelErrors.slice(0, limit).map((e) => ({
|
|
135
|
+
name: e.name,
|
|
136
|
+
message: e.message,
|
|
137
|
+
file: e.file,
|
|
138
|
+
line: e.line,
|
|
139
|
+
})),
|
|
140
|
+
customErrors: result.customErrors.slice(0, limit).map((e) => ({
|
|
141
|
+
name: e.name,
|
|
142
|
+
implementsError: e.implementsError,
|
|
143
|
+
file: e.file,
|
|
144
|
+
line: e.line,
|
|
145
|
+
})),
|
|
146
|
+
summary: `${result.stats.errorChecks} error checks, ${result.issues.length} potential issues`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function formatInterfacesResult(result, limit) {
|
|
150
|
+
return {
|
|
151
|
+
total: result.interfaces.length,
|
|
152
|
+
interfaces: result.interfaces.slice(0, limit).map((i) => ({
|
|
153
|
+
name: i.name,
|
|
154
|
+
package: i.package,
|
|
155
|
+
methods: i.methods,
|
|
156
|
+
implementations: i.implementations,
|
|
157
|
+
file: i.file,
|
|
158
|
+
line: i.line,
|
|
159
|
+
})),
|
|
160
|
+
implementations: result.implementations.slice(0, limit).map((impl) => ({
|
|
161
|
+
struct: impl.struct,
|
|
162
|
+
interface: impl.interface,
|
|
163
|
+
file: impl.file,
|
|
164
|
+
line: impl.line,
|
|
165
|
+
})),
|
|
166
|
+
truncated: result.interfaces.length > limit,
|
|
167
|
+
summary: `${result.interfaces.length} interfaces with ${result.implementations.length} implementations`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function formatDataAccessResult(result, limit) {
|
|
171
|
+
return {
|
|
172
|
+
total: result.accessPoints.length,
|
|
173
|
+
byFramework: result.byFramework,
|
|
174
|
+
byOperation: result.byOperation,
|
|
175
|
+
tables: result.tables,
|
|
176
|
+
accessPoints: result.accessPoints.slice(0, limit).map((a) => ({
|
|
177
|
+
table: a.table,
|
|
178
|
+
operation: a.operation,
|
|
179
|
+
framework: a.framework,
|
|
180
|
+
file: a.file,
|
|
181
|
+
line: a.line,
|
|
182
|
+
isRawSql: a.isRawSql,
|
|
183
|
+
})),
|
|
184
|
+
truncated: result.accessPoints.length > limit,
|
|
185
|
+
summary: `${result.accessPoints.length} data access points across ${result.tables.length} tables`,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function formatGoroutinesResult(result, limit) {
|
|
189
|
+
return {
|
|
190
|
+
total: result.goroutines.length,
|
|
191
|
+
stats: {
|
|
192
|
+
goStatements: result.stats.goStatements,
|
|
193
|
+
channels: result.stats.channels,
|
|
194
|
+
mutexes: result.stats.mutexes,
|
|
195
|
+
waitGroups: result.stats.waitGroups,
|
|
196
|
+
},
|
|
197
|
+
goroutines: result.goroutines.slice(0, limit).map((g) => ({
|
|
198
|
+
file: g.file,
|
|
199
|
+
line: g.line,
|
|
200
|
+
function: g.function,
|
|
201
|
+
hasRecover: g.hasRecover,
|
|
202
|
+
channelOps: g.channelOps,
|
|
203
|
+
})),
|
|
204
|
+
potentialIssues: result.issues.slice(0, limit).map((i) => ({
|
|
205
|
+
type: i.type,
|
|
206
|
+
file: i.file,
|
|
207
|
+
line: i.line,
|
|
208
|
+
message: i.message,
|
|
209
|
+
})),
|
|
210
|
+
truncated: result.goroutines.length > limit,
|
|
211
|
+
summary: `${result.goroutines.length} goroutines, ${result.issues.length} potential concurrency issues`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=go.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.js","sourceRoot":"","sources":["../../../src/tools/analysis/go.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,4 +8,9 @@ export declare const ANALYSIS_TOOLS: Tool[];
|
|
|
8
8
|
export { handleTestTopology, type TestTopologyArgs, type TestTopologyAction } from './test-topology.js';
|
|
9
9
|
export { handleCoupling, type CouplingArgs, type CouplingAction } from './coupling.js';
|
|
10
10
|
export { handleErrorHandling, type ErrorHandlingArgs, type ErrorHandlingAction } from './error-handling.js';
|
|
11
|
+
export { handleDecisions, type DecisionsArgs, type DecisionsAction } from './decisions.js';
|
|
12
|
+
export { handleSimulate, type SimulateArgs } from './simulate.js';
|
|
13
|
+
export { handleConstraints, type ConstraintsArgs, type ConstraintsAction } from './constraints.js';
|
|
14
|
+
export { executeWpfTool, type WpfArgs, type WpfAction } from './wpf.js';
|
|
15
|
+
export { executeGoTool, type GoArgs, type GoAction } from './go.js';
|
|
11
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/analysis/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/analysis/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAsB/D,eAAO,MAAM,cAAc,EAAE,IAAI,EA+RhC,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxG,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC"}
|