@vpxa/kb 0.1.1
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/LICENSE +21 -0
- package/README.md +1140 -0
- package/bin/kb.mjs +10 -0
- package/package.json +67 -0
- package/packages/analyzers/dist/blast-radius-analyzer.d.ts +23 -0
- package/packages/analyzers/dist/blast-radius-analyzer.js +114 -0
- package/packages/analyzers/dist/dependency-analyzer.d.ts +29 -0
- package/packages/analyzers/dist/dependency-analyzer.js +425 -0
- package/packages/analyzers/dist/diagram-generator.d.ts +13 -0
- package/packages/analyzers/dist/diagram-generator.js +86 -0
- package/packages/analyzers/dist/entry-point-analyzer.d.ts +19 -0
- package/packages/analyzers/dist/entry-point-analyzer.js +239 -0
- package/packages/analyzers/dist/index.d.ts +14 -0
- package/packages/analyzers/dist/index.js +23 -0
- package/packages/analyzers/dist/knowledge-producer.d.ts +32 -0
- package/packages/analyzers/dist/knowledge-producer.js +113 -0
- package/packages/analyzers/dist/pattern-analyzer.d.ts +12 -0
- package/packages/analyzers/dist/pattern-analyzer.js +359 -0
- package/packages/analyzers/dist/regex-call-graph.d.ts +17 -0
- package/packages/analyzers/dist/regex-call-graph.js +428 -0
- package/packages/analyzers/dist/structure-analyzer.d.ts +11 -0
- package/packages/analyzers/dist/structure-analyzer.js +258 -0
- package/packages/analyzers/dist/symbol-analyzer.d.ts +10 -0
- package/packages/analyzers/dist/symbol-analyzer.js +442 -0
- package/packages/analyzers/dist/ts-call-graph.d.ts +27 -0
- package/packages/analyzers/dist/ts-call-graph.js +160 -0
- package/packages/analyzers/dist/types.d.ts +98 -0
- package/packages/analyzers/dist/types.js +1 -0
- package/packages/chunker/dist/call-graph-extractor.d.ts +22 -0
- package/packages/chunker/dist/call-graph-extractor.js +90 -0
- package/packages/chunker/dist/chunker-factory.d.ts +7 -0
- package/packages/chunker/dist/chunker-factory.js +36 -0
- package/packages/chunker/dist/chunker.interface.d.ts +10 -0
- package/packages/chunker/dist/chunker.interface.js +1 -0
- package/packages/chunker/dist/code-chunker.d.ts +14 -0
- package/packages/chunker/dist/code-chunker.js +134 -0
- package/packages/chunker/dist/generic-chunker.d.ts +12 -0
- package/packages/chunker/dist/generic-chunker.js +72 -0
- package/packages/chunker/dist/index.d.ts +8 -0
- package/packages/chunker/dist/index.js +21 -0
- package/packages/chunker/dist/markdown-chunker.d.ts +14 -0
- package/packages/chunker/dist/markdown-chunker.js +122 -0
- package/packages/chunker/dist/treesitter-chunker.d.ts +47 -0
- package/packages/chunker/dist/treesitter-chunker.js +234 -0
- package/packages/cli/dist/commands/analyze.d.ts +3 -0
- package/packages/cli/dist/commands/analyze.js +112 -0
- package/packages/cli/dist/commands/context-cmds.d.ts +3 -0
- package/packages/cli/dist/commands/context-cmds.js +155 -0
- package/packages/cli/dist/commands/environment.d.ts +3 -0
- package/packages/cli/dist/commands/environment.js +204 -0
- package/packages/cli/dist/commands/execution.d.ts +3 -0
- package/packages/cli/dist/commands/execution.js +137 -0
- package/packages/cli/dist/commands/graph.d.ts +3 -0
- package/packages/cli/dist/commands/graph.js +81 -0
- package/packages/cli/dist/commands/init.d.ts +8 -0
- package/packages/cli/dist/commands/init.js +87 -0
- package/packages/cli/dist/commands/knowledge.d.ts +3 -0
- package/packages/cli/dist/commands/knowledge.js +139 -0
- package/packages/cli/dist/commands/search.d.ts +3 -0
- package/packages/cli/dist/commands/search.js +267 -0
- package/packages/cli/dist/commands/system.d.ts +3 -0
- package/packages/cli/dist/commands/system.js +241 -0
- package/packages/cli/dist/commands/workspace.d.ts +3 -0
- package/packages/cli/dist/commands/workspace.js +388 -0
- package/packages/cli/dist/context.d.ts +5 -0
- package/packages/cli/dist/context.js +14 -0
- package/packages/cli/dist/helpers.d.ts +52 -0
- package/packages/cli/dist/helpers.js +458 -0
- package/packages/cli/dist/index.d.ts +8 -0
- package/packages/cli/dist/index.js +69 -0
- package/packages/cli/dist/kb-init.d.ts +57 -0
- package/packages/cli/dist/kb-init.js +82 -0
- package/packages/cli/dist/types.d.ts +7 -0
- package/packages/cli/dist/types.js +1 -0
- package/packages/core/dist/constants.d.ts +49 -0
- package/packages/core/dist/constants.js +43 -0
- package/packages/core/dist/content-detector.d.ts +9 -0
- package/packages/core/dist/content-detector.js +79 -0
- package/packages/core/dist/errors.d.ts +18 -0
- package/packages/core/dist/errors.js +40 -0
- package/packages/core/dist/index.d.ts +6 -0
- package/packages/core/dist/index.js +9 -0
- package/packages/core/dist/logger.d.ts +9 -0
- package/packages/core/dist/logger.js +34 -0
- package/packages/core/dist/types.d.ts +108 -0
- package/packages/core/dist/types.js +1 -0
- package/packages/embeddings/dist/embedder.interface.d.ts +24 -0
- package/packages/embeddings/dist/embedder.interface.js +1 -0
- package/packages/embeddings/dist/index.d.ts +3 -0
- package/packages/embeddings/dist/index.js +5 -0
- package/packages/embeddings/dist/onnx-embedder.d.ts +24 -0
- package/packages/embeddings/dist/onnx-embedder.js +82 -0
- package/packages/indexer/dist/file-hasher.d.ts +11 -0
- package/packages/indexer/dist/file-hasher.js +13 -0
- package/packages/indexer/dist/filesystem-crawler.d.ts +27 -0
- package/packages/indexer/dist/filesystem-crawler.js +125 -0
- package/packages/indexer/dist/graph-extractor.d.ts +22 -0
- package/packages/indexer/dist/graph-extractor.js +111 -0
- package/packages/indexer/dist/incremental-indexer.d.ts +47 -0
- package/packages/indexer/dist/incremental-indexer.js +278 -0
- package/packages/indexer/dist/index.d.ts +5 -0
- package/packages/indexer/dist/index.js +14 -0
- package/packages/server/dist/api.d.ts +8 -0
- package/packages/server/dist/api.js +9 -0
- package/packages/server/dist/config.d.ts +3 -0
- package/packages/server/dist/config.js +75 -0
- package/packages/server/dist/curated-manager.d.ts +86 -0
- package/packages/server/dist/curated-manager.js +357 -0
- package/packages/server/dist/index.d.ts +2 -0
- package/packages/server/dist/index.js +134 -0
- package/packages/server/dist/replay-interceptor.d.ts +11 -0
- package/packages/server/dist/replay-interceptor.js +38 -0
- package/packages/server/dist/resources/resources.d.ts +4 -0
- package/packages/server/dist/resources/resources.js +40 -0
- package/packages/server/dist/server.d.ts +21 -0
- package/packages/server/dist/server.js +247 -0
- package/packages/server/dist/tools/analyze.tools.d.ts +11 -0
- package/packages/server/dist/tools/analyze.tools.js +288 -0
- package/packages/server/dist/tools/forge.tools.d.ts +12 -0
- package/packages/server/dist/tools/forge.tools.js +501 -0
- package/packages/server/dist/tools/forget.tool.d.ts +4 -0
- package/packages/server/dist/tools/forget.tool.js +43 -0
- package/packages/server/dist/tools/graph.tool.d.ts +4 -0
- package/packages/server/dist/tools/graph.tool.js +110 -0
- package/packages/server/dist/tools/list.tool.d.ts +4 -0
- package/packages/server/dist/tools/list.tool.js +56 -0
- package/packages/server/dist/tools/lookup.tool.d.ts +4 -0
- package/packages/server/dist/tools/lookup.tool.js +53 -0
- package/packages/server/dist/tools/onboard.tool.d.ts +5 -0
- package/packages/server/dist/tools/onboard.tool.js +112 -0
- package/packages/server/dist/tools/produce.tool.d.ts +3 -0
- package/packages/server/dist/tools/produce.tool.js +74 -0
- package/packages/server/dist/tools/read.tool.d.ts +4 -0
- package/packages/server/dist/tools/read.tool.js +49 -0
- package/packages/server/dist/tools/reindex.tool.d.ts +7 -0
- package/packages/server/dist/tools/reindex.tool.js +70 -0
- package/packages/server/dist/tools/remember.tool.d.ts +4 -0
- package/packages/server/dist/tools/remember.tool.js +45 -0
- package/packages/server/dist/tools/replay.tool.d.ts +3 -0
- package/packages/server/dist/tools/replay.tool.js +89 -0
- package/packages/server/dist/tools/search.tool.d.ts +5 -0
- package/packages/server/dist/tools/search.tool.js +331 -0
- package/packages/server/dist/tools/status.tool.d.ts +4 -0
- package/packages/server/dist/tools/status.tool.js +68 -0
- package/packages/server/dist/tools/toolkit.tools.d.ts +35 -0
- package/packages/server/dist/tools/toolkit.tools.js +1674 -0
- package/packages/server/dist/tools/update.tool.d.ts +4 -0
- package/packages/server/dist/tools/update.tool.js +42 -0
- package/packages/server/dist/tools/utility.tools.d.ts +15 -0
- package/packages/server/dist/tools/utility.tools.js +461 -0
- package/packages/store/dist/graph-store.interface.d.ts +104 -0
- package/packages/store/dist/graph-store.interface.js +1 -0
- package/packages/store/dist/index.d.ts +6 -0
- package/packages/store/dist/index.js +9 -0
- package/packages/store/dist/lance-store.d.ts +32 -0
- package/packages/store/dist/lance-store.js +258 -0
- package/packages/store/dist/sqlite-graph-store.d.ts +43 -0
- package/packages/store/dist/sqlite-graph-store.js +374 -0
- package/packages/store/dist/store-factory.d.ts +9 -0
- package/packages/store/dist/store-factory.js +14 -0
- package/packages/store/dist/store.interface.d.ts +48 -0
- package/packages/store/dist/store.interface.js +1 -0
- package/packages/tools/dist/batch.d.ts +21 -0
- package/packages/tools/dist/batch.js +45 -0
- package/packages/tools/dist/changelog.d.ts +34 -0
- package/packages/tools/dist/changelog.js +112 -0
- package/packages/tools/dist/check.d.ts +26 -0
- package/packages/tools/dist/check.js +59 -0
- package/packages/tools/dist/checkpoint.d.ts +17 -0
- package/packages/tools/dist/checkpoint.js +43 -0
- package/packages/tools/dist/codemod.d.ts +37 -0
- package/packages/tools/dist/codemod.js +69 -0
- package/packages/tools/dist/compact.d.ts +41 -0
- package/packages/tools/dist/compact.js +60 -0
- package/packages/tools/dist/data-transform.d.ts +10 -0
- package/packages/tools/dist/data-transform.js +124 -0
- package/packages/tools/dist/dead-symbols.d.ts +21 -0
- package/packages/tools/dist/dead-symbols.js +71 -0
- package/packages/tools/dist/delegate.d.ts +34 -0
- package/packages/tools/dist/delegate.js +130 -0
- package/packages/tools/dist/diff-parse.d.ts +26 -0
- package/packages/tools/dist/diff-parse.js +153 -0
- package/packages/tools/dist/digest.d.ts +53 -0
- package/packages/tools/dist/digest.js +242 -0
- package/packages/tools/dist/encode.d.ts +14 -0
- package/packages/tools/dist/encode.js +46 -0
- package/packages/tools/dist/env-info.d.ts +28 -0
- package/packages/tools/dist/env-info.js +58 -0
- package/packages/tools/dist/eval.d.ts +13 -0
- package/packages/tools/dist/eval.js +79 -0
- package/packages/tools/dist/evidence-map.d.ts +79 -0
- package/packages/tools/dist/evidence-map.js +203 -0
- package/packages/tools/dist/file-summary.d.ts +32 -0
- package/packages/tools/dist/file-summary.js +106 -0
- package/packages/tools/dist/file-walk.d.ts +4 -0
- package/packages/tools/dist/file-walk.js +75 -0
- package/packages/tools/dist/find-examples.d.ts +25 -0
- package/packages/tools/dist/find-examples.js +48 -0
- package/packages/tools/dist/find.d.ts +47 -0
- package/packages/tools/dist/find.js +120 -0
- package/packages/tools/dist/forge-classify.d.ts +44 -0
- package/packages/tools/dist/forge-classify.js +319 -0
- package/packages/tools/dist/forge-ground.d.ts +64 -0
- package/packages/tools/dist/forge-ground.js +184 -0
- package/packages/tools/dist/git-context.d.ts +22 -0
- package/packages/tools/dist/git-context.js +46 -0
- package/packages/tools/dist/graph-query.d.ts +89 -0
- package/packages/tools/dist/graph-query.js +194 -0
- package/packages/tools/dist/health.d.ts +14 -0
- package/packages/tools/dist/health.js +118 -0
- package/packages/tools/dist/http-request.d.ts +23 -0
- package/packages/tools/dist/http-request.js +58 -0
- package/packages/tools/dist/index.d.ts +49 -0
- package/packages/tools/dist/index.js +273 -0
- package/packages/tools/dist/lane.d.ts +39 -0
- package/packages/tools/dist/lane.js +227 -0
- package/packages/tools/dist/measure.d.ts +38 -0
- package/packages/tools/dist/measure.js +119 -0
- package/packages/tools/dist/onboard.d.ts +41 -0
- package/packages/tools/dist/onboard.js +1139 -0
- package/packages/tools/dist/parse-output.d.ts +80 -0
- package/packages/tools/dist/parse-output.js +158 -0
- package/packages/tools/dist/process-manager.d.ts +18 -0
- package/packages/tools/dist/process-manager.js +69 -0
- package/packages/tools/dist/queue.d.ts +38 -0
- package/packages/tools/dist/queue.js +126 -0
- package/packages/tools/dist/regex-test.d.ts +31 -0
- package/packages/tools/dist/regex-test.js +39 -0
- package/packages/tools/dist/rename.d.ts +29 -0
- package/packages/tools/dist/rename.js +70 -0
- package/packages/tools/dist/replay.d.ts +56 -0
- package/packages/tools/dist/replay.js +108 -0
- package/packages/tools/dist/schema-validate.d.ts +23 -0
- package/packages/tools/dist/schema-validate.js +141 -0
- package/packages/tools/dist/scope-map.d.ts +52 -0
- package/packages/tools/dist/scope-map.js +72 -0
- package/packages/tools/dist/snippet.d.ts +34 -0
- package/packages/tools/dist/snippet.js +80 -0
- package/packages/tools/dist/stash.d.ts +12 -0
- package/packages/tools/dist/stash.js +60 -0
- package/packages/tools/dist/stratum-card.d.ts +31 -0
- package/packages/tools/dist/stratum-card.js +239 -0
- package/packages/tools/dist/symbol.d.ts +28 -0
- package/packages/tools/dist/symbol.js +87 -0
- package/packages/tools/dist/test-run.d.ts +23 -0
- package/packages/tools/dist/test-run.js +55 -0
- package/packages/tools/dist/text-utils.d.ts +16 -0
- package/packages/tools/dist/text-utils.js +31 -0
- package/packages/tools/dist/time-utils.d.ts +18 -0
- package/packages/tools/dist/time-utils.js +135 -0
- package/packages/tools/dist/trace.d.ts +24 -0
- package/packages/tools/dist/trace.js +114 -0
- package/packages/tools/dist/truncation.d.ts +22 -0
- package/packages/tools/dist/truncation.js +45 -0
- package/packages/tools/dist/watch.d.ts +30 -0
- package/packages/tools/dist/watch.js +61 -0
- package/packages/tools/dist/web-fetch.d.ts +45 -0
- package/packages/tools/dist/web-fetch.js +249 -0
- package/packages/tools/dist/web-search.d.ts +23 -0
- package/packages/tools/dist/web-search.js +46 -0
- package/packages/tools/dist/workset.d.ts +45 -0
- package/packages/tools/dist/workset.js +77 -0
- package/packages/tui/dist/App.d.ts +8 -0
- package/packages/tui/dist/App.js +52659 -0
- package/packages/tui/dist/index.d.ts +19 -0
- package/packages/tui/dist/index.js +54742 -0
- package/packages/tui/dist/panels/CuratedPanel.d.ts +8 -0
- package/packages/tui/dist/panels/CuratedPanel.js +34452 -0
- package/packages/tui/dist/panels/LogPanel.d.ts +3 -0
- package/packages/tui/dist/panels/LogPanel.js +51894 -0
- package/packages/tui/dist/panels/SearchPanel.d.ts +10 -0
- package/packages/tui/dist/panels/SearchPanel.js +34985 -0
- package/packages/tui/dist/panels/StatusPanel.d.ts +8 -0
- package/packages/tui/dist/panels/StatusPanel.js +34465 -0
- package/skills/knowledge-base/SKILL.md +316 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { replayAppend } from "@kb/tools";
|
|
2
|
+
function installReplayInterceptor(server) {
|
|
3
|
+
const original = server.registerTool.bind(server);
|
|
4
|
+
server.registerTool = (name, config, handler) => {
|
|
5
|
+
const wrappedHandler = async (args, extra) => {
|
|
6
|
+
const start = Date.now();
|
|
7
|
+
try {
|
|
8
|
+
const result = await handler(args, extra);
|
|
9
|
+
replayAppend({
|
|
10
|
+
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
11
|
+
source: "mcp",
|
|
12
|
+
tool: name,
|
|
13
|
+
input: JSON.stringify(args),
|
|
14
|
+
durationMs: Date.now() - start,
|
|
15
|
+
status: "ok",
|
|
16
|
+
output: JSON.stringify(result).slice(0, 200)
|
|
17
|
+
});
|
|
18
|
+
return result;
|
|
19
|
+
} catch (err) {
|
|
20
|
+
replayAppend({
|
|
21
|
+
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
22
|
+
source: "mcp",
|
|
23
|
+
tool: name,
|
|
24
|
+
input: JSON.stringify(args),
|
|
25
|
+
durationMs: Date.now() - start,
|
|
26
|
+
status: "error",
|
|
27
|
+
output: err instanceof Error ? err.message : String(err)
|
|
28
|
+
});
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return original(name, config, wrappedHandler);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
installReplayInterceptor
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=replay-interceptor.js.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
function registerResources(server, store) {
|
|
2
|
+
server.resource(
|
|
3
|
+
"kb-status",
|
|
4
|
+
"kb://status",
|
|
5
|
+
{ description: "Current knowledge base status and statistics", mimeType: "text/plain" },
|
|
6
|
+
async () => {
|
|
7
|
+
const stats = await store.getStats();
|
|
8
|
+
return {
|
|
9
|
+
contents: [
|
|
10
|
+
{
|
|
11
|
+
uri: "kb://status",
|
|
12
|
+
text: `Knowledge Base: ${stats.totalRecords} records from ${stats.totalFiles} files. Last indexed: ${stats.lastIndexedAt ?? "Never"}`,
|
|
13
|
+
mimeType: "text/plain"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
server.resource(
|
|
20
|
+
"kb-file-tree",
|
|
21
|
+
"kb://file-tree",
|
|
22
|
+
{ description: "List of all indexed source files", mimeType: "text/plain" },
|
|
23
|
+
async () => {
|
|
24
|
+
const paths = await store.listSourcePaths();
|
|
25
|
+
return {
|
|
26
|
+
contents: [
|
|
27
|
+
{
|
|
28
|
+
uri: "kb://file-tree",
|
|
29
|
+
text: paths.sort().join("\n"),
|
|
30
|
+
mimeType: "text/plain"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
registerResources
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { KBConfig } from '@kb/core';
|
|
2
|
+
import { OnnxEmbedder } from '@kb/embeddings';
|
|
3
|
+
import { IncrementalIndexer } from '@kb/indexer';
|
|
4
|
+
import type { IGraphStore } from '@kb/store';
|
|
5
|
+
import { createStore } from '@kb/store';
|
|
6
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
import { CuratedKnowledgeManager } from './curated-manager.js';
|
|
8
|
+
export interface KnowledgeBaseComponents {
|
|
9
|
+
embedder: OnnxEmbedder;
|
|
10
|
+
store: Awaited<ReturnType<typeof createStore>>;
|
|
11
|
+
indexer: IncrementalIndexer;
|
|
12
|
+
curated: CuratedKnowledgeManager;
|
|
13
|
+
graphStore: IGraphStore;
|
|
14
|
+
}
|
|
15
|
+
export declare function initializeKnowledgeBase(config: KBConfig): Promise<KnowledgeBaseComponents>;
|
|
16
|
+
export declare function createMcpServer(kb: KnowledgeBaseComponents, config: KBConfig): McpServer;
|
|
17
|
+
export declare function createServer(config: KBConfig): Promise<{
|
|
18
|
+
server: McpServer;
|
|
19
|
+
runInitialIndex: () => Promise<void>;
|
|
20
|
+
}>;
|
|
21
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { initializeTreeSitter } from "@kb/chunker";
|
|
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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IEmbedder } from '@kb/embeddings';
|
|
2
|
+
import type { IKnowledgeStore } from '@kb/store';
|
|
3
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
|
+
export declare function registerAnalyzeStructureTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder): void;
|
|
5
|
+
export declare function registerAnalyzeDependenciesTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder): void;
|
|
6
|
+
export declare function registerAnalyzeSymbolsTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder): void;
|
|
7
|
+
export declare function registerAnalyzePatternsTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder): void;
|
|
8
|
+
export declare function registerAnalyzeEntryPointsTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder): void;
|
|
9
|
+
export declare function registerAnalyzeDiagramTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder): void;
|
|
10
|
+
export declare function registerBlastRadiusTool(server: McpServer, store: IKnowledgeStore, embedder: IEmbedder): void;
|
|
11
|
+
//# sourceMappingURL=analyze.tools.d.ts.map
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool registrations for FORGE/STRATUM protocol tools.
|
|
3
|
+
*/
|
|
4
|
+
import type { IEmbedder } from '@kb/embeddings';
|
|
5
|
+
import type { IKnowledgeStore } from '@kb/store';
|
|
6
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
export declare function registerEvidenceMapTool(server: McpServer): void;
|
|
8
|
+
export declare function registerDigestTool(server: McpServer, embedder: IEmbedder): void;
|
|
9
|
+
export declare function registerForgeClassifyTool(server: McpServer): void;
|
|
10
|
+
export declare function registerStratumCardTool(server: McpServer, embedder: IEmbedder): void;
|
|
11
|
+
export declare function registerForgeGroundTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
|
|
12
|
+
//# sourceMappingURL=forge.tools.d.ts.map
|