@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,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module indexer/walker
|
|
3
|
+
*
|
|
4
|
+
* Walks a directory tree using fast-glob and maps each file to a detected
|
|
5
|
+
* programming language based on its extension.
|
|
6
|
+
*/
|
|
7
|
+
import fg from 'fast-glob';
|
|
8
|
+
import { extname } from 'node:path';
|
|
9
|
+
// ─── Extension → Language mapping ────────────────────────────────────────────
|
|
10
|
+
export const EXT_TO_LANG = {
|
|
11
|
+
'.c': 'c',
|
|
12
|
+
'.h': 'c',
|
|
13
|
+
'.rs': 'rust',
|
|
14
|
+
'.py': 'python',
|
|
15
|
+
'.cpp': 'cpp',
|
|
16
|
+
'.cc': 'cpp',
|
|
17
|
+
'.cxx': 'cpp',
|
|
18
|
+
'.hpp': 'cpp',
|
|
19
|
+
'.hxx': 'cpp',
|
|
20
|
+
'.ts': 'typescript',
|
|
21
|
+
'.tsx': 'typescript',
|
|
22
|
+
'.js': 'javascript',
|
|
23
|
+
'.jsx': 'javascript',
|
|
24
|
+
'.mjs': 'javascript',
|
|
25
|
+
'.cjs': 'javascript',
|
|
26
|
+
'.go': 'go',
|
|
27
|
+
'.java': 'java',
|
|
28
|
+
'.cs': 'csharp',
|
|
29
|
+
'.rb': 'ruby',
|
|
30
|
+
'.php': 'php',
|
|
31
|
+
'.swift': 'swift',
|
|
32
|
+
'.kt': 'kotlin',
|
|
33
|
+
'.kts': 'kotlin',
|
|
34
|
+
'.scala': 'scala',
|
|
35
|
+
'.sc': 'scala',
|
|
36
|
+
'.lua': 'lua',
|
|
37
|
+
'.sh': 'bash',
|
|
38
|
+
'.bash': 'bash',
|
|
39
|
+
'.zsh': 'bash',
|
|
40
|
+
'.ex': 'elixir',
|
|
41
|
+
'.exs': 'elixir',
|
|
42
|
+
'.zig': 'zig',
|
|
43
|
+
'.dart': 'dart',
|
|
44
|
+
'.ml': 'ocaml',
|
|
45
|
+
'.mli': 'ocaml',
|
|
46
|
+
'.hs': 'haskell',
|
|
47
|
+
'.jl': 'julia',
|
|
48
|
+
'.elm': 'elm',
|
|
49
|
+
'.m': 'objc',
|
|
50
|
+
'.mm': 'objc',
|
|
51
|
+
};
|
|
52
|
+
// Paths always excluded unless the caller overrides them.
|
|
53
|
+
const DEFAULT_EXCLUDES = [
|
|
54
|
+
'**/node_modules/**',
|
|
55
|
+
'**/.git/**',
|
|
56
|
+
'**/dist/**',
|
|
57
|
+
'**/build/**',
|
|
58
|
+
'**/__pycache__/**',
|
|
59
|
+
'**/target/**',
|
|
60
|
+
];
|
|
61
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* Walks `config.rootDir` and returns every source file that can be mapped
|
|
64
|
+
* to a known programming language.
|
|
65
|
+
*/
|
|
66
|
+
export async function walkFiles(config) {
|
|
67
|
+
const { rootDir, includeGlobs = ['**/*'], excludeGlobs = [], extensions, } = config;
|
|
68
|
+
const patterns = includeGlobs.length > 0 ? includeGlobs : ['**/*'];
|
|
69
|
+
const ignore = [...DEFAULT_EXCLUDES, ...excludeGlobs];
|
|
70
|
+
const paths = await fg(patterns, {
|
|
71
|
+
cwd: rootDir,
|
|
72
|
+
absolute: true,
|
|
73
|
+
onlyFiles: true,
|
|
74
|
+
ignore,
|
|
75
|
+
dot: false,
|
|
76
|
+
});
|
|
77
|
+
const results = [];
|
|
78
|
+
for (const filePath of paths) {
|
|
79
|
+
const ext = extname(filePath).toLowerCase();
|
|
80
|
+
// Skip if caller supplied an explicit extension filter.
|
|
81
|
+
if (extensions && !extensions.includes(ext))
|
|
82
|
+
continue;
|
|
83
|
+
const language = EXT_TO_LANG[ext];
|
|
84
|
+
if (!language)
|
|
85
|
+
continue;
|
|
86
|
+
results.push({ path: filePath, language });
|
|
87
|
+
}
|
|
88
|
+
return results;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Detect the Lore language for a single file path using extension mapping.
|
|
92
|
+
* Returns `undefined` when the extension is unknown or filtered out.
|
|
93
|
+
*/
|
|
94
|
+
export function detectLanguageForPath(filePath, config) {
|
|
95
|
+
const ext = extname(filePath).toLowerCase();
|
|
96
|
+
if (config?.extensions && !config.extensions.includes(ext))
|
|
97
|
+
return undefined;
|
|
98
|
+
return EXT_TO_LANG[ext];
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=walker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/indexer/walker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module indexer/watcher
|
|
3
|
+
*
|
|
4
|
+
* FileWatcher wraps Node's built-in `fs.watch` to detect create/update/delete
|
|
5
|
+
* events in a directory tree, debounces/batches them, and calls
|
|
6
|
+
* `IndexBuilder.update()` with the affected paths.
|
|
7
|
+
*/
|
|
8
|
+
import type { WalkerConfig } from './walker.js';
|
|
9
|
+
/** Configuration options for FileWatcher. */
|
|
10
|
+
export interface WatcherOptions {
|
|
11
|
+
/** Whether the watcher is active. Defaults to `true`. */
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
/** Debounce window in milliseconds before flushing batched changes. Defaults to 300. */
|
|
14
|
+
debounceMs?: number;
|
|
15
|
+
/** Whether to refresh git history during update cycles. */
|
|
16
|
+
history?: boolean | {
|
|
17
|
+
depth?: number;
|
|
18
|
+
all?: boolean;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Watches a directory tree for file changes and triggers incremental index
|
|
23
|
+
* updates via `IndexBuilder.update()`.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* const watcher = new FileWatcher('/path/to/kb.db', { rootDir: '/path/to/src' });
|
|
28
|
+
* watcher.start();
|
|
29
|
+
* // ...later...
|
|
30
|
+
* watcher.stop();
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare class FileWatcher {
|
|
34
|
+
private readonly dbPath;
|
|
35
|
+
private readonly walkerConfig;
|
|
36
|
+
private readonly debounceMs;
|
|
37
|
+
private readonly enabled;
|
|
38
|
+
private readonly history;
|
|
39
|
+
private watcher;
|
|
40
|
+
private pendingPaths;
|
|
41
|
+
private debounceTimer;
|
|
42
|
+
private flushRunning;
|
|
43
|
+
constructor(dbPath: string, walkerConfig: WalkerConfig, options?: WatcherOptions);
|
|
44
|
+
/** Begin watching `walkerConfig.rootDir` recursively for file changes. */
|
|
45
|
+
start(): void;
|
|
46
|
+
/** Stop watching and cancel any pending debounce flush. */
|
|
47
|
+
stop(): void;
|
|
48
|
+
private scheduleFlush;
|
|
49
|
+
private flush;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/indexer/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACvD;AAID;;;;;;;;;;;GAWG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8C;IAEtE,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,GAAE,cAAmB;IAQpF,0EAA0E;IAC1E,KAAK,IAAI,IAAI;IAqBb,2DAA2D;IAC3D,IAAI,IAAI,IAAI;IAaZ,OAAO,CAAC,aAAa;YAOP,KAAK;CAqCpB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module indexer/watcher
|
|
3
|
+
*
|
|
4
|
+
* FileWatcher wraps Node's built-in `fs.watch` to detect create/update/delete
|
|
5
|
+
* events in a directory tree, debounces/batches them, and calls
|
|
6
|
+
* `IndexBuilder.update()` with the affected paths.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import { IndexBuilder } from './index.js';
|
|
10
|
+
// ─── FileWatcher ──────────────────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Watches a directory tree for file changes and triggers incremental index
|
|
13
|
+
* updates via `IndexBuilder.update()`.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const watcher = new FileWatcher('/path/to/kb.db', { rootDir: '/path/to/src' });
|
|
18
|
+
* watcher.start();
|
|
19
|
+
* // ...later...
|
|
20
|
+
* watcher.stop();
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class FileWatcher {
|
|
24
|
+
dbPath;
|
|
25
|
+
walkerConfig;
|
|
26
|
+
debounceMs;
|
|
27
|
+
enabled;
|
|
28
|
+
history;
|
|
29
|
+
watcher = null;
|
|
30
|
+
pendingPaths = new Set();
|
|
31
|
+
debounceTimer = null;
|
|
32
|
+
flushRunning = false;
|
|
33
|
+
constructor(dbPath, walkerConfig, options = {}) {
|
|
34
|
+
this.dbPath = dbPath;
|
|
35
|
+
this.walkerConfig = walkerConfig;
|
|
36
|
+
this.debounceMs = options.debounceMs ?? 300;
|
|
37
|
+
this.enabled = options.enabled ?? true;
|
|
38
|
+
this.history = options.history ?? false;
|
|
39
|
+
}
|
|
40
|
+
/** Begin watching `walkerConfig.rootDir` recursively for file changes. */
|
|
41
|
+
start() {
|
|
42
|
+
if (!this.enabled || this.watcher)
|
|
43
|
+
return;
|
|
44
|
+
this.watcher = fs.watch(this.walkerConfig.rootDir, { recursive: true }, (event, filename) => {
|
|
45
|
+
if (!filename)
|
|
46
|
+
return;
|
|
47
|
+
const absPath = `${this.walkerConfig.rootDir}/${filename}`;
|
|
48
|
+
this.pendingPaths.add(absPath);
|
|
49
|
+
this.scheduleFlush();
|
|
50
|
+
});
|
|
51
|
+
this.watcher.on('error', (err) => {
|
|
52
|
+
process.stderr.write(JSON.stringify({ level: 'error', source: 'FileWatcher', message: String(err) }) + '\n');
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/** Stop watching and cancel any pending debounce flush. */
|
|
56
|
+
stop() {
|
|
57
|
+
if (this.debounceTimer !== null) {
|
|
58
|
+
clearTimeout(this.debounceTimer);
|
|
59
|
+
this.debounceTimer = null;
|
|
60
|
+
}
|
|
61
|
+
if (this.watcher) {
|
|
62
|
+
this.watcher.close();
|
|
63
|
+
this.watcher = null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// ─── Private helpers ──────────────────────────────────────────────────────
|
|
67
|
+
scheduleFlush() {
|
|
68
|
+
if (this.debounceTimer !== null) {
|
|
69
|
+
clearTimeout(this.debounceTimer);
|
|
70
|
+
}
|
|
71
|
+
this.debounceTimer = setTimeout(() => this.flush(), this.debounceMs);
|
|
72
|
+
}
|
|
73
|
+
async flush() {
|
|
74
|
+
this.debounceTimer = null;
|
|
75
|
+
if (this.flushRunning)
|
|
76
|
+
return;
|
|
77
|
+
this.flushRunning = true;
|
|
78
|
+
try {
|
|
79
|
+
const paths = [...this.pendingPaths];
|
|
80
|
+
this.pendingPaths.clear();
|
|
81
|
+
if (paths.length === 0)
|
|
82
|
+
return;
|
|
83
|
+
const builder = new IndexBuilder(this.dbPath, this.walkerConfig, undefined, {
|
|
84
|
+
history: this.history,
|
|
85
|
+
});
|
|
86
|
+
let errorCount = 0;
|
|
87
|
+
try {
|
|
88
|
+
await builder.update(paths);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
errorCount++;
|
|
92
|
+
process.stderr.write(JSON.stringify({ level: 'error', source: 'FileWatcher', message: String(err) }) + '\n');
|
|
93
|
+
}
|
|
94
|
+
process.stderr.write(JSON.stringify({
|
|
95
|
+
level: 'info',
|
|
96
|
+
source: 'FileWatcher',
|
|
97
|
+
message: 'refresh cycle complete',
|
|
98
|
+
files: paths.length,
|
|
99
|
+
errors: errorCount,
|
|
100
|
+
}) + '\n');
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
this.flushRunning = false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/indexer/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module kb-server/db
|
|
3
|
+
*
|
|
4
|
+
* Read-only SQLite connection wrapper for the KB MCP server.
|
|
5
|
+
* All MCP tool files use `openReadOnly()` to open the knowledge-base database.
|
|
6
|
+
*/
|
|
7
|
+
import Database from 'better-sqlite3';
|
|
8
|
+
export type { Database };
|
|
9
|
+
/**
|
|
10
|
+
* Opens the knowledge-base database at `path` in read-only mode.
|
|
11
|
+
* Foreign-key enforcement is enabled for consistency.
|
|
12
|
+
*/
|
|
13
|
+
export declare function openReadOnly(path: string): Database.Database;
|
|
14
|
+
export interface SymbolRow {
|
|
15
|
+
id: number;
|
|
16
|
+
file_id: number;
|
|
17
|
+
name: string;
|
|
18
|
+
kind: string;
|
|
19
|
+
start_line: number;
|
|
20
|
+
end_line: number;
|
|
21
|
+
signature: string | null;
|
|
22
|
+
doc_comment: string | null;
|
|
23
|
+
line_count: number | null;
|
|
24
|
+
param_count: number | null;
|
|
25
|
+
cyclomatic: number | null;
|
|
26
|
+
max_nesting: number | null;
|
|
27
|
+
}
|
|
28
|
+
/** Fetch a single symbol by primary key. Returns `undefined` if not found. */
|
|
29
|
+
export declare function getSymbolById(db: Database.Database, id: number): SymbolRow | undefined;
|
|
30
|
+
/** Fetch all symbols whose name matches the given string (case-insensitive). */
|
|
31
|
+
export declare function getSymbolsByName(db: Database.Database, name: string, branch?: string): SymbolRow[];
|
|
32
|
+
/** Return all symbols, optionally limited to `limit` rows. */
|
|
33
|
+
export declare function listSymbols(db: Database.Database, limit?: number, branch?: string): SymbolRow[];
|
|
34
|
+
export interface FileRow {
|
|
35
|
+
id: number;
|
|
36
|
+
path: string;
|
|
37
|
+
branch: string;
|
|
38
|
+
language: string;
|
|
39
|
+
size_bytes: number;
|
|
40
|
+
last_hash: string | null;
|
|
41
|
+
indexed_at: number;
|
|
42
|
+
}
|
|
43
|
+
/** Fetch a single file row by primary key. */
|
|
44
|
+
export declare function getFileById(db: Database.Database, id: number, branch?: string): FileRow | undefined;
|
|
45
|
+
/** Fetch a single file row by its path. */
|
|
46
|
+
export declare function getFileByPath(db: Database.Database, path: string, branch?: string): FileRow | undefined;
|
|
47
|
+
/** Return all indexed files, optionally limited to `limit` rows. */
|
|
48
|
+
export declare function listFiles(db: Database.Database, limit?: number, branch?: string): FileRow[];
|
|
49
|
+
export interface TestMappingRow {
|
|
50
|
+
test_path: string;
|
|
51
|
+
confidence: string;
|
|
52
|
+
}
|
|
53
|
+
/** Return mapped tests (path + confidence) for a source file path. */
|
|
54
|
+
export declare function listTestMappingsBySourcePath(db: Database.Database, sourcePath: string, branch?: string): TestMappingRow[];
|
|
55
|
+
export interface ConfigEntryRefRow {
|
|
56
|
+
path: string;
|
|
57
|
+
branch: string;
|
|
58
|
+
line: number;
|
|
59
|
+
}
|
|
60
|
+
export interface ConfigEntryRow {
|
|
61
|
+
id: number;
|
|
62
|
+
file_id: number;
|
|
63
|
+
key: string;
|
|
64
|
+
value: string | null;
|
|
65
|
+
default_value: string | null;
|
|
66
|
+
inferred_type: string | null;
|
|
67
|
+
required: number;
|
|
68
|
+
description: string | null;
|
|
69
|
+
kind: string;
|
|
70
|
+
file_path: string;
|
|
71
|
+
file_branch: string;
|
|
72
|
+
references: ConfigEntryRefRow[];
|
|
73
|
+
}
|
|
74
|
+
export interface ListConfigEntriesArgs {
|
|
75
|
+
key?: string;
|
|
76
|
+
filePath?: string;
|
|
77
|
+
kind?: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Return config entries joined with their config-file metadata and usage references.
|
|
81
|
+
* Results are ordered deterministically by key and file path.
|
|
82
|
+
*/
|
|
83
|
+
export declare function listConfigEntries(db: Database.Database, args?: ListConfigEntriesArgs): ConfigEntryRow[];
|
|
84
|
+
export interface AnnotationRow {
|
|
85
|
+
file_path: string;
|
|
86
|
+
line: number;
|
|
87
|
+
kind: string;
|
|
88
|
+
text: string;
|
|
89
|
+
symbol_name: string | null;
|
|
90
|
+
symbol_kind: string | null;
|
|
91
|
+
}
|
|
92
|
+
/** Return annotations filtered by kind, with optional path filter and row limit. */
|
|
93
|
+
export declare function listAnnotations(db: Database.Database, kind: string, path?: string, limit?: number): AnnotationRow[];
|
|
94
|
+
export interface ApiRouteRow {
|
|
95
|
+
method: string;
|
|
96
|
+
path: string;
|
|
97
|
+
handler: string;
|
|
98
|
+
file: string;
|
|
99
|
+
line: number;
|
|
100
|
+
framework: string;
|
|
101
|
+
}
|
|
102
|
+
export interface ListApiRoutesArgs {
|
|
103
|
+
method?: string;
|
|
104
|
+
pathPrefix?: string;
|
|
105
|
+
framework?: string;
|
|
106
|
+
}
|
|
107
|
+
export declare function listApiRoutes(db: Database.Database, args?: ListApiRoutesArgs): ApiRouteRow[];
|
|
108
|
+
export interface CommitRow {
|
|
109
|
+
sha: string;
|
|
110
|
+
author: string;
|
|
111
|
+
author_email: string;
|
|
112
|
+
timestamp: number;
|
|
113
|
+
message: string;
|
|
114
|
+
parents: string;
|
|
115
|
+
}
|
|
116
|
+
export interface CommitFileRow {
|
|
117
|
+
commit_sha: string;
|
|
118
|
+
file_path: string;
|
|
119
|
+
change_type: string;
|
|
120
|
+
insertions: number | null;
|
|
121
|
+
deletions: number | null;
|
|
122
|
+
}
|
|
123
|
+
export interface CommitRefRow {
|
|
124
|
+
commit_sha: string;
|
|
125
|
+
ref_name: string;
|
|
126
|
+
ref_type: string;
|
|
127
|
+
}
|
|
128
|
+
export interface CommitStatsFilters {
|
|
129
|
+
since?: string;
|
|
130
|
+
until?: string;
|
|
131
|
+
author?: string;
|
|
132
|
+
limit?: number;
|
|
133
|
+
}
|
|
134
|
+
export interface CommitCadenceRow {
|
|
135
|
+
bucket: string;
|
|
136
|
+
commits: number;
|
|
137
|
+
}
|
|
138
|
+
export interface CommitSizeRow {
|
|
139
|
+
sha: string;
|
|
140
|
+
author: string;
|
|
141
|
+
author_email: string;
|
|
142
|
+
timestamp: number;
|
|
143
|
+
insertions: number;
|
|
144
|
+
deletions: number;
|
|
145
|
+
}
|
|
146
|
+
export interface CommitChurnFileRow {
|
|
147
|
+
file_path: string;
|
|
148
|
+
commit_count: number;
|
|
149
|
+
total_insertions: number;
|
|
150
|
+
total_deletions: number;
|
|
151
|
+
total_churn: number;
|
|
152
|
+
}
|
|
153
|
+
export interface CommitAuthorStatsRow {
|
|
154
|
+
author: string;
|
|
155
|
+
author_email: string;
|
|
156
|
+
commit_count: number;
|
|
157
|
+
total_insertions: number;
|
|
158
|
+
total_deletions: number;
|
|
159
|
+
total_churn: number;
|
|
160
|
+
}
|
|
161
|
+
export interface CommitMessagePrefixRow {
|
|
162
|
+
prefix: string;
|
|
163
|
+
count: number;
|
|
164
|
+
}
|
|
165
|
+
export interface CommitScheduleRow {
|
|
166
|
+
day_of_week: number;
|
|
167
|
+
hour_of_day: number;
|
|
168
|
+
commits: number;
|
|
169
|
+
}
|
|
170
|
+
export interface CommitBranchActivityRow {
|
|
171
|
+
ref_name: string;
|
|
172
|
+
ref_type: string;
|
|
173
|
+
commits: number;
|
|
174
|
+
}
|
|
175
|
+
/** Fetch a single commit by its SHA (full or prefix match). */
|
|
176
|
+
export declare function getCommitBySha(db: Database.Database, sha: string): CommitRow | undefined;
|
|
177
|
+
/** Return the most recent commits ordered by timestamp DESC, limited to `limit` rows. */
|
|
178
|
+
export declare function listRecentCommits(db: Database.Database, limit?: number): CommitRow[];
|
|
179
|
+
/** Return commits that touched the given file path, ordered by timestamp DESC. */
|
|
180
|
+
export declare function listCommitsByFile(db: Database.Database, filePath: string, limit?: number): CommitRow[];
|
|
181
|
+
/** Return commits filtered by author name or email, ordered by timestamp DESC. */
|
|
182
|
+
export declare function listCommitsByAuthor(db: Database.Database, author: string, limit?: number): CommitRow[];
|
|
183
|
+
/** Return all files touched by a given commit SHA. */
|
|
184
|
+
export declare function listCommitFiles(db: Database.Database, commitSha: string): CommitFileRow[];
|
|
185
|
+
/** Return refs (branches/tags) that currently point to the given commit SHA. */
|
|
186
|
+
export declare function listCommitRefs(db: Database.Database, commitSha: string): CommitRefRow[];
|
|
187
|
+
/** Return commits associated with a branch/tag ref name or prefix. */
|
|
188
|
+
export declare function listCommitsByRef(db: Database.Database, refQuery: string, limit?: number): CommitRow[];
|
|
189
|
+
export declare function listCommitCadence(db: Database.Database, granularity: 'day' | 'week' | 'month', filters?: CommitStatsFilters): CommitCadenceRow[];
|
|
190
|
+
export declare function listCommitSizes(db: Database.Database, filters?: CommitStatsFilters): CommitSizeRow[];
|
|
191
|
+
export declare function listCommitChurnByFile(db: Database.Database, filters?: CommitStatsFilters): CommitChurnFileRow[];
|
|
192
|
+
export declare function listCommitAuthorStats(db: Database.Database, filters?: CommitStatsFilters): CommitAuthorStatsRow[];
|
|
193
|
+
export declare function listCommitMessagePrefixes(db: Database.Database, filters?: CommitStatsFilters): CommitMessagePrefixRow[];
|
|
194
|
+
export declare function listCommitSchedule(db: Database.Database, filters?: CommitStatsFilters): CommitScheduleRow[];
|
|
195
|
+
export declare function listCommitBranchActivity(db: Database.Database, filters?: CommitStatsFilters): CommitBranchActivityRow[];
|
|
196
|
+
export interface CoverageRunRow {
|
|
197
|
+
id: number;
|
|
198
|
+
commit_sha: string;
|
|
199
|
+
source_path: string;
|
|
200
|
+
format: string;
|
|
201
|
+
ingested_at: number;
|
|
202
|
+
source_mtime: number | null;
|
|
203
|
+
}
|
|
204
|
+
export interface CoverageStaleness {
|
|
205
|
+
coverage_commit: string | null;
|
|
206
|
+
current_commit: string | null;
|
|
207
|
+
commits_behind: number;
|
|
208
|
+
stale: boolean;
|
|
209
|
+
}
|
|
210
|
+
export interface CoverageTotals {
|
|
211
|
+
lines_found: number;
|
|
212
|
+
lines_hit: number;
|
|
213
|
+
coverage_percent: number | null;
|
|
214
|
+
}
|
|
215
|
+
export interface SymbolCoverageAggregate {
|
|
216
|
+
symbol_id: number;
|
|
217
|
+
symbol_name: string;
|
|
218
|
+
file_path: string;
|
|
219
|
+
start_line: number;
|
|
220
|
+
end_line: number;
|
|
221
|
+
total_lines: number;
|
|
222
|
+
covered_lines: number;
|
|
223
|
+
uncovered_lines: number[];
|
|
224
|
+
coverage_percent: number | null;
|
|
225
|
+
}
|
|
226
|
+
/** Return the most recent coverage ingestion run. */
|
|
227
|
+
export declare function getLatestCoverageRun(db: Database.Database): CoverageRunRow | undefined;
|
|
228
|
+
/** Return staleness metadata comparing latest coverage run commit against indexed history. */
|
|
229
|
+
export declare function getCoverageStaleness(db: Database.Database): CoverageStaleness;
|
|
230
|
+
/** Return global line totals for the most recent coverage run. */
|
|
231
|
+
export declare function getLatestCoverageTotals(db: Database.Database): CoverageTotals | undefined;
|
|
232
|
+
/** Return symbol-level coverage aggregates computed from the latest coverage run. */
|
|
233
|
+
export declare function getSymbolCoverageAggregates(db: Database.Database, options?: {
|
|
234
|
+
symbolIds?: number[];
|
|
235
|
+
path?: string;
|
|
236
|
+
branch?: string;
|
|
237
|
+
limit?: number;
|
|
238
|
+
}): SymbolCoverageAggregate[];
|
|
239
|
+
/** Return symbol coverage percentages for selected symbol ids from latest coverage run. */
|
|
240
|
+
export declare function getCoveragePercentBySymbolIds(db: Database.Database, symbolIds: number[], branch?: string): Map<number, number | null>;
|
|
241
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/kb-server/db.ts"],"names":[],"mappings":"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"}
|