argustack 0.1.33 → 0.2.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/README.md +29 -12
- package/dist/adapters/lmstudio/embedding-provider.d.ts +37 -0
- package/dist/adapters/lmstudio/embedding-provider.d.ts.map +1 -0
- package/dist/adapters/lmstudio/embedding-provider.js +174 -0
- package/dist/adapters/lmstudio/embedding-provider.js.map +1 -0
- package/dist/adapters/lmstudio/index.d.ts +3 -0
- package/dist/adapters/lmstudio/index.d.ts.map +1 -0
- package/dist/adapters/lmstudio/index.js +2 -0
- package/dist/adapters/lmstudio/index.js.map +1 -0
- package/dist/adapters/lsp/index.d.ts +4 -0
- package/dist/adapters/lsp/index.d.ts.map +1 -0
- package/dist/adapters/lsp/index.js +3 -0
- package/dist/adapters/lsp/index.js.map +1 -0
- package/dist/adapters/lsp/jsonrpc.d.ts +12 -0
- package/dist/adapters/lsp/jsonrpc.d.ts.map +1 -0
- package/dist/adapters/lsp/jsonrpc.js +30 -0
- package/dist/adapters/lsp/jsonrpc.js.map +1 -0
- package/dist/adapters/lsp/typescript-lsp.d.ts +25 -0
- package/dist/adapters/lsp/typescript-lsp.d.ts.map +1 -0
- package/dist/adapters/lsp/typescript-lsp.js +131 -0
- package/dist/adapters/lsp/typescript-lsp.js.map +1 -0
- package/dist/adapters/neo4j/client.d.ts +11 -0
- package/dist/adapters/neo4j/client.d.ts.map +1 -0
- package/dist/adapters/neo4j/client.js +14 -0
- package/dist/adapters/neo4j/client.js.map +1 -0
- package/dist/adapters/neo4j/cypher.d.ts +23 -0
- package/dist/adapters/neo4j/cypher.d.ts.map +1 -0
- package/dist/adapters/neo4j/cypher.js +138 -0
- package/dist/adapters/neo4j/cypher.js.map +1 -0
- package/dist/adapters/neo4j/graph-store.d.ts +33 -0
- package/dist/adapters/neo4j/graph-store.d.ts.map +1 -0
- package/dist/adapters/neo4j/graph-store.js +282 -0
- package/dist/adapters/neo4j/graph-store.js.map +1 -0
- package/dist/adapters/neo4j/index.d.ts +4 -0
- package/dist/adapters/neo4j/index.d.ts.map +1 -0
- package/dist/adapters/neo4j/index.js +3 -0
- package/dist/adapters/neo4j/index.js.map +1 -0
- package/dist/adapters/neo4j/mapper.d.ts +5 -0
- package/dist/adapters/neo4j/mapper.d.ts.map +1 -0
- package/dist/adapters/neo4j/mapper.js +49 -0
- package/dist/adapters/neo4j/mapper.js.map +1 -0
- package/dist/adapters/postgres/code-meta.d.ts +21 -0
- package/dist/adapters/postgres/code-meta.d.ts.map +1 -0
- package/dist/adapters/postgres/code-meta.js +150 -0
- package/dist/adapters/postgres/code-meta.js.map +1 -0
- package/dist/adapters/postgres/index.d.ts +1 -0
- package/dist/adapters/postgres/index.d.ts.map +1 -1
- package/dist/adapters/postgres/index.js +1 -0
- package/dist/adapters/postgres/index.js.map +1 -1
- package/dist/adapters/postgres/schema.d.ts.map +1 -1
- package/dist/adapters/postgres/schema.js +38 -0
- package/dist/adapters/postgres/schema.js.map +1 -1
- package/dist/adapters/postgres/storage.d.ts +3 -3
- package/dist/adapters/postgres/storage.d.ts.map +1 -1
- package/dist/adapters/postgres/storage.js +4 -4
- package/dist/adapters/postgres/storage.js.map +1 -1
- package/dist/adapters/qdrant/client.d.ts +8 -0
- package/dist/adapters/qdrant/client.d.ts.map +1 -0
- package/dist/adapters/qdrant/client.js +12 -0
- package/dist/adapters/qdrant/client.js.map +1 -0
- package/dist/adapters/qdrant/index.d.ts +4 -0
- package/dist/adapters/qdrant/index.d.ts.map +1 -0
- package/dist/adapters/qdrant/index.js +3 -0
- package/dist/adapters/qdrant/index.js.map +1 -0
- package/dist/adapters/qdrant/mapper.d.ts +16 -0
- package/dist/adapters/qdrant/mapper.d.ts.map +1 -0
- package/dist/adapters/qdrant/mapper.js +52 -0
- package/dist/adapters/qdrant/mapper.js.map +1 -0
- package/dist/adapters/qdrant/vector-store.d.ts +19 -0
- package/dist/adapters/qdrant/vector-store.d.ts.map +1 -0
- package/dist/adapters/qdrant/vector-store.js +114 -0
- package/dist/adapters/qdrant/vector-store.js.map +1 -0
- package/dist/adapters/tree-sitter/index.d.ts +4 -0
- package/dist/adapters/tree-sitter/index.d.ts.map +1 -0
- package/dist/adapters/tree-sitter/index.js +3 -0
- package/dist/adapters/tree-sitter/index.js.map +1 -0
- package/dist/adapters/tree-sitter/parser.d.ts +15 -0
- package/dist/adapters/tree-sitter/parser.d.ts.map +1 -0
- package/dist/adapters/tree-sitter/parser.js +186 -0
- package/dist/adapters/tree-sitter/parser.js.map +1 -0
- package/dist/adapters/tree-sitter/queries.d.ts +14 -0
- package/dist/adapters/tree-sitter/queries.d.ts.map +1 -0
- package/dist/adapters/tree-sitter/queries.js +14 -0
- package/dist/adapters/tree-sitter/queries.js.map +1 -0
- package/dist/adapters/voyage/embedding-provider.d.ts +25 -0
- package/dist/adapters/voyage/embedding-provider.d.ts.map +1 -0
- package/dist/adapters/voyage/embedding-provider.js +105 -0
- package/dist/adapters/voyage/embedding-provider.js.map +1 -0
- package/dist/adapters/voyage/index.d.ts +3 -0
- package/dist/adapters/voyage/index.d.ts.map +1 -0
- package/dist/adapters/voyage/index.js +2 -0
- package/dist/adapters/voyage/index.js.map +1 -0
- package/dist/cli/code.d.ts +3 -0
- package/dist/cli/code.d.ts.map +1 -0
- package/dist/cli/code.js +565 -0
- package/dist/cli/code.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/index.d.ts.map +1 -1
- package/dist/cli/init/index.js +5 -2
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +3 -0
- package/dist/cli/sync.js.map +1 -1
- package/dist/code-intel/chunker.d.ts +15 -0
- package/dist/code-intel/chunker.d.ts.map +1 -0
- package/dist/code-intel/chunker.js +39 -0
- package/dist/code-intel/chunker.js.map +1 -0
- package/dist/code-intel/file-discovery.d.ts +19 -0
- package/dist/code-intel/file-discovery.d.ts.map +1 -0
- package/dist/code-intel/file-discovery.js +80 -0
- package/dist/code-intel/file-discovery.js.map +1 -0
- package/dist/code-intel/hash.d.ts +2 -0
- package/dist/code-intel/hash.d.ts.map +1 -0
- package/dist/code-intel/hash.js +5 -0
- package/dist/code-intel/hash.js.map +1 -0
- package/dist/code-intel/index.d.ts +17 -0
- package/dist/code-intel/index.d.ts.map +1 -0
- package/dist/code-intel/index.js +11 -0
- package/dist/code-intel/index.js.map +1 -0
- package/dist/code-intel/indexer.d.ts +43 -0
- package/dist/code-intel/indexer.d.ts.map +1 -0
- package/dist/code-intel/indexer.js +234 -0
- package/dist/code-intel/indexer.js.map +1 -0
- package/dist/code-intel/job-lock.d.ts +7 -0
- package/dist/code-intel/job-lock.d.ts.map +1 -0
- package/dist/code-intel/job-lock.js +18 -0
- package/dist/code-intel/job-lock.js.map +1 -0
- package/dist/code-intel/layer-detector.d.ts +9 -0
- package/dist/code-intel/layer-detector.d.ts.map +1 -0
- package/dist/code-intel/layer-detector.js +31 -0
- package/dist/code-intel/layer-detector.js.map +1 -0
- package/dist/code-intel/lsp-resolver.d.ts +24 -0
- package/dist/code-intel/lsp-resolver.d.ts.map +1 -0
- package/dist/code-intel/lsp-resolver.js +125 -0
- package/dist/code-intel/lsp-resolver.js.map +1 -0
- package/dist/code-intel/ranker.d.ts +28 -0
- package/dist/code-intel/ranker.d.ts.map +1 -0
- package/dist/code-intel/ranker.js +69 -0
- package/dist/code-intel/ranker.js.map +1 -0
- package/dist/code-intel/resolver.d.ts +14 -0
- package/dist/code-intel/resolver.d.ts.map +1 -0
- package/dist/code-intel/resolver.js +59 -0
- package/dist/code-intel/resolver.js.map +1 -0
- package/dist/code-intel/tsconfig-paths.d.ts +11 -0
- package/dist/code-intel/tsconfig-paths.d.ts.map +1 -0
- package/dist/code-intel/tsconfig-paths.js +67 -0
- package/dist/code-intel/tsconfig-paths.js.map +1 -0
- package/dist/code-intel/watcher.d.ts +27 -0
- package/dist/code-intel/watcher.d.ts.map +1 -0
- package/dist/code-intel/watcher.js +93 -0
- package/dist/code-intel/watcher.js.map +1 -0
- package/dist/core/ports/code-embedding.d.ts +42 -0
- package/dist/core/ports/code-embedding.d.ts.map +1 -0
- package/dist/core/ports/code-embedding.js +2 -0
- package/dist/core/ports/code-embedding.js.map +1 -0
- package/dist/core/ports/code-graph.d.ts +56 -0
- package/dist/core/ports/code-graph.d.ts.map +1 -0
- package/dist/core/ports/code-graph.js +2 -0
- package/dist/core/ports/code-graph.js.map +1 -0
- package/dist/core/ports/code-meta.d.ts +33 -0
- package/dist/core/ports/code-meta.d.ts.map +1 -0
- package/dist/core/ports/code-meta.js +2 -0
- package/dist/core/ports/code-meta.js.map +1 -0
- package/dist/core/ports/code-parser.d.ts +13 -0
- package/dist/core/ports/code-parser.d.ts.map +1 -0
- package/dist/core/ports/code-parser.js +2 -0
- package/dist/core/ports/code-parser.js.map +1 -0
- package/dist/core/ports/code-vector-store.d.ts +37 -0
- package/dist/core/ports/code-vector-store.d.ts.map +1 -0
- package/dist/core/ports/code-vector-store.js +2 -0
- package/dist/core/ports/code-vector-store.js.map +1 -0
- package/dist/core/ports/index.d.ts +6 -0
- package/dist/core/ports/index.d.ts.map +1 -1
- package/dist/core/ports/lsp-client.d.ts +22 -0
- package/dist/core/ports/lsp-client.d.ts.map +1 -0
- package/dist/core/ports/lsp-client.js +2 -0
- package/dist/core/ports/lsp-client.js.map +1 -0
- package/dist/core/types/code.d.ts +153 -0
- package/dist/core/types/code.d.ts.map +1 -0
- package/dist/core/types/code.js +2 -0
- package/dist/core/types/code.js.map +1 -0
- package/dist/core/types/config.d.ts +1 -1
- package/dist/core/types/config.d.ts.map +1 -1
- package/dist/core/types/config.js +8 -1
- package/dist/core/types/config.js.map +1 -1
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/mcp/helpers.d.ts +21 -0
- package/dist/mcp/helpers.d.ts.map +1 -1
- package/dist/mcp/helpers.js +159 -5
- package/dist/mcp/helpers.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +6 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/code-graph.d.ts +3 -0
- package/dist/mcp/tools/code-graph.d.ts.map +1 -0
- package/dist/mcp/tools/code-graph.js +295 -0
- package/dist/mcp/tools/code-graph.js.map +1 -0
- package/dist/mcp/tools/code-hybrid.d.ts +3 -0
- package/dist/mcp/tools/code-hybrid.d.ts.map +1 -0
- package/dist/mcp/tools/code-hybrid.js +118 -0
- package/dist/mcp/tools/code-hybrid.js.map +1 -0
- package/dist/mcp/tools/code-search.d.ts +3 -0
- package/dist/mcp/tools/code-search.d.ts.map +1 -0
- package/dist/mcp/tools/code-search.js +95 -0
- package/dist/mcp/tools/code-search.js.map +1 -0
- package/dist/mcp/tools/workspace.js +1 -1
- package/dist/mcp/tools/workspace.js.map +1 -1
- package/dist/use-cases/code-search.d.ts +36 -0
- package/dist/use-cases/code-search.d.ts.map +1 -0
- package/dist/use-cases/code-search.js +74 -0
- package/dist/use-cases/code-search.js.map +1 -0
- package/dist/use-cases/index-code.d.ts +24 -0
- package/dist/use-cases/index-code.d.ts.map +1 -0
- package/dist/use-cases/index-code.js +43 -0
- package/dist/use-cases/index-code.js.map +1 -0
- package/dist/use-cases/register-code-project.d.ts +21 -0
- package/dist/use-cases/register-code-project.d.ts.map +1 -0
- package/dist/use-cases/register-code-project.js +19 -0
- package/dist/use-cases/register-code-project.js.map +1 -0
- package/dist/use-cases/unregister-code-project.d.ts +11 -0
- package/dist/use-cases/unregister-code-project.d.ts.map +1 -0
- package/dist/use-cases/unregister-code-project.js +19 -0
- package/dist/use-cases/unregister-code-project.js.map +1 -0
- package/dist/use-cases/watch-code.d.ts +33 -0
- package/dist/use-cases/watch-code.d.ts.map +1 -0
- package/dist/use-cases/watch-code.js +52 -0
- package/dist/use-cases/watch-code.js.map +1 -0
- package/package.json +10 -3
- package/templates/code-docker-compose.yml +51 -0
- package/templates/env.example +16 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { loadWorkspace, createCodeAdapters, textResponse, errorResponse, } from '../helpers.js';
|
|
3
|
+
const KIND_VALUES = [
|
|
4
|
+
'function',
|
|
5
|
+
'class',
|
|
6
|
+
'method',
|
|
7
|
+
'interface',
|
|
8
|
+
'type',
|
|
9
|
+
'enum',
|
|
10
|
+
'const',
|
|
11
|
+
'component',
|
|
12
|
+
];
|
|
13
|
+
const LAYER_VALUES = ['domain', 'application', 'infrastructure', 'presentation'];
|
|
14
|
+
async function resolveProjectId(adapters, explicitId) {
|
|
15
|
+
if (explicitId) {
|
|
16
|
+
const byId = await adapters.storage.getProjectById(explicitId);
|
|
17
|
+
return byId ? byId.id : null;
|
|
18
|
+
}
|
|
19
|
+
const byRoot = await adapters.storage.getProjectByRoot(process.cwd());
|
|
20
|
+
return byRoot ? byRoot.id : null;
|
|
21
|
+
}
|
|
22
|
+
function formatSymbol(s) {
|
|
23
|
+
const layer = s.layer ? ` [${s.layer}]` : '';
|
|
24
|
+
return `- **${s.qualifiedName}** (${s.kind})${layer} — ${s.filePath}:${String(s.startLine)}`;
|
|
25
|
+
}
|
|
26
|
+
function formatFile(f) {
|
|
27
|
+
const layer = f.layer ? ` [${f.layer}]` : '';
|
|
28
|
+
return `- ${f.path}${layer}`;
|
|
29
|
+
}
|
|
30
|
+
async function runWithAdapters(fn) {
|
|
31
|
+
const ws = loadWorkspace();
|
|
32
|
+
if (!ws.ok) {
|
|
33
|
+
return { error: `Workspace not found: ${ws.reason}` };
|
|
34
|
+
}
|
|
35
|
+
const adapters = await createCodeAdapters(ws.root);
|
|
36
|
+
if (!adapters) {
|
|
37
|
+
return {
|
|
38
|
+
error: 'Code intelligence not configured. Set NEO4J_URI, QDRANT_URL, VOYAGE_API_KEY in workspace .env',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return fn(adapters);
|
|
42
|
+
}
|
|
43
|
+
export function registerCodeGraphTools(server) {
|
|
44
|
+
server.registerTool('find_symbol', {
|
|
45
|
+
description: 'Find symbols (functions/classes/methods/interfaces/types) by name fragment. Returns file path + line. Use to locate code without grep.',
|
|
46
|
+
inputSchema: {
|
|
47
|
+
query: z.string().describe('Symbol name fragment, case-insensitive'),
|
|
48
|
+
kind: z.enum(KIND_VALUES).optional().describe('Filter by kind'),
|
|
49
|
+
layer: z.enum(LAYER_VALUES).optional().describe('Filter by architecture layer'),
|
|
50
|
+
limit: z.number().optional().describe('Max results (default 25)'),
|
|
51
|
+
project_id: z.string().optional().describe('Project id (default: auto-detect from CWD)'),
|
|
52
|
+
},
|
|
53
|
+
}, async ({ query, kind, layer, limit, project_id: projectIdInput }) => {
|
|
54
|
+
const result = await runWithAdapters(async (adapters) => {
|
|
55
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
56
|
+
if (!projectId) {
|
|
57
|
+
return { error: 'Project not registered. Run `argustack code register --name <name>`.' };
|
|
58
|
+
}
|
|
59
|
+
const findOpts = {
|
|
60
|
+
projectId,
|
|
61
|
+
query,
|
|
62
|
+
};
|
|
63
|
+
if (kind) {
|
|
64
|
+
findOpts.kind = kind;
|
|
65
|
+
}
|
|
66
|
+
if (layer) {
|
|
67
|
+
findOpts.layer = layer;
|
|
68
|
+
}
|
|
69
|
+
if (limit !== undefined) {
|
|
70
|
+
findOpts.limit = limit;
|
|
71
|
+
}
|
|
72
|
+
const symbols = await adapters.graph.findSymbol(findOpts);
|
|
73
|
+
if (symbols.length === 0) {
|
|
74
|
+
return { text: `No symbols matching "${query}".` };
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
text: `# Symbols matching "${query}"\n\n${symbols.map(formatSymbol).join('\n')}`,
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
if ('error' in result) {
|
|
81
|
+
return errorResponse(result.error);
|
|
82
|
+
}
|
|
83
|
+
return textResponse(result.text);
|
|
84
|
+
});
|
|
85
|
+
server.registerTool('get_dependencies', {
|
|
86
|
+
description: 'Return files that the given file imports (transitively). Use to understand downstream impact.',
|
|
87
|
+
inputSchema: {
|
|
88
|
+
file: z.string().describe('File path relative to project root'),
|
|
89
|
+
depth: z.number().optional().describe('Traversal depth (default 2)'),
|
|
90
|
+
project_id: z.string().optional(),
|
|
91
|
+
},
|
|
92
|
+
}, async ({ file, depth, project_id: projectIdInput }) => {
|
|
93
|
+
const result = await runWithAdapters(async (adapters) => {
|
|
94
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
95
|
+
if (!projectId) {
|
|
96
|
+
return { error: 'Project not registered.' };
|
|
97
|
+
}
|
|
98
|
+
const files = await adapters.graph.getDependencies(projectId, file, depth ?? 2);
|
|
99
|
+
if (files.length === 0) {
|
|
100
|
+
return { text: `${file} has no resolved imports.` };
|
|
101
|
+
}
|
|
102
|
+
return { text: `# Dependencies of ${file}\n\n${files.map(formatFile).join('\n')}` };
|
|
103
|
+
});
|
|
104
|
+
if ('error' in result) {
|
|
105
|
+
return errorResponse(result.error);
|
|
106
|
+
}
|
|
107
|
+
return textResponse(result.text);
|
|
108
|
+
});
|
|
109
|
+
server.registerTool('get_dependents', {
|
|
110
|
+
description: 'Return files that import the given file (upstream).',
|
|
111
|
+
inputSchema: {
|
|
112
|
+
file: z.string(),
|
|
113
|
+
depth: z.number().optional(),
|
|
114
|
+
project_id: z.string().optional(),
|
|
115
|
+
},
|
|
116
|
+
}, async ({ file, depth, project_id: projectIdInput }) => {
|
|
117
|
+
const result = await runWithAdapters(async (adapters) => {
|
|
118
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
119
|
+
if (!projectId) {
|
|
120
|
+
return { error: 'Project not registered.' };
|
|
121
|
+
}
|
|
122
|
+
const files = await adapters.graph.getDependents(projectId, file, depth ?? 2);
|
|
123
|
+
if (files.length === 0) {
|
|
124
|
+
return { text: `${file} has no resolved dependents.` };
|
|
125
|
+
}
|
|
126
|
+
return { text: `# Dependents of ${file}\n\n${files.map(formatFile).join('\n')}` };
|
|
127
|
+
});
|
|
128
|
+
if ('error' in result) {
|
|
129
|
+
return errorResponse(result.error);
|
|
130
|
+
}
|
|
131
|
+
return textResponse(result.text);
|
|
132
|
+
});
|
|
133
|
+
server.registerTool('get_callers', {
|
|
134
|
+
description: 'Return symbols that call the given qualified name (transitively).',
|
|
135
|
+
inputSchema: {
|
|
136
|
+
qualified_name: z.string(),
|
|
137
|
+
depth: z.number().optional(),
|
|
138
|
+
project_id: z.string().optional(),
|
|
139
|
+
},
|
|
140
|
+
}, async ({ qualified_name: qualifiedName, depth, project_id: projectIdInput }) => {
|
|
141
|
+
const result = await runWithAdapters(async (adapters) => {
|
|
142
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
143
|
+
if (!projectId) {
|
|
144
|
+
return { error: 'Project not registered.' };
|
|
145
|
+
}
|
|
146
|
+
const symbols = await adapters.graph.getCallers(projectId, qualifiedName, depth ?? 3);
|
|
147
|
+
if (symbols.length === 0) {
|
|
148
|
+
return { text: `No callers found for ${qualifiedName}.` };
|
|
149
|
+
}
|
|
150
|
+
return { text: `# Callers of ${qualifiedName}\n\n${symbols.map(formatSymbol).join('\n')}` };
|
|
151
|
+
});
|
|
152
|
+
if ('error' in result) {
|
|
153
|
+
return errorResponse(result.error);
|
|
154
|
+
}
|
|
155
|
+
return textResponse(result.text);
|
|
156
|
+
});
|
|
157
|
+
server.registerTool('get_callees', {
|
|
158
|
+
description: 'Return symbols called by the given qualified name (transitively).',
|
|
159
|
+
inputSchema: {
|
|
160
|
+
qualified_name: z.string(),
|
|
161
|
+
depth: z.number().optional(),
|
|
162
|
+
project_id: z.string().optional(),
|
|
163
|
+
},
|
|
164
|
+
}, async ({ qualified_name: qualifiedName, depth, project_id: projectIdInput }) => {
|
|
165
|
+
const result = await runWithAdapters(async (adapters) => {
|
|
166
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
167
|
+
if (!projectId) {
|
|
168
|
+
return { error: 'Project not registered.' };
|
|
169
|
+
}
|
|
170
|
+
const symbols = await adapters.graph.getCallees(projectId, qualifiedName, depth ?? 3);
|
|
171
|
+
if (symbols.length === 0) {
|
|
172
|
+
return { text: `${qualifiedName} calls nothing tracked.` };
|
|
173
|
+
}
|
|
174
|
+
return { text: `# Callees of ${qualifiedName}\n\n${symbols.map(formatSymbol).join('\n')}` };
|
|
175
|
+
});
|
|
176
|
+
if ('error' in result) {
|
|
177
|
+
return errorResponse(result.error);
|
|
178
|
+
}
|
|
179
|
+
return textResponse(result.text);
|
|
180
|
+
});
|
|
181
|
+
server.registerTool('get_call_path', {
|
|
182
|
+
description: 'Find shortest CALLS path between two qualified names. Returns ordered list of symbols.',
|
|
183
|
+
inputSchema: {
|
|
184
|
+
from: z.string(),
|
|
185
|
+
to: z.string(),
|
|
186
|
+
project_id: z.string().optional(),
|
|
187
|
+
},
|
|
188
|
+
}, async ({ from, to, project_id: projectIdInput }) => {
|
|
189
|
+
const result = await runWithAdapters(async (adapters) => {
|
|
190
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
191
|
+
if (!projectId) {
|
|
192
|
+
return { error: 'Project not registered.' };
|
|
193
|
+
}
|
|
194
|
+
const path = await adapters.graph.getCallPath(projectId, from, to);
|
|
195
|
+
if (!path) {
|
|
196
|
+
return { text: `No call path from ${from} → ${to}.` };
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
text: `# Call path: ${from} → ${to}\n\n${path.map((s, i) => `${String(i + 1)}. ${formatSymbol(s)}`).join('\n')}`,
|
|
200
|
+
};
|
|
201
|
+
});
|
|
202
|
+
if ('error' in result) {
|
|
203
|
+
return errorResponse(result.error);
|
|
204
|
+
}
|
|
205
|
+
return textResponse(result.text);
|
|
206
|
+
});
|
|
207
|
+
server.registerTool('find_arch_violations', {
|
|
208
|
+
description: 'Find Clean Architecture violations: domain → infra/presentation, application → presentation. Returns the violating call edges.',
|
|
209
|
+
inputSchema: { project_id: z.string().optional() },
|
|
210
|
+
}, async ({ project_id: projectIdInput }) => {
|
|
211
|
+
const result = await runWithAdapters(async (adapters) => {
|
|
212
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
213
|
+
if (!projectId) {
|
|
214
|
+
return { error: 'Project not registered.' };
|
|
215
|
+
}
|
|
216
|
+
const violations = await adapters.graph.findArchViolations(projectId);
|
|
217
|
+
if (violations.length === 0) {
|
|
218
|
+
return { text: 'No architecture violations detected.' };
|
|
219
|
+
}
|
|
220
|
+
const lines = violations.map((v) => `- ${v.fromQn} → ${v.toQn} (count: ${String(v.count)})`);
|
|
221
|
+
return { text: `# Architecture violations (${String(violations.length)})\n\n${lines.join('\n')}` };
|
|
222
|
+
});
|
|
223
|
+
if ('error' in result) {
|
|
224
|
+
return errorResponse(result.error);
|
|
225
|
+
}
|
|
226
|
+
return textResponse(result.text);
|
|
227
|
+
});
|
|
228
|
+
server.registerTool('find_unused_exports', {
|
|
229
|
+
description: 'Find exported symbols with no incoming references (no callers, no implementations, no extensions). Candidates for deletion.',
|
|
230
|
+
inputSchema: { project_id: z.string().optional() },
|
|
231
|
+
}, async ({ project_id: projectIdInput }) => {
|
|
232
|
+
const result = await runWithAdapters(async (adapters) => {
|
|
233
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
234
|
+
if (!projectId) {
|
|
235
|
+
return { error: 'Project not registered.' };
|
|
236
|
+
}
|
|
237
|
+
const symbols = await adapters.graph.findUnusedExports(projectId);
|
|
238
|
+
if (symbols.length === 0) {
|
|
239
|
+
return { text: 'No unused exports.' };
|
|
240
|
+
}
|
|
241
|
+
return { text: `# Unused exports\n\n${symbols.map(formatSymbol).join('\n')}` };
|
|
242
|
+
});
|
|
243
|
+
if ('error' in result) {
|
|
244
|
+
return errorResponse(result.error);
|
|
245
|
+
}
|
|
246
|
+
return textResponse(result.text);
|
|
247
|
+
});
|
|
248
|
+
server.registerTool('get_implementers', {
|
|
249
|
+
description: 'Return classes that implement the given interface (qualified name).',
|
|
250
|
+
inputSchema: {
|
|
251
|
+
interface_qualified_name: z.string(),
|
|
252
|
+
project_id: z.string().optional(),
|
|
253
|
+
},
|
|
254
|
+
}, async ({ interface_qualified_name: interfaceQualifiedName, project_id: projectIdInput }) => {
|
|
255
|
+
const result = await runWithAdapters(async (adapters) => {
|
|
256
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
257
|
+
if (!projectId) {
|
|
258
|
+
return { error: 'Project not registered.' };
|
|
259
|
+
}
|
|
260
|
+
const symbols = await adapters.graph.getImplementers(projectId, interfaceQualifiedName);
|
|
261
|
+
if (symbols.length === 0) {
|
|
262
|
+
return { text: `No implementers of ${interfaceQualifiedName}.` };
|
|
263
|
+
}
|
|
264
|
+
return { text: `# Implementers of ${interfaceQualifiedName}\n\n${symbols.map(formatSymbol).join('\n')}` };
|
|
265
|
+
});
|
|
266
|
+
if ('error' in result) {
|
|
267
|
+
return errorResponse(result.error);
|
|
268
|
+
}
|
|
269
|
+
return textResponse(result.text);
|
|
270
|
+
});
|
|
271
|
+
server.registerTool('get_layer_symbols', {
|
|
272
|
+
description: 'Return all symbols in a given architecture layer (domain/application/infrastructure/presentation).',
|
|
273
|
+
inputSchema: {
|
|
274
|
+
layer: z.enum(LAYER_VALUES),
|
|
275
|
+
project_id: z.string().optional(),
|
|
276
|
+
},
|
|
277
|
+
}, async ({ layer, project_id: projectIdInput }) => {
|
|
278
|
+
const result = await runWithAdapters(async (adapters) => {
|
|
279
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
280
|
+
if (!projectId) {
|
|
281
|
+
return { error: 'Project not registered.' };
|
|
282
|
+
}
|
|
283
|
+
const symbols = await adapters.graph.getLayerSymbols(projectId, layer);
|
|
284
|
+
if (symbols.length === 0) {
|
|
285
|
+
return { text: `No symbols in layer ${layer}.` };
|
|
286
|
+
}
|
|
287
|
+
return { text: `# Symbols in layer '${layer}' (${String(symbols.length)})\n\n${symbols.slice(0, 100).map(formatSymbol).join('\n')}` };
|
|
288
|
+
});
|
|
289
|
+
if ('error' in result) {
|
|
290
|
+
return errorResponse(result.error);
|
|
291
|
+
}
|
|
292
|
+
return textResponse(result.text);
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=code-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-graph.js","sourceRoot":"","sources":["../../../src/mcp/tools/code-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-hybrid.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/code-hybrid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmCzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8G/D"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { loadWorkspace, createCodeAdapters, textResponse, errorResponse, } from '../helpers.js';
|
|
3
|
+
import { CodeSearchUseCase } from '../../use-cases/code-search.js';
|
|
4
|
+
async function resolveProjectId(adapters, explicitId) {
|
|
5
|
+
if (explicitId) {
|
|
6
|
+
const byId = await adapters.storage.getProjectById(explicitId);
|
|
7
|
+
return byId ? byId.id : null;
|
|
8
|
+
}
|
|
9
|
+
const byRoot = await adapters.storage.getProjectByRoot(process.cwd());
|
|
10
|
+
return byRoot ? byRoot.id : null;
|
|
11
|
+
}
|
|
12
|
+
function formatPlannedSection(layer, items) {
|
|
13
|
+
if (items.length === 0) {
|
|
14
|
+
return `### ${layer}\n_no candidates_`;
|
|
15
|
+
}
|
|
16
|
+
const lines = items.map((f) => `- \`${f.filePath}\` — ${f.reason}${f.similarTo ? ` (similar to: ${f.similarTo})` : ''}`);
|
|
17
|
+
return `### ${layer}\n${lines.join('\n')}`;
|
|
18
|
+
}
|
|
19
|
+
export function registerCodeHybridTools(server) {
|
|
20
|
+
server.registerTool('explain_feature', {
|
|
21
|
+
description: 'Explain how a feature works: 4-stage pipeline (semantic search → graph expand → rerank → cluster by layer). Returns layered code map for the topic.',
|
|
22
|
+
inputSchema: {
|
|
23
|
+
query: z.string().describe('Feature or behavior description'),
|
|
24
|
+
top_k: z.number().optional(),
|
|
25
|
+
project_id: z.string().optional(),
|
|
26
|
+
},
|
|
27
|
+
}, async ({ query, top_k: topK, project_id: projectIdInput }) => {
|
|
28
|
+
const ws = loadWorkspace();
|
|
29
|
+
if (!ws.ok) {
|
|
30
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
31
|
+
}
|
|
32
|
+
const adapters = await createCodeAdapters(ws.root);
|
|
33
|
+
if (!adapters) {
|
|
34
|
+
return errorResponse('Code intelligence not configured.');
|
|
35
|
+
}
|
|
36
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
37
|
+
if (!projectId) {
|
|
38
|
+
return errorResponse('Project not registered.');
|
|
39
|
+
}
|
|
40
|
+
const useCase = new CodeSearchUseCase(adapters.graph, adapters.vec, adapters.embedding);
|
|
41
|
+
const input = {
|
|
42
|
+
projectId,
|
|
43
|
+
query,
|
|
44
|
+
};
|
|
45
|
+
if (topK !== undefined) {
|
|
46
|
+
input.topK = topK;
|
|
47
|
+
}
|
|
48
|
+
const result = await useCase.explainFeature(input);
|
|
49
|
+
const sections = [`# Feature explanation: "${query}"`, ''];
|
|
50
|
+
const layers = [
|
|
51
|
+
'domain',
|
|
52
|
+
'application',
|
|
53
|
+
'infrastructure',
|
|
54
|
+
'presentation',
|
|
55
|
+
];
|
|
56
|
+
for (const layer of layers) {
|
|
57
|
+
const hits = result.byLayer[layer];
|
|
58
|
+
if (hits.length === 0) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
sections.push(`## ${layer}`);
|
|
62
|
+
for (const h of hits) {
|
|
63
|
+
sections.push(`- ${h.payload.name} (${h.payload.kind}) — ${h.payload.filePath}:${String(h.payload.startLine)}`);
|
|
64
|
+
}
|
|
65
|
+
sections.push('');
|
|
66
|
+
}
|
|
67
|
+
if (result.expandedFiles.length > 0) {
|
|
68
|
+
sections.push('## Graph-expanded files');
|
|
69
|
+
for (const f of result.expandedFiles.slice(0, 20)) {
|
|
70
|
+
sections.push(`- ${f}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return textResponse(sections.join('\n'));
|
|
74
|
+
});
|
|
75
|
+
server.registerTool('plan_feature_files', {
|
|
76
|
+
description: 'Killer feature for /create-technical-plan: returns a layered list of files (domain/application/infrastructure/presentation) Claude should consider when planning a new feature. Combines semantic match + graph neighborhood.',
|
|
77
|
+
inputSchema: {
|
|
78
|
+
description: z.string().describe('Feature description'),
|
|
79
|
+
top_k_per_layer: z.number().optional().describe('Default 5'),
|
|
80
|
+
project_id: z.string().optional(),
|
|
81
|
+
},
|
|
82
|
+
}, async ({ description, top_k_per_layer: topKPerLayer, project_id: projectIdInput }) => {
|
|
83
|
+
const ws = loadWorkspace();
|
|
84
|
+
if (!ws.ok) {
|
|
85
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
86
|
+
}
|
|
87
|
+
const adapters = await createCodeAdapters(ws.root);
|
|
88
|
+
if (!adapters) {
|
|
89
|
+
return errorResponse('Code intelligence not configured.');
|
|
90
|
+
}
|
|
91
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
92
|
+
if (!projectId) {
|
|
93
|
+
return errorResponse('Project not registered.');
|
|
94
|
+
}
|
|
95
|
+
const useCase = new CodeSearchUseCase(adapters.graph, adapters.vec, adapters.embedding);
|
|
96
|
+
const input = {
|
|
97
|
+
projectId,
|
|
98
|
+
description,
|
|
99
|
+
};
|
|
100
|
+
if (topKPerLayer !== undefined) {
|
|
101
|
+
input.topKPerLayer = topKPerLayer;
|
|
102
|
+
}
|
|
103
|
+
const plan = await useCase.planFeatureFiles(input);
|
|
104
|
+
const text = [
|
|
105
|
+
`# Plan files for: "${description}"`,
|
|
106
|
+
'',
|
|
107
|
+
formatPlannedSection('Domain', plan.domain),
|
|
108
|
+
'',
|
|
109
|
+
formatPlannedSection('Application', plan.application),
|
|
110
|
+
'',
|
|
111
|
+
formatPlannedSection('Infrastructure', plan.infrastructure),
|
|
112
|
+
'',
|
|
113
|
+
formatPlannedSection('Presentation', plan.presentation),
|
|
114
|
+
].join('\n');
|
|
115
|
+
return textResponse(text);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=code-hybrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-hybrid.js","sourceRoot":"","sources":["../../../src/mcp/tools/code-hybrid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-search.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/code-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0CzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkF/D"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { loadWorkspace, createCodeAdapters, textResponse, errorResponse, } from '../helpers.js';
|
|
3
|
+
import { CodeSearchUseCase } from '../../use-cases/code-search.js';
|
|
4
|
+
const KIND_VALUES = [
|
|
5
|
+
'function',
|
|
6
|
+
'class',
|
|
7
|
+
'method',
|
|
8
|
+
'interface',
|
|
9
|
+
'type',
|
|
10
|
+
'enum',
|
|
11
|
+
'const',
|
|
12
|
+
'component',
|
|
13
|
+
];
|
|
14
|
+
const LAYER_VALUES = ['domain', 'application', 'infrastructure', 'presentation'];
|
|
15
|
+
async function resolveProjectId(adapters, explicitId) {
|
|
16
|
+
if (explicitId) {
|
|
17
|
+
const byId = await adapters.storage.getProjectById(explicitId);
|
|
18
|
+
return byId ? byId.id : null;
|
|
19
|
+
}
|
|
20
|
+
const byRoot = await adapters.storage.getProjectByRoot(process.cwd());
|
|
21
|
+
return byRoot ? byRoot.id : null;
|
|
22
|
+
}
|
|
23
|
+
function formatHit(hit) {
|
|
24
|
+
const score = hit.rerankScore !== undefined ? hit.rerankScore.toFixed(3) : hit.score.toFixed(3);
|
|
25
|
+
const layer = hit.payload.layer ? `[${hit.payload.layer}] ` : '';
|
|
26
|
+
return `- **${hit.payload.name}** (${hit.payload.kind}) ${layer}— ${hit.payload.filePath}:${String(hit.payload.startLine)} _(score: ${score})_`;
|
|
27
|
+
}
|
|
28
|
+
export function registerCodeSearchTools(server) {
|
|
29
|
+
server.registerTool('search_semantic', {
|
|
30
|
+
description: 'Semantic search over indexed code chunks. Embeds your query with voyage-code-3 and finds top matches by intent (not keyword). Returns file/lines/layer/preview.',
|
|
31
|
+
inputSchema: {
|
|
32
|
+
query: z.string().describe('Natural-language query (e.g. "tax calculation", "auth middleware")'),
|
|
33
|
+
layer: z.enum(LAYER_VALUES).optional(),
|
|
34
|
+
kind: z.enum(KIND_VALUES).optional(),
|
|
35
|
+
top_k: z.number().optional().describe('Default 10'),
|
|
36
|
+
project_id: z.string().optional(),
|
|
37
|
+
},
|
|
38
|
+
}, async ({ query, layer, kind, top_k: topK, project_id: projectIdInput }) => {
|
|
39
|
+
const ws = loadWorkspace();
|
|
40
|
+
if (!ws.ok) {
|
|
41
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
42
|
+
}
|
|
43
|
+
const adapters = await createCodeAdapters(ws.root);
|
|
44
|
+
if (!adapters) {
|
|
45
|
+
return errorResponse('Code intelligence not configured. Set NEO4J_URI, QDRANT_URL, VOYAGE_API_KEY in workspace .env');
|
|
46
|
+
}
|
|
47
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
48
|
+
if (!projectId) {
|
|
49
|
+
return errorResponse('Project not registered. Run `argustack code register --name <name>`.');
|
|
50
|
+
}
|
|
51
|
+
const useCase = new CodeSearchUseCase(adapters.graph, adapters.vec, adapters.embedding);
|
|
52
|
+
const input = { projectId, query };
|
|
53
|
+
if (layer) {
|
|
54
|
+
input.layer = layer;
|
|
55
|
+
}
|
|
56
|
+
if (kind) {
|
|
57
|
+
input.kind = kind;
|
|
58
|
+
}
|
|
59
|
+
if (topK !== undefined) {
|
|
60
|
+
input.topK = topK;
|
|
61
|
+
}
|
|
62
|
+
const hits = await useCase.searchSemantic(input);
|
|
63
|
+
if (hits.length === 0) {
|
|
64
|
+
return textResponse(`No semantic matches for "${query}".`);
|
|
65
|
+
}
|
|
66
|
+
return textResponse(`# Semantic matches for "${query}"\n\n${hits.map(formatHit).join('\n')}`);
|
|
67
|
+
});
|
|
68
|
+
server.registerTool('find_similar_code', {
|
|
69
|
+
description: 'Find code chunks semantically similar to a given symbol (by qualified name).',
|
|
70
|
+
inputSchema: {
|
|
71
|
+
qualified_name: z.string(),
|
|
72
|
+
top_k: z.number().optional(),
|
|
73
|
+
project_id: z.string().optional(),
|
|
74
|
+
},
|
|
75
|
+
}, async ({ qualified_name: qualifiedName, top_k: topK, project_id: projectIdInput }) => {
|
|
76
|
+
const ws = loadWorkspace();
|
|
77
|
+
if (!ws.ok) {
|
|
78
|
+
return errorResponse(`Workspace not found: ${ws.reason}`);
|
|
79
|
+
}
|
|
80
|
+
const adapters = await createCodeAdapters(ws.root);
|
|
81
|
+
if (!adapters) {
|
|
82
|
+
return errorResponse('Code intelligence not configured.');
|
|
83
|
+
}
|
|
84
|
+
const projectId = await resolveProjectId(adapters, projectIdInput);
|
|
85
|
+
if (!projectId) {
|
|
86
|
+
return errorResponse('Project not registered.');
|
|
87
|
+
}
|
|
88
|
+
const hits = await adapters.vec.findSimilar(projectId, qualifiedName, topK ?? 10);
|
|
89
|
+
if (hits.length === 0) {
|
|
90
|
+
return textResponse(`No similar chunks for ${qualifiedName}.`);
|
|
91
|
+
}
|
|
92
|
+
return textResponse(`# Similar to ${qualifiedName}\n\n${hits.map(formatHit).join('\n')}`);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=code-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-search.js","sourceRoot":"","sources":["../../../src/mcp/tools/code-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,7 +50,7 @@ export function registerWorkspaceTools(server) {
|
|
|
50
50
|
server.registerTool('switch_workspace', {
|
|
51
51
|
description: 'Switch active workspace. All subsequent queries will use the new workspace database and .env credentials. Use list_workspaces first to see available names. Related: list_workspaces, workspace_info.',
|
|
52
52
|
inputSchema: {
|
|
53
|
-
name: z.string().describe('Workspace name to switch to (e.g. "
|
|
53
|
+
name: z.string().describe('Workspace name to switch to (e.g. "myapp", "client-project")'),
|
|
54
54
|
},
|
|
55
55
|
}, async ({ name }) => {
|
|
56
56
|
const result = await switchWorkspace(name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/mcp/tools/workspace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACL,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EAAE,4NAA4N;KAC1O,EACD,GAAG,EAAE;QACH,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,aAAa,CAAC,gDAAgD,EAAE,CAAC,MAAM,2CAA2C,CAAC,CAAC;QAC7H,CAAC;QAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CACpE,CAAC;QAEF,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;YAC7B,CAAC,CAAC,wBAAwB,EAAE,CAAC,MAAM,CAAC,IAAI,WAAW;YACnD,CAAC,CAAC,8BAA8B,CAAC;QAEnC,MAAM,IAAI,GAAG;YACX,QAAQ;YACR,SAAS,EAAE,CAAC,IAAI,EAAE;YAClB,YAAY,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE;YACjC,EAAE;YACF,uBAAuB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;YACjD,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACtD,EAAE;YACF,iBAAiB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE;SAClF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EAAE,iKAAiK;KAC/K,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,aAAa,CAAC,wBAAwB,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,aAAa,CAAC,kDAAkD,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAChC,CAAC;YACF,OAAO,YAAY,CAAC,SAAS,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,OAAO,aAAa,CAAC,4BAA4B,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EAAE,uMAAuM;QACpN,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/mcp/tools/workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ICodeGraph } from '../core/ports/code-graph.js';
|
|
2
|
+
import type { ICodeVectorStore } from '../core/ports/code-vector-store.js';
|
|
3
|
+
import type { ICodeEmbedding } from '../core/ports/code-embedding.js';
|
|
4
|
+
import type { CodeSymbolKind, CodeLayer, PlanFeatureFilesResult } from '../core/types/code.js';
|
|
5
|
+
import { type RankerHit } from '../code-intel/ranker.js';
|
|
6
|
+
export interface SearchSemanticInput {
|
|
7
|
+
projectId: string;
|
|
8
|
+
query: string;
|
|
9
|
+
layer?: CodeLayer;
|
|
10
|
+
kind?: CodeSymbolKind;
|
|
11
|
+
topK?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ExplainFeatureInput {
|
|
14
|
+
projectId: string;
|
|
15
|
+
query: string;
|
|
16
|
+
topK?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface PlanFeatureFilesInput {
|
|
19
|
+
projectId: string;
|
|
20
|
+
description: string;
|
|
21
|
+
topKPerLayer?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class CodeSearchUseCase {
|
|
24
|
+
private readonly graph;
|
|
25
|
+
private readonly vec;
|
|
26
|
+
private readonly embedding;
|
|
27
|
+
private readonly ranker;
|
|
28
|
+
constructor(graph: ICodeGraph, vec: ICodeVectorStore, embedding: ICodeEmbedding);
|
|
29
|
+
searchSemantic(input: SearchSemanticInput): Promise<RankerHit[]>;
|
|
30
|
+
explainFeature(input: ExplainFeatureInput): Promise<{
|
|
31
|
+
byLayer: Record<CodeLayer | 'unclassified', RankerHit[]>;
|
|
32
|
+
expandedFiles: string[];
|
|
33
|
+
}>;
|
|
34
|
+
planFeatureFiles(input: PlanFeatureFilesInput): Promise<PlanFeatureFilesResult>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=code-search.d.ts.map
|