@jafreck/lore 0.1.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/LICENSE +21 -0
- package/README.md +405 -0
- package/dist/cli.d.ts +19 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +345 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/call-graph.d.ts +39 -0
- package/dist/indexer/call-graph.d.ts.map +1 -0
- package/dist/indexer/call-graph.js +193 -0
- package/dist/indexer/call-graph.js.map +1 -0
- package/dist/indexer/complexity.d.ts +9 -0
- package/dist/indexer/complexity.d.ts.map +1 -0
- package/dist/indexer/complexity.js +66 -0
- package/dist/indexer/complexity.js.map +1 -0
- package/dist/indexer/config-parser.d.ts +16 -0
- package/dist/indexer/config-parser.d.ts.map +1 -0
- package/dist/indexer/config-parser.js +261 -0
- package/dist/indexer/config-parser.js.map +1 -0
- package/dist/indexer/coverage.d.ts +13 -0
- package/dist/indexer/coverage.d.ts.map +1 -0
- package/dist/indexer/coverage.js +84 -0
- package/dist/indexer/coverage.js.map +1 -0
- package/dist/indexer/db.d.ts +38 -0
- package/dist/indexer/db.d.ts.map +1 -0
- package/dist/indexer/db.js +275 -0
- package/dist/indexer/db.js.map +1 -0
- package/dist/indexer/embedder.d.ts +70 -0
- package/dist/indexer/embedder.d.ts.map +1 -0
- package/dist/indexer/embedder.js +186 -0
- package/dist/indexer/embedder.js.map +1 -0
- package/dist/indexer/ensure-python-deps.d.ts +22 -0
- package/dist/indexer/ensure-python-deps.d.ts.map +1 -0
- package/dist/indexer/ensure-python-deps.js +47 -0
- package/dist/indexer/ensure-python-deps.js.map +1 -0
- package/dist/indexer/extractors/bash.d.ts +12 -0
- package/dist/indexer/extractors/bash.d.ts.map +1 -0
- package/dist/indexer/extractors/bash.js +57 -0
- package/dist/indexer/extractors/bash.js.map +1 -0
- package/dist/indexer/extractors/c.d.ts +12 -0
- package/dist/indexer/extractors/c.d.ts.map +1 -0
- package/dist/indexer/extractors/c.js +106 -0
- package/dist/indexer/extractors/c.js.map +1 -0
- package/dist/indexer/extractors/cpp.d.ts +12 -0
- package/dist/indexer/extractors/cpp.d.ts.map +1 -0
- package/dist/indexer/extractors/cpp.js +84 -0
- package/dist/indexer/extractors/cpp.js.map +1 -0
- package/dist/indexer/extractors/csharp.d.ts +12 -0
- package/dist/indexer/extractors/csharp.d.ts.map +1 -0
- package/dist/indexer/extractors/csharp.js +79 -0
- package/dist/indexer/extractors/csharp.js.map +1 -0
- package/dist/indexer/extractors/dart.d.ts +12 -0
- package/dist/indexer/extractors/dart.d.ts.map +1 -0
- package/dist/indexer/extractors/dart.js +80 -0
- package/dist/indexer/extractors/dart.js.map +1 -0
- package/dist/indexer/extractors/elixir.d.ts +12 -0
- package/dist/indexer/extractors/elixir.d.ts.map +1 -0
- package/dist/indexer/extractors/elixir.js +87 -0
- package/dist/indexer/extractors/elixir.js.map +1 -0
- package/dist/indexer/extractors/elm.d.ts +12 -0
- package/dist/indexer/extractors/elm.d.ts.map +1 -0
- package/dist/indexer/extractors/elm.js +87 -0
- package/dist/indexer/extractors/elm.js.map +1 -0
- package/dist/indexer/extractors/go.d.ts +12 -0
- package/dist/indexer/extractors/go.d.ts.map +1 -0
- package/dist/indexer/extractors/go.js +158 -0
- package/dist/indexer/extractors/go.js.map +1 -0
- package/dist/indexer/extractors/haskell.d.ts +12 -0
- package/dist/indexer/extractors/haskell.d.ts.map +1 -0
- package/dist/indexer/extractors/haskell.js +104 -0
- package/dist/indexer/extractors/haskell.js.map +1 -0
- package/dist/indexer/extractors/java.d.ts +12 -0
- package/dist/indexer/extractors/java.d.ts.map +1 -0
- package/dist/indexer/extractors/java.js +68 -0
- package/dist/indexer/extractors/java.js.map +1 -0
- package/dist/indexer/extractors/javascript.d.ts +13 -0
- package/dist/indexer/extractors/javascript.d.ts.map +1 -0
- package/dist/indexer/extractors/javascript.js +180 -0
- package/dist/indexer/extractors/javascript.js.map +1 -0
- package/dist/indexer/extractors/julia.d.ts +12 -0
- package/dist/indexer/extractors/julia.d.ts.map +1 -0
- package/dist/indexer/extractors/julia.js +94 -0
- package/dist/indexer/extractors/julia.js.map +1 -0
- package/dist/indexer/extractors/kotlin.d.ts +12 -0
- package/dist/indexer/extractors/kotlin.d.ts.map +1 -0
- package/dist/indexer/extractors/kotlin.js +71 -0
- package/dist/indexer/extractors/kotlin.js.map +1 -0
- package/dist/indexer/extractors/lua.d.ts +12 -0
- package/dist/indexer/extractors/lua.d.ts.map +1 -0
- package/dist/indexer/extractors/lua.js +68 -0
- package/dist/indexer/extractors/lua.js.map +1 -0
- package/dist/indexer/extractors/objc.d.ts +12 -0
- package/dist/indexer/extractors/objc.d.ts.map +1 -0
- package/dist/indexer/extractors/objc.js +129 -0
- package/dist/indexer/extractors/objc.js.map +1 -0
- package/dist/indexer/extractors/ocaml.d.ts +12 -0
- package/dist/indexer/extractors/ocaml.d.ts.map +1 -0
- package/dist/indexer/extractors/ocaml.js +92 -0
- package/dist/indexer/extractors/ocaml.js.map +1 -0
- package/dist/indexer/extractors/php.d.ts +12 -0
- package/dist/indexer/extractors/php.d.ts.map +1 -0
- package/dist/indexer/extractors/php.js +99 -0
- package/dist/indexer/extractors/php.js.map +1 -0
- package/dist/indexer/extractors/python.d.ts +12 -0
- package/dist/indexer/extractors/python.d.ts.map +1 -0
- package/dist/indexer/extractors/python.js +129 -0
- package/dist/indexer/extractors/python.js.map +1 -0
- package/dist/indexer/extractors/ruby.d.ts +12 -0
- package/dist/indexer/extractors/ruby.d.ts.map +1 -0
- package/dist/indexer/extractors/ruby.js +100 -0
- package/dist/indexer/extractors/ruby.js.map +1 -0
- package/dist/indexer/extractors/rust.d.ts +12 -0
- package/dist/indexer/extractors/rust.d.ts.map +1 -0
- package/dist/indexer/extractors/rust.js +82 -0
- package/dist/indexer/extractors/rust.js.map +1 -0
- package/dist/indexer/extractors/scala.d.ts +12 -0
- package/dist/indexer/extractors/scala.d.ts.map +1 -0
- package/dist/indexer/extractors/scala.js +91 -0
- package/dist/indexer/extractors/scala.js.map +1 -0
- package/dist/indexer/extractors/swift.d.ts +12 -0
- package/dist/indexer/extractors/swift.d.ts.map +1 -0
- package/dist/indexer/extractors/swift.js +90 -0
- package/dist/indexer/extractors/swift.js.map +1 -0
- package/dist/indexer/extractors/types.d.ts +118 -0
- package/dist/indexer/extractors/types.d.ts.map +1 -0
- package/dist/indexer/extractors/types.js +43 -0
- package/dist/indexer/extractors/types.js.map +1 -0
- package/dist/indexer/extractors/typescript.d.ts +14 -0
- package/dist/indexer/extractors/typescript.d.ts.map +1 -0
- package/dist/indexer/extractors/typescript.js +172 -0
- package/dist/indexer/extractors/typescript.js.map +1 -0
- package/dist/indexer/extractors/zig.d.ts +12 -0
- package/dist/indexer/extractors/zig.d.ts.map +1 -0
- package/dist/indexer/extractors/zig.js +95 -0
- package/dist/indexer/extractors/zig.js.map +1 -0
- package/dist/indexer/git-history.d.ts +23 -0
- package/dist/indexer/git-history.d.ts.map +1 -0
- package/dist/indexer/git-history.js +144 -0
- package/dist/indexer/git-history.js.map +1 -0
- package/dist/indexer/git-hooks.d.ts +19 -0
- package/dist/indexer/git-hooks.d.ts.map +1 -0
- package/dist/indexer/git-hooks.js +74 -0
- package/dist/indexer/git-hooks.js.map +1 -0
- package/dist/indexer/index.d.ts +83 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +431 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/parser.d.ts +30 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +114 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/poller.d.ts +50 -0
- package/dist/indexer/poller.d.ts.map +1 -0
- package/dist/indexer/poller.js +140 -0
- package/dist/indexer/poller.js.map +1 -0
- package/dist/indexer/resolver.d.ts +52 -0
- package/dist/indexer/resolver.d.ts.map +1 -0
- package/dist/indexer/resolver.js +271 -0
- package/dist/indexer/resolver.js.map +1 -0
- package/dist/indexer/test-mapper.d.ts +6 -0
- package/dist/indexer/test-mapper.d.ts.map +1 -0
- package/dist/indexer/test-mapper.js +48 -0
- package/dist/indexer/test-mapper.js.map +1 -0
- package/dist/indexer/walker.d.ts +51 -0
- package/dist/indexer/walker.d.ts.map +1 -0
- package/dist/indexer/walker.js +100 -0
- package/dist/indexer/walker.js.map +1 -0
- package/dist/indexer/watcher.d.ts +51 -0
- package/dist/indexer/watcher.d.ts.map +1 -0
- package/dist/indexer/watcher.js +107 -0
- package/dist/indexer/watcher.js.map +1 -0
- package/dist/kb-server/db.d.ts +241 -0
- package/dist/kb-server/db.d.ts.map +1 -0
- package/dist/kb-server/db.js +659 -0
- package/dist/kb-server/db.js.map +1 -0
- package/dist/kb-server/server.d.ts +35 -0
- package/dist/kb-server/server.d.ts.map +1 -0
- package/dist/kb-server/server.js +240 -0
- package/dist/kb-server/server.js.map +1 -0
- package/dist/kb-server/tools/annotations.d.ts +40 -0
- package/dist/kb-server/tools/annotations.d.ts.map +1 -0
- package/dist/kb-server/tools/annotations.js +35 -0
- package/dist/kb-server/tools/annotations.js.map +1 -0
- package/dist/kb-server/tools/architecture.d.ts +60 -0
- package/dist/kb-server/tools/architecture.d.ts.map +1 -0
- package/dist/kb-server/tools/architecture.js +174 -0
- package/dist/kb-server/tools/architecture.js.map +1 -0
- package/dist/kb-server/tools/blame.d.ts +67 -0
- package/dist/kb-server/tools/blame.d.ts.map +1 -0
- package/dist/kb-server/tools/blame.js +162 -0
- package/dist/kb-server/tools/blame.js.map +1 -0
- package/dist/kb-server/tools/coverage.d.ts +67 -0
- package/dist/kb-server/tools/coverage.d.ts.map +1 -0
- package/dist/kb-server/tools/coverage.js +74 -0
- package/dist/kb-server/tools/coverage.js.map +1 -0
- package/dist/kb-server/tools/graph.d.ts +56 -0
- package/dist/kb-server/tools/graph.d.ts.map +1 -0
- package/dist/kb-server/tools/graph.js +188 -0
- package/dist/kb-server/tools/graph.js.map +1 -0
- package/dist/kb-server/tools/history.d.ts +47 -0
- package/dist/kb-server/tools/history.d.ts.map +1 -0
- package/dist/kb-server/tools/history.js +91 -0
- package/dist/kb-server/tools/history.js.map +1 -0
- package/dist/kb-server/tools/lookup.d.ts +36 -0
- package/dist/kb-server/tools/lookup.d.ts.map +1 -0
- package/dist/kb-server/tools/lookup.js +45 -0
- package/dist/kb-server/tools/lookup.js.map +1 -0
- package/dist/kb-server/tools/metrics.d.ts +73 -0
- package/dist/kb-server/tools/metrics.d.ts.map +1 -0
- package/dist/kb-server/tools/metrics.js +79 -0
- package/dist/kb-server/tools/metrics.js.map +1 -0
- package/dist/kb-server/tools/notes.d.ts +165 -0
- package/dist/kb-server/tools/notes.d.ts.map +1 -0
- package/dist/kb-server/tools/notes.js +175 -0
- package/dist/kb-server/tools/notes.js.map +1 -0
- package/dist/kb-server/tools/routes.d.ts +38 -0
- package/dist/kb-server/tools/routes.d.ts.map +1 -0
- package/dist/kb-server/tools/routes.js +38 -0
- package/dist/kb-server/tools/routes.js.map +1 -0
- package/dist/kb-server/tools/search.d.ts +60 -0
- package/dist/kb-server/tools/search.d.ts.map +1 -0
- package/dist/kb-server/tools/search.js +170 -0
- package/dist/kb-server/tools/search.js.map +1 -0
- package/dist/kb-server/tools/snippet.d.ts +44 -0
- package/dist/kb-server/tools/snippet.d.ts.map +1 -0
- package/dist/kb-server/tools/snippet.js +49 -0
- package/dist/kb-server/tools/snippet.js.map +1 -0
- package/dist/kb-server/tools/test-map.d.ts +38 -0
- package/dist/kb-server/tools/test-map.d.ts.map +1 -0
- package/dist/kb-server/tools/test-map.js +32 -0
- package/dist/kb-server/tools/test-map.js.map +1 -0
- package/dist/kb-server/tools/writeback.d.ts +49 -0
- package/dist/kb-server/tools/writeback.d.ts.map +1 -0
- package/dist/kb-server/tools/writeback.js +68 -0
- package/dist/kb-server/tools/writeback.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module kb-server/server
|
|
3
|
+
*
|
|
4
|
+
* Knowledge-base MCP server.
|
|
5
|
+
*
|
|
6
|
+
* Exports `createKbMcpServer()` for use by `KbServerProcess` (HTTP transport)
|
|
7
|
+
* and retains a standalone CLI entry point for development/debugging.
|
|
8
|
+
*
|
|
9
|
+
* MCP tools exposed:
|
|
10
|
+
* kb_lookup — symbol / file lookup
|
|
11
|
+
* kb_graph — call / import graph queries
|
|
12
|
+
* kb_search — structural, semantic, and fused search
|
|
13
|
+
* kb_test_map — source-file to mapped-test lookup
|
|
14
|
+
* kb_snippet — source-code snippet extraction
|
|
15
|
+
* kb_blame — git blame metadata for file lines
|
|
16
|
+
* kb_metrics — aggregate code metrics
|
|
17
|
+
* kb_writeback — LLM summary write-back
|
|
18
|
+
* kb_history — git commit history queries
|
|
19
|
+
*
|
|
20
|
+
* Standalone usage:
|
|
21
|
+
* node dist/kb-server/server.js --db <path-to-kb.db>
|
|
22
|
+
* tsx src/kb-server/server.ts --db <path-to-kb.db>
|
|
23
|
+
*/
|
|
24
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
25
|
+
import { type Database } from './db.js';
|
|
26
|
+
import { type EmbeddingProvider } from '../indexer/embedder.js';
|
|
27
|
+
/**
|
|
28
|
+
* Create and return a fully-configured `McpServer` with all KB tools registered.
|
|
29
|
+
*
|
|
30
|
+
* @param db Read-only SQLite connection to the knowledge-base.
|
|
31
|
+
* @param dbPath Path to the DB file, needed by `kb_writeback` for write access.
|
|
32
|
+
* @param embedder Optional live embedding provider for semantic/fused search.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createKbMcpServer(db: Database.Database, dbPath: string, embedder?: EmbeddingProvider): McpServer;
|
|
35
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/kb-server/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EASL,KAAK,QAAQ,EACd,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAgC,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA6D9F;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,SAAS,CAkLX"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module kb-server/server
|
|
3
|
+
*
|
|
4
|
+
* Knowledge-base MCP server.
|
|
5
|
+
*
|
|
6
|
+
* Exports `createKbMcpServer()` for use by `KbServerProcess` (HTTP transport)
|
|
7
|
+
* and retains a standalone CLI entry point for development/debugging.
|
|
8
|
+
*
|
|
9
|
+
* MCP tools exposed:
|
|
10
|
+
* kb_lookup — symbol / file lookup
|
|
11
|
+
* kb_graph — call / import graph queries
|
|
12
|
+
* kb_search — structural, semantic, and fused search
|
|
13
|
+
* kb_test_map — source-file to mapped-test lookup
|
|
14
|
+
* kb_snippet — source-code snippet extraction
|
|
15
|
+
* kb_blame — git blame metadata for file lines
|
|
16
|
+
* kb_metrics — aggregate code metrics
|
|
17
|
+
* kb_writeback — LLM summary write-back
|
|
18
|
+
* kb_history — git commit history queries
|
|
19
|
+
*
|
|
20
|
+
* Standalone usage:
|
|
21
|
+
* node dist/kb-server/server.js --db <path-to-kb.db>
|
|
22
|
+
* tsx src/kb-server/server.ts --db <path-to-kb.db>
|
|
23
|
+
*/
|
|
24
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
25
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
26
|
+
import { z } from 'zod';
|
|
27
|
+
import { fileURLToPath } from 'url';
|
|
28
|
+
import { listCommitAuthorStats, listCommitBranchActivity, listCommitCadence, listCommitChurnByFile, listCommitMessagePrefixes, listCommitSchedule, listCommitSizes, openReadOnly, } from './db.js';
|
|
29
|
+
import { getKbMeta } from '../indexer/db.js';
|
|
30
|
+
import { SentenceTransformersProvider } from '../indexer/embedder.js';
|
|
31
|
+
import * as lookup from './tools/lookup.js';
|
|
32
|
+
import * as graph from './tools/graph.js';
|
|
33
|
+
import * as search from './tools/search.js';
|
|
34
|
+
import * as testMap from './tools/test-map.js';
|
|
35
|
+
import * as snippet from './tools/snippet.js';
|
|
36
|
+
import * as blame from './tools/blame.js';
|
|
37
|
+
import * as metrics from './tools/metrics.js';
|
|
38
|
+
import * as coverage from './tools/coverage.js';
|
|
39
|
+
import * as writeback from './tools/writeback.js';
|
|
40
|
+
import * as history from './tools/history.js';
|
|
41
|
+
function handleCommitStats(db, args) {
|
|
42
|
+
const filters = {
|
|
43
|
+
limit: args.limit,
|
|
44
|
+
since: args.since,
|
|
45
|
+
until: args.until,
|
|
46
|
+
author: args.author,
|
|
47
|
+
};
|
|
48
|
+
switch (args.metric) {
|
|
49
|
+
case 'cadence':
|
|
50
|
+
return {
|
|
51
|
+
metric: args.metric,
|
|
52
|
+
day: listCommitCadence(db, 'day', filters),
|
|
53
|
+
week: listCommitCadence(db, 'week', filters),
|
|
54
|
+
month: listCommitCadence(db, 'month', filters),
|
|
55
|
+
};
|
|
56
|
+
case 'size':
|
|
57
|
+
return { metric: args.metric, commits: listCommitSizes(db, filters) };
|
|
58
|
+
case 'churn':
|
|
59
|
+
return { metric: args.metric, files: listCommitChurnByFile(db, filters) };
|
|
60
|
+
case 'authors':
|
|
61
|
+
return { metric: args.metric, authors: listCommitAuthorStats(db, filters) };
|
|
62
|
+
case 'messages':
|
|
63
|
+
return { metric: args.metric, prefixes: listCommitMessagePrefixes(db, filters) };
|
|
64
|
+
case 'schedule':
|
|
65
|
+
return { metric: args.metric, buckets: listCommitSchedule(db, filters) };
|
|
66
|
+
case 'branches':
|
|
67
|
+
return { metric: args.metric, refs: listCommitBranchActivity(db, filters) };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ─── Server factory ───────────────────────────────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Create and return a fully-configured `McpServer` with all KB tools registered.
|
|
73
|
+
*
|
|
74
|
+
* @param db Read-only SQLite connection to the knowledge-base.
|
|
75
|
+
* @param dbPath Path to the DB file, needed by `kb_writeback` for write access.
|
|
76
|
+
* @param embedder Optional live embedding provider for semantic/fused search.
|
|
77
|
+
*/
|
|
78
|
+
export function createKbMcpServer(db, dbPath, embedder) {
|
|
79
|
+
const server = new McpServer({ name: 'lore-kb-server', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
80
|
+
// ── kb_lookup ──────────────────────────────────────────────────────────────
|
|
81
|
+
server.tool(lookup.toolDef.name, lookup.toolDef.description, {
|
|
82
|
+
kind: z.enum(['symbol', 'file']).describe('Whether to look up a symbol or a file.'),
|
|
83
|
+
query: z.string().describe('Symbol name or file path to look up.'),
|
|
84
|
+
branch: z.string().optional().describe('Optional branch to filter results.'),
|
|
85
|
+
}, async (args) => ({
|
|
86
|
+
content: [{ type: 'text', text: JSON.stringify(lookup.handler(db, args)) }],
|
|
87
|
+
}));
|
|
88
|
+
// ── kb_graph ───────────────────────────────────────────────────────────────
|
|
89
|
+
server.tool(graph.toolDef.name, graph.toolDef.description, {
|
|
90
|
+
kind: z
|
|
91
|
+
.enum(['call', 'import', 'module', 'inheritance'])
|
|
92
|
+
.describe('"call", "import", "module", or "inheritance" graph edges.'),
|
|
93
|
+
source_id: z.number().optional().describe('Filter edges by source node id.'),
|
|
94
|
+
limit: z.number().optional().describe('Max edges to return (default 200).'),
|
|
95
|
+
branch: z.string().optional().describe('Optional branch to filter edges.'),
|
|
96
|
+
}, async (args) => ({
|
|
97
|
+
content: [{ type: 'text', text: JSON.stringify(graph.handler(db, args)) }],
|
|
98
|
+
}));
|
|
99
|
+
// ── kb_search ──────────────────────────────────────────────────────────────
|
|
100
|
+
server.tool(search.toolDef.name, search.toolDef.description, {
|
|
101
|
+
query: z.string().describe('Search query.'),
|
|
102
|
+
mode: z
|
|
103
|
+
.enum(['structural', 'semantic', 'fused'])
|
|
104
|
+
.optional()
|
|
105
|
+
.describe('Search mode (default: structural).'),
|
|
106
|
+
limit: z.number().optional().describe('Max results (default 20).'),
|
|
107
|
+
branch: z.string().optional().describe('Optional branch to filter results.'),
|
|
108
|
+
}, async (args) => ({
|
|
109
|
+
content: [{ type: 'text', text: JSON.stringify(await search.handler(db, args, embedder)) }],
|
|
110
|
+
}));
|
|
111
|
+
// ── kb_test_map ─────────────────────────────────────────────────────────────
|
|
112
|
+
server.tool(testMap.toolDef.name, testMap.toolDef.description, {
|
|
113
|
+
source_path: z.string().describe('Source file path to resolve mapped test files for.'),
|
|
114
|
+
branch: z.string().optional().describe('Optional branch to constrain mappings.'),
|
|
115
|
+
}, async (args) => ({
|
|
116
|
+
content: [{ type: 'text', text: JSON.stringify(testMap.handler(db, args)) }],
|
|
117
|
+
}));
|
|
118
|
+
// ── kb_snippet ─────────────────────────────────────────────────────────────
|
|
119
|
+
server.tool(snippet.toolDef.name, snippet.toolDef.description, {
|
|
120
|
+
path: z.string().describe('Absolute file path as stored in the index.'),
|
|
121
|
+
start_line: z.number().optional().describe('First line (1-based, inclusive).'),
|
|
122
|
+
end_line: z.number().optional().describe('Last line (1-based, inclusive).'),
|
|
123
|
+
branch: z.string().optional().describe('Optional branch to disambiguate the file path.'),
|
|
124
|
+
}, async (args) => ({
|
|
125
|
+
content: [{ type: 'text', text: JSON.stringify(snippet.handler(db, args)) }],
|
|
126
|
+
}));
|
|
127
|
+
// ── kb_metrics ─────────────────────────────────────────────────────────────
|
|
128
|
+
server.tool(metrics.toolDef.name, metrics.toolDef.description, {}, async (_args) => ({
|
|
129
|
+
content: [{ type: 'text', text: JSON.stringify(metrics.handler(db, {})) }],
|
|
130
|
+
}));
|
|
131
|
+
// ── kb_coverage ────────────────────────────────────────────────────────────
|
|
132
|
+
server.tool(coverage.toolDef.name, coverage.toolDef.description, {
|
|
133
|
+
symbol_id: z.number().optional().describe('Optional symbol id to fetch exact coverage for.'),
|
|
134
|
+
symbol_name: z.string().optional().describe('Optional symbol name filter (case-insensitive).'),
|
|
135
|
+
path: z.string().optional().describe('Optional file path filter.'),
|
|
136
|
+
branch: z.string().optional().describe('Optional branch filter.'),
|
|
137
|
+
limit: z.number().optional().describe('Maximum symbols to return (default 50).'),
|
|
138
|
+
}, async (args) => ({
|
|
139
|
+
content: [{ type: 'text', text: JSON.stringify(coverage.handler(db, args)) }],
|
|
140
|
+
}));
|
|
141
|
+
// ── kb_blame ───────────────────────────────────────────────────────────────
|
|
142
|
+
server.tool(blame.toolDef.name, blame.toolDef.description, {
|
|
143
|
+
path: z.string().describe('Absolute file path as stored in the index.'),
|
|
144
|
+
line: z.number().optional().describe('Single line to blame (1-based).'),
|
|
145
|
+
start_line: z.number().optional().describe('Range start line (1-based).'),
|
|
146
|
+
end_line: z.number().optional().describe('Range end line (1-based).'),
|
|
147
|
+
ref: z.string().optional().describe('Git ref to blame against (default HEAD).'),
|
|
148
|
+
branch: z.string().optional().describe('Optional branch to disambiguate indexed file path.'),
|
|
149
|
+
}, async (args) => ({
|
|
150
|
+
content: [{ type: 'text', text: JSON.stringify(blame.handler(db, args)) }],
|
|
151
|
+
}));
|
|
152
|
+
// ── kb_writeback ───────────────────────────────────────────────────────────
|
|
153
|
+
server.tool(writeback.toolDef.name, writeback.toolDef.description, {
|
|
154
|
+
symbol_id: z.number().describe('Symbol id to attach the summary to.'),
|
|
155
|
+
summary: z.string().describe('Natural-language summary text.'),
|
|
156
|
+
model: z.string().describe('Model identifier that generated the summary.'),
|
|
157
|
+
branch: z.string().optional().describe('Optional branch to validate the symbol belongs to.'),
|
|
158
|
+
}, async (args) => ({
|
|
159
|
+
content: [
|
|
160
|
+
{ type: 'text', text: JSON.stringify(writeback.handler(dbPath, args)) },
|
|
161
|
+
],
|
|
162
|
+
}));
|
|
163
|
+
// ── kb_history ─────────────────────────────────────────────────────────────
|
|
164
|
+
server.tool(history.toolDef.name, history.toolDef.description, {
|
|
165
|
+
mode: z
|
|
166
|
+
.enum(['file', 'commit', 'author', 'ref', 'recent'])
|
|
167
|
+
.describe('Query mode: file, commit, author, ref, or recent.'),
|
|
168
|
+
query: z.string().optional().describe('File path, commit SHA, author name/email, or ref.'),
|
|
169
|
+
limit: z.number().optional().describe('Max results (default 20, max 200).'),
|
|
170
|
+
}, async (args) => ({
|
|
171
|
+
content: [{ type: 'text', text: JSON.stringify(history.handler(db, args)) }],
|
|
172
|
+
}));
|
|
173
|
+
// ── kb_commit_stats ────────────────────────────────────────────────────────
|
|
174
|
+
server.tool('kb_commit_stats', 'Return git commit analytics for a selected metric.', {
|
|
175
|
+
metric: z
|
|
176
|
+
.enum(['cadence', 'size', 'churn', 'authors', 'messages', 'schedule', 'branches'])
|
|
177
|
+
.describe('Analytics metric to compute.'),
|
|
178
|
+
limit: z.number().optional().describe('Max rows for top-N metrics (default 20, max 200).'),
|
|
179
|
+
since: z.string().optional().describe('Optional ISO date lower bound (inclusive).'),
|
|
180
|
+
until: z.string().optional().describe('Optional ISO date upper bound (inclusive).'),
|
|
181
|
+
author: z.string().optional().describe('Optional author name/email substring filter.'),
|
|
182
|
+
}, async (args) => ({
|
|
183
|
+
content: [{ type: 'text', text: JSON.stringify(handleCommitStats(db, args)) }],
|
|
184
|
+
}));
|
|
185
|
+
return server;
|
|
186
|
+
}
|
|
187
|
+
// ─── Embedding helper ─────────────────────────────────────────────────────────
|
|
188
|
+
/**
|
|
189
|
+
* Read the embedding model stored in `kb_meta` at index time and spin up a
|
|
190
|
+
* `SentenceTransformersProvider` instance for it. Returns `undefined` when no
|
|
191
|
+
* embedding model is recorded in the database.
|
|
192
|
+
*/
|
|
193
|
+
async function buildEmbedder(db) {
|
|
194
|
+
const modelName = getKbMeta(db, 'embedding_model');
|
|
195
|
+
if (!modelName)
|
|
196
|
+
return undefined;
|
|
197
|
+
const provider = new SentenceTransformersProvider(modelName);
|
|
198
|
+
try {
|
|
199
|
+
await provider.init();
|
|
200
|
+
return provider;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Model not available — fall back to structural search only.
|
|
204
|
+
try {
|
|
205
|
+
await provider.dispose();
|
|
206
|
+
}
|
|
207
|
+
catch { /* ignore */ }
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// ─── CLI argument parsing ─────────────────────────────────────────────────────
|
|
212
|
+
function parseArgs() {
|
|
213
|
+
const args = process.argv.slice(2);
|
|
214
|
+
const dbIdx = args.indexOf('--db');
|
|
215
|
+
if (dbIdx === -1 || !args[dbIdx + 1]) {
|
|
216
|
+
console.error('Usage: kb-server --db <path>');
|
|
217
|
+
process.exit(1);
|
|
218
|
+
}
|
|
219
|
+
return { dbPath: args[dbIdx + 1] };
|
|
220
|
+
}
|
|
221
|
+
// ─── Main (standalone CLI) ────────────────────────────────────────────────────
|
|
222
|
+
async function main() {
|
|
223
|
+
const { dbPath } = parseArgs();
|
|
224
|
+
const db = openReadOnly(dbPath);
|
|
225
|
+
const embedder = await buildEmbedder(db);
|
|
226
|
+
const server = createKbMcpServer(db, dbPath, embedder);
|
|
227
|
+
// Connect via stdio transport (standalone/debug mode).
|
|
228
|
+
const transport = new StdioServerTransport();
|
|
229
|
+
await server.connect(transport);
|
|
230
|
+
// Signal readiness to the parent process over stderr.
|
|
231
|
+
process.stderr.write('READY\n');
|
|
232
|
+
}
|
|
233
|
+
// Only run when executed as a standalone script, not when imported as a module.
|
|
234
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
235
|
+
main().catch((err) => {
|
|
236
|
+
console.error('KB server fatal error:', err);
|
|
237
|
+
process.exit(1);
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/kb-server/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module kb-server/tools/annotations
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: return indexed source-code annotations by kind.
|
|
5
|
+
*/
|
|
6
|
+
import type { Database } from '../db.js';
|
|
7
|
+
import { listAnnotations } from '../db.js';
|
|
8
|
+
export declare const toolDef: {
|
|
9
|
+
readonly name: "kb_annotations";
|
|
10
|
+
readonly description: "Return indexed annotations (TODO/FIXME/etc.) by kind, with optional file path filter and result limit.";
|
|
11
|
+
readonly inputSchema: {
|
|
12
|
+
readonly type: "object";
|
|
13
|
+
readonly properties: {
|
|
14
|
+
readonly kind: {
|
|
15
|
+
readonly type: "string";
|
|
16
|
+
readonly enum: readonly ["TODO", "FIXME", "HACK", "XXX", "NOTE", "BUG", "OPTIMIZE"];
|
|
17
|
+
readonly description: "Annotation kind/tag to filter by.";
|
|
18
|
+
};
|
|
19
|
+
readonly path: {
|
|
20
|
+
readonly type: "string";
|
|
21
|
+
readonly description: "Optional exact file path filter.";
|
|
22
|
+
};
|
|
23
|
+
readonly limit: {
|
|
24
|
+
readonly type: "number";
|
|
25
|
+
readonly description: "Maximum number of results to return (default 20).";
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
readonly required: readonly ["kind"];
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export interface AnnotationsArgs {
|
|
32
|
+
kind: 'TODO' | 'FIXME' | 'HACK' | 'XXX' | 'NOTE' | 'BUG' | 'OPTIMIZE';
|
|
33
|
+
path?: string;
|
|
34
|
+
limit?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface AnnotationsResult {
|
|
37
|
+
results: ReturnType<typeof listAnnotations>;
|
|
38
|
+
}
|
|
39
|
+
export declare function handler(db: Database.Database, args: AnnotationsArgs): AnnotationsResult;
|
|
40
|
+
//# sourceMappingURL=annotations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../../src/kb-server/tools/annotations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;CAuBV,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;CAC7C;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,eAAe,GAAG,iBAAiB,CAIvF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module kb-server/tools/annotations
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: return indexed source-code annotations by kind.
|
|
5
|
+
*/
|
|
6
|
+
import { listAnnotations } from '../db.js';
|
|
7
|
+
export const toolDef = {
|
|
8
|
+
name: 'kb_annotations',
|
|
9
|
+
description: 'Return indexed annotations (TODO/FIXME/etc.) by kind, with optional file path filter and result limit.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
kind: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
enum: ['TODO', 'FIXME', 'HACK', 'XXX', 'NOTE', 'BUG', 'OPTIMIZE'],
|
|
16
|
+
description: 'Annotation kind/tag to filter by.',
|
|
17
|
+
},
|
|
18
|
+
path: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'Optional exact file path filter.',
|
|
21
|
+
},
|
|
22
|
+
limit: {
|
|
23
|
+
type: 'number',
|
|
24
|
+
description: 'Maximum number of results to return (default 20).',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
required: ['kind'],
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
export function handler(db, args) {
|
|
31
|
+
return {
|
|
32
|
+
results: listAnnotations(db, args.kind, args.path, args.limit ?? 20),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=annotations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../../src/kb-server/tools/annotations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,wGAAwG;IAC1G,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC;gBACjE,WAAW,EAAE,mCAAmC;aACjD;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAChD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACO,CAAC;AAYX,MAAM,UAAU,OAAO,CAAC,EAAqB,EAAE,IAAqB;IAClE,OAAO;QACL,OAAO,EAAE,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module kb-server/tools/architecture
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: return a high-level architecture view grouped by path depth.
|
|
5
|
+
*/
|
|
6
|
+
import type { Database } from '../db.js';
|
|
7
|
+
export declare const toolDef: {
|
|
8
|
+
readonly name: "kb_architecture";
|
|
9
|
+
readonly description: string;
|
|
10
|
+
readonly inputSchema: {
|
|
11
|
+
readonly type: "object";
|
|
12
|
+
readonly properties: {
|
|
13
|
+
readonly depth: {
|
|
14
|
+
readonly type: "number";
|
|
15
|
+
readonly description: "Optional path depth used to group files into components (default 2).";
|
|
16
|
+
};
|
|
17
|
+
readonly branch: {
|
|
18
|
+
readonly type: "string";
|
|
19
|
+
readonly description: "Optional branch name to filter architecture output.";
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
readonly required: readonly [];
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
export interface ArchitectureArgs {
|
|
26
|
+
depth?: number;
|
|
27
|
+
branch?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ArchitectureComponent {
|
|
30
|
+
component: string;
|
|
31
|
+
branch: string;
|
|
32
|
+
file_count: number;
|
|
33
|
+
symbol_count: number;
|
|
34
|
+
module_count: number;
|
|
35
|
+
}
|
|
36
|
+
export interface ArchitectureEdge {
|
|
37
|
+
source_component: string;
|
|
38
|
+
target_component: string;
|
|
39
|
+
branch: string;
|
|
40
|
+
edge_count: number;
|
|
41
|
+
}
|
|
42
|
+
export interface ArchitectureNode {
|
|
43
|
+
component: string;
|
|
44
|
+
branch: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ArchitectureExternalDep {
|
|
47
|
+
component: string;
|
|
48
|
+
branch: string;
|
|
49
|
+
package: string;
|
|
50
|
+
file_count: number;
|
|
51
|
+
}
|
|
52
|
+
export interface ArchitectureResult {
|
|
53
|
+
components: ArchitectureComponent[];
|
|
54
|
+
edges: ArchitectureEdge[];
|
|
55
|
+
entry_points: ArchitectureNode[];
|
|
56
|
+
leaf_nodes: ArchitectureNode[];
|
|
57
|
+
external_deps: ArchitectureExternalDep[];
|
|
58
|
+
}
|
|
59
|
+
export declare function handler(db: Database.Database, args: ArchitectureArgs): ArchitectureResult;
|
|
60
|
+
//# sourceMappingURL=architecture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../../../src/kb-server/tools/architecture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;CAmBV,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,qBAAqB,EAAE,CAAC;IACpC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,aAAa,EAAE,uBAAuB,EAAE,CAAC;CAC1C;AAUD,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,CAsKzF"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module kb-server/tools/architecture
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: return a high-level architecture view grouped by path depth.
|
|
5
|
+
*/
|
|
6
|
+
export const toolDef = {
|
|
7
|
+
name: 'kb_architecture',
|
|
8
|
+
description: 'Return an architecture overview grouped by path prefix, including component summaries, ' +
|
|
9
|
+
'inter-component edges, entry points, leaf nodes, and external dependency usage.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
depth: {
|
|
14
|
+
type: 'number',
|
|
15
|
+
description: 'Optional path depth used to group files into components (default 2).',
|
|
16
|
+
},
|
|
17
|
+
branch: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'Optional branch name to filter architecture output.',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
required: [],
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
function toComponent(path, depth) {
|
|
26
|
+
const parts = path.split('/').filter(Boolean);
|
|
27
|
+
if (parts.length === 0) {
|
|
28
|
+
return '.';
|
|
29
|
+
}
|
|
30
|
+
return parts.slice(0, depth).join('/');
|
|
31
|
+
}
|
|
32
|
+
export function handler(db, args) {
|
|
33
|
+
const depth = Math.max(1, Math.floor(args.depth ?? 2));
|
|
34
|
+
const fileRows = (args.branch !== undefined
|
|
35
|
+
? db
|
|
36
|
+
.prepare(`SELECT f.id,
|
|
37
|
+
f.path,
|
|
38
|
+
f.branch,
|
|
39
|
+
COUNT(DISTINCT s.id) AS symbol_count,
|
|
40
|
+
COUNT(DISTINCT m.id) AS module_count
|
|
41
|
+
FROM files f
|
|
42
|
+
LEFT JOIN symbols s ON s.file_id = f.id
|
|
43
|
+
LEFT JOIN file_modules fm ON fm.file_id = f.id
|
|
44
|
+
LEFT JOIN modules m ON m.id = fm.module_id
|
|
45
|
+
WHERE f.branch = ?
|
|
46
|
+
GROUP BY f.id, f.path, f.branch`)
|
|
47
|
+
.all(args.branch)
|
|
48
|
+
: db
|
|
49
|
+
.prepare(`SELECT f.id,
|
|
50
|
+
f.path,
|
|
51
|
+
f.branch,
|
|
52
|
+
COUNT(DISTINCT s.id) AS symbol_count,
|
|
53
|
+
COUNT(DISTINCT m.id) AS module_count
|
|
54
|
+
FROM files f
|
|
55
|
+
LEFT JOIN symbols s ON s.file_id = f.id
|
|
56
|
+
LEFT JOIN file_modules fm ON fm.file_id = f.id
|
|
57
|
+
LEFT JOIN modules m ON m.id = fm.module_id
|
|
58
|
+
GROUP BY f.id, f.path, f.branch`)
|
|
59
|
+
.all());
|
|
60
|
+
const filesById = new Map(fileRows.map((row) => [row.id, row]));
|
|
61
|
+
const componentsMap = new Map();
|
|
62
|
+
for (const row of fileRows) {
|
|
63
|
+
const component = toComponent(row.path, depth);
|
|
64
|
+
const key = `${row.branch}\u0000${component}`;
|
|
65
|
+
const existing = componentsMap.get(key);
|
|
66
|
+
if (existing !== undefined) {
|
|
67
|
+
existing.file_count += 1;
|
|
68
|
+
existing.symbol_count += row.symbol_count;
|
|
69
|
+
existing.module_count += row.module_count;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
componentsMap.set(key, {
|
|
73
|
+
component,
|
|
74
|
+
branch: row.branch,
|
|
75
|
+
file_count: 1,
|
|
76
|
+
symbol_count: row.symbol_count,
|
|
77
|
+
module_count: row.module_count,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const importRows = (args.branch !== undefined
|
|
81
|
+
? db
|
|
82
|
+
.prepare(`SELECT fi.file_id, fi.resolved_id, f_src.branch
|
|
83
|
+
FROM file_imports fi
|
|
84
|
+
JOIN files f_src ON f_src.id = fi.file_id
|
|
85
|
+
WHERE f_src.branch = ?`)
|
|
86
|
+
.all(args.branch)
|
|
87
|
+
: db
|
|
88
|
+
.prepare(`SELECT fi.file_id, fi.resolved_id, f_src.branch
|
|
89
|
+
FROM file_imports fi
|
|
90
|
+
JOIN files f_src ON f_src.id = fi.file_id`)
|
|
91
|
+
.all());
|
|
92
|
+
const edgesMap = new Map();
|
|
93
|
+
const inboundByNode = new Map();
|
|
94
|
+
const outboundByNode = new Map();
|
|
95
|
+
for (const row of importRows) {
|
|
96
|
+
if (row.resolved_id === null) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const srcFile = filesById.get(row.file_id);
|
|
100
|
+
const dstFile = filesById.get(row.resolved_id);
|
|
101
|
+
if (srcFile === undefined || dstFile === undefined || srcFile.branch !== dstFile.branch) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const sourceComponent = toComponent(srcFile.path, depth);
|
|
105
|
+
const targetComponent = toComponent(dstFile.path, depth);
|
|
106
|
+
const edgeKey = `${row.branch}\u0000${sourceComponent}\u0000${targetComponent}`;
|
|
107
|
+
const existing = edgesMap.get(edgeKey);
|
|
108
|
+
if (existing !== undefined) {
|
|
109
|
+
existing.edge_count += 1;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
edgesMap.set(edgeKey, {
|
|
113
|
+
source_component: sourceComponent,
|
|
114
|
+
target_component: targetComponent,
|
|
115
|
+
branch: row.branch,
|
|
116
|
+
edge_count: 1,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const sourceNodeKey = `${row.branch}\u0000${sourceComponent}`;
|
|
120
|
+
const targetNodeKey = `${row.branch}\u0000${targetComponent}`;
|
|
121
|
+
outboundByNode.set(sourceNodeKey, (outboundByNode.get(sourceNodeKey) ?? 0) + 1);
|
|
122
|
+
inboundByNode.set(targetNodeKey, (inboundByNode.get(targetNodeKey) ?? 0) + 1);
|
|
123
|
+
}
|
|
124
|
+
const entryPoints = [];
|
|
125
|
+
const leafNodes = [];
|
|
126
|
+
for (const component of componentsMap.values()) {
|
|
127
|
+
const nodeKey = `${component.branch}\u0000${component.component}`;
|
|
128
|
+
if ((inboundByNode.get(nodeKey) ?? 0) === 0) {
|
|
129
|
+
entryPoints.push({ branch: component.branch, component: component.component });
|
|
130
|
+
}
|
|
131
|
+
if ((outboundByNode.get(nodeKey) ?? 0) === 0) {
|
|
132
|
+
leafNodes.push({ branch: component.branch, component: component.component });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const externalDepsRows = (args.branch !== undefined
|
|
136
|
+
? db
|
|
137
|
+
.prepare(`SELECT f.path, f.branch, ed.package, COUNT(DISTINCT f.id) AS file_count
|
|
138
|
+
FROM external_deps ed
|
|
139
|
+
JOIN files f ON f.id = ed.file_id
|
|
140
|
+
WHERE f.branch = ?
|
|
141
|
+
GROUP BY f.path, f.branch, ed.package`)
|
|
142
|
+
.all(args.branch)
|
|
143
|
+
: db
|
|
144
|
+
.prepare(`SELECT f.path, f.branch, ed.package, COUNT(DISTINCT f.id) AS file_count
|
|
145
|
+
FROM external_deps ed
|
|
146
|
+
JOIN files f ON f.id = ed.file_id
|
|
147
|
+
GROUP BY f.path, f.branch, ed.package`)
|
|
148
|
+
.all());
|
|
149
|
+
const externalDepsMap = new Map();
|
|
150
|
+
for (const row of externalDepsRows) {
|
|
151
|
+
const component = toComponent(row.path, depth);
|
|
152
|
+
const depKey = `${row.branch}\u0000${component}\u0000${row.package}`;
|
|
153
|
+
const existing = externalDepsMap.get(depKey);
|
|
154
|
+
if (existing !== undefined) {
|
|
155
|
+
existing.file_count += row.file_count;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
externalDepsMap.set(depKey, {
|
|
159
|
+
component,
|
|
160
|
+
branch: row.branch,
|
|
161
|
+
package: row.package,
|
|
162
|
+
file_count: row.file_count,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
components: Array.from(componentsMap.values()),
|
|
168
|
+
edges: Array.from(edgesMap.values()),
|
|
169
|
+
entry_points: entryPoints,
|
|
170
|
+
leaf_nodes: leafNodes,
|
|
171
|
+
external_deps: Array.from(externalDepsMap.values()),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=architecture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../../src/kb-server/tools/architecture.ts"],"names":[],"mappings":"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"}
|