-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathget-component-usage.ts
More file actions
108 lines (101 loc) · 2.89 KB
/
get-component-usage.ts
File metadata and controls
108 lines (101 loc) · 2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
import { promises as fs } from 'fs';
import type { ToolContext, ToolResponse } from './types.js';
export const definition: Tool = {
name: 'get_component_usage',
description:
'Find WHERE a library or component is used in the codebase. ' +
"This is 'Find Usages' - returns all files that import a given package/module. " +
"Example: get_component_usage('@mycompany/utils') -> shows all files using it.",
inputSchema: {
type: 'object',
properties: {
name: {
type: 'string',
description:
"Import source to find usages for (e.g., 'primeng/table', '@mycompany/ui/button', 'lodash')"
}
},
required: ['name']
}
};
export async function handle(
args: Record<string, unknown>,
ctx: ToolContext
): Promise<ToolResponse> {
const { name: componentName } = args as { name: string };
try {
const intelligencePath = ctx.paths.intelligence;
const content = await fs.readFile(intelligencePath, 'utf-8');
const intelligence = JSON.parse(content);
const importGraph = intelligence.importGraph || {};
const usages = importGraph.usages || {};
// Find matching usages (exact match or partial match)
let matchedUsage = usages[componentName];
// Try partial match if exact match not found
if (!matchedUsage) {
const matchingKeys = Object.keys(usages).filter(
(key) => key.includes(componentName) || componentName.includes(key)
);
if (matchingKeys.length > 0) {
matchedUsage = usages[matchingKeys[0]];
}
}
if (matchedUsage) {
return {
content: [
{
type: 'text',
text: JSON.stringify(
{
status: 'success',
component: componentName,
usageCount: matchedUsage.usageCount,
usedIn: matchedUsage.usedIn
},
null,
2
)
}
]
};
} else {
// Show top used as alternatives
const topUsed = importGraph.topUsed || [];
return {
content: [
{
type: 'text',
text: JSON.stringify(
{
status: 'not_found',
component: componentName,
message: `No usages found for '${componentName}'.`,
suggestions: topUsed.slice(0, 10)
},
null,
2
)
}
]
};
}
} catch (error) {
return {
content: [
{
type: 'text',
text: JSON.stringify(
{
status: 'error',
message: 'Failed to get component usage. Run indexing first.',
error: error instanceof Error ? error.message : String(error)
},
null,
2
)
}
]
};
}
}