@weavelogic/knowledge-graph-agent 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/README.md +264 -0
- package/dist/cli/bin.d.ts +8 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +20 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/claude.d.ts +11 -0
- package/dist/cli/commands/claude.d.ts.map +1 -0
- package/dist/cli/commands/claude.js +102 -0
- package/dist/cli/commands/claude.js.map +1 -0
- package/dist/cli/commands/docs.d.ts +11 -0
- package/dist/cli/commands/docs.d.ts.map +1 -0
- package/dist/cli/commands/docs.js +108 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +11 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +122 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/init.d.ts +11 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +80 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/search.d.ts +11 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +80 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +11 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +84 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +11 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +76 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/index.d.ts +11 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +45 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/database.d.ts +121 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +470 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/graph.d.ts +109 -0
- package/dist/core/graph.d.ts.map +1 -0
- package/dist/core/graph.js +343 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/security.d.ts +62 -0
- package/dist/core/security.d.ts.map +1 -0
- package/dist/core/security.js +31 -0
- package/dist/core/security.js.map +1 -0
- package/dist/core/types.d.ts +232 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +37 -0
- package/dist/core/types.js.map +1 -0
- package/dist/generators/claude-md.d.ts +33 -0
- package/dist/generators/claude-md.d.ts.map +1 -0
- package/dist/generators/claude-md.js +410 -0
- package/dist/generators/claude-md.js.map +1 -0
- package/dist/generators/docs-init.d.ts +20 -0
- package/dist/generators/docs-init.d.ts.map +1 -0
- package/dist/generators/docs-init.js +625 -0
- package/dist/generators/docs-init.js.map +1 -0
- package/dist/generators/graph-generator.d.ts +41 -0
- package/dist/generators/graph-generator.d.ts.map +1 -0
- package/dist/generators/graph-generator.js +266 -0
- package/dist/generators/graph-generator.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/claude-flow.d.ts +62 -0
- package/dist/integrations/claude-flow.d.ts.map +1 -0
- package/dist/integrations/claude-flow.js +243 -0
- package/dist/integrations/claude-flow.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { existsSync } from "fs";
|
|
5
|
+
import { join } from "path";
|
|
6
|
+
import { updateGraph, generateAndSave } from "../../generators/graph-generator.js";
|
|
7
|
+
import { validateProjectRoot, validateDocsPath } from "../../core/security.js";
|
|
8
|
+
function createGraphCommand() {
|
|
9
|
+
const command = new Command("graph");
|
|
10
|
+
command.description("Generate or update knowledge graph from documentation").option("-p, --path <path>", "Project root path", ".").option("-d, --docs <path>", "Docs directory path", "docs").option("-u, --update", "Incremental update instead of full regeneration").option("-v, --verbose", "Show detailed output").action(async (options) => {
|
|
11
|
+
const spinner = ora("Generating knowledge graph...").start();
|
|
12
|
+
try {
|
|
13
|
+
const projectRoot = validateProjectRoot(options.path);
|
|
14
|
+
const docsPath = validateDocsPath(projectRoot, options.docs);
|
|
15
|
+
const dbPath = join(projectRoot, ".kg", "knowledge.db");
|
|
16
|
+
if (!existsSync(docsPath)) {
|
|
17
|
+
spinner.fail(`Docs directory not found: ${docsPath}`);
|
|
18
|
+
console.log(chalk.gray(" Run ") + chalk.cyan("kg docs init") + chalk.gray(" to create it"));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
if (!existsSync(join(projectRoot, ".kg"))) {
|
|
22
|
+
spinner.fail("Knowledge graph not initialized");
|
|
23
|
+
console.log(chalk.gray(" Run ") + chalk.cyan("kg init") + chalk.gray(" first"));
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
let result;
|
|
27
|
+
if (options.update && existsSync(dbPath)) {
|
|
28
|
+
spinner.text = "Updating knowledge graph...";
|
|
29
|
+
result = await updateGraph(dbPath, docsPath);
|
|
30
|
+
spinner.succeed("Knowledge graph updated!");
|
|
31
|
+
console.log();
|
|
32
|
+
console.log(chalk.white(" Changes:"));
|
|
33
|
+
console.log(chalk.green(` Added: ${result.added}`));
|
|
34
|
+
console.log(chalk.blue(` Updated: ${result.updated}`));
|
|
35
|
+
console.log(chalk.yellow(` Removed: ${result.removed}`));
|
|
36
|
+
} else {
|
|
37
|
+
spinner.text = "Scanning documentation...";
|
|
38
|
+
result = await generateAndSave(
|
|
39
|
+
{
|
|
40
|
+
projectRoot,
|
|
41
|
+
outputPath: docsPath
|
|
42
|
+
},
|
|
43
|
+
dbPath
|
|
44
|
+
);
|
|
45
|
+
if (result.success) {
|
|
46
|
+
spinner.succeed("Knowledge graph generated!");
|
|
47
|
+
} else {
|
|
48
|
+
spinner.warn("Knowledge graph generated with errors");
|
|
49
|
+
}
|
|
50
|
+
console.log();
|
|
51
|
+
console.log(chalk.white(" Statistics:"));
|
|
52
|
+
console.log(chalk.gray(` Files scanned: ${result.stats.filesScanned}`));
|
|
53
|
+
console.log(chalk.green(` Nodes created: ${result.stats.nodesCreated}`));
|
|
54
|
+
console.log(chalk.blue(` Edges created: ${result.stats.edgesCreated}`));
|
|
55
|
+
}
|
|
56
|
+
const errors = "errors" in result ? result.errors : result.stats?.errors;
|
|
57
|
+
if (errors && errors.length > 0) {
|
|
58
|
+
console.log();
|
|
59
|
+
console.log(chalk.yellow(" Warnings:"));
|
|
60
|
+
errors.slice(0, 5).forEach((err) => {
|
|
61
|
+
console.log(chalk.gray(` - ${err}`));
|
|
62
|
+
});
|
|
63
|
+
if (errors.length > 5) {
|
|
64
|
+
console.log(chalk.gray(` ... and ${errors.length - 5} more`));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
console.log();
|
|
68
|
+
console.log(chalk.cyan("Next: ") + chalk.white("kg stats") + chalk.gray(" to view graph statistics"));
|
|
69
|
+
console.log();
|
|
70
|
+
} catch (error) {
|
|
71
|
+
spinner.fail("Failed to generate knowledge graph");
|
|
72
|
+
console.error(chalk.red(String(error)));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
command.command("analyze").description("Analyze graph structure and suggest improvements").option("-p, --path <path>", "Project root path", ".").action(async (options) => {
|
|
77
|
+
const spinner = ora("Analyzing graph...").start();
|
|
78
|
+
try {
|
|
79
|
+
const projectRoot = validateProjectRoot(options.path);
|
|
80
|
+
const dbPath = join(projectRoot, ".kg", "knowledge.db");
|
|
81
|
+
if (!existsSync(dbPath)) {
|
|
82
|
+
spinner.fail('Knowledge graph not found. Run "kg graph" first.');
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
const { createDatabase } = await import("../../core/database.js");
|
|
86
|
+
const db = createDatabase(dbPath);
|
|
87
|
+
const stats = db.getStats();
|
|
88
|
+
spinner.succeed("Graph analysis complete!");
|
|
89
|
+
console.log();
|
|
90
|
+
console.log(chalk.white(" Graph Health:"));
|
|
91
|
+
if (stats.orphanNodes > 0) {
|
|
92
|
+
console.log(chalk.yellow(` ⚠ ${stats.orphanNodes} orphan nodes (no links)`));
|
|
93
|
+
} else {
|
|
94
|
+
console.log(chalk.green(" ✓ No orphan nodes"));
|
|
95
|
+
}
|
|
96
|
+
const density = stats.avgLinksPerNode;
|
|
97
|
+
if (density < 1) {
|
|
98
|
+
console.log(chalk.yellow(` ⚠ Low link density (${density} avg links/node)`));
|
|
99
|
+
} else {
|
|
100
|
+
console.log(chalk.green(` ✓ Good link density (${density} avg links/node)`));
|
|
101
|
+
}
|
|
102
|
+
if (stats.mostConnected.length > 0) {
|
|
103
|
+
console.log();
|
|
104
|
+
console.log(chalk.white(" Most Connected:"));
|
|
105
|
+
stats.mostConnected.forEach(({ id, connections }) => {
|
|
106
|
+
console.log(chalk.gray(` ${id}: ${connections} connections`));
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
db.close();
|
|
110
|
+
console.log();
|
|
111
|
+
} catch (error) {
|
|
112
|
+
spinner.fail("Analysis failed");
|
|
113
|
+
console.error(chalk.red(String(error)));
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
return command;
|
|
118
|
+
}
|
|
119
|
+
export {
|
|
120
|
+
createGraphCommand
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sources":["../../../src/cli/commands/graph.ts"],"sourcesContent":["/**\n * Graph Command\n *\n * Generate and update knowledge graph from documentation.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { generateAndSave, updateGraph } from '../../generators/graph-generator.js';\nimport { validateProjectRoot, validateDocsPath } from '../../core/security.js';\n\n/**\n * Create graph command\n */\nexport function createGraphCommand(): Command {\n const command = new Command('graph');\n\n command\n .description('Generate or update knowledge graph from documentation')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-d, --docs <path>', 'Docs directory path', 'docs')\n .option('-u, --update', 'Incremental update instead of full regeneration')\n .option('-v, --verbose', 'Show detailed output')\n .action(async (options) => {\n const spinner = ora('Generating knowledge graph...').start();\n\n try {\n // Validate paths to prevent traversal attacks\n const projectRoot = validateProjectRoot(options.path);\n const docsPath = validateDocsPath(projectRoot, options.docs);\n const dbPath = join(projectRoot, '.kg', 'knowledge.db');\n\n // Check if docs exist\n if (!existsSync(docsPath)) {\n spinner.fail(`Docs directory not found: ${docsPath}`);\n console.log(chalk.gray(' Run ') + chalk.cyan('kg docs init') + chalk.gray(' to create it'));\n process.exit(1);\n }\n\n // Check if KG is initialized\n if (!existsSync(join(projectRoot, '.kg'))) {\n spinner.fail('Knowledge graph not initialized');\n console.log(chalk.gray(' Run ') + chalk.cyan('kg init') + chalk.gray(' first'));\n process.exit(1);\n }\n\n let result;\n\n if (options.update && existsSync(dbPath)) {\n // Incremental update\n spinner.text = 'Updating knowledge graph...';\n result = await updateGraph(dbPath, docsPath);\n\n spinner.succeed('Knowledge graph updated!');\n\n console.log();\n console.log(chalk.white(' Changes:'));\n console.log(chalk.green(` Added: ${result.added}`));\n console.log(chalk.blue(` Updated: ${result.updated}`));\n console.log(chalk.yellow(` Removed: ${result.removed}`));\n\n } else {\n // Full generation\n spinner.text = 'Scanning documentation...';\n\n result = await generateAndSave(\n {\n projectRoot,\n outputPath: docsPath,\n },\n dbPath\n );\n\n if (result.success) {\n spinner.succeed('Knowledge graph generated!');\n } else {\n spinner.warn('Knowledge graph generated with errors');\n }\n\n console.log();\n console.log(chalk.white(' Statistics:'));\n console.log(chalk.gray(` Files scanned: ${result.stats.filesScanned}`));\n console.log(chalk.green(` Nodes created: ${result.stats.nodesCreated}`));\n console.log(chalk.blue(` Edges created: ${result.stats.edgesCreated}`));\n }\n\n // Show errors if any\n const errors = 'errors' in result ? result.errors : result.stats?.errors;\n if (errors && errors.length > 0) {\n console.log();\n console.log(chalk.yellow(' Warnings:'));\n errors.slice(0, 5).forEach((err: string) => {\n console.log(chalk.gray(` - ${err}`));\n });\n if (errors.length > 5) {\n console.log(chalk.gray(` ... and ${errors.length - 5} more`));\n }\n }\n\n console.log();\n console.log(chalk.cyan('Next: ') + chalk.white('kg stats') + chalk.gray(' to view graph statistics'));\n console.log();\n\n } catch (error) {\n spinner.fail('Failed to generate knowledge graph');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Add subcommands\n command\n .command('analyze')\n .description('Analyze graph structure and suggest improvements')\n .option('-p, --path <path>', 'Project root path', '.')\n .action(async (options) => {\n const spinner = ora('Analyzing graph...').start();\n\n try {\n const projectRoot = validateProjectRoot(options.path);\n const dbPath = join(projectRoot, '.kg', 'knowledge.db');\n\n if (!existsSync(dbPath)) {\n spinner.fail('Knowledge graph not found. Run \"kg graph\" first.');\n process.exit(1);\n }\n\n const { createDatabase } = await import('../../core/database.js');\n const db = createDatabase(dbPath);\n\n const stats = db.getStats();\n spinner.succeed('Graph analysis complete!');\n\n console.log();\n console.log(chalk.white(' Graph Health:'));\n\n // Orphan analysis\n if (stats.orphanNodes > 0) {\n console.log(chalk.yellow(` ⚠ ${stats.orphanNodes} orphan nodes (no links)`));\n } else {\n console.log(chalk.green(' ✓ No orphan nodes'));\n }\n\n // Connection density\n const density = stats.avgLinksPerNode;\n if (density < 1) {\n console.log(chalk.yellow(` ⚠ Low link density (${density} avg links/node)`));\n } else {\n console.log(chalk.green(` ✓ Good link density (${density} avg links/node)`));\n }\n\n // Most connected nodes\n if (stats.mostConnected.length > 0) {\n console.log();\n console.log(chalk.white(' Most Connected:'));\n stats.mostConnected.forEach(({ id, connections }) => {\n console.log(chalk.gray(` ${id}: ${connections} connections`));\n });\n }\n\n db.close();\n console.log();\n\n } catch (error) {\n spinner.fail('Analysis failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n return command;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAkG3C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { existsSync, mkdirSync, writeFileSync } from "fs";
|
|
5
|
+
import { join } from "path";
|
|
6
|
+
import { ConfigSchema } from "../../core/types.js";
|
|
7
|
+
import { createDatabase } from "../../core/database.js";
|
|
8
|
+
import { validateProjectRoot, validateDocsPath } from "../../core/security.js";
|
|
9
|
+
function createInitCommand() {
|
|
10
|
+
const command = new Command("init");
|
|
11
|
+
command.description("Initialize knowledge graph in the current project").option("-p, --path <path>", "Project root path", ".").option("-d, --docs <path>", "Docs directory path", "docs").option("-n, --name <name>", "Project name").option("--no-db", "Skip database initialization").option("--no-config", "Skip config file creation").option("-f, --force", "Overwrite existing files").action(async (options) => {
|
|
12
|
+
const spinner = ora("Initializing knowledge graph...").start();
|
|
13
|
+
try {
|
|
14
|
+
const projectRoot = validateProjectRoot(options.path);
|
|
15
|
+
const docsPath = options.docs;
|
|
16
|
+
validateDocsPath(projectRoot, docsPath);
|
|
17
|
+
const kgDir = join(projectRoot, ".kg");
|
|
18
|
+
if (existsSync(kgDir) && !options.force) {
|
|
19
|
+
spinner.warn("Knowledge graph already initialized. Use --force to reinitialize.");
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!existsSync(kgDir)) {
|
|
23
|
+
mkdirSync(kgDir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
if (options.db !== false) {
|
|
26
|
+
spinner.text = "Creating database...";
|
|
27
|
+
const dbPath = join(kgDir, "knowledge.db");
|
|
28
|
+
const db = createDatabase(dbPath);
|
|
29
|
+
db.setMetadata("projectRoot", projectRoot);
|
|
30
|
+
db.setMetadata("docsPath", docsPath);
|
|
31
|
+
db.setMetadata("initialized", (/* @__PURE__ */ new Date()).toISOString());
|
|
32
|
+
db.close();
|
|
33
|
+
}
|
|
34
|
+
if (options.config !== false) {
|
|
35
|
+
spinner.text = "Creating configuration...";
|
|
36
|
+
const configPath = join(kgDir, "config.json");
|
|
37
|
+
if (!existsSync(configPath) || options.force) {
|
|
38
|
+
const config = ConfigSchema.parse({
|
|
39
|
+
projectRoot: ".",
|
|
40
|
+
docsRoot: docsPath,
|
|
41
|
+
vaultName: options.name,
|
|
42
|
+
graph: {
|
|
43
|
+
includePatterns: ["**/*.md"],
|
|
44
|
+
excludePatterns: ["node_modules/**", "dist/**", ".git/**"]
|
|
45
|
+
},
|
|
46
|
+
database: {
|
|
47
|
+
path: ".kg/knowledge.db"
|
|
48
|
+
},
|
|
49
|
+
claudeFlow: {
|
|
50
|
+
enabled: true,
|
|
51
|
+
namespace: "knowledge-graph",
|
|
52
|
+
syncOnChange: true
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const gitignorePath = join(kgDir, ".gitignore");
|
|
59
|
+
if (!existsSync(gitignorePath)) {
|
|
60
|
+
writeFileSync(gitignorePath, "# Knowledge Graph Database\nknowledge.db\nknowledge.db-wal\nknowledge.db-shm\n", "utf-8");
|
|
61
|
+
}
|
|
62
|
+
spinner.succeed("Knowledge graph initialized!");
|
|
63
|
+
console.log("\n" + chalk.cyan("Next steps:"));
|
|
64
|
+
console.log(chalk.gray(" 1. Initialize docs: ") + chalk.white("kg docs init"));
|
|
65
|
+
console.log(chalk.gray(" 2. Generate graph: ") + chalk.white("kg graph"));
|
|
66
|
+
console.log(chalk.gray(" 3. Update CLAUDE.md: ") + chalk.white("kg claude update"));
|
|
67
|
+
console.log(chalk.gray(" 4. Sync with claude-flow: ") + chalk.white("kg sync"));
|
|
68
|
+
console.log();
|
|
69
|
+
} catch (error) {
|
|
70
|
+
spinner.fail("Failed to initialize knowledge graph");
|
|
71
|
+
console.error(chalk.red(String(error)));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
return command;
|
|
76
|
+
}
|
|
77
|
+
export {
|
|
78
|
+
createInitCommand
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sources":["../../../src/cli/commands/init.ts"],"sourcesContent":["/**\n * Init Command\n *\n * Initialize knowledge graph in a project.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { ConfigSchema } from '../../core/types.js';\nimport { createDatabase } from '../../core/database.js';\nimport { validateProjectRoot, validateDocsPath } from '../../core/security.js';\n\n/**\n * Create init command\n */\nexport function createInitCommand(): Command {\n const command = new Command('init');\n\n command\n .description('Initialize knowledge graph in the current project')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-d, --docs <path>', 'Docs directory path', 'docs')\n .option('-n, --name <name>', 'Project name')\n .option('--no-db', 'Skip database initialization')\n .option('--no-config', 'Skip config file creation')\n .option('-f, --force', 'Overwrite existing files')\n .action(async (options) => {\n const spinner = ora('Initializing knowledge graph...').start();\n\n try {\n // Validate paths to prevent traversal attacks\n const projectRoot = validateProjectRoot(options.path);\n const docsPath = options.docs; // Relative path for config, validated when used\n validateDocsPath(projectRoot, docsPath); // Validate it stays within project\n const kgDir = join(projectRoot, '.kg');\n\n // Check if already initialized\n if (existsSync(kgDir) && !options.force) {\n spinner.warn('Knowledge graph already initialized. Use --force to reinitialize.');\n return;\n }\n\n // Create .kg directory\n if (!existsSync(kgDir)) {\n mkdirSync(kgDir, { recursive: true });\n }\n\n // Initialize database\n if (options.db !== false) {\n spinner.text = 'Creating database...';\n const dbPath = join(kgDir, 'knowledge.db');\n const db = createDatabase(dbPath);\n\n // Set initial metadata\n db.setMetadata('projectRoot', projectRoot);\n db.setMetadata('docsPath', docsPath);\n db.setMetadata('initialized', new Date().toISOString());\n\n db.close();\n }\n\n // Create config file\n if (options.config !== false) {\n spinner.text = 'Creating configuration...';\n const configPath = join(kgDir, 'config.json');\n\n if (!existsSync(configPath) || options.force) {\n const config = ConfigSchema.parse({\n projectRoot: '.',\n docsRoot: docsPath,\n vaultName: options.name,\n graph: {\n includePatterns: ['**/*.md'],\n excludePatterns: ['node_modules/**', 'dist/**', '.git/**'],\n },\n database: {\n path: '.kg/knowledge.db',\n },\n claudeFlow: {\n enabled: true,\n namespace: 'knowledge-graph',\n syncOnChange: true,\n },\n });\n\n writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');\n }\n }\n\n // Create .gitignore entry\n const gitignorePath = join(kgDir, '.gitignore');\n if (!existsSync(gitignorePath)) {\n writeFileSync(gitignorePath, '# Knowledge Graph Database\\nknowledge.db\\nknowledge.db-wal\\nknowledge.db-shm\\n', 'utf-8');\n }\n\n spinner.succeed('Knowledge graph initialized!');\n\n // Show next steps\n console.log('\\n' + chalk.cyan('Next steps:'));\n console.log(chalk.gray(' 1. Initialize docs: ') + chalk.white('kg docs init'));\n console.log(chalk.gray(' 2. Generate graph: ') + chalk.white('kg graph'));\n console.log(chalk.gray(' 3. Update CLAUDE.md: ') + chalk.white('kg claude update'));\n console.log(chalk.gray(' 4. Sync with claude-flow: ') + chalk.white('kg sync'));\n console.log();\n\n } catch (error) {\n spinner.fail('Failed to initialize knowledge graph');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n return command;\n}\n"],"names":[],"mappings":";;;;;;;;AAkBO,SAAS,oBAA6B;AAC3C,QAAM,UAAU,IAAI,QAAQ,MAAM;AAElC,UACG,YAAY,mDAAmD,EAC/D,OAAO,qBAAqB,qBAAqB,GAAG,EACpD,OAAO,qBAAqB,uBAAuB,MAAM,EACzD,OAAO,qBAAqB,cAAc,EAC1C,OAAO,WAAW,8BAA8B,EAChD,OAAO,eAAe,2BAA2B,EACjD,OAAO,eAAe,0BAA0B,EAChD,OAAO,OAAO,YAAY;AACzB,UAAM,UAAU,IAAI,iCAAiC,EAAE,MAAA;AAEvD,QAAI;AAEF,YAAM,cAAc,oBAAoB,QAAQ,IAAI;AACpD,YAAM,WAAW,QAAQ;AACzB,uBAAiB,aAAa,QAAQ;AACtC,YAAM,QAAQ,KAAK,aAAa,KAAK;AAGrC,UAAI,WAAW,KAAK,KAAK,CAAC,QAAQ,OAAO;AACvC,gBAAQ,KAAK,mEAAmE;AAChF;AAAA,MACF;AAGA,UAAI,CAAC,WAAW,KAAK,GAAG;AACtB,kBAAU,OAAO,EAAE,WAAW,KAAA,CAAM;AAAA,MACtC;AAGA,UAAI,QAAQ,OAAO,OAAO;AACxB,gBAAQ,OAAO;AACf,cAAM,SAAS,KAAK,OAAO,cAAc;AACzC,cAAM,KAAK,eAAe,MAAM;AAGhC,WAAG,YAAY,eAAe,WAAW;AACzC,WAAG,YAAY,YAAY,QAAQ;AACnC,WAAG,YAAY,gBAAe,oBAAI,KAAA,GAAO,aAAa;AAEtD,WAAG,MAAA;AAAA,MACL;AAGA,UAAI,QAAQ,WAAW,OAAO;AAC5B,gBAAQ,OAAO;AACf,cAAM,aAAa,KAAK,OAAO,aAAa;AAE5C,YAAI,CAAC,WAAW,UAAU,KAAK,QAAQ,OAAO;AAC5C,gBAAM,SAAS,aAAa,MAAM;AAAA,YAChC,aAAa;AAAA,YACb,UAAU;AAAA,YACV,WAAW,QAAQ;AAAA,YACnB,OAAO;AAAA,cACL,iBAAiB,CAAC,SAAS;AAAA,cAC3B,iBAAiB,CAAC,mBAAmB,WAAW,SAAS;AAAA,YAAA;AAAA,YAE3D,UAAU;AAAA,cACR,MAAM;AAAA,YAAA;AAAA,YAER,YAAY;AAAA,cACV,SAAS;AAAA,cACT,WAAW;AAAA,cACX,cAAc;AAAA,YAAA;AAAA,UAChB,CACD;AAED,wBAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAAA,QACpE;AAAA,MACF;AAGA,YAAM,gBAAgB,KAAK,OAAO,YAAY;AAC9C,UAAI,CAAC,WAAW,aAAa,GAAG;AAC9B,sBAAc,eAAe,kFAAkF,OAAO;AAAA,MACxH;AAEA,cAAQ,QAAQ,8BAA8B;AAG9C,cAAQ,IAAI,OAAO,MAAM,KAAK,aAAa,CAAC;AAC5C,cAAQ,IAAI,MAAM,KAAK,2BAA2B,IAAI,MAAM,MAAM,cAAc,CAAC;AACjF,cAAQ,IAAI,MAAM,KAAK,2BAA2B,IAAI,MAAM,MAAM,UAAU,CAAC;AAC7E,cAAQ,IAAI,MAAM,KAAK,2BAA2B,IAAI,MAAM,MAAM,kBAAkB,CAAC;AACrF,cAAQ,IAAI,MAAM,KAAK,8BAA8B,IAAI,MAAM,MAAM,SAAS,CAAC;AAC/E,cAAQ,IAAA;AAAA,IAEV,SAAS,OAAO;AACd,cAAQ,KAAK,sCAAsC;AACnD,cAAQ,MAAM,MAAM,IAAI,OAAO,KAAK,CAAC,CAAC;AACtC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAuG7C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
import { join } from "path";
|
|
5
|
+
import { createDatabase } from "../../core/database.js";
|
|
6
|
+
import { validateProjectRoot } from "../../core/security.js";
|
|
7
|
+
function createSearchCommand() {
|
|
8
|
+
const command = new Command("search");
|
|
9
|
+
command.description("Search the knowledge graph").argument("<query>", "Search query").option("-p, --path <path>", "Project root path", ".").option("-t, --type <type>", "Filter by node type").option("-g, --tag <tag>", "Filter by tag").option("-l, --limit <number>", "Limit results", "20").option("--json", "Output as JSON").action(async (query, options) => {
|
|
10
|
+
try {
|
|
11
|
+
const projectRoot = validateProjectRoot(options.path);
|
|
12
|
+
const dbPath = join(projectRoot, ".kg", "knowledge.db");
|
|
13
|
+
if (!existsSync(dbPath)) {
|
|
14
|
+
console.log(chalk.yellow(" Knowledge graph not found"));
|
|
15
|
+
console.log(chalk.gray(" Run ") + chalk.cyan("kg graph") + chalk.gray(" to generate one"));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const db = createDatabase(dbPath);
|
|
19
|
+
const limit = parseInt(options.limit, 10);
|
|
20
|
+
let results;
|
|
21
|
+
if (options.tag) {
|
|
22
|
+
results = db.getNodesByTag(options.tag);
|
|
23
|
+
} else if (options.type) {
|
|
24
|
+
results = db.getNodesByType(options.type);
|
|
25
|
+
} else {
|
|
26
|
+
results = db.searchNodes(query, limit);
|
|
27
|
+
}
|
|
28
|
+
if (options.type && !options.tag) {
|
|
29
|
+
results = results.filter((n) => n.type === options.type);
|
|
30
|
+
}
|
|
31
|
+
results = results.slice(0, limit);
|
|
32
|
+
if (options.json) {
|
|
33
|
+
console.log(JSON.stringify(results.map((n) => ({
|
|
34
|
+
id: n.id,
|
|
35
|
+
title: n.title,
|
|
36
|
+
type: n.type,
|
|
37
|
+
status: n.status,
|
|
38
|
+
path: n.path,
|
|
39
|
+
tags: n.tags
|
|
40
|
+
})), null, 2));
|
|
41
|
+
db.close();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
console.log(chalk.cyan(`
|
|
45
|
+
Search Results for "${query}"
|
|
46
|
+
`));
|
|
47
|
+
if (results.length === 0) {
|
|
48
|
+
console.log(chalk.gray(" No results found"));
|
|
49
|
+
db.close();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
console.log(chalk.gray(` Found ${results.length} result${results.length === 1 ? "" : "s"}
|
|
53
|
+
`));
|
|
54
|
+
results.forEach((node, i) => {
|
|
55
|
+
const statusColor = node.status === "active" ? chalk.green : node.status === "draft" ? chalk.yellow : node.status === "deprecated" ? chalk.red : chalk.gray;
|
|
56
|
+
console.log(chalk.white(` ${i + 1}. ${node.title}`));
|
|
57
|
+
console.log(chalk.gray(` Type: ${node.type} | Status: `) + statusColor(node.status));
|
|
58
|
+
console.log(chalk.gray(` Path: ${node.path}`));
|
|
59
|
+
if (node.tags.length > 0) {
|
|
60
|
+
console.log(chalk.gray(" Tags: ") + chalk.blue(node.tags.join(", ")));
|
|
61
|
+
}
|
|
62
|
+
const incoming = node.incomingLinks.length;
|
|
63
|
+
const outgoing = node.outgoingLinks.length;
|
|
64
|
+
if (incoming > 0 || outgoing > 0) {
|
|
65
|
+
console.log(chalk.gray(` Links: ${incoming} incoming, ${outgoing} outgoing`));
|
|
66
|
+
}
|
|
67
|
+
console.log();
|
|
68
|
+
});
|
|
69
|
+
db.close();
|
|
70
|
+
} catch (error) {
|
|
71
|
+
console.error(chalk.red("Search failed:"), String(error));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
return command;
|
|
76
|
+
}
|
|
77
|
+
export {
|
|
78
|
+
createSearchCommand
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sources":["../../../src/cli/commands/search.ts"],"sourcesContent":["/**\n * Search Command\n *\n * Search the knowledge graph.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { createDatabase } from '../../core/database.js';\nimport { validateProjectRoot } from '../../core/security.js';\n\n/**\n * Create search command\n */\nexport function createSearchCommand(): Command {\n const command = new Command('search');\n\n command\n .description('Search the knowledge graph')\n .argument('<query>', 'Search query')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-t, --type <type>', 'Filter by node type')\n .option('-g, --tag <tag>', 'Filter by tag')\n .option('-l, --limit <number>', 'Limit results', '20')\n .option('--json', 'Output as JSON')\n .action(async (query, options) => {\n try {\n // Validate path to prevent traversal attacks\n const projectRoot = validateProjectRoot(options.path);\n const dbPath = join(projectRoot, '.kg', 'knowledge.db');\n\n // Check if database exists\n if (!existsSync(dbPath)) {\n console.log(chalk.yellow(' Knowledge graph not found'));\n console.log(chalk.gray(' Run ') + chalk.cyan('kg graph') + chalk.gray(' to generate one'));\n return;\n }\n\n const db = createDatabase(dbPath);\n const limit = parseInt(options.limit, 10);\n\n let results;\n\n if (options.tag) {\n // Search by tag\n results = db.getNodesByTag(options.tag);\n } else if (options.type) {\n // Search by type\n results = db.getNodesByType(options.type);\n } else {\n // Full-text search\n results = db.searchNodes(query, limit);\n }\n\n // Apply additional filters\n if (options.type && !options.tag) {\n results = results.filter(n => n.type === options.type);\n }\n\n // Limit results\n results = results.slice(0, limit);\n\n if (options.json) {\n console.log(JSON.stringify(results.map(n => ({\n id: n.id,\n title: n.title,\n type: n.type,\n status: n.status,\n path: n.path,\n tags: n.tags,\n })), null, 2));\n db.close();\n return;\n }\n\n console.log(chalk.cyan(`\\n Search Results for \"${query}\"\\n`));\n\n if (results.length === 0) {\n console.log(chalk.gray(' No results found'));\n db.close();\n return;\n }\n\n console.log(chalk.gray(` Found ${results.length} result${results.length === 1 ? '' : 's'}\\n`));\n\n results.forEach((node, i) => {\n const statusColor = node.status === 'active' ? chalk.green :\n node.status === 'draft' ? chalk.yellow :\n node.status === 'deprecated' ? chalk.red : chalk.gray;\n\n console.log(chalk.white(` ${i + 1}. ${node.title}`));\n console.log(chalk.gray(` Type: ${node.type} | Status: `) + statusColor(node.status));\n console.log(chalk.gray(` Path: ${node.path}`));\n\n if (node.tags.length > 0) {\n console.log(chalk.gray(' Tags: ') + chalk.blue(node.tags.join(', ')));\n }\n\n // Show connections\n const incoming = node.incomingLinks.length;\n const outgoing = node.outgoingLinks.length;\n if (incoming > 0 || outgoing > 0) {\n console.log(chalk.gray(` Links: ${incoming} incoming, ${outgoing} outgoing`));\n }\n\n console.log();\n });\n\n db.close();\n\n } catch (error) {\n console.error(chalk.red('Search failed:'), String(error));\n process.exit(1);\n }\n });\n\n return command;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stats.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAmG5C"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
import { join } from "path";
|
|
5
|
+
import { createDatabase } from "../../core/database.js";
|
|
6
|
+
import { validateProjectRoot } from "../../core/security.js";
|
|
7
|
+
function createStatsCommand() {
|
|
8
|
+
const command = new Command("stats");
|
|
9
|
+
command.description("Display knowledge graph statistics").option("-p, --path <path>", "Project root path", ".").option("--json", "Output as JSON").action(async (options) => {
|
|
10
|
+
try {
|
|
11
|
+
const projectRoot = validateProjectRoot(options.path);
|
|
12
|
+
const dbPath = join(projectRoot, ".kg", "knowledge.db");
|
|
13
|
+
if (!existsSync(dbPath)) {
|
|
14
|
+
console.log(chalk.yellow(" Knowledge graph not found"));
|
|
15
|
+
console.log(chalk.gray(" Run ") + chalk.cyan("kg graph") + chalk.gray(" to generate one"));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const db = createDatabase(dbPath);
|
|
19
|
+
const stats = db.getStats();
|
|
20
|
+
const metadata = {
|
|
21
|
+
version: db.getMetadata("version"),
|
|
22
|
+
lastGenerated: db.getMetadata("lastGenerated"),
|
|
23
|
+
lastUpdated: db.getMetadata("lastUpdated")
|
|
24
|
+
};
|
|
25
|
+
if (options.json) {
|
|
26
|
+
console.log(JSON.stringify({ stats, metadata }, null, 2));
|
|
27
|
+
db.close();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
console.log(chalk.cyan("\n Knowledge Graph Statistics\n"));
|
|
31
|
+
console.log(chalk.white(" Overview"));
|
|
32
|
+
console.log(chalk.gray(` Total nodes: ${stats.totalNodes}`));
|
|
33
|
+
console.log(chalk.gray(` Total edges: ${stats.totalEdges}`));
|
|
34
|
+
console.log(chalk.gray(` Orphan nodes: ${stats.orphanNodes}`));
|
|
35
|
+
console.log(chalk.gray(` Avg links: ${stats.avgLinksPerNode}/node`));
|
|
36
|
+
console.log();
|
|
37
|
+
console.log(chalk.white(" Nodes by Type"));
|
|
38
|
+
Object.entries(stats.nodesByType).forEach(([type, count]) => {
|
|
39
|
+
if (count > 0) {
|
|
40
|
+
const bar = "█".repeat(Math.min(count, 20));
|
|
41
|
+
console.log(chalk.gray(` ${type.padEnd(12)} ${String(count).padStart(4)} ${chalk.blue(bar)}`));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
console.log();
|
|
45
|
+
console.log(chalk.white(" Nodes by Status"));
|
|
46
|
+
Object.entries(stats.nodesByStatus).forEach(([status, count]) => {
|
|
47
|
+
if (count > 0) {
|
|
48
|
+
const color = status === "active" ? chalk.green : status === "draft" ? chalk.yellow : status === "deprecated" ? chalk.red : chalk.gray;
|
|
49
|
+
console.log(color(` ${status.padEnd(12)} ${count}`));
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
if (stats.mostConnected.length > 0) {
|
|
53
|
+
console.log();
|
|
54
|
+
console.log(chalk.white(" Most Connected Nodes"));
|
|
55
|
+
stats.mostConnected.forEach(({ id, connections }, i) => {
|
|
56
|
+
console.log(chalk.gray(` ${i + 1}. ${id} (${connections} connections)`));
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (metadata.lastGenerated || metadata.lastUpdated) {
|
|
60
|
+
console.log();
|
|
61
|
+
console.log(chalk.white(" Metadata"));
|
|
62
|
+
if (metadata.version) {
|
|
63
|
+
console.log(chalk.gray(` Version: ${metadata.version}`));
|
|
64
|
+
}
|
|
65
|
+
if (metadata.lastGenerated) {
|
|
66
|
+
console.log(chalk.gray(` Generated: ${metadata.lastGenerated}`));
|
|
67
|
+
}
|
|
68
|
+
if (metadata.lastUpdated) {
|
|
69
|
+
console.log(chalk.gray(` Last updated: ${metadata.lastUpdated}`));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
db.close();
|
|
73
|
+
console.log();
|
|
74
|
+
} catch (error) {
|
|
75
|
+
console.error(chalk.red("Failed to get stats:"), String(error));
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return command;
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
createStatsCommand
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sources":["../../../src/cli/commands/stats.ts"],"sourcesContent":["/**\n * Stats Command\n *\n * Display knowledge graph statistics.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { createDatabase } from '../../core/database.js';\nimport { validateProjectRoot } from '../../core/security.js';\n\n/**\n * Create stats command\n */\nexport function createStatsCommand(): Command {\n const command = new Command('stats');\n\n command\n .description('Display knowledge graph statistics')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n // Validate path to prevent traversal attacks\n const projectRoot = validateProjectRoot(options.path);\n const dbPath = join(projectRoot, '.kg', 'knowledge.db');\n\n // Check if database exists\n if (!existsSync(dbPath)) {\n console.log(chalk.yellow(' Knowledge graph not found'));\n console.log(chalk.gray(' Run ') + chalk.cyan('kg graph') + chalk.gray(' to generate one'));\n return;\n }\n\n const db = createDatabase(dbPath);\n const stats = db.getStats();\n const metadata = {\n version: db.getMetadata('version'),\n lastGenerated: db.getMetadata('lastGenerated'),\n lastUpdated: db.getMetadata('lastUpdated'),\n };\n\n if (options.json) {\n console.log(JSON.stringify({ stats, metadata }, null, 2));\n db.close();\n return;\n }\n\n console.log(chalk.cyan('\\n Knowledge Graph Statistics\\n'));\n\n // Overview\n console.log(chalk.white(' Overview'));\n console.log(chalk.gray(` Total nodes: ${stats.totalNodes}`));\n console.log(chalk.gray(` Total edges: ${stats.totalEdges}`));\n console.log(chalk.gray(` Orphan nodes: ${stats.orphanNodes}`));\n console.log(chalk.gray(` Avg links: ${stats.avgLinksPerNode}/node`));\n\n // Nodes by type\n console.log();\n console.log(chalk.white(' Nodes by Type'));\n Object.entries(stats.nodesByType).forEach(([type, count]) => {\n if (count > 0) {\n const bar = '█'.repeat(Math.min(count, 20));\n console.log(chalk.gray(` ${type.padEnd(12)} ${String(count).padStart(4)} ${chalk.blue(bar)}`));\n }\n });\n\n // Nodes by status\n console.log();\n console.log(chalk.white(' Nodes by Status'));\n Object.entries(stats.nodesByStatus).forEach(([status, count]) => {\n if (count > 0) {\n const color = status === 'active' ? chalk.green :\n status === 'draft' ? chalk.yellow :\n status === 'deprecated' ? chalk.red : chalk.gray;\n console.log(color(` ${status.padEnd(12)} ${count}`));\n }\n });\n\n // Most connected\n if (stats.mostConnected.length > 0) {\n console.log();\n console.log(chalk.white(' Most Connected Nodes'));\n stats.mostConnected.forEach(({ id, connections }, i) => {\n console.log(chalk.gray(` ${i + 1}. ${id} (${connections} connections)`));\n });\n }\n\n // Metadata\n if (metadata.lastGenerated || metadata.lastUpdated) {\n console.log();\n console.log(chalk.white(' Metadata'));\n if (metadata.version) {\n console.log(chalk.gray(` Version: ${metadata.version}`));\n }\n if (metadata.lastGenerated) {\n console.log(chalk.gray(` Generated: ${metadata.lastGenerated}`));\n }\n if (metadata.lastUpdated) {\n console.log(chalk.gray(` Last updated: ${metadata.lastUpdated}`));\n }\n }\n\n db.close();\n console.log();\n\n } catch (error) {\n console.error(chalk.red('Failed to get stats:'), String(error));\n process.exit(1);\n }\n });\n\n return command;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CA4F3C"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { existsSync } from "fs";
|
|
5
|
+
import { join } from "path";
|
|
6
|
+
import { createDatabase } from "../../core/database.js";
|
|
7
|
+
import { createClaudeFlowIntegration, generateMcpConfig } from "../../integrations/claude-flow.js";
|
|
8
|
+
import { validateProjectRoot } from "../../core/security.js";
|
|
9
|
+
function createSyncCommand() {
|
|
10
|
+
const command = new Command("sync");
|
|
11
|
+
command.description("Sync knowledge graph with claude-flow memory").option("-p, --path <path>", "Project root path", ".").option("-n, --namespace <namespace>", "Memory namespace", "knowledge-graph").option("--show-commands", "Show MCP commands instead of executing").option("--hooks", "Show hook configuration commands").action(async (options) => {
|
|
12
|
+
const spinner = ora("Syncing with claude-flow...").start();
|
|
13
|
+
try {
|
|
14
|
+
const projectRoot = validateProjectRoot(options.path);
|
|
15
|
+
const dbPath = join(projectRoot, ".kg", "knowledge.db");
|
|
16
|
+
if (!existsSync(dbPath)) {
|
|
17
|
+
spinner.fail("Knowledge graph not found");
|
|
18
|
+
console.log(chalk.gray(" Run ") + chalk.cyan("kg graph") + chalk.gray(" first"));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
const db = createDatabase(dbPath);
|
|
22
|
+
const integration = createClaudeFlowIntegration({
|
|
23
|
+
namespace: options.namespace,
|
|
24
|
+
syncOnChange: true
|
|
25
|
+
});
|
|
26
|
+
if (options.showCommands) {
|
|
27
|
+
spinner.stop();
|
|
28
|
+
console.log(chalk.cyan("\n Claude-Flow MCP Commands\n"));
|
|
29
|
+
console.log(chalk.gray(" Use these commands in Claude Code:\n"));
|
|
30
|
+
integration.generateRetrievalCommands().forEach((cmd) => {
|
|
31
|
+
console.log(chalk.white(` ${cmd}`));
|
|
32
|
+
});
|
|
33
|
+
db.close();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (options.hooks) {
|
|
37
|
+
spinner.stop();
|
|
38
|
+
console.log(chalk.cyan("\n Claude-Flow Hook Commands\n"));
|
|
39
|
+
console.log(chalk.gray(" Add these to your workflow:\n"));
|
|
40
|
+
integration.generateHookCommands().forEach((cmd) => {
|
|
41
|
+
console.log(chalk.white(` ${cmd}`));
|
|
42
|
+
});
|
|
43
|
+
db.close();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
spinner.text = "Preparing sync data...";
|
|
47
|
+
const result = await integration.syncToMemory(db);
|
|
48
|
+
spinner.succeed("Sync complete!");
|
|
49
|
+
console.log();
|
|
50
|
+
console.log(chalk.white(" Results:"));
|
|
51
|
+
console.log(chalk.green(` Synced: ${result.synced} entries`));
|
|
52
|
+
if (result.failed > 0) {
|
|
53
|
+
console.log(chalk.yellow(` Failed: ${result.failed}`));
|
|
54
|
+
}
|
|
55
|
+
console.log();
|
|
56
|
+
console.log(chalk.cyan(" Memory Retrieval:"));
|
|
57
|
+
console.log(chalk.gray(` Get stats: mcp__claude-flow__memory_usage { action: "retrieve", key: "stats", namespace: "${options.namespace}" }`));
|
|
58
|
+
console.log(chalk.gray(` Get node: mcp__claude-flow__memory_usage { action: "retrieve", key: "node/<id>", namespace: "${options.namespace}" }`));
|
|
59
|
+
db.close();
|
|
60
|
+
console.log();
|
|
61
|
+
} catch (error) {
|
|
62
|
+
spinner.fail("Sync failed");
|
|
63
|
+
console.error(chalk.red(String(error)));
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
command.command("config").description("Show MCP configuration for CLAUDE.md").option("-n, --namespace <namespace>", "Memory namespace", "knowledge-graph").action((options) => {
|
|
68
|
+
const config = generateMcpConfig(options.namespace);
|
|
69
|
+
console.log(config);
|
|
70
|
+
});
|
|
71
|
+
return command;
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
createSyncCommand
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sources":["../../../src/cli/commands/sync.ts"],"sourcesContent":["/**\n * Sync Command\n *\n * Synchronize knowledge graph with claude-flow memory.\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { createDatabase } from '../../core/database.js';\nimport { createClaudeFlowIntegration, generateMcpConfig } from '../../integrations/claude-flow.js';\nimport { validateProjectRoot } from '../../core/security.js';\n\n/**\n * Create sync command\n */\nexport function createSyncCommand(): Command {\n const command = new Command('sync');\n\n command\n .description('Sync knowledge graph with claude-flow memory')\n .option('-p, --path <path>', 'Project root path', '.')\n .option('-n, --namespace <namespace>', 'Memory namespace', 'knowledge-graph')\n .option('--show-commands', 'Show MCP commands instead of executing')\n .option('--hooks', 'Show hook configuration commands')\n .action(async (options) => {\n const spinner = ora('Syncing with claude-flow...').start();\n\n try {\n // Validate path to prevent traversal attacks\n const projectRoot = validateProjectRoot(options.path);\n const dbPath = join(projectRoot, '.kg', 'knowledge.db');\n\n // Check if database exists\n if (!existsSync(dbPath)) {\n spinner.fail('Knowledge graph not found');\n console.log(chalk.gray(' Run ') + chalk.cyan('kg graph') + chalk.gray(' first'));\n process.exit(1);\n }\n\n const db = createDatabase(dbPath);\n const integration = createClaudeFlowIntegration({\n namespace: options.namespace,\n syncOnChange: true,\n });\n\n if (options.showCommands) {\n spinner.stop();\n console.log(chalk.cyan('\\n Claude-Flow MCP Commands\\n'));\n console.log(chalk.gray(' Use these commands in Claude Code:\\n'));\n integration.generateRetrievalCommands().forEach(cmd => {\n console.log(chalk.white(` ${cmd}`));\n });\n db.close();\n return;\n }\n\n if (options.hooks) {\n spinner.stop();\n console.log(chalk.cyan('\\n Claude-Flow Hook Commands\\n'));\n console.log(chalk.gray(' Add these to your workflow:\\n'));\n integration.generateHookCommands().forEach(cmd => {\n console.log(chalk.white(` ${cmd}`));\n });\n db.close();\n return;\n }\n\n // Perform sync\n spinner.text = 'Preparing sync data...';\n const result = await integration.syncToMemory(db);\n\n spinner.succeed('Sync complete!');\n\n console.log();\n console.log(chalk.white(' Results:'));\n console.log(chalk.green(` Synced: ${result.synced} entries`));\n if (result.failed > 0) {\n console.log(chalk.yellow(` Failed: ${result.failed}`));\n }\n\n // Show helpful commands\n console.log();\n console.log(chalk.cyan(' Memory Retrieval:'));\n console.log(chalk.gray(` Get stats: mcp__claude-flow__memory_usage { action: \"retrieve\", key: \"stats\", namespace: \"${options.namespace}\" }`));\n console.log(chalk.gray(` Get node: mcp__claude-flow__memory_usage { action: \"retrieve\", key: \"node/<id>\", namespace: \"${options.namespace}\" }`));\n\n db.close();\n console.log();\n\n } catch (error) {\n spinner.fail('Sync failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n\n // Config subcommand\n command\n .command('config')\n .description('Show MCP configuration for CLAUDE.md')\n .option('-n, --namespace <namespace>', 'Memory namespace', 'knowledge-graph')\n .action((options) => {\n const config = generateMcpConfig(options.namespace);\n console.log(config);\n });\n\n return command;\n}\n"],"names":[],"mappings":";;;;;;;;AAkBO,SAAS,oBAA6B;AAC3C,QAAM,UAAU,IAAI,QAAQ,MAAM;AAElC,UACG,YAAY,8CAA8C,EAC1D,OAAO,qBAAqB,qBAAqB,GAAG,EACpD,OAAO,+BAA+B,oBAAoB,iBAAiB,EAC3E,OAAO,mBAAmB,wCAAwC,EAClE,OAAO,WAAW,kCAAkC,EACpD,OAAO,OAAO,YAAY;AACzB,UAAM,UAAU,IAAI,6BAA6B,EAAE,MAAA;AAEnD,QAAI;AAEF,YAAM,cAAc,oBAAoB,QAAQ,IAAI;AACpD,YAAM,SAAS,KAAK,aAAa,OAAO,cAAc;AAGtD,UAAI,CAAC,WAAW,MAAM,GAAG;AACvB,gBAAQ,KAAK,2BAA2B;AACxC,gBAAQ,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,QAAQ,CAAC;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,KAAK,eAAe,MAAM;AAChC,YAAM,cAAc,4BAA4B;AAAA,QAC9C,WAAW,QAAQ;AAAA,QACnB,cAAc;AAAA,MAAA,CACf;AAED,UAAI,QAAQ,cAAc;AACxB,gBAAQ,KAAA;AACR,gBAAQ,IAAI,MAAM,KAAK,gCAAgC,CAAC;AACxD,gBAAQ,IAAI,MAAM,KAAK,wCAAwC,CAAC;AAChE,oBAAY,0BAAA,EAA4B,QAAQ,CAAA,QAAO;AACrD,kBAAQ,IAAI,MAAM,MAAM,KAAK,GAAG,EAAE,CAAC;AAAA,QACrC,CAAC;AACD,WAAG,MAAA;AACH;AAAA,MACF;AAEA,UAAI,QAAQ,OAAO;AACjB,gBAAQ,KAAA;AACR,gBAAQ,IAAI,MAAM,KAAK,iCAAiC,CAAC;AACzD,gBAAQ,IAAI,MAAM,KAAK,iCAAiC,CAAC;AACzD,oBAAY,qBAAA,EAAuB,QAAQ,CAAA,QAAO;AAChD,kBAAQ,IAAI,MAAM,MAAM,KAAK,GAAG,EAAE,CAAC;AAAA,QACrC,CAAC;AACD,WAAG,MAAA;AACH;AAAA,MACF;AAGA,cAAQ,OAAO;AACf,YAAM,SAAS,MAAM,YAAY,aAAa,EAAE;AAEhD,cAAQ,QAAQ,gBAAgB;AAEhC,cAAQ,IAAA;AACR,cAAQ,IAAI,MAAM,MAAM,YAAY,CAAC;AACrC,cAAQ,IAAI,MAAM,MAAM,eAAe,OAAO,MAAM,UAAU,CAAC;AAC/D,UAAI,OAAO,SAAS,GAAG;AACrB,gBAAQ,IAAI,MAAM,OAAO,eAAe,OAAO,MAAM,EAAE,CAAC;AAAA,MAC1D;AAGA,cAAQ,IAAA;AACR,cAAQ,IAAI,MAAM,KAAK,qBAAqB,CAAC;AAC7C,cAAQ,IAAI,MAAM,KAAK,iGAAiG,QAAQ,SAAS,KAAK,CAAC;AAC/I,cAAQ,IAAI,MAAM,KAAK,qGAAqG,QAAQ,SAAS,KAAK,CAAC;AAEnJ,SAAG,MAAA;AACH,cAAQ,IAAA;AAAA,IAEV,SAAS,OAAO;AACd,cAAQ,KAAK,aAAa;AAC1B,cAAQ,MAAM,MAAM,IAAI,OAAO,KAAK,CAAC,CAAC;AACtC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAGH,UACG,QAAQ,QAAQ,EAChB,YAAY,sCAAsC,EAClD,OAAO,+BAA+B,oBAAoB,iBAAiB,EAC3E,OAAO,CAAC,YAAY;AACnB,UAAM,SAAS,kBAAkB,QAAQ,SAAS;AAClD,YAAQ,IAAI,MAAM;AAAA,EACpB,CAAC;AAEH,SAAO;AACT;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Graph Agent CLI
|
|
3
|
+
*
|
|
4
|
+
* Main CLI setup and command registration.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Create and configure the CLI program
|
|
9
|
+
*/
|
|
10
|
+
export declare function createCLI(): Command;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CA4CnC"}
|