kb-tool 0.1.4 → 0.1.6
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/dist/commands/agent-context.d.ts +5 -0
- package/dist/commands/agent-context.d.ts.map +1 -0
- package/dist/commands/agent-context.js +83 -0
- package/dist/commands/agent-context.js.map +1 -0
- package/dist/commands/agent-context.test.d.ts +2 -0
- package/dist/commands/agent-context.test.d.ts.map +1 -0
- package/dist/commands/agent-context.test.js +84 -0
- package/dist/commands/agent-context.test.js.map +1 -0
- package/dist/commands/index-cmd.d.ts +3 -0
- package/dist/commands/index-cmd.d.ts.map +1 -0
- package/dist/commands/index-cmd.js +40 -0
- package/dist/commands/index-cmd.js.map +1 -0
- package/dist/commands/ingest.d.ts +3 -0
- package/dist/commands/ingest.d.ts.map +1 -0
- package/dist/commands/ingest.js +103 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +34 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +3 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +53 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/log-cmd.d.ts +3 -0
- package/dist/commands/log-cmd.d.ts.map +1 -0
- package/dist/commands/log-cmd.js +50 -0
- package/dist/commands/log-cmd.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +10 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/query.d.ts +3 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +33 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +88 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +76 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -7028
- package/dist/index.js.map +1 -1
- package/package.json +4 -5
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
export declare function readSchemaLines(schemaPath: string): Promise<string>;
|
|
3
|
+
export declare function buildBlock(projectName: string, schemaLines: string): Promise<string>;
|
|
4
|
+
export declare function makeAgentContextCommand(): Command;
|
|
5
|
+
//# sourceMappingURL=agent-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-context.d.ts","sourceRoot":"","sources":["../../src/commands/agent-context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASzE;AAED,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAWD,wBAAgB,uBAAuB,IAAI,OAAO,CAqCjD"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { readFile, writeFile, access } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { loadProject } from "kb-core";
|
|
6
|
+
export async function readSchemaLines(schemaPath) {
|
|
7
|
+
let content;
|
|
8
|
+
try {
|
|
9
|
+
content = await readFile(schemaPath, "utf8");
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return "_No `.kb/schema.md` found in this project._";
|
|
13
|
+
}
|
|
14
|
+
const lines = content.split("\n").slice(0, 20);
|
|
15
|
+
return lines.join("\n");
|
|
16
|
+
}
|
|
17
|
+
export async function buildBlock(projectName, schemaLines) {
|
|
18
|
+
return `## Knowledge Base: ${projectName}
|
|
19
|
+
|
|
20
|
+
This project has an LLM-maintained knowledge base at \`./wiki/\`.
|
|
21
|
+
- Wiki index: \`wiki/_index.md\`
|
|
22
|
+
- Schema/conventions: \`.kb/schema.md\`
|
|
23
|
+
- Raw sources: \`sources/\`
|
|
24
|
+
- Activity log: \`log.md\`
|
|
25
|
+
|
|
26
|
+
### Available CLI commands
|
|
27
|
+
- \`kb search <query>\` — Search the wiki
|
|
28
|
+
- \`kb ingest <path> --apply\` — Process a new source into the wiki
|
|
29
|
+
- \`kb query <question>\` — Ask a question against the wiki
|
|
30
|
+
- \`kb lint\` — Health-check the wiki
|
|
31
|
+
- \`kb lint --deep\` — LLM-assisted deep health check
|
|
32
|
+
|
|
33
|
+
### MCP tools available
|
|
34
|
+
This project exposes an MCP server via \`kb mcp\`.
|
|
35
|
+
Tools: kb_search, kb_get_page, kb_get_index, kb_ingest, kb_lint, kb_backlinks, kb_status.
|
|
36
|
+
|
|
37
|
+
### Wiki conventions
|
|
38
|
+
${schemaLines}`;
|
|
39
|
+
}
|
|
40
|
+
async function fileExists(filePath) {
|
|
41
|
+
try {
|
|
42
|
+
await access(filePath);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function makeAgentContextCommand() {
|
|
50
|
+
const cmd = new Command("agent-context");
|
|
51
|
+
cmd
|
|
52
|
+
.description("Generate a markdown context block for CLAUDE.md / AGENTS.md")
|
|
53
|
+
.option("--write", "Append block to CLAUDE.md in project root", false)
|
|
54
|
+
.action(async (options) => {
|
|
55
|
+
try {
|
|
56
|
+
const project = await loadProject(process.cwd());
|
|
57
|
+
const schemaPath = join(project.root, ".kb", "schema.md");
|
|
58
|
+
const schemaLines = await readSchemaLines(schemaPath);
|
|
59
|
+
const block = await buildBlock(project.name, schemaLines);
|
|
60
|
+
if (!options.write) {
|
|
61
|
+
console.log(block);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const claudeMdPath = join(project.root, "CLAUDE.md");
|
|
65
|
+
const exists = await fileExists(claudeMdPath);
|
|
66
|
+
if (exists) {
|
|
67
|
+
const existing = await readFile(claudeMdPath, "utf8");
|
|
68
|
+
await writeFile(claudeMdPath, `${existing}\n---\n${block}`, "utf8");
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
await writeFile(claudeMdPath, block, "utf8");
|
|
72
|
+
}
|
|
73
|
+
console.log(chalk.green("Written to CLAUDE.md"));
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
77
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return cmd;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=agent-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-context.js","sourceRoot":"","sources":["../../src/commands/agent-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-context.test.d.ts","sourceRoot":"","sources":["../../src/commands/agent-context.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// packages/cli/src/commands/agent-context.test.ts
|
|
2
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
3
|
+
import { mkdtemp, rm, writeFile, readFile } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { buildBlock, readSchemaLines } from "./agent-context.js";
|
|
7
|
+
describe("buildBlock", () => {
|
|
8
|
+
it("includes the project name in the heading", async () => {
|
|
9
|
+
const block = await buildBlock("my-project", "## Schema\nConventions here.");
|
|
10
|
+
expect(block).toContain("## Knowledge Base: my-project");
|
|
11
|
+
});
|
|
12
|
+
it("includes all CLI commands", async () => {
|
|
13
|
+
const block = await buildBlock("test", "");
|
|
14
|
+
expect(block).toContain("kb search");
|
|
15
|
+
expect(block).toContain("kb ingest");
|
|
16
|
+
expect(block).toContain("kb query");
|
|
17
|
+
expect(block).toContain("kb lint");
|
|
18
|
+
});
|
|
19
|
+
it("includes all MCP tool names", async () => {
|
|
20
|
+
const block = await buildBlock("test", "");
|
|
21
|
+
expect(block).toContain("kb_search");
|
|
22
|
+
expect(block).toContain("kb_get_page");
|
|
23
|
+
expect(block).toContain("kb_lint");
|
|
24
|
+
});
|
|
25
|
+
it("includes the schema lines in the output", async () => {
|
|
26
|
+
const block = await buildBlock("test", "Custom schema content here.");
|
|
27
|
+
expect(block).toContain("Custom schema content here.");
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("readSchemaLines", () => {
|
|
31
|
+
let tmpDir;
|
|
32
|
+
beforeEach(async () => {
|
|
33
|
+
tmpDir = await mkdtemp(join(tmpdir(), "kb-agent-test-"));
|
|
34
|
+
});
|
|
35
|
+
afterEach(async () => {
|
|
36
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
37
|
+
});
|
|
38
|
+
it("returns fallback message when schema file does not exist", async () => {
|
|
39
|
+
const result = await readSchemaLines(join(tmpDir, "nonexistent.md"));
|
|
40
|
+
expect(result).toContain("schema.md");
|
|
41
|
+
});
|
|
42
|
+
it("returns first 20 lines of schema file", async () => {
|
|
43
|
+
const lines = Array.from({ length: 30 }, (_, i) => `Line ${i + 1}`);
|
|
44
|
+
await writeFile(join(tmpDir, "schema.md"), lines.join("\n"), "utf8");
|
|
45
|
+
const result = await readSchemaLines(join(tmpDir, "schema.md"));
|
|
46
|
+
const resultLines = result.split("\n");
|
|
47
|
+
expect(resultLines).toHaveLength(20);
|
|
48
|
+
expect(resultLines[0]).toBe("Line 1");
|
|
49
|
+
expect(resultLines[19]).toBe("Line 20");
|
|
50
|
+
});
|
|
51
|
+
it("returns full content when file has fewer than 20 lines", async () => {
|
|
52
|
+
await writeFile(join(tmpDir, "schema.md"), "Line 1\nLine 2\nLine 3", "utf8");
|
|
53
|
+
const result = await readSchemaLines(join(tmpDir, "schema.md"));
|
|
54
|
+
expect(result).toBe("Line 1\nLine 2\nLine 3");
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe("--write behavior (via file manipulation)", () => {
|
|
58
|
+
let tmpDir;
|
|
59
|
+
beforeEach(async () => {
|
|
60
|
+
tmpDir = await mkdtemp(join(tmpdir(), "kb-write-test-"));
|
|
61
|
+
});
|
|
62
|
+
afterEach(async () => {
|
|
63
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
64
|
+
});
|
|
65
|
+
it("creates CLAUDE.md when it does not exist", async () => {
|
|
66
|
+
const claudePath = join(tmpDir, "CLAUDE.md");
|
|
67
|
+
const block = await buildBlock("test-project", "Schema.");
|
|
68
|
+
await writeFile(claudePath, block, "utf8");
|
|
69
|
+
const content = await readFile(claudePath, "utf8");
|
|
70
|
+
expect(content).toContain("## Knowledge Base: test-project");
|
|
71
|
+
});
|
|
72
|
+
it("appends to existing CLAUDE.md with separator", async () => {
|
|
73
|
+
const claudePath = join(tmpDir, "CLAUDE.md");
|
|
74
|
+
await writeFile(claudePath, "# Existing Content\n", "utf8");
|
|
75
|
+
const block = await buildBlock("test-project", "Schema.");
|
|
76
|
+
const existing = await readFile(claudePath, "utf8");
|
|
77
|
+
await writeFile(claudePath, `${existing}\n---\n${block}`, "utf8");
|
|
78
|
+
const content = await readFile(claudePath, "utf8");
|
|
79
|
+
expect(content).toContain("# Existing Content");
|
|
80
|
+
expect(content).toContain("---");
|
|
81
|
+
expect(content).toContain("## Knowledge Base: test-project");
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=agent-context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-context.test.js","sourceRoot":"","sources":["../../src/commands/agent-context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,gBAAgB,IAAI,OAAO,CAuC1C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { loadProject, indexProject } from "kb-core";
|
|
4
|
+
export function makeIndexCommand() {
|
|
5
|
+
const cmd = new Command("index");
|
|
6
|
+
cmd
|
|
7
|
+
.description("Index wiki pages into the search database")
|
|
8
|
+
.option("--rebuild", "delete all entries and re-index from scratch", false)
|
|
9
|
+
.action(async (options) => {
|
|
10
|
+
try {
|
|
11
|
+
const project = await loadProject(process.cwd());
|
|
12
|
+
console.log("Indexing wiki pages...");
|
|
13
|
+
const stats = await indexProject(project, options.rebuild);
|
|
14
|
+
const updated = stats.indexed;
|
|
15
|
+
const unchanged = stats.skipped;
|
|
16
|
+
const total = updated + unchanged;
|
|
17
|
+
const details = [];
|
|
18
|
+
if (updated > 0)
|
|
19
|
+
details.push(`${updated} updated`);
|
|
20
|
+
if (unchanged > 0)
|
|
21
|
+
details.push(`${unchanged} unchanged`);
|
|
22
|
+
if (stats.deleted > 0)
|
|
23
|
+
details.push(`${stats.deleted} deleted`);
|
|
24
|
+
if (stats.errors > 0)
|
|
25
|
+
details.push(`${stats.errors} errors`);
|
|
26
|
+
const detailStr = details.length > 0 ? ` (${details.join(", ")})` : "";
|
|
27
|
+
console.log(`${chalk.green("✓")} Indexed ${total} page${total !== 1 ? "s" : ""}${detailStr}`);
|
|
28
|
+
if (stats.errors > 0) {
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
34
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return cmd;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-cmd.js","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEpD,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC,GAAG;SACA,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,WAAW,EAAE,8CAA8C,EAAE,KAAK,CAAC;SAC1E,MAAM,CAAC,KAAK,EAAE,OAA6B,EAAE,EAAE;QAC9C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAEtC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAE3D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC;YAChC,MAAM,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;YAElC,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC;YACpD,IAAI,SAAS,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,YAAY,CAAC,CAAC;YAC1D,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;YAChE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;YAE7D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,CACjF,CAAC;YAEF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0EpC,wBAAgB,iBAAiB,IAAI,OAAO,CA4D3C"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { readdir, stat } from "node:fs/promises";
|
|
4
|
+
import { join, basename } from "node:path";
|
|
5
|
+
import { loadProject, ingestSource, createLlmAdapter } from "kb-core";
|
|
6
|
+
function printPlan(plan, sourcePath) {
|
|
7
|
+
const sourceBase = basename(sourcePath);
|
|
8
|
+
const sourceFilename = basename(plan.sourceFile);
|
|
9
|
+
const { result } = plan;
|
|
10
|
+
console.log(chalk.yellow("Dry run — use --apply to write changes\n"));
|
|
11
|
+
console.log(`Source: ${chalk.cyan(sourceBase)} → ${chalk.cyan(`sources/${sourceFilename}`)}`);
|
|
12
|
+
const hasChanges = result.newPages.length > 0 ||
|
|
13
|
+
result.updates.length > 0 ||
|
|
14
|
+
result.summary.path;
|
|
15
|
+
if (!hasChanges) {
|
|
16
|
+
console.log(chalk.gray("\nNo changes would be made."));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
console.log(chalk.bold("\nWould create:"));
|
|
20
|
+
console.log(` ${chalk.green("+")} ${result.summary.path} ${chalk.gray("(new page)")}`);
|
|
21
|
+
for (const p of result.newPages) {
|
|
22
|
+
console.log(` ${chalk.green("+")} ${p.path} ${chalk.gray(`(new page)`)}`);
|
|
23
|
+
}
|
|
24
|
+
if (result.updates.length > 0) {
|
|
25
|
+
console.log(chalk.bold("\nWould update:"));
|
|
26
|
+
for (const u of result.updates) {
|
|
27
|
+
console.log(` ${chalk.yellow("~")} ${u.path} ${chalk.gray(`(${u.reason})`)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
console.log(`\nWould update index: ${chalk.cyan("wiki/_index.md")}`);
|
|
31
|
+
console.log(`Log entry: ${chalk.gray(`"${result.logEntry}"`)}`);
|
|
32
|
+
console.log(chalk.gray("\nRun with --apply to write these changes."));
|
|
33
|
+
}
|
|
34
|
+
function printApplied(plan, sourcePath) {
|
|
35
|
+
const sourceBase = basename(sourcePath);
|
|
36
|
+
const sourceFilename = basename(plan.sourceFile);
|
|
37
|
+
const { result } = plan;
|
|
38
|
+
console.log(`${chalk.green("✓")} Ingested ${chalk.cyan(sourceBase)} → ${chalk.cyan(`sources/${sourceFilename}`)}`);
|
|
39
|
+
console.log(` ${chalk.green("+")} ${result.summary.path}`);
|
|
40
|
+
for (const p of result.newPages) {
|
|
41
|
+
console.log(` ${chalk.green("+")} ${p.path}`);
|
|
42
|
+
}
|
|
43
|
+
for (const u of result.updates) {
|
|
44
|
+
console.log(` ${chalk.yellow("~")} ${u.path}`);
|
|
45
|
+
}
|
|
46
|
+
console.log(` ${chalk.yellow("~")} wiki/_index.md`);
|
|
47
|
+
console.log(chalk.gray(` Log: "${result.logEntry}"`));
|
|
48
|
+
}
|
|
49
|
+
async function collectFiles(dirPath) {
|
|
50
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
51
|
+
return entries.filter((e) => e.isFile()).map((e) => join(dirPath, e.name));
|
|
52
|
+
}
|
|
53
|
+
export function makeIngestCommand() {
|
|
54
|
+
const cmd = new Command("ingest");
|
|
55
|
+
cmd
|
|
56
|
+
.description("Ingest a source document into the wiki using LLM")
|
|
57
|
+
.argument("<source-path>", "path to file or URL to ingest")
|
|
58
|
+
.option("--apply", "write changes to wiki (default: dry-run)", false)
|
|
59
|
+
.option("--batch", "process all files in a directory", false)
|
|
60
|
+
.action(async (sourcePath, options) => {
|
|
61
|
+
try {
|
|
62
|
+
const project = await loadProject(process.cwd());
|
|
63
|
+
const llm = createLlmAdapter(project.config);
|
|
64
|
+
let sources;
|
|
65
|
+
if (options.batch) {
|
|
66
|
+
const s = await stat(sourcePath);
|
|
67
|
+
if (!s.isDirectory()) {
|
|
68
|
+
console.error(chalk.red("Error: --batch requires a directory path"));
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
sources = await collectFiles(sourcePath);
|
|
72
|
+
if (sources.length === 0) {
|
|
73
|
+
console.log(chalk.gray("No files found in directory."));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
sources = [sourcePath];
|
|
79
|
+
}
|
|
80
|
+
for (const src of sources) {
|
|
81
|
+
if (options.batch) {
|
|
82
|
+
console.log(chalk.bold(`\nProcessing: ${basename(src)}`));
|
|
83
|
+
}
|
|
84
|
+
const plan = await ingestSource(project, src, llm, {
|
|
85
|
+
apply: options.apply,
|
|
86
|
+
});
|
|
87
|
+
if (plan.dryRun) {
|
|
88
|
+
printPlan(plan, src);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
printApplied(plan, src);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
97
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return cmd;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,eAAe,IAAI,OAAO,CAoCzC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { basename, resolve } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { initProject } from "kb-core";
|
|
5
|
+
export function makeInitCommand() {
|
|
6
|
+
const cmd = new Command("init");
|
|
7
|
+
cmd
|
|
8
|
+
.description("Initialize a new knowledge base in the current directory")
|
|
9
|
+
.argument("[project-name]", "Name of the project (defaults to directory name)")
|
|
10
|
+
.action(async (projectName) => {
|
|
11
|
+
const directory = resolve(process.cwd());
|
|
12
|
+
const name = projectName ?? basename(directory);
|
|
13
|
+
try {
|
|
14
|
+
await initProject({ name, directory });
|
|
15
|
+
console.log(chalk.green(`✓ Knowledge base initialized: ${name}`));
|
|
16
|
+
console.log("");
|
|
17
|
+
console.log(chalk.dim("Created:"));
|
|
18
|
+
console.log(chalk.dim(" .kb/config.toml — project manifest"));
|
|
19
|
+
console.log(chalk.dim(" .kb/schema.md — LLM instructions"));
|
|
20
|
+
console.log(chalk.dim(" sources/ — raw source materials"));
|
|
21
|
+
console.log(chalk.dim(" wiki/_index.md — wiki root"));
|
|
22
|
+
console.log(chalk.dim(" log.md — activity log"));
|
|
23
|
+
console.log("");
|
|
24
|
+
console.log(chalk.cyan(`Run ${chalk.bold("kb ingest <source>")} to add content.`));
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
28
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return cmd;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,GAAG;SACA,WAAW,CAAC,0DAA0D,CAAC;SACvE,QAAQ,CACP,gBAAgB,EAChB,kDAAkD,CACnD;SACA,MAAM,CAAC,KAAK,EAAE,WAA+B,EAAE,EAAE;QAChD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,WAAW,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAEvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CACtE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,eAAe,IAAI,OAAO,CAqEzC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { loadProject, lintProject } from "kb-core";
|
|
4
|
+
export function makeLintCommand() {
|
|
5
|
+
const cmd = new Command("lint");
|
|
6
|
+
cmd
|
|
7
|
+
.description("Check wiki health for broken links, orphan pages, and more")
|
|
8
|
+
.option("--deep", "LLM-assisted checks (Phase 2)", false)
|
|
9
|
+
.action(async (options) => {
|
|
10
|
+
try {
|
|
11
|
+
if (options.deep) {
|
|
12
|
+
console.log(chalk.yellow("--deep requires LLM, not yet implemented"));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const project = await loadProject(process.cwd());
|
|
16
|
+
console.log("Checking wiki health...\n");
|
|
17
|
+
const result = await lintProject(project);
|
|
18
|
+
if (result.issues.length === 0) {
|
|
19
|
+
console.log(chalk.green(`✓ Wiki is healthy (${result.pagesChecked} pages checked)`));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
for (const issue of result.issues) {
|
|
23
|
+
const code = chalk.gray(`[${issue.code}]`);
|
|
24
|
+
if (issue.severity === "warning") {
|
|
25
|
+
if (issue.code === "BROKEN_LINK") {
|
|
26
|
+
console.log(`${chalk.yellow("⚠")} ${chalk.cyan(issue.path)} → [[${issue.detail}]] not found ${code}`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.log(`${chalk.yellow("⚠")} ${chalk.cyan(issue.path)} — ${issue.message} ${code}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.log(`${chalk.blue("ℹ")} ${chalk.cyan(issue.path)} — ${issue.message} ${code}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const warnings = result.issues.filter((i) => i.severity === "warning").length;
|
|
37
|
+
const infos = result.issues.filter((i) => i.severity === "info").length;
|
|
38
|
+
const parts = [];
|
|
39
|
+
if (warnings > 0)
|
|
40
|
+
parts.push(`${chalk.yellow(String(warnings))} warning${warnings !== 1 ? "s" : ""}`);
|
|
41
|
+
if (infos > 0)
|
|
42
|
+
parts.push(`${chalk.blue(String(infos))} info`);
|
|
43
|
+
console.log(`\nFound ${parts.join(", ")}. Run with --deep for LLM-assisted checks.`);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
47
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return cmd;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/log-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,cAAc,IAAI,OAAO,CAiDxC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { readFile } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { loadProject, parseLogEntries } from "kb-core";
|
|
6
|
+
export function makeLogCommand() {
|
|
7
|
+
const cmd = new Command("log");
|
|
8
|
+
cmd
|
|
9
|
+
.description("Show recent activity log entries")
|
|
10
|
+
.option("--last <n>", "number of entries to show", "10")
|
|
11
|
+
.action(async (options) => {
|
|
12
|
+
try {
|
|
13
|
+
const project = await loadProject(process.cwd());
|
|
14
|
+
const logPath = join(project.wikiDir, "log.md");
|
|
15
|
+
let content;
|
|
16
|
+
try {
|
|
17
|
+
content = await readFile(logPath, "utf8");
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
console.log(chalk.gray("No activity log found."));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const n = parseInt(options.last, 10);
|
|
24
|
+
if (isNaN(n) || n < 1) {
|
|
25
|
+
console.error(chalk.red("Error: --last must be a positive integer"));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const entries = parseLogEntries(content);
|
|
29
|
+
if (entries.length === 0) {
|
|
30
|
+
console.log(chalk.gray("Activity log is empty."));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const last = entries.slice(-n);
|
|
34
|
+
for (const entry of last) {
|
|
35
|
+
console.log(chalk.bold(`## ${entry.heading}`));
|
|
36
|
+
if (entry.body) {
|
|
37
|
+
console.log(entry.body);
|
|
38
|
+
}
|
|
39
|
+
console.log();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
44
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return cmd;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=log-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-cmd.js","sourceRoot":"","sources":["../../src/commands/log-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAuB,MAAM,SAAS,CAAC;AAE5E,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IAE/B,GAAG;SACA,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,YAAY,EAAE,2BAA2B,EAAE,IAAI,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEhD,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YAEzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC/C,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;gBACD,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,cAAc,IAAI,OAAO,CAMxC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { startMcpServer } from "kb-mcp";
|
|
3
|
+
export function makeMcpCommand() {
|
|
4
|
+
return new Command("mcp")
|
|
5
|
+
.description("Start MCP server (stdio)")
|
|
6
|
+
.action(async () => {
|
|
7
|
+
await startMcpServer();
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;SACtB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,gBAAgB,IAAI,OAAO,CAmC1C"}
|