@vpxa/kb 0.1.1 → 0.1.2
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/package.json +1 -1
- package/packages/analyzers/dist/blast-radius-analyzer.js +13 -114
- package/packages/analyzers/dist/dependency-analyzer.js +11 -425
- package/packages/analyzers/dist/diagram-generator.js +4 -86
- package/packages/analyzers/dist/entry-point-analyzer.js +5 -239
- package/packages/analyzers/dist/index.js +1 -23
- package/packages/analyzers/dist/knowledge-producer.js +24 -113
- package/packages/analyzers/dist/pattern-analyzer.js +5 -359
- package/packages/analyzers/dist/regex-call-graph.js +1 -428
- package/packages/analyzers/dist/structure-analyzer.js +4 -258
- package/packages/analyzers/dist/symbol-analyzer.js +13 -442
- package/packages/analyzers/dist/ts-call-graph.js +1 -160
- package/packages/analyzers/dist/types.js +0 -1
- package/packages/chunker/dist/call-graph-extractor.js +1 -90
- package/packages/chunker/dist/chunker-factory.js +1 -36
- package/packages/chunker/dist/chunker.interface.js +0 -1
- package/packages/chunker/dist/code-chunker.js +14 -134
- package/packages/chunker/dist/generic-chunker.js +5 -72
- package/packages/chunker/dist/index.js +1 -21
- package/packages/chunker/dist/markdown-chunker.js +7 -119
- package/packages/chunker/dist/treesitter-chunker.js +8 -234
- package/packages/cli/dist/commands/analyze.js +3 -112
- package/packages/cli/dist/commands/context-cmds.js +1 -155
- package/packages/cli/dist/commands/environment.js +2 -204
- package/packages/cli/dist/commands/execution.js +1 -137
- package/packages/cli/dist/commands/graph.js +7 -81
- package/packages/cli/dist/commands/init.js +9 -87
- package/packages/cli/dist/commands/knowledge.js +1 -139
- package/packages/cli/dist/commands/search.js +8 -267
- package/packages/cli/dist/commands/system.js +4 -241
- package/packages/cli/dist/commands/workspace.js +2 -388
- package/packages/cli/dist/context.js +1 -14
- package/packages/cli/dist/helpers.js +3 -458
- package/packages/cli/dist/index.js +3 -69
- package/packages/cli/dist/kb-init.js +1 -82
- package/packages/cli/dist/types.js +0 -1
- package/packages/core/dist/constants.js +1 -43
- package/packages/core/dist/content-detector.js +1 -79
- package/packages/core/dist/errors.js +1 -40
- package/packages/core/dist/index.js +1 -9
- package/packages/core/dist/logger.js +1 -34
- package/packages/core/dist/types.js +0 -1
- package/packages/embeddings/dist/embedder.interface.js +0 -1
- package/packages/embeddings/dist/index.js +1 -5
- package/packages/embeddings/dist/onnx-embedder.js +1 -82
- package/packages/indexer/dist/file-hasher.js +1 -13
- package/packages/indexer/dist/filesystem-crawler.js +1 -125
- package/packages/indexer/dist/graph-extractor.js +1 -111
- package/packages/indexer/dist/incremental-indexer.js +1 -278
- package/packages/indexer/dist/index.js +1 -14
- package/packages/server/dist/api.js +1 -9
- package/packages/server/dist/config.js +1 -75
- package/packages/server/dist/curated-manager.js +9 -356
- package/packages/server/dist/index.js +1 -134
- package/packages/server/dist/replay-interceptor.js +1 -38
- package/packages/server/dist/resources/resources.js +2 -40
- package/packages/server/dist/server.js +1 -247
- package/packages/server/dist/tools/analyze.tools.js +1 -288
- package/packages/server/dist/tools/forge.tools.js +11 -499
- package/packages/server/dist/tools/forget.tool.js +3 -39
- package/packages/server/dist/tools/graph.tool.js +5 -110
- package/packages/server/dist/tools/list.tool.js +5 -53
- package/packages/server/dist/tools/lookup.tool.js +8 -51
- package/packages/server/dist/tools/onboard.tool.js +2 -112
- package/packages/server/dist/tools/produce.tool.js +4 -74
- package/packages/server/dist/tools/read.tool.js +4 -47
- package/packages/server/dist/tools/reindex.tool.js +2 -70
- package/packages/server/dist/tools/remember.tool.js +3 -42
- package/packages/server/dist/tools/replay.tool.js +6 -88
- package/packages/server/dist/tools/search.tool.js +17 -327
- package/packages/server/dist/tools/status.tool.js +3 -68
- package/packages/server/dist/tools/toolkit.tools.js +20 -1673
- package/packages/server/dist/tools/update.tool.js +3 -39
- package/packages/server/dist/tools/utility.tools.js +19 -456
- package/packages/store/dist/graph-store.interface.js +0 -1
- package/packages/store/dist/index.js +1 -9
- package/packages/store/dist/lance-store.js +1 -258
- package/packages/store/dist/sqlite-graph-store.js +8 -309
- package/packages/store/dist/store-factory.js +1 -14
- package/packages/store/dist/store.interface.js +0 -1
- package/packages/tools/dist/batch.js +1 -45
- package/packages/tools/dist/changelog.js +2 -112
- package/packages/tools/dist/check.js +2 -59
- package/packages/tools/dist/checkpoint.js +2 -43
- package/packages/tools/dist/codemod.js +2 -69
- package/packages/tools/dist/compact.js +3 -60
- package/packages/tools/dist/data-transform.js +1 -124
- package/packages/tools/dist/dead-symbols.js +2 -71
- package/packages/tools/dist/delegate.js +3 -128
- package/packages/tools/dist/diff-parse.js +3 -153
- package/packages/tools/dist/digest.js +7 -242
- package/packages/tools/dist/encode.js +1 -46
- package/packages/tools/dist/env-info.js +1 -58
- package/packages/tools/dist/eval.js +3 -79
- package/packages/tools/dist/evidence-map.js +3 -203
- package/packages/tools/dist/file-summary.js +2 -106
- package/packages/tools/dist/file-walk.js +1 -75
- package/packages/tools/dist/find-examples.js +3 -48
- package/packages/tools/dist/find.js +1 -120
- package/packages/tools/dist/forge-classify.js +2 -319
- package/packages/tools/dist/forge-ground.js +1 -184
- package/packages/tools/dist/git-context.js +3 -46
- package/packages/tools/dist/graph-query.js +1 -194
- package/packages/tools/dist/health.js +1 -118
- package/packages/tools/dist/http-request.js +1 -58
- package/packages/tools/dist/index.js +1 -273
- package/packages/tools/dist/lane.js +7 -227
- package/packages/tools/dist/measure.js +2 -119
- package/packages/tools/dist/onboard.js +42 -1136
- package/packages/tools/dist/parse-output.js +2 -158
- package/packages/tools/dist/process-manager.js +1 -69
- package/packages/tools/dist/queue.js +2 -126
- package/packages/tools/dist/regex-test.js +1 -39
- package/packages/tools/dist/rename.js +2 -70
- package/packages/tools/dist/replay.js +6 -108
- package/packages/tools/dist/schema-validate.js +1 -141
- package/packages/tools/dist/scope-map.js +1 -72
- package/packages/tools/dist/snippet.js +1 -80
- package/packages/tools/dist/stash.js +2 -60
- package/packages/tools/dist/stratum-card.js +5 -238
- package/packages/tools/dist/symbol.js +3 -87
- package/packages/tools/dist/test-run.js +2 -55
- package/packages/tools/dist/text-utils.js +2 -31
- package/packages/tools/dist/time-utils.js +1 -135
- package/packages/tools/dist/trace.js +2 -114
- package/packages/tools/dist/truncation.js +10 -41
- package/packages/tools/dist/watch.js +1 -61
- package/packages/tools/dist/web-fetch.js +9 -244
- package/packages/tools/dist/web-search.js +1 -46
- package/packages/tools/dist/workset.js +2 -77
- package/packages/tui/dist/App.js +260 -52468
- package/packages/tui/dist/index.js +286 -54551
- package/packages/tui/dist/panels/CuratedPanel.js +211 -34291
- package/packages/tui/dist/panels/LogPanel.js +259 -51703
- package/packages/tui/dist/panels/SearchPanel.js +212 -34824
- package/packages/tui/dist/panels/StatusPanel.js +211 -34304
|
@@ -1,247 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { OnnxEmbedder } from "@kb/embeddings";
|
|
3
|
-
import { IncrementalIndexer } from "@kb/indexer";
|
|
4
|
-
import { createStore, SqliteGraphStore } from "@kb/store";
|
|
5
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
-
import { CuratedKnowledgeManager } from "./curated-manager.js";
|
|
7
|
-
import { installReplayInterceptor } from "./replay-interceptor.js";
|
|
8
|
-
import { registerResources } from "./resources/resources.js";
|
|
9
|
-
import {
|
|
10
|
-
registerAnalyzeDependenciesTool,
|
|
11
|
-
registerAnalyzeDiagramTool,
|
|
12
|
-
registerAnalyzeEntryPointsTool,
|
|
13
|
-
registerAnalyzePatternsTool,
|
|
14
|
-
registerAnalyzeStructureTool,
|
|
15
|
-
registerAnalyzeSymbolsTool,
|
|
16
|
-
registerBlastRadiusTool
|
|
17
|
-
} from "./tools/analyze.tools.js";
|
|
18
|
-
import {
|
|
19
|
-
registerDigestTool,
|
|
20
|
-
registerEvidenceMapTool,
|
|
21
|
-
registerForgeClassifyTool,
|
|
22
|
-
registerForgeGroundTool,
|
|
23
|
-
registerStratumCardTool
|
|
24
|
-
} from "./tools/forge.tools.js";
|
|
25
|
-
import { registerForgetTool } from "./tools/forget.tool.js";
|
|
26
|
-
import { registerGraphTool } from "./tools/graph.tool.js";
|
|
27
|
-
import { registerListTool } from "./tools/list.tool.js";
|
|
28
|
-
import { registerLookupTool } from "./tools/lookup.tool.js";
|
|
29
|
-
import { registerOnboardTool } from "./tools/onboard.tool.js";
|
|
30
|
-
import { registerProduceKnowledgeTool } from "./tools/produce.tool.js";
|
|
31
|
-
import { registerReadTool } from "./tools/read.tool.js";
|
|
32
|
-
import { registerReindexTool } from "./tools/reindex.tool.js";
|
|
33
|
-
import { registerRememberTool } from "./tools/remember.tool.js";
|
|
34
|
-
import { registerReplayTool } from "./tools/replay.tool.js";
|
|
35
|
-
import { registerSearchTool } from "./tools/search.tool.js";
|
|
36
|
-
import { registerStatusTool } from "./tools/status.tool.js";
|
|
37
|
-
import {
|
|
38
|
-
registerBatchTool,
|
|
39
|
-
registerCheckpointTool,
|
|
40
|
-
registerCheckTool,
|
|
41
|
-
registerCodemodTool,
|
|
42
|
-
registerCompactTool,
|
|
43
|
-
registerDataTransformTool,
|
|
44
|
-
registerDeadSymbolsTool,
|
|
45
|
-
registerDelegateTool,
|
|
46
|
-
registerDiffParseTool,
|
|
47
|
-
registerEvalTool,
|
|
48
|
-
registerFileSummaryTool,
|
|
49
|
-
registerFindExamplesTool,
|
|
50
|
-
registerFindTool,
|
|
51
|
-
registerGitContextTool,
|
|
52
|
-
registerHealthTool,
|
|
53
|
-
registerLaneTool,
|
|
54
|
-
registerParseOutputTool,
|
|
55
|
-
registerProcessTool,
|
|
56
|
-
registerQueueTool,
|
|
57
|
-
registerRenameTool,
|
|
58
|
-
registerScopeMapTool,
|
|
59
|
-
registerStashTool,
|
|
60
|
-
registerSymbolTool,
|
|
61
|
-
registerTestRunTool,
|
|
62
|
-
registerTraceTool,
|
|
63
|
-
registerWatchTool,
|
|
64
|
-
registerWebFetchTool,
|
|
65
|
-
registerWorksetTool
|
|
66
|
-
} from "./tools/toolkit.tools.js";
|
|
67
|
-
import { registerUpdateTool } from "./tools/update.tool.js";
|
|
68
|
-
import {
|
|
69
|
-
registerChangelogTool,
|
|
70
|
-
registerEncodeTool,
|
|
71
|
-
registerEnvTool,
|
|
72
|
-
registerHttpTool,
|
|
73
|
-
registerMeasureTool,
|
|
74
|
-
registerRegexTestTool,
|
|
75
|
-
registerSchemaValidateTool,
|
|
76
|
-
registerSnippetTool,
|
|
77
|
-
registerTimeTool,
|
|
78
|
-
registerWebSearchTool
|
|
79
|
-
} from "./tools/utility.tools.js";
|
|
80
|
-
async function initializeKnowledgeBase(config) {
|
|
81
|
-
console.error("[KB] Initializing knowledge base components...");
|
|
82
|
-
const embedder = new OnnxEmbedder({
|
|
83
|
-
model: config.embedding.model,
|
|
84
|
-
dimensions: config.embedding.dimensions
|
|
85
|
-
});
|
|
86
|
-
await embedder.initialize();
|
|
87
|
-
console.error(`[KB] Embedder loaded: ${embedder.modelId} (${embedder.dimensions}d)`);
|
|
88
|
-
const store = await createStore({
|
|
89
|
-
backend: config.store.backend,
|
|
90
|
-
path: config.store.path
|
|
91
|
-
});
|
|
92
|
-
await store.initialize();
|
|
93
|
-
console.error("[KB] Store initialized");
|
|
94
|
-
const indexer = new IncrementalIndexer(embedder, store);
|
|
95
|
-
const curatedDir = config.curated.path;
|
|
96
|
-
const curated = new CuratedKnowledgeManager(curatedDir, store, embedder);
|
|
97
|
-
const graphStore = new SqliteGraphStore({ path: config.store.path });
|
|
98
|
-
await graphStore.initialize();
|
|
99
|
-
console.error("[KB] Graph store initialized");
|
|
100
|
-
indexer.setGraphStore(graphStore);
|
|
101
|
-
const treeSitterAvailable = await initializeTreeSitter();
|
|
102
|
-
if (treeSitterAvailable) {
|
|
103
|
-
console.error("[KB] Tree-sitter chunking enabled");
|
|
104
|
-
} else {
|
|
105
|
-
console.error("[KB] Tree-sitter not available \u2014 using regex-based code chunking");
|
|
106
|
-
}
|
|
107
|
-
return { embedder, store, indexer, curated, graphStore };
|
|
108
|
-
}
|
|
109
|
-
function createMcpServer(kb, config) {
|
|
110
|
-
const server = new McpServer({
|
|
111
|
-
name: "kb",
|
|
112
|
-
version: "0.1.0"
|
|
113
|
-
});
|
|
114
|
-
installReplayInterceptor(server);
|
|
115
|
-
registerSearchTool(server, kb.embedder, kb.store, kb.graphStore);
|
|
116
|
-
registerLookupTool(server, kb.store);
|
|
117
|
-
registerStatusTool(server, kb.store, kb.graphStore);
|
|
118
|
-
registerReindexTool(server, kb.indexer, config, kb.curated, kb.store);
|
|
119
|
-
registerRememberTool(server, kb.curated);
|
|
120
|
-
registerUpdateTool(server, kb.curated);
|
|
121
|
-
registerForgetTool(server, kb.curated);
|
|
122
|
-
registerReadTool(server, kb.curated);
|
|
123
|
-
registerListTool(server, kb.curated);
|
|
124
|
-
registerAnalyzeStructureTool(server, kb.store, kb.embedder);
|
|
125
|
-
registerAnalyzeDependenciesTool(server, kb.store, kb.embedder);
|
|
126
|
-
registerAnalyzeSymbolsTool(server, kb.store, kb.embedder);
|
|
127
|
-
registerAnalyzePatternsTool(server, kb.store, kb.embedder);
|
|
128
|
-
registerAnalyzeEntryPointsTool(server, kb.store, kb.embedder);
|
|
129
|
-
registerAnalyzeDiagramTool(server, kb.store, kb.embedder);
|
|
130
|
-
registerBlastRadiusTool(server, kb.store, kb.embedder);
|
|
131
|
-
registerProduceKnowledgeTool(server);
|
|
132
|
-
registerOnboardTool(server, kb.store, kb.embedder);
|
|
133
|
-
registerGraphTool(server, kb.graphStore);
|
|
134
|
-
registerCompactTool(server, kb.embedder);
|
|
135
|
-
registerScopeMapTool(server, kb.embedder, kb.store);
|
|
136
|
-
registerFindTool(server, kb.embedder, kb.store);
|
|
137
|
-
registerParseOutputTool(server);
|
|
138
|
-
registerWorksetTool(server);
|
|
139
|
-
registerCheckTool(server);
|
|
140
|
-
registerBatchTool(server, kb.embedder, kb.store);
|
|
141
|
-
registerSymbolTool(server, kb.embedder, kb.store);
|
|
142
|
-
registerEvalTool(server);
|
|
143
|
-
registerTestRunTool(server);
|
|
144
|
-
registerStashTool(server);
|
|
145
|
-
registerGitContextTool(server);
|
|
146
|
-
registerDiffParseTool(server);
|
|
147
|
-
registerRenameTool(server);
|
|
148
|
-
registerCodemodTool(server);
|
|
149
|
-
registerFileSummaryTool(server);
|
|
150
|
-
registerCheckpointTool(server);
|
|
151
|
-
registerDataTransformTool(server);
|
|
152
|
-
registerTraceTool(server, kb.embedder, kb.store);
|
|
153
|
-
registerFindExamplesTool(server, kb.embedder, kb.store);
|
|
154
|
-
registerProcessTool(server);
|
|
155
|
-
registerWatchTool(server);
|
|
156
|
-
registerDeadSymbolsTool(server, kb.embedder, kb.store);
|
|
157
|
-
registerDelegateTool(server);
|
|
158
|
-
registerHealthTool(server);
|
|
159
|
-
registerLaneTool(server);
|
|
160
|
-
registerQueueTool(server);
|
|
161
|
-
registerWebFetchTool(server);
|
|
162
|
-
registerEvidenceMapTool(server);
|
|
163
|
-
registerDigestTool(server, kb.embedder);
|
|
164
|
-
registerForgeClassifyTool(server);
|
|
165
|
-
registerStratumCardTool(server, kb.embedder);
|
|
166
|
-
registerForgeGroundTool(server, kb.embedder, kb.store);
|
|
167
|
-
registerWebSearchTool(server);
|
|
168
|
-
registerHttpTool(server);
|
|
169
|
-
registerRegexTestTool(server);
|
|
170
|
-
registerEncodeTool(server);
|
|
171
|
-
registerMeasureTool(server);
|
|
172
|
-
registerChangelogTool(server);
|
|
173
|
-
registerSchemaValidateTool(server);
|
|
174
|
-
registerSnippetTool(server);
|
|
175
|
-
registerEnvTool(server);
|
|
176
|
-
registerTimeTool(server);
|
|
177
|
-
registerResources(server, kb.store);
|
|
178
|
-
registerReplayTool(server);
|
|
179
|
-
return server;
|
|
180
|
-
}
|
|
181
|
-
async function createServer(config) {
|
|
182
|
-
const kb = await initializeKnowledgeBase(config);
|
|
183
|
-
const server = createMcpServer(kb, config);
|
|
184
|
-
console.error("[KB] MCP server configured with 64 tools and 2 resources");
|
|
185
|
-
const runInitialIndex = async () => {
|
|
186
|
-
try {
|
|
187
|
-
const sourcePaths = config.sources.map((s) => s.path).join(", ");
|
|
188
|
-
console.error(`[KB] Running initial index for sources: ${sourcePaths}`);
|
|
189
|
-
const result = await kb.indexer.index(config, (p) => {
|
|
190
|
-
if (p.phase === "crawling" || p.phase === "done") return;
|
|
191
|
-
if (p.phase === "chunking" && p.currentFile) {
|
|
192
|
-
console.error(`[KB] [${p.filesProcessed + 1}/${p.filesTotal}] ${p.currentFile}`);
|
|
193
|
-
}
|
|
194
|
-
if (p.phase === "cleanup") {
|
|
195
|
-
console.error(
|
|
196
|
-
`[KB] cleanup: removing ${p.filesTotal - p.filesProcessed} stale entries`
|
|
197
|
-
);
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
console.error(
|
|
201
|
-
`[KB] Indexed ${result.filesProcessed} files (${result.filesSkipped} skipped, ${result.chunksCreated} chunks) in ${(result.durationMs / 1e3).toFixed(1)}s`
|
|
202
|
-
);
|
|
203
|
-
try {
|
|
204
|
-
await kb.store.createFtsIndex();
|
|
205
|
-
} catch (ftsErr) {
|
|
206
|
-
console.error("[KB] FTS index creation failed (non-fatal):", ftsErr);
|
|
207
|
-
}
|
|
208
|
-
try {
|
|
209
|
-
const curatedResult = await kb.curated.reindexAll();
|
|
210
|
-
console.error(
|
|
211
|
-
`[KB] Curated re-index: ${curatedResult.indexed} entries restored to vector store`
|
|
212
|
-
);
|
|
213
|
-
} catch (curatedErr) {
|
|
214
|
-
console.error("[KB] Curated re-index failed:", curatedErr);
|
|
215
|
-
}
|
|
216
|
-
} catch (err) {
|
|
217
|
-
console.error("[KB] Initial index failed (will retry on kb_reindex):", err);
|
|
218
|
-
}
|
|
219
|
-
};
|
|
220
|
-
const shutdown = async () => {
|
|
221
|
-
console.error("[KB] Shutting down...");
|
|
222
|
-
await kb.graphStore.close().catch(() => {
|
|
223
|
-
});
|
|
224
|
-
await kb.store.close();
|
|
225
|
-
process.exit(0);
|
|
226
|
-
};
|
|
227
|
-
process.on("SIGINT", shutdown);
|
|
228
|
-
process.on("SIGTERM", shutdown);
|
|
229
|
-
const originalPpid = process.ppid;
|
|
230
|
-
const ppidCheck = setInterval(() => {
|
|
231
|
-
try {
|
|
232
|
-
process.kill(originalPpid, 0);
|
|
233
|
-
} catch {
|
|
234
|
-
console.error("[KB] Parent process died \u2014 orphan detected, shutting down...");
|
|
235
|
-
clearInterval(ppidCheck);
|
|
236
|
-
shutdown();
|
|
237
|
-
}
|
|
238
|
-
}, 5e3);
|
|
239
|
-
ppidCheck.unref();
|
|
240
|
-
return { server, runInitialIndex };
|
|
241
|
-
}
|
|
242
|
-
export {
|
|
243
|
-
createMcpServer,
|
|
244
|
-
createServer,
|
|
245
|
-
initializeKnowledgeBase
|
|
246
|
-
};
|
|
247
|
-
//# sourceMappingURL=server.js.map
|
|
1
|
+
import{initializeTreeSitter as c}from"@kb/chunker";import{OnnxEmbedder as m}from"@kb/embeddings";import{IncrementalIndexer as g}from"@kb/indexer";import{createStore as p,SqliteGraphStore as T}from"@kb/store";import{McpServer as u}from"@modelcontextprotocol/sdk/server/mcp.js";import{CuratedKnowledgeManager as f}from"./curated-manager.js";import{installReplayInterceptor as h}from"./replay-interceptor.js";import{registerResources as S}from"./resources/resources.js";import{registerAnalyzeDependenciesTool as x,registerAnalyzeDiagramTool as w,registerAnalyzeEntryPointsTool as K,registerAnalyzePatternsTool as y,registerAnalyzeStructureTool as B,registerAnalyzeSymbolsTool as C,registerBlastRadiusTool as I}from"./tools/analyze.tools.js";import{registerDigestTool as v,registerEvidenceMapTool as P,registerForgeClassifyTool as z,registerForgeGroundTool as R,registerStratumCardTool as E}from"./tools/forge.tools.js";import{registerForgetTool as F}from"./tools/forget.tool.js";import{registerGraphTool as M}from"./tools/graph.tool.js";import{registerListTool as $}from"./tools/list.tool.js";import{registerLookupTool as G}from"./tools/lookup.tool.js";import{registerOnboardTool as A}from"./tools/onboard.tool.js";import{registerProduceKnowledgeTool as D}from"./tools/produce.tool.js";import{registerReadTool as O}from"./tools/read.tool.js";import{registerReindexTool as W}from"./tools/reindex.tool.js";import{registerRememberTool as L}from"./tools/remember.tool.js";import{registerReplayTool as H}from"./tools/replay.tool.js";import{registerSearchTool as j}from"./tools/search.tool.js";import{registerStatusTool as q}from"./tools/status.tool.js";import{registerBatchTool as N,registerCheckpointTool as Q,registerCheckTool as U,registerCodemodTool as V,registerCompactTool as _,registerDataTransformTool as J,registerDeadSymbolsTool as X,registerDelegateTool as Y,registerDiffParseTool as Z,registerEvalTool as b,registerFileSummaryTool as k,registerFindExamplesTool as ee,registerFindTool as re,registerGitContextTool as oe,registerHealthTool as te,registerLaneTool as se,registerParseOutputTool as ie,registerProcessTool as ne,registerQueueTool as ae,registerRenameTool as le,registerScopeMapTool as de,registerStashTool as ce,registerSymbolTool as me,registerTestRunTool as ge,registerTraceTool as pe,registerWatchTool as Te,registerWebFetchTool as ue,registerWorksetTool as fe}from"./tools/toolkit.tools.js";import{registerUpdateTool as he}from"./tools/update.tool.js";import{registerChangelogTool as Se,registerEncodeTool as xe,registerEnvTool as we,registerHttpTool as Ke,registerMeasureTool as ye,registerRegexTestTool as Be,registerSchemaValidateTool as Ce,registerSnippetTool as Ie,registerTimeTool as ve,registerWebSearchTool as Pe}from"./tools/utility.tools.js";async function ze(r){console.error("[KB] Initializing knowledge base components...");const t=new m({model:r.embedding.model,dimensions:r.embedding.dimensions});await t.initialize(),console.error(`[KB] Embedder loaded: ${t.modelId} (${t.dimensions}d)`);const e=await p({backend:r.store.backend,path:r.store.path});await e.initialize(),console.error("[KB] Store initialized");const a=new g(t,e),i=r.curated.path,d=new f(i,e,t),s=new T({path:r.store.path});await s.initialize(),console.error("[KB] Graph store initialized"),a.setGraphStore(s);const n=await c();return console.error(n?"[KB] Tree-sitter chunking enabled":"[KB] Tree-sitter not available \u2014 using regex-based code chunking"),{embedder:t,store:e,indexer:a,curated:d,graphStore:s}}function Re(r,t){const e=new u({name:"kb",version:"0.1.0"});return h(e),j(e,r.embedder,r.store,r.graphStore),G(e,r.store),q(e,r.store,r.graphStore),W(e,r.indexer,t,r.curated,r.store),L(e,r.curated),he(e,r.curated),F(e,r.curated),O(e,r.curated),$(e,r.curated),B(e,r.store,r.embedder),x(e,r.store,r.embedder),C(e,r.store,r.embedder),y(e,r.store,r.embedder),K(e,r.store,r.embedder),w(e,r.store,r.embedder),I(e,r.store,r.embedder),D(e),A(e,r.store,r.embedder),M(e,r.graphStore),_(e,r.embedder),de(e,r.embedder,r.store),re(e,r.embedder,r.store),ie(e),fe(e),U(e),N(e,r.embedder,r.store),me(e,r.embedder,r.store),b(e),ge(e),ce(e),oe(e),Z(e),le(e),V(e),k(e),Q(e),J(e),pe(e,r.embedder,r.store),ee(e,r.embedder,r.store),ne(e),Te(e),X(e,r.embedder,r.store),Y(e),te(e),se(e),ae(e),ue(e),P(e),v(e,r.embedder),z(e),E(e,r.embedder),R(e,r.embedder,r.store),Pe(e),Ke(e),Be(e),xe(e),ye(e),Se(e),Ce(e),Ie(e),we(e),ve(e),S(e,r.store),H(e),e}async function rr(r){const t=await ze(r),e=Re(t,r);console.error("[KB] MCP server configured with 64 tools and 2 resources");const a=async()=>{try{const n=r.sources.map(o=>o.path).join(", ");console.error(`[KB] Running initial index for sources: ${n}`);const l=await t.indexer.index(r,o=>{o.phase==="crawling"||o.phase==="done"||(o.phase==="chunking"&&o.currentFile&&console.error(`[KB] [${o.filesProcessed+1}/${o.filesTotal}] ${o.currentFile}`),o.phase==="cleanup"&&console.error(`[KB] cleanup: removing ${o.filesTotal-o.filesProcessed} stale entries`))});console.error(`[KB] Indexed ${l.filesProcessed} files (${l.filesSkipped} skipped, ${l.chunksCreated} chunks) in ${(l.durationMs/1e3).toFixed(1)}s`);try{await t.store.createFtsIndex()}catch(o){console.error("[KB] FTS index creation failed (non-fatal):",o)}try{const o=await t.curated.reindexAll();console.error(`[KB] Curated re-index: ${o.indexed} entries restored to vector store`)}catch(o){console.error("[KB] Curated re-index failed:",o)}}catch(n){console.error("[KB] Initial index failed (will retry on kb_reindex):",n)}},i=async()=>{console.error("[KB] Shutting down..."),await t.graphStore.close().catch(()=>{}),await t.store.close(),process.exit(0)};process.on("SIGINT",i),process.on("SIGTERM",i);const d=process.ppid,s=setInterval(()=>{try{process.kill(d,0)}catch{console.error("[KB] Parent process died \u2014 orphan detected, shutting down..."),clearInterval(s),i()}},5e3);return s.unref(),{server:e,runInitialIndex:a}}export{Re as createMcpServer,rr as createServer,ze as initializeKnowledgeBase};
|
|
@@ -1,288 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
BlastRadiusAnalyzer,
|
|
4
|
-
DependencyAnalyzer,
|
|
5
|
-
DiagramGenerator,
|
|
6
|
-
EntryPointAnalyzer,
|
|
7
|
-
PatternAnalyzer,
|
|
8
|
-
StructureAnalyzer,
|
|
9
|
-
SymbolAnalyzer
|
|
10
|
-
} from "@kb/analyzers";
|
|
11
|
-
import { z } from "zod";
|
|
12
|
-
async function persistAnalysisResult(store, embedder, analyzerName, rootPath, output) {
|
|
13
|
-
try {
|
|
14
|
-
const pathHash = createHash("sha256").update(rootPath).digest("hex").slice(0, 12);
|
|
15
|
-
const sourcePath = `produced/analysis/${analyzerName}/${pathHash}.md`;
|
|
16
|
-
const contentHash = createHash("sha256").update(output).digest("hex").slice(0, 16);
|
|
17
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
18
|
-
const sections = output.length > 2e3 ? output.split(/(?=^## )/m).filter((s) => s.trim().length > 0) : [output];
|
|
19
|
-
const records = sections.map((text, i) => ({
|
|
20
|
-
id: createHash("sha256").update(`${sourcePath}::${i}`).digest("hex").slice(0, 16),
|
|
21
|
-
content: text.trim(),
|
|
22
|
-
sourcePath,
|
|
23
|
-
contentType: "produced-knowledge",
|
|
24
|
-
chunkIndex: i,
|
|
25
|
-
totalChunks: sections.length,
|
|
26
|
-
startLine: 0,
|
|
27
|
-
endLine: 0,
|
|
28
|
-
fileHash: contentHash,
|
|
29
|
-
indexedAt: now,
|
|
30
|
-
origin: "produced",
|
|
31
|
-
tags: ["analysis", analyzerName],
|
|
32
|
-
category: "analysis",
|
|
33
|
-
version: 1
|
|
34
|
-
}));
|
|
35
|
-
const vectors = await embedder.embedBatch(records.map((r) => r.content));
|
|
36
|
-
await store.upsert(records, vectors);
|
|
37
|
-
console.error(`[KB] Auto-persisted ${analyzerName} analysis (${records.length} chunks)`);
|
|
38
|
-
} catch (err) {
|
|
39
|
-
console.error(`[KB] Auto-persist ${analyzerName} failed:`, err);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function registerAnalyzeStructureTool(server, store, embedder) {
|
|
43
|
-
const analyzer = new StructureAnalyzer();
|
|
44
|
-
server.registerTool(
|
|
45
|
-
"analyze_structure",
|
|
46
|
-
{
|
|
47
|
-
description: "Analyze the file/directory structure of a codebase. Returns an annotated tree with language stats.",
|
|
48
|
-
inputSchema: {
|
|
49
|
-
path: z.string().describe("Root path to analyze"),
|
|
50
|
-
max_depth: z.number().min(1).max(10).default(6).describe("Maximum directory depth"),
|
|
51
|
-
format: z.enum(["json", "markdown"]).default("markdown").describe("Output format")
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
async ({ path, max_depth, format }) => {
|
|
55
|
-
try {
|
|
56
|
-
const result = await analyzer.analyze(path, { format, maxDepth: max_depth });
|
|
57
|
-
persistAnalysisResult(store, embedder, "structure", path, result.output);
|
|
58
|
-
return {
|
|
59
|
-
content: [
|
|
60
|
-
{
|
|
61
|
-
type: "text",
|
|
62
|
-
text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` for import graphs, or `analyze_patterns` to detect architecture patterns._"
|
|
63
|
-
}
|
|
64
|
-
]
|
|
65
|
-
};
|
|
66
|
-
} catch (err) {
|
|
67
|
-
return {
|
|
68
|
-
content: [{ type: "text", text: `Analysis failed: ${err.message}` }],
|
|
69
|
-
isError: true
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
function registerAnalyzeDependenciesTool(server, store, embedder) {
|
|
76
|
-
const analyzer = new DependencyAnalyzer();
|
|
77
|
-
server.registerTool(
|
|
78
|
-
"analyze_dependencies",
|
|
79
|
-
{
|
|
80
|
-
description: "Analyze import/require dependencies across a codebase. Shows external packages and internal module graph.",
|
|
81
|
-
inputSchema: {
|
|
82
|
-
path: z.string().describe("Root path to analyze"),
|
|
83
|
-
format: z.enum(["json", "markdown", "mermaid"]).default("markdown").describe("Output format")
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
async ({ path, format }) => {
|
|
87
|
-
try {
|
|
88
|
-
const result = await analyzer.analyze(path, { format });
|
|
89
|
-
persistAnalysisResult(store, embedder, "dependencies", path, result.output);
|
|
90
|
-
return {
|
|
91
|
-
content: [
|
|
92
|
-
{
|
|
93
|
-
type: "text",
|
|
94
|
-
text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_symbols` to explore exported symbols, or `analyze_diagram` for visual representation._"
|
|
95
|
-
}
|
|
96
|
-
]
|
|
97
|
-
};
|
|
98
|
-
} catch (err) {
|
|
99
|
-
return {
|
|
100
|
-
content: [{ type: "text", text: `Analysis failed: ${err.message}` }],
|
|
101
|
-
isError: true
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
function registerAnalyzeSymbolsTool(server, store, embedder) {
|
|
108
|
-
const analyzer = new SymbolAnalyzer();
|
|
109
|
-
server.registerTool(
|
|
110
|
-
"analyze_symbols",
|
|
111
|
-
{
|
|
112
|
-
description: "Extract exported and local symbols (functions, classes, interfaces, types, constants) from a codebase.",
|
|
113
|
-
inputSchema: {
|
|
114
|
-
path: z.string().describe("Root path to analyze"),
|
|
115
|
-
filter: z.string().optional().describe("Filter symbols by name substring"),
|
|
116
|
-
format: z.enum(["json", "markdown"]).default("markdown").describe("Output format")
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
async ({ path, filter, format }) => {
|
|
120
|
-
try {
|
|
121
|
-
const result = await analyzer.analyze(path, { format, filter });
|
|
122
|
-
persistAnalysisResult(store, embedder, "symbols", path, result.output);
|
|
123
|
-
return {
|
|
124
|
-
content: [
|
|
125
|
-
{
|
|
126
|
-
type: "text",
|
|
127
|
-
text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see import relationships, or `search` to find usage patterns._"
|
|
128
|
-
}
|
|
129
|
-
]
|
|
130
|
-
};
|
|
131
|
-
} catch (err) {
|
|
132
|
-
return {
|
|
133
|
-
content: [{ type: "text", text: `Analysis failed: ${err.message}` }],
|
|
134
|
-
isError: true
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
function registerAnalyzePatternsTool(server, store, embedder) {
|
|
141
|
-
const analyzer = new PatternAnalyzer();
|
|
142
|
-
server.registerTool(
|
|
143
|
-
"analyze_patterns",
|
|
144
|
-
{
|
|
145
|
-
description: "Detect architectural patterns, frameworks, and conventions in a codebase using directory structure and code heuristics.",
|
|
146
|
-
inputSchema: {
|
|
147
|
-
path: z.string().describe("Root path to analyze")
|
|
148
|
-
}
|
|
149
|
-
},
|
|
150
|
-
async ({ path }) => {
|
|
151
|
-
try {
|
|
152
|
-
const result = await analyzer.analyze(path);
|
|
153
|
-
persistAnalysisResult(store, embedder, "patterns", path, result.output);
|
|
154
|
-
return {
|
|
155
|
-
content: [
|
|
156
|
-
{
|
|
157
|
-
type: "text",
|
|
158
|
-
text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_entry_points` to find Lambda handlers and main exports, or `produce_knowledge` for full analysis._"
|
|
159
|
-
}
|
|
160
|
-
]
|
|
161
|
-
};
|
|
162
|
-
} catch (err) {
|
|
163
|
-
return {
|
|
164
|
-
content: [{ type: "text", text: `Analysis failed: ${err.message}` }],
|
|
165
|
-
isError: true
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
function registerAnalyzeEntryPointsTool(server, store, embedder) {
|
|
172
|
-
const analyzer = new EntryPointAnalyzer();
|
|
173
|
-
server.registerTool(
|
|
174
|
-
"analyze_entry_points",
|
|
175
|
-
{
|
|
176
|
-
description: "Find entry points: Lambda handlers, main exports, CLI bins, and server start scripts.",
|
|
177
|
-
inputSchema: {
|
|
178
|
-
path: z.string().describe("Root path to analyze")
|
|
179
|
-
}
|
|
180
|
-
},
|
|
181
|
-
async ({ path }) => {
|
|
182
|
-
try {
|
|
183
|
-
const result = await analyzer.analyze(path);
|
|
184
|
-
persistAnalysisResult(store, embedder, "entry-points", path, result.output);
|
|
185
|
-
return {
|
|
186
|
-
content: [
|
|
187
|
-
{
|
|
188
|
-
type: "text",
|
|
189
|
-
text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see what each entry point imports, or `produce_knowledge` for comprehensive analysis._"
|
|
190
|
-
}
|
|
191
|
-
]
|
|
192
|
-
};
|
|
193
|
-
} catch (err) {
|
|
194
|
-
return {
|
|
195
|
-
content: [{ type: "text", text: `Analysis failed: ${err.message}` }],
|
|
196
|
-
isError: true
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
function registerAnalyzeDiagramTool(server, store, embedder) {
|
|
203
|
-
const generator = new DiagramGenerator();
|
|
204
|
-
server.registerTool(
|
|
205
|
-
"analyze_diagram",
|
|
206
|
-
{
|
|
207
|
-
description: "Generate a Mermaid diagram of the codebase architecture or dependency graph.",
|
|
208
|
-
inputSchema: {
|
|
209
|
-
path: z.string().describe("Root path to analyze"),
|
|
210
|
-
diagram_type: z.enum(["architecture", "dependencies"]).default("architecture").describe("Type of diagram")
|
|
211
|
-
}
|
|
212
|
-
},
|
|
213
|
-
async ({ path, diagram_type }) => {
|
|
214
|
-
try {
|
|
215
|
-
const result = await generator.analyze(path, { diagramType: diagram_type });
|
|
216
|
-
persistAnalysisResult(store, embedder, "diagram", path, result.output);
|
|
217
|
-
return {
|
|
218
|
-
content: [
|
|
219
|
-
{
|
|
220
|
-
type: "text",
|
|
221
|
-
text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_structure` for detailed file tree, or `produce_knowledge` for comprehensive analysis._"
|
|
222
|
-
}
|
|
223
|
-
]
|
|
224
|
-
};
|
|
225
|
-
} catch (err) {
|
|
226
|
-
return {
|
|
227
|
-
content: [
|
|
228
|
-
{ type: "text", text: `Diagram generation failed: ${err.message}` }
|
|
229
|
-
],
|
|
230
|
-
isError: true
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
function registerBlastRadiusTool(server, store, embedder) {
|
|
237
|
-
const analyzer = new BlastRadiusAnalyzer();
|
|
238
|
-
server.registerTool(
|
|
239
|
-
"blast_radius",
|
|
240
|
-
{
|
|
241
|
-
description: "Given a list of changed files, trace the dependency graph to find all affected files (direct + transitive importers) and their tests. Useful for scoping code reviews and impact analysis.",
|
|
242
|
-
inputSchema: {
|
|
243
|
-
path: z.string().describe("Root path of the codebase"),
|
|
244
|
-
files: z.array(z.string()).min(1).describe("Changed file paths (relative to root)"),
|
|
245
|
-
max_depth: z.number().min(1).max(20).default(5).describe("Maximum transitive dependency depth"),
|
|
246
|
-
format: z.enum(["json", "markdown"]).default("markdown").describe("Output format")
|
|
247
|
-
}
|
|
248
|
-
},
|
|
249
|
-
async ({ path, files, max_depth, format }) => {
|
|
250
|
-
try {
|
|
251
|
-
const result = await analyzer.analyze(path, {
|
|
252
|
-
files,
|
|
253
|
-
maxDepth: max_depth,
|
|
254
|
-
format
|
|
255
|
-
});
|
|
256
|
-
persistAnalysisResult(store, embedder, "blast-radius", path, result.output);
|
|
257
|
-
return {
|
|
258
|
-
content: [
|
|
259
|
-
{
|
|
260
|
-
type: "text",
|
|
261
|
-
text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see the full import graph, or `analyze_symbols` to inspect affected exports._"
|
|
262
|
-
}
|
|
263
|
-
]
|
|
264
|
-
};
|
|
265
|
-
} catch (err) {
|
|
266
|
-
return {
|
|
267
|
-
content: [
|
|
268
|
-
{
|
|
269
|
-
type: "text",
|
|
270
|
-
text: `Blast radius analysis failed: ${err.message}`
|
|
271
|
-
}
|
|
272
|
-
],
|
|
273
|
-
isError: true
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
);
|
|
278
|
-
}
|
|
279
|
-
export {
|
|
280
|
-
registerAnalyzeDependenciesTool,
|
|
281
|
-
registerAnalyzeDiagramTool,
|
|
282
|
-
registerAnalyzeEntryPointsTool,
|
|
283
|
-
registerAnalyzePatternsTool,
|
|
284
|
-
registerAnalyzeStructureTool,
|
|
285
|
-
registerAnalyzeSymbolsTool,
|
|
286
|
-
registerBlastRadiusTool
|
|
287
|
-
};
|
|
288
|
-
//# sourceMappingURL=analyze.tools.js.map
|
|
1
|
+
import{createHash as y}from"node:crypto";import{BlastRadiusAnalyzer as f,DependencyAnalyzer as x,DiagramGenerator as b,EntryPointAnalyzer as w,PatternAnalyzer as z,StructureAnalyzer as _,SymbolAnalyzer as v}from"@kb/analyzers";import{z as a}from"zod";async function d(s,o,r,i,e){try{const t=y("sha256").update(i).digest("hex").slice(0,12),n=`produced/analysis/${r}/${t}.md`,c=y("sha256").update(e).digest("hex").slice(0,16),l=new Date().toISOString(),m=e.length>2e3?e.split(/(?=^## )/m).filter(p=>p.trim().length>0):[e],u=m.map((p,g)=>({id:y("sha256").update(`${n}::${g}`).digest("hex").slice(0,16),content:p.trim(),sourcePath:n,contentType:"produced-knowledge",chunkIndex:g,totalChunks:m.length,startLine:0,endLine:0,fileHash:c,indexedAt:l,origin:"produced",tags:["analysis",r],category:"analysis",version:1})),h=await o.embedBatch(u.map(p=>p.content));await s.upsert(u,h),console.error(`[KB] Auto-persisted ${r} analysis (${u.length} chunks)`)}catch(t){console.error(`[KB] Auto-persist ${r} failed:`,t)}}function K(s,o,r){const i=new _;s.registerTool("analyze_structure",{description:"Analyze the file/directory structure of a codebase. Returns an annotated tree with language stats.",inputSchema:{path:a.string().describe("Root path to analyze"),max_depth:a.number().min(1).max(10).default(6).describe("Maximum directory depth"),format:a.enum(["json","markdown"]).default("markdown").describe("Output format")}},async({path:e,max_depth:t,format:n})=>{try{const c=await i.analyze(e,{format:n,maxDepth:t});return d(o,r,"structure",e,c.output),{content:[{type:"text",text:c.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` for import graphs, or `analyze_patterns` to detect architecture patterns._"}]}}catch(c){return{content:[{type:"text",text:`Analysis failed: ${c.message}`}],isError:!0}}})}function k(s,o,r){const i=new x;s.registerTool("analyze_dependencies",{description:"Analyze import/require dependencies across a codebase. Shows external packages and internal module graph.",inputSchema:{path:a.string().describe("Root path to analyze"),format:a.enum(["json","markdown","mermaid"]).default("markdown").describe("Output format")}},async({path:e,format:t})=>{try{const n=await i.analyze(e,{format:t});return d(o,r,"dependencies",e,n.output),{content:[{type:"text",text:n.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_symbols` to explore exported symbols, or `analyze_diagram` for visual representation._"}]}}catch(n){return{content:[{type:"text",text:`Analysis failed: ${n.message}`}],isError:!0}}})}function I(s,o,r){const i=new v;s.registerTool("analyze_symbols",{description:"Extract exported and local symbols (functions, classes, interfaces, types, constants) from a codebase.",inputSchema:{path:a.string().describe("Root path to analyze"),filter:a.string().optional().describe("Filter symbols by name substring"),format:a.enum(["json","markdown"]).default("markdown").describe("Output format")}},async({path:e,filter:t,format:n})=>{try{const c=await i.analyze(e,{format:n,filter:t});return d(o,r,"symbols",e,c.output),{content:[{type:"text",text:c.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see import relationships, or `search` to find usage patterns._"}]}}catch(c){return{content:[{type:"text",text:`Analysis failed: ${c.message}`}],isError:!0}}})}function T(s,o,r){const i=new z;s.registerTool("analyze_patterns",{description:"Detect architectural patterns, frameworks, and conventions in a codebase using directory structure and code heuristics.",inputSchema:{path:a.string().describe("Root path to analyze")}},async({path:e})=>{try{const t=await i.analyze(e);return d(o,r,"patterns",e,t.output),{content:[{type:"text",text:t.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_entry_points` to find Lambda handlers and main exports, or `produce_knowledge` for full analysis._"}]}}catch(t){return{content:[{type:"text",text:`Analysis failed: ${t.message}`}],isError:!0}}})}function $(s,o,r){const i=new w;s.registerTool("analyze_entry_points",{description:"Find entry points: Lambda handlers, main exports, CLI bins, and server start scripts.",inputSchema:{path:a.string().describe("Root path to analyze")}},async({path:e})=>{try{const t=await i.analyze(e);return d(o,r,"entry-points",e,t.output),{content:[{type:"text",text:t.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see what each entry point imports, or `produce_knowledge` for comprehensive analysis._"}]}}catch(t){return{content:[{type:"text",text:`Analysis failed: ${t.message}`}],isError:!0}}})}function B(s,o,r){const i=new b;s.registerTool("analyze_diagram",{description:"Generate a Mermaid diagram of the codebase architecture or dependency graph.",inputSchema:{path:a.string().describe("Root path to analyze"),diagram_type:a.enum(["architecture","dependencies"]).default("architecture").describe("Type of diagram")}},async({path:e,diagram_type:t})=>{try{const n=await i.analyze(e,{diagramType:t});return d(o,r,"diagram",e,n.output),{content:[{type:"text",text:n.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_structure` for detailed file tree, or `produce_knowledge` for comprehensive analysis._"}]}}catch(n){return{content:[{type:"text",text:`Diagram generation failed: ${n.message}`}],isError:!0}}})}function R(s,o,r){const i=new f;s.registerTool("blast_radius",{description:"Given a list of changed files, trace the dependency graph to find all affected files (direct + transitive importers) and their tests. Useful for scoping code reviews and impact analysis.",inputSchema:{path:a.string().describe("Root path of the codebase"),files:a.array(a.string()).min(1).describe("Changed file paths (relative to root)"),max_depth:a.number().min(1).max(20).default(5).describe("Maximum transitive dependency depth"),format:a.enum(["json","markdown"]).default("markdown").describe("Output format")}},async({path:e,files:t,max_depth:n,format:c})=>{try{const l=await i.analyze(e,{files:t,maxDepth:n,format:c});return d(o,r,"blast-radius",e,l.output),{content:[{type:"text",text:l.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see the full import graph, or `analyze_symbols` to inspect affected exports._"}]}}catch(l){return{content:[{type:"text",text:`Blast radius analysis failed: ${l.message}`}],isError:!0}}})}export{k as registerAnalyzeDependenciesTool,B as registerAnalyzeDiagramTool,$ as registerAnalyzeEntryPointsTool,T as registerAnalyzePatternsTool,K as registerAnalyzeStructureTool,I as registerAnalyzeSymbolsTool,R as registerBlastRadiusTool};
|