@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,458 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import {
|
|
4
|
+
check,
|
|
5
|
+
find
|
|
6
|
+
} from "@kb/tools";
|
|
7
|
+
function extractNumFlag(args, flag, defaultValue) {
|
|
8
|
+
const idx = args.indexOf(flag);
|
|
9
|
+
if (idx === -1 || idx + 1 >= args.length) return defaultValue;
|
|
10
|
+
const val = Number.parseInt(args.splice(idx, 2)[1], 10);
|
|
11
|
+
return Number.isNaN(val) ? defaultValue : val;
|
|
12
|
+
}
|
|
13
|
+
function extractStrFlag(args, flag, defaultValue) {
|
|
14
|
+
const idx = args.indexOf(flag);
|
|
15
|
+
if (idx === -1 || idx + 1 >= args.length) return defaultValue;
|
|
16
|
+
return args.splice(idx, 2)[1];
|
|
17
|
+
}
|
|
18
|
+
function extractBoolFlag(args, flag) {
|
|
19
|
+
const idx = args.indexOf(flag);
|
|
20
|
+
if (idx === -1) return false;
|
|
21
|
+
args.splice(idx, 1);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
async function readStdin() {
|
|
25
|
+
if (process.stdin.isTTY) return "";
|
|
26
|
+
const chunks = [];
|
|
27
|
+
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
28
|
+
return Buffer.concat(chunks).toString("utf-8");
|
|
29
|
+
}
|
|
30
|
+
async function readInput(filePath) {
|
|
31
|
+
if (filePath) return readFile(resolve(filePath), "utf-8");
|
|
32
|
+
return readStdin();
|
|
33
|
+
}
|
|
34
|
+
function splitCsv(value) {
|
|
35
|
+
return value.split(",").map((item) => item.trim()).filter(Boolean);
|
|
36
|
+
}
|
|
37
|
+
function parseBatchPayload(input) {
|
|
38
|
+
const parsed = JSON.parse(input);
|
|
39
|
+
if (Array.isArray(parsed)) {
|
|
40
|
+
return { operations: validateBatchOperations(parsed) };
|
|
41
|
+
}
|
|
42
|
+
if (parsed && typeof parsed === "object" && "operations" in parsed) {
|
|
43
|
+
const payload = parsed;
|
|
44
|
+
return {
|
|
45
|
+
operations: validateBatchOperations(payload.operations),
|
|
46
|
+
concurrency: typeof payload.concurrency === "number" ? payload.concurrency : void 0
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
throw new Error(
|
|
50
|
+
"Batch input must be an array of operations or an object with an operations array."
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
function validateBatchOperations(value) {
|
|
54
|
+
if (!Array.isArray(value)) {
|
|
55
|
+
throw new Error("Batch operations must be an array.");
|
|
56
|
+
}
|
|
57
|
+
return value.map((item, index) => {
|
|
58
|
+
if (!item || typeof item !== "object") {
|
|
59
|
+
throw new Error(`Batch operation at index ${index} must be an object.`);
|
|
60
|
+
}
|
|
61
|
+
const candidate = item;
|
|
62
|
+
if (typeof candidate.id !== "string" || candidate.id.length === 0) {
|
|
63
|
+
throw new Error(`Batch operation at index ${index} is missing a valid id.`);
|
|
64
|
+
}
|
|
65
|
+
if (typeof candidate.type !== "string" || candidate.type.length === 0) {
|
|
66
|
+
throw new Error(`Batch operation ${candidate.id} is missing a valid type.`);
|
|
67
|
+
}
|
|
68
|
+
if (!candidate.args || typeof candidate.args !== "object" || Array.isArray(candidate.args)) {
|
|
69
|
+
throw new Error(`Batch operation ${candidate.id} must include an args object.`);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
id: candidate.id,
|
|
73
|
+
type: candidate.type,
|
|
74
|
+
args: candidate.args
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function formatFocusRanges(ranges) {
|
|
79
|
+
return ranges.map((range) => {
|
|
80
|
+
const heading = range.heading ? ` ${range.heading}` : "";
|
|
81
|
+
return `${range.start}-${range.end}${heading}`;
|
|
82
|
+
}).join(", ");
|
|
83
|
+
}
|
|
84
|
+
function printParsedOutput(result) {
|
|
85
|
+
switch (result.tool) {
|
|
86
|
+
case "tsc":
|
|
87
|
+
case "biome": {
|
|
88
|
+
console.log(`${result.tool} errors: ${result.errors.length}`);
|
|
89
|
+
for (const error of result.errors) {
|
|
90
|
+
const location = [error.line, error.column].filter((value) => value !== void 0).join(":");
|
|
91
|
+
const prefix = location ? `${error.file}:${location}` : error.file;
|
|
92
|
+
const code = error.code ? ` ${error.code}` : "";
|
|
93
|
+
console.log(`- ${prefix} [${error.severity}${code}] ${error.message}`);
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
case "vitest":
|
|
98
|
+
console.log("Vitest summary");
|
|
99
|
+
console.log(` Passed: ${result.summary.passed}`);
|
|
100
|
+
console.log(` Failed: ${result.summary.failed}`);
|
|
101
|
+
console.log(` Skipped: ${result.summary.skipped}`);
|
|
102
|
+
if (result.summary.duration !== void 0) {
|
|
103
|
+
console.log(` Duration: ${result.summary.duration}ms`);
|
|
104
|
+
}
|
|
105
|
+
for (const test of result.summary.tests) {
|
|
106
|
+
if (test.status !== "fail") continue;
|
|
107
|
+
console.log(`- ${test.name}${test.file ? ` (${test.file})` : ""}`);
|
|
108
|
+
if (test.error) console.log(` ${test.error}`);
|
|
109
|
+
}
|
|
110
|
+
return;
|
|
111
|
+
case "git-status":
|
|
112
|
+
console.log(`Branch: ${result.status.branch ?? "unknown"}`);
|
|
113
|
+
console.log(`Staged: ${result.status.staged.length}`);
|
|
114
|
+
for (const item of result.status.staged) console.log(` ${item.status} ${item.file}`);
|
|
115
|
+
console.log(`Unstaged: ${result.status.unstaged.length}`);
|
|
116
|
+
for (const item of result.status.unstaged) console.log(` ${item.status} ${item.file}`);
|
|
117
|
+
console.log(`Untracked: ${result.status.untracked.length}`);
|
|
118
|
+
for (const item of result.status.untracked) console.log(` ?? ${item}`);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function printCheckResult(result) {
|
|
123
|
+
console.log(`Overall: ${result.passed ? "passed" : "failed"}`);
|
|
124
|
+
printCheckSection("tsc", result.tsc.passed, result.tsc.errors);
|
|
125
|
+
printCheckSection("biome", result.biome.passed, result.biome.errors);
|
|
126
|
+
}
|
|
127
|
+
function printCheckSection(label, passed, errors) {
|
|
128
|
+
console.log(`${label}: ${passed ? "passed" : `${errors.length} issue(s)`}`);
|
|
129
|
+
for (const error of errors) {
|
|
130
|
+
const location = [error.line, error.column].filter((value) => value !== void 0).join(":");
|
|
131
|
+
const prefix = location ? `${error.file}:${location}` : error.file;
|
|
132
|
+
const code = error.code ? ` ${error.code}` : "";
|
|
133
|
+
console.log(` - ${prefix} [${error.severity}${code}] ${error.message}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function printTestRunResult(result) {
|
|
137
|
+
console.log(`Vitest: ${result.passed ? "passed" : "failed"}`);
|
|
138
|
+
console.log(` Duration: ${result.durationMs}ms`);
|
|
139
|
+
console.log(` Passed: ${result.summary.passed}`);
|
|
140
|
+
console.log(` Failed: ${result.summary.failed}`);
|
|
141
|
+
console.log(` Skipped: ${result.summary.skipped}`);
|
|
142
|
+
if (result.summary.suites !== void 0) {
|
|
143
|
+
console.log(` Suites: ${result.summary.suites}`);
|
|
144
|
+
}
|
|
145
|
+
const failedTests = result.summary.tests.filter((test) => test.status === "fail");
|
|
146
|
+
if (failedTests.length === 0) return;
|
|
147
|
+
console.log("Failed tests:");
|
|
148
|
+
for (const test of failedTests) {
|
|
149
|
+
console.log(` - ${test.name}${test.file ? ` (${test.file})` : ""}`);
|
|
150
|
+
if (test.error) console.log(` ${test.error}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function printGitContext(result) {
|
|
154
|
+
console.log(`Branch: ${result.branch}`);
|
|
155
|
+
console.log(`Staged: ${result.status.staged.length}`);
|
|
156
|
+
for (const file of result.status.staged) console.log(` - ${file}`);
|
|
157
|
+
console.log(`Modified: ${result.status.modified.length}`);
|
|
158
|
+
for (const file of result.status.modified) console.log(` - ${file}`);
|
|
159
|
+
console.log(`Untracked: ${result.status.untracked.length}`);
|
|
160
|
+
for (const file of result.status.untracked) console.log(` - ${file}`);
|
|
161
|
+
console.log("");
|
|
162
|
+
console.log("Recent commits:");
|
|
163
|
+
if (result.recentCommits.length === 0) {
|
|
164
|
+
console.log(" none");
|
|
165
|
+
} else {
|
|
166
|
+
for (const commit of result.recentCommits) {
|
|
167
|
+
console.log(` - ${commit.hash} ${commit.message}`);
|
|
168
|
+
console.log(` ${commit.author} @ ${commit.date}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (result.diff) {
|
|
172
|
+
console.log("");
|
|
173
|
+
console.log("Diff stat:");
|
|
174
|
+
console.log(result.diff);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function printDiffFiles(files) {
|
|
178
|
+
if (files.length === 0) {
|
|
179
|
+
console.log("No diff files found.");
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
for (const file of files) {
|
|
183
|
+
const renameInfo = file.oldPath ? ` (from ${file.oldPath})` : "";
|
|
184
|
+
console.log(`${file.path}${renameInfo}`);
|
|
185
|
+
console.log(` Status: ${file.status}`);
|
|
186
|
+
console.log(` Changes: +${file.additions} -${file.deletions}`);
|
|
187
|
+
console.log(` Hunks: ${file.hunks.length}`);
|
|
188
|
+
for (const hunk of file.hunks) {
|
|
189
|
+
const header = hunk.header ? ` ${hunk.header}` : "";
|
|
190
|
+
console.log(
|
|
191
|
+
` @@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@${header}`
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function printTraceResult(result) {
|
|
197
|
+
console.log(`Start: ${result.start}`);
|
|
198
|
+
console.log(`Direction: ${result.direction}`);
|
|
199
|
+
console.log(`Depth reached: ${result.depth}`);
|
|
200
|
+
console.log(`Nodes: ${result.nodes.length}`);
|
|
201
|
+
if (result.nodes.length === 0) {
|
|
202
|
+
console.log("No trace nodes found.");
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
for (const node of result.nodes) {
|
|
206
|
+
console.log(` - [${node.relationship}] ${node.path}:${node.line} ${node.symbol}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function printExamplesResult(result) {
|
|
210
|
+
console.log(`Query: ${result.query}`);
|
|
211
|
+
console.log(`Examples: ${result.examples.length} shown (${result.totalFound} total)`);
|
|
212
|
+
if (result.examples.length === 0) {
|
|
213
|
+
console.log("No matching examples found.");
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
for (const example of result.examples) {
|
|
217
|
+
console.log("");
|
|
218
|
+
console.log(`${example.path}:${example.startLine}-${example.endLine}`);
|
|
219
|
+
console.log(` Context: ${example.context}`);
|
|
220
|
+
console.log(` Relevance: ${(example.relevance * 100).toFixed(1)}%`);
|
|
221
|
+
for (const line of example.content.split("\n")) {
|
|
222
|
+
console.log(` ${line}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function printManagedProcess(info) {
|
|
227
|
+
console.log(info.id);
|
|
228
|
+
console.log(` Command: ${info.command}${info.args.length > 0 ? ` ${info.args.join(" ")}` : ""}`);
|
|
229
|
+
console.log(` PID: ${info.pid ?? "unknown"}`);
|
|
230
|
+
console.log(` Status: ${info.status}`);
|
|
231
|
+
console.log(` Started: ${info.startedAt}`);
|
|
232
|
+
if (info.exitCode !== void 0) console.log(` Exit code: ${info.exitCode}`);
|
|
233
|
+
console.log(` Logs: ${info.logs.length}`);
|
|
234
|
+
}
|
|
235
|
+
function printDeadSymbolsResult(result) {
|
|
236
|
+
console.log(`Exports scanned: ${result.totalExports}`);
|
|
237
|
+
console.log(`Potentially dead: ${result.totalDead}`);
|
|
238
|
+
if (result.deadSymbols.length === 0) {
|
|
239
|
+
console.log("No dead symbols found.");
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
for (const symbolInfo of result.deadSymbols) {
|
|
243
|
+
console.log(` - ${symbolInfo.path}:${symbolInfo.line} ${symbolInfo.kind} ${symbolInfo.name}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function printFileSummary(summary) {
|
|
247
|
+
console.log(summary.path);
|
|
248
|
+
console.log(` Language: ${summary.language}`);
|
|
249
|
+
console.log(` Lines: ${summary.lines}`);
|
|
250
|
+
console.log(` Estimated tokens: ~${summary.estimatedTokens}`);
|
|
251
|
+
console.log("");
|
|
252
|
+
printSection("Imports", summary.imports);
|
|
253
|
+
printSection("Exports", summary.exports);
|
|
254
|
+
printSection(
|
|
255
|
+
"Functions",
|
|
256
|
+
summary.functions.map(
|
|
257
|
+
(item) => `${item.name} @ line ${item.line}${item.exported ? " [exported]" : ""}`
|
|
258
|
+
)
|
|
259
|
+
);
|
|
260
|
+
printSection(
|
|
261
|
+
"Classes",
|
|
262
|
+
summary.classes.map(
|
|
263
|
+
(item) => `${item.name} @ line ${item.line}${item.exported ? " [exported]" : ""}`
|
|
264
|
+
)
|
|
265
|
+
);
|
|
266
|
+
printSection(
|
|
267
|
+
"Interfaces",
|
|
268
|
+
summary.interfaces.map((item) => `${item.name} @ line ${item.line}`)
|
|
269
|
+
);
|
|
270
|
+
printSection(
|
|
271
|
+
"Types",
|
|
272
|
+
summary.types.map((item) => `${item.name} @ line ${item.line}`)
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
function printSymbolInfo(result) {
|
|
276
|
+
console.log(`Symbol: ${result.name}`);
|
|
277
|
+
if (result.definedIn) {
|
|
278
|
+
console.log(
|
|
279
|
+
`Defined in: ${result.definedIn.path}:${result.definedIn.line} (${result.definedIn.kind})`
|
|
280
|
+
);
|
|
281
|
+
} else {
|
|
282
|
+
console.log("Defined in: not found");
|
|
283
|
+
}
|
|
284
|
+
console.log("");
|
|
285
|
+
console.log("Imported by:");
|
|
286
|
+
if (result.importedBy.length === 0) {
|
|
287
|
+
console.log(" none");
|
|
288
|
+
} else {
|
|
289
|
+
for (const item of result.importedBy) {
|
|
290
|
+
console.log(` - ${item.path}:${item.line} ${item.importStatement}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
console.log("");
|
|
294
|
+
console.log("Referenced in:");
|
|
295
|
+
if (result.referencedIn.length === 0) {
|
|
296
|
+
console.log(" none");
|
|
297
|
+
} else {
|
|
298
|
+
for (const item of result.referencedIn) {
|
|
299
|
+
console.log(` - ${item.path}:${item.line} ${item.context}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
function printWorkset(workset) {
|
|
304
|
+
console.log(workset.name);
|
|
305
|
+
console.log(` Files: ${workset.files.length}`);
|
|
306
|
+
console.log(` Updated: ${workset.updated}`);
|
|
307
|
+
if (workset.description) console.log(` Description: ${workset.description}`);
|
|
308
|
+
for (const file of workset.files) console.log(` - ${file}`);
|
|
309
|
+
}
|
|
310
|
+
function printCheckpoint(checkpoint) {
|
|
311
|
+
console.log(checkpoint.id);
|
|
312
|
+
console.log(` Label: ${checkpoint.label}`);
|
|
313
|
+
console.log(` Created: ${checkpoint.createdAt}`);
|
|
314
|
+
if (checkpoint.notes) console.log(` Notes: ${checkpoint.notes}`);
|
|
315
|
+
if (checkpoint.files?.length) {
|
|
316
|
+
console.log(` Files: ${checkpoint.files.length}`);
|
|
317
|
+
for (const file of checkpoint.files) console.log(` - ${file}`);
|
|
318
|
+
}
|
|
319
|
+
console.log(" Data:");
|
|
320
|
+
for (const line of JSON.stringify(checkpoint.data, null, 2).split("\n")) {
|
|
321
|
+
console.log(` ${line}`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
function printSection(label, items) {
|
|
325
|
+
console.log(`${label}:`);
|
|
326
|
+
if (items.length === 0) {
|
|
327
|
+
console.log(" none");
|
|
328
|
+
console.log("");
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
for (const item of items) console.log(` - ${item}`);
|
|
332
|
+
console.log("");
|
|
333
|
+
}
|
|
334
|
+
function parseMaybeJsonString(value) {
|
|
335
|
+
const trimmed = value.trim();
|
|
336
|
+
if (!trimmed) return "";
|
|
337
|
+
try {
|
|
338
|
+
return JSON.parse(trimmed);
|
|
339
|
+
} catch {
|
|
340
|
+
return value;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
function parseRecordString(value) {
|
|
344
|
+
const trimmed = value.trim();
|
|
345
|
+
if (!trimmed) return {};
|
|
346
|
+
const parsed = JSON.parse(trimmed);
|
|
347
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
348
|
+
throw new Error("Checkpoint data must be a JSON object.");
|
|
349
|
+
}
|
|
350
|
+
return parsed;
|
|
351
|
+
}
|
|
352
|
+
function rrf(vecResults, ftsResults, k = 60) {
|
|
353
|
+
const merged = /* @__PURE__ */ new Map();
|
|
354
|
+
for (let i = 0; i < vecResults.length; i++) {
|
|
355
|
+
const r = vecResults[i];
|
|
356
|
+
merged.set(r.record.id, { record: r.record, score: 1 / (k + i + 1) });
|
|
357
|
+
}
|
|
358
|
+
for (let i = 0; i < ftsResults.length; i++) {
|
|
359
|
+
const r = ftsResults[i];
|
|
360
|
+
const existing = merged.get(r.record.id);
|
|
361
|
+
if (existing) existing.score += 1 / (k + i + 1);
|
|
362
|
+
else merged.set(r.record.id, { record: r.record, score: 1 / (k + i + 1) });
|
|
363
|
+
}
|
|
364
|
+
return [...merged.values()].sort((a, b) => b.score - a.score);
|
|
365
|
+
}
|
|
366
|
+
async function executeCliBatchOperation(operation, context) {
|
|
367
|
+
switch (operation.type) {
|
|
368
|
+
case "search": {
|
|
369
|
+
if (!context) throw new Error("search operation requires knowledge base context");
|
|
370
|
+
const query = typeof operation.args.query === "string" ? operation.args.query.trim() : "";
|
|
371
|
+
if (!query) throw new Error("search operation requires a query");
|
|
372
|
+
const limit = typeof operation.args.limit === "number" ? operation.args.limit : 5;
|
|
373
|
+
const searchMode = operation.args.search_mode === "semantic" || operation.args.search_mode === "keyword" ? operation.args.search_mode : "hybrid";
|
|
374
|
+
const contentType = typeof operation.args.content_type === "string" ? operation.args.content_type : void 0;
|
|
375
|
+
const minScore = typeof operation.args.min_score === "number" ? operation.args.min_score : 0.25;
|
|
376
|
+
if (searchMode === "keyword") {
|
|
377
|
+
return (await context.store.ftsSearch(query, { limit, contentType, minScore })).slice(
|
|
378
|
+
0,
|
|
379
|
+
limit
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
const queryVector = await context.embedder.embedQuery(query);
|
|
383
|
+
if (searchMode === "semantic") {
|
|
384
|
+
return context.store.search(queryVector, { limit, contentType, minScore });
|
|
385
|
+
}
|
|
386
|
+
const [vectorResults, ftsResults] = await Promise.all([
|
|
387
|
+
context.store.search(queryVector, { limit: limit * 2, contentType, minScore }),
|
|
388
|
+
context.store.ftsSearch(query, { limit: limit * 2, contentType, minScore }).catch(() => [])
|
|
389
|
+
]);
|
|
390
|
+
return rrf(vectorResults, ftsResults).slice(0, limit);
|
|
391
|
+
}
|
|
392
|
+
case "find": {
|
|
393
|
+
if (!context) throw new Error("find operation requires knowledge base context");
|
|
394
|
+
const query = typeof operation.args.query === "string" ? operation.args.query : void 0;
|
|
395
|
+
const glob = typeof operation.args.glob === "string" ? operation.args.glob : void 0;
|
|
396
|
+
const pattern = typeof operation.args.pattern === "string" ? operation.args.pattern : void 0;
|
|
397
|
+
const limit = typeof operation.args.limit === "number" ? operation.args.limit : 10;
|
|
398
|
+
const contentType = typeof operation.args.content_type === "string" ? operation.args.content_type : void 0;
|
|
399
|
+
const cwd = typeof operation.args.cwd === "string" ? operation.args.cwd : void 0;
|
|
400
|
+
if (!query && !glob && !pattern) {
|
|
401
|
+
throw new Error("find operation requires query, glob, or pattern");
|
|
402
|
+
}
|
|
403
|
+
return find(context.embedder, context.store, {
|
|
404
|
+
query,
|
|
405
|
+
glob,
|
|
406
|
+
pattern,
|
|
407
|
+
limit,
|
|
408
|
+
contentType,
|
|
409
|
+
cwd
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
case "check": {
|
|
413
|
+
const files = Array.isArray(operation.args.files) ? operation.args.files.filter((item) => typeof item === "string") : void 0;
|
|
414
|
+
const cwd = typeof operation.args.cwd === "string" ? operation.args.cwd : void 0;
|
|
415
|
+
const skipTypes = operation.args.skip_types === true;
|
|
416
|
+
const skipLint = operation.args.skip_lint === true;
|
|
417
|
+
return check({
|
|
418
|
+
files,
|
|
419
|
+
cwd,
|
|
420
|
+
skipTypes,
|
|
421
|
+
skipLint
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
default:
|
|
425
|
+
throw new Error(`Unsupported batch operation type: ${operation.type}`);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
export {
|
|
429
|
+
executeCliBatchOperation,
|
|
430
|
+
extractBoolFlag,
|
|
431
|
+
extractNumFlag,
|
|
432
|
+
extractStrFlag,
|
|
433
|
+
formatFocusRanges,
|
|
434
|
+
parseBatchPayload,
|
|
435
|
+
parseMaybeJsonString,
|
|
436
|
+
parseRecordString,
|
|
437
|
+
printCheckResult,
|
|
438
|
+
printCheckSection,
|
|
439
|
+
printCheckpoint,
|
|
440
|
+
printDeadSymbolsResult,
|
|
441
|
+
printDiffFiles,
|
|
442
|
+
printExamplesResult,
|
|
443
|
+
printFileSummary,
|
|
444
|
+
printGitContext,
|
|
445
|
+
printManagedProcess,
|
|
446
|
+
printParsedOutput,
|
|
447
|
+
printSection,
|
|
448
|
+
printSymbolInfo,
|
|
449
|
+
printTestRunResult,
|
|
450
|
+
printTraceResult,
|
|
451
|
+
printWorkset,
|
|
452
|
+
readInput,
|
|
453
|
+
readStdin,
|
|
454
|
+
rrf,
|
|
455
|
+
splitCsv,
|
|
456
|
+
validateBatchOperations
|
|
457
|
+
};
|
|
458
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @anvpx/kb CLI — command-line interface for the knowledge base toolkit.
|
|
3
|
+
*
|
|
4
|
+
* Thin adapter: arg parsing + output formatting.
|
|
5
|
+
* All core logic lives in @kb/core, @kb/store, @kb/embeddings, etc.
|
|
6
|
+
*/
|
|
7
|
+
export declare function run(argv: string[]): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { analyzeCommands } from "./commands/analyze.js";
|
|
2
|
+
import { contextCommands } from "./commands/context-cmds.js";
|
|
3
|
+
import { environmentCommands } from "./commands/environment.js";
|
|
4
|
+
import { executionCommands } from "./commands/execution.js";
|
|
5
|
+
import { graphCommands } from "./commands/graph.js";
|
|
6
|
+
import { knowledgeCommands } from "./commands/knowledge.js";
|
|
7
|
+
import { searchCommands } from "./commands/search.js";
|
|
8
|
+
import { systemCommands } from "./commands/system.js";
|
|
9
|
+
import { workspaceCommands } from "./commands/workspace.js";
|
|
10
|
+
import { getCtx } from "./context.js";
|
|
11
|
+
const commands = [
|
|
12
|
+
...searchCommands,
|
|
13
|
+
...knowledgeCommands,
|
|
14
|
+
...analyzeCommands,
|
|
15
|
+
...graphCommands,
|
|
16
|
+
...systemCommands,
|
|
17
|
+
...executionCommands,
|
|
18
|
+
...contextCommands,
|
|
19
|
+
...workspaceCommands,
|
|
20
|
+
...environmentCommands
|
|
21
|
+
];
|
|
22
|
+
commands.push({
|
|
23
|
+
name: "help",
|
|
24
|
+
description: "Show available commands",
|
|
25
|
+
run: async () => {
|
|
26
|
+
printHelp();
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
async function run(argv) {
|
|
30
|
+
const args = [...argv];
|
|
31
|
+
const commandName = args.shift();
|
|
32
|
+
if (!commandName || commandName === "--help" || commandName === "-h") {
|
|
33
|
+
printHelp();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (commandName === "--version" || commandName === "-v") {
|
|
37
|
+
console.log("0.1.0");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const command = commands.find((candidate) => candidate.name === commandName);
|
|
41
|
+
if (!command) {
|
|
42
|
+
console.error(`Unknown command: ${commandName}`);
|
|
43
|
+
printHelp();
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
await command.run(args);
|
|
48
|
+
} finally {
|
|
49
|
+
const kbContext = getCtx();
|
|
50
|
+
if (kbContext) await kbContext.store.close();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function printHelp() {
|
|
54
|
+
console.log("@anvpx/kb \u2014 Local-first AI developer toolkit\n");
|
|
55
|
+
console.log("Usage: kb <command> [options]\n");
|
|
56
|
+
console.log("Commands:");
|
|
57
|
+
const maxLen = Math.max(...commands.map((command) => command.name.length));
|
|
58
|
+
for (const command of commands) {
|
|
59
|
+
console.log(` ${command.name.padEnd(maxLen + 2)}${command.description}`);
|
|
60
|
+
}
|
|
61
|
+
console.log("");
|
|
62
|
+
console.log("Options:");
|
|
63
|
+
console.log(" --help, -h Show this help");
|
|
64
|
+
console.log(" --version, -v Show version");
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
run
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KB initialization for CLI commands.
|
|
3
|
+
* Mirrors the server's initializeKnowledgeBase but avoids importing @kb/server
|
|
4
|
+
* (which has MCP SDK deps and auto-runs on import from index.ts).
|
|
5
|
+
*/
|
|
6
|
+
import type { KBConfig } from '@kb/core';
|
|
7
|
+
import { type IEmbedder } from '@kb/embeddings';
|
|
8
|
+
import { IncrementalIndexer } from '@kb/indexer';
|
|
9
|
+
import { type IGraphStore, type IKnowledgeStore } from '@kb/store';
|
|
10
|
+
interface ICuratedManager {
|
|
11
|
+
reindexAll(): Promise<{
|
|
12
|
+
indexed: number;
|
|
13
|
+
}>;
|
|
14
|
+
remember(title: string, content: string, category: string, tags?: string[]): Promise<{
|
|
15
|
+
path: string;
|
|
16
|
+
}>;
|
|
17
|
+
update(relativePath: string, newContent: string, reason: string): Promise<{
|
|
18
|
+
path: string;
|
|
19
|
+
version: number;
|
|
20
|
+
}>;
|
|
21
|
+
forget(relativePath: string, reason: string): Promise<{
|
|
22
|
+
path: string;
|
|
23
|
+
}>;
|
|
24
|
+
read(relativePath: string): Promise<{
|
|
25
|
+
path: string;
|
|
26
|
+
title: string;
|
|
27
|
+
category: string;
|
|
28
|
+
tags: string[];
|
|
29
|
+
version: number;
|
|
30
|
+
content: string;
|
|
31
|
+
}>;
|
|
32
|
+
list(filters?: {
|
|
33
|
+
category?: string;
|
|
34
|
+
tag?: string;
|
|
35
|
+
}): Promise<Array<{
|
|
36
|
+
path: string;
|
|
37
|
+
title: string;
|
|
38
|
+
category: string;
|
|
39
|
+
tags: string[];
|
|
40
|
+
version: number;
|
|
41
|
+
contentPreview: string;
|
|
42
|
+
}>>;
|
|
43
|
+
}
|
|
44
|
+
export interface KBContext {
|
|
45
|
+
config: KBConfig;
|
|
46
|
+
embedder: IEmbedder;
|
|
47
|
+
store: IKnowledgeStore;
|
|
48
|
+
graphStore: IGraphStore;
|
|
49
|
+
indexer: IncrementalIndexer;
|
|
50
|
+
curated: ICuratedManager;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Initialize all KB components for CLI use.
|
|
54
|
+
*/
|
|
55
|
+
export declare function initKB(): Promise<KBContext>;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=kb-init.d.ts.map
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { initializeTreeSitter } from "@kb/chunker";
|
|
4
|
+
import { OnnxEmbedder } from "@kb/embeddings";
|
|
5
|
+
import { IncrementalIndexer } from "@kb/indexer";
|
|
6
|
+
import { createStore, SqliteGraphStore } from "@kb/store";
|
|
7
|
+
function loadConfig() {
|
|
8
|
+
const configPath = process.env.KB_CONFIG_PATH ?? (existsSync(resolve(process.cwd(), "kb.config.json")) ? resolve(process.cwd(), "kb.config.json") : null);
|
|
9
|
+
if (!configPath) {
|
|
10
|
+
console.error("No kb.config.json found in current directory.");
|
|
11
|
+
console.error("Run `kb init` to create one, or set KB_CONFIG_PATH.");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
15
|
+
const config = JSON.parse(raw);
|
|
16
|
+
const root = dirname(configPath);
|
|
17
|
+
config.sources = config.sources.map((s) => ({
|
|
18
|
+
...s,
|
|
19
|
+
path: resolve(root, s.path)
|
|
20
|
+
}));
|
|
21
|
+
config.store.path = resolve(root, config.store.path);
|
|
22
|
+
config.curated = config.curated ?? { path: "curated" };
|
|
23
|
+
config.curated.path = resolve(root, config.curated.path);
|
|
24
|
+
return config;
|
|
25
|
+
}
|
|
26
|
+
async function initKB() {
|
|
27
|
+
const config = loadConfig();
|
|
28
|
+
const embedder = new OnnxEmbedder({
|
|
29
|
+
model: config.embedding.model,
|
|
30
|
+
dimensions: config.embedding.dimensions
|
|
31
|
+
});
|
|
32
|
+
await embedder.initialize();
|
|
33
|
+
const store = await createStore({
|
|
34
|
+
backend: config.store.backend,
|
|
35
|
+
path: config.store.path
|
|
36
|
+
});
|
|
37
|
+
await store.initialize();
|
|
38
|
+
const indexer = new IncrementalIndexer(embedder, store);
|
|
39
|
+
const { CuratedKnowledgeManager } = await import("@kb/server/curated-manager");
|
|
40
|
+
const curated = new CuratedKnowledgeManager(config.curated.path, store, embedder);
|
|
41
|
+
let graphStore;
|
|
42
|
+
try {
|
|
43
|
+
const gs = new SqliteGraphStore({ path: config.store.path });
|
|
44
|
+
await gs.initialize();
|
|
45
|
+
graphStore = gs;
|
|
46
|
+
indexer.setGraphStore(graphStore);
|
|
47
|
+
} catch (err) {
|
|
48
|
+
console.error(`[kb] Graph store init failed (non-fatal): ${err.message}`);
|
|
49
|
+
graphStore = {
|
|
50
|
+
initialize: async () => {
|
|
51
|
+
},
|
|
52
|
+
upsertNode: async () => {
|
|
53
|
+
},
|
|
54
|
+
upsertEdge: async () => {
|
|
55
|
+
},
|
|
56
|
+
upsertNodes: async () => {
|
|
57
|
+
},
|
|
58
|
+
upsertEdges: async () => {
|
|
59
|
+
},
|
|
60
|
+
getNode: async () => null,
|
|
61
|
+
getNeighbors: async () => ({ nodes: [], edges: [] }),
|
|
62
|
+
traverse: async () => ({ nodes: [], edges: [] }),
|
|
63
|
+
findNodes: async () => [],
|
|
64
|
+
findEdges: async () => [],
|
|
65
|
+
deleteNode: async () => {
|
|
66
|
+
},
|
|
67
|
+
deleteBySourcePath: async () => 0,
|
|
68
|
+
clear: async () => {
|
|
69
|
+
},
|
|
70
|
+
getStats: async () => ({ nodeCount: 0, edgeCount: 0, nodeTypes: {}, edgeTypes: {} }),
|
|
71
|
+
close: async () => {
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
await initializeTreeSitter().catch(() => {
|
|
76
|
+
});
|
|
77
|
+
return { config, embedder, store, graphStore, indexer, curated };
|
|
78
|
+
}
|
|
79
|
+
export {
|
|
80
|
+
initKB
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=kb-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|