ts-knowledge-graph 0.1.1 → 0.1.2
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 +34 -13
- package/contribs/web_visualisation/README.md +55 -0
- package/contribs/web_visualisation/web/css/style.css +115 -0
- package/contribs/web_visualisation/web/data/.gitignore +2 -0
- package/contribs/web_visualisation/web/index.html +58 -0
- package/contribs/web_visualisation/web/js/app.js +364 -0
- package/dist/agent/agent_tools.d.ts +13 -0
- package/dist/agent/agent_tools.d.ts.map +1 -0
- package/dist/agent/agent_tools.js +153 -0
- package/dist/agent/agent_tools.js.map +1 -0
- package/dist/agent/code_editor.d.ts +18 -0
- package/dist/agent/code_editor.d.ts.map +1 -0
- package/dist/agent/code_editor.js +43 -0
- package/dist/agent/code_editor.js.map +1 -0
- package/dist/agent/optimizer_agent.d.ts +30 -0
- package/dist/agent/optimizer_agent.d.ts.map +1 -0
- package/dist/agent/optimizer_agent.js +97 -0
- package/dist/agent/optimizer_agent.js.map +1 -0
- package/dist/cli.d.ts +0 -9
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +24 -208
- package/dist/cli.js.map +1 -1
- package/dist/commands/blast-radius.d.ts +5 -0
- package/dist/commands/blast-radius.d.ts.map +1 -0
- package/dist/commands/blast-radius.js +18 -0
- package/dist/commands/blast-radius.js.map +1 -0
- package/dist/commands/blast_radius.d.ts +5 -0
- package/dist/commands/blast_radius.d.ts.map +1 -0
- package/dist/commands/blast_radius.js +18 -0
- package/dist/commands/blast_radius.js.map +1 -0
- package/dist/commands/blast_radius_command.d.ts +5 -0
- package/dist/commands/blast_radius_command.d.ts.map +1 -0
- package/dist/commands/blast_radius_command.js +18 -0
- package/dist/commands/blast_radius_command.js.map +1 -0
- package/dist/commands/calls.d.ts +5 -0
- package/dist/commands/calls.d.ts.map +1 -0
- package/dist/commands/calls.js +7 -0
- package/dist/commands/calls.js.map +1 -0
- package/dist/commands/calls_command.d.ts +5 -0
- package/dist/commands/calls_command.d.ts.map +1 -0
- package/dist/commands/calls_command.js +7 -0
- package/dist/commands/calls_command.js.map +1 -0
- package/dist/commands/command-helpers.d.ts +15 -0
- package/dist/commands/command-helpers.d.ts.map +1 -0
- package/dist/commands/command-helpers.js +61 -0
- package/dist/commands/command-helpers.js.map +1 -0
- package/dist/commands/command_helpers.d.ts +15 -0
- package/dist/commands/command_helpers.d.ts.map +1 -0
- package/dist/commands/command_helpers.js +61 -0
- package/dist/commands/command_helpers.js.map +1 -0
- package/dist/commands/dead-exports.d.ts +5 -0
- package/dist/commands/dead-exports.d.ts.map +1 -0
- package/dist/commands/dead-exports.js +7 -0
- package/dist/commands/dead-exports.js.map +1 -0
- package/dist/commands/dead_exports.d.ts +5 -0
- package/dist/commands/dead_exports.d.ts.map +1 -0
- package/dist/commands/dead_exports.js +7 -0
- package/dist/commands/dead_exports.js.map +1 -0
- package/dist/commands/dead_exports_command.d.ts +5 -0
- package/dist/commands/dead_exports_command.d.ts.map +1 -0
- package/dist/commands/dead_exports_command.js +7 -0
- package/dist/commands/dead_exports_command.js.map +1 -0
- package/dist/commands/extract.d.ts +8 -0
- package/dist/commands/extract.d.ts.map +1 -0
- package/dist/commands/extract.js +49 -0
- package/dist/commands/extract.js.map +1 -0
- package/dist/commands/extract_command.d.ts +8 -0
- package/dist/commands/extract_command.d.ts.map +1 -0
- package/dist/commands/extract_command.js +49 -0
- package/dist/commands/extract_command.js.map +1 -0
- package/dist/commands/find.d.ts +5 -0
- package/dist/commands/find.d.ts.map +1 -0
- package/dist/commands/find.js +7 -0
- package/dist/commands/find.js.map +1 -0
- package/dist/commands/find_command.d.ts +5 -0
- package/dist/commands/find_command.d.ts.map +1 -0
- package/dist/commands/find_command.js +7 -0
- package/dist/commands/find_command.js.map +1 -0
- package/dist/commands/install_command.d.ts +16 -0
- package/dist/commands/install_command.d.ts.map +1 -0
- package/dist/commands/install_command.js +42 -0
- package/dist/commands/install_command.js.map +1 -0
- package/dist/commands/load.d.ts +6 -0
- package/dist/commands/load.d.ts.map +1 -0
- package/dist/commands/load.js +28 -0
- package/dist/commands/load.js.map +1 -0
- package/dist/commands/load_command.d.ts +6 -0
- package/dist/commands/load_command.d.ts.map +1 -0
- package/dist/commands/load_command.js +28 -0
- package/dist/commands/load_command.js.map +1 -0
- package/dist/commands/neighbors.d.ts +5 -0
- package/dist/commands/neighbors.d.ts.map +1 -0
- package/dist/commands/neighbors.js +17 -0
- package/dist/commands/neighbors.js.map +1 -0
- package/dist/commands/neighbors_command.d.ts +5 -0
- package/dist/commands/neighbors_command.d.ts.map +1 -0
- package/dist/commands/neighbors_command.js +17 -0
- package/dist/commands/neighbors_command.js.map +1 -0
- package/dist/commands/optimize.d.ts +6 -0
- package/dist/commands/optimize.d.ts.map +1 -0
- package/dist/commands/optimize.js +59 -0
- package/dist/commands/optimize.js.map +1 -0
- package/dist/commands/optimize_command.d.ts +6 -0
- package/dist/commands/optimize_command.d.ts.map +1 -0
- package/dist/commands/optimize_command.js +59 -0
- package/dist/commands/optimize_command.js.map +1 -0
- package/dist/commands/references.d.ts +5 -0
- package/dist/commands/references.d.ts.map +1 -0
- package/dist/commands/references.js +17 -0
- package/dist/commands/references.js.map +1 -0
- package/dist/commands/references_command.d.ts +5 -0
- package/dist/commands/references_command.d.ts.map +1 -0
- package/dist/commands/references_command.js +17 -0
- package/dist/commands/references_command.js.map +1 -0
- package/dist/commands/web.d.ts +19 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +120 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/commands/web_command.d.ts +19 -0
- package/dist/commands/web_command.d.ts.map +1 -0
- package/dist/commands/web_command.js +120 -0
- package/dist/commands/web_command.js.map +1 -0
- package/dist/commands/who-calls.d.ts +5 -0
- package/dist/commands/who-calls.d.ts.map +1 -0
- package/dist/commands/who-calls.js +7 -0
- package/dist/commands/who-calls.js.map +1 -0
- package/dist/commands/who_calls.d.ts +5 -0
- package/dist/commands/who_calls.d.ts.map +1 -0
- package/dist/commands/who_calls.js +7 -0
- package/dist/commands/who_calls.js.map +1 -0
- package/dist/commands/who_calls_command.d.ts +5 -0
- package/dist/commands/who_calls_command.d.ts.map +1 -0
- package/dist/commands/who_calls_command.js +7 -0
- package/dist/commands/who_calls_command.js.map +1 -0
- package/dist/extract/graph_builder.d.ts +16 -0
- package/dist/extract/graph_builder.d.ts.map +1 -0
- package/dist/extract/graph_builder.js +39 -0
- package/dist/extract/graph_builder.js.map +1 -0
- package/dist/extract/node_id.d.ts +8 -0
- package/dist/extract/node_id.d.ts.map +1 -0
- package/dist/extract/node_id.js +22 -0
- package/dist/extract/node_id.js.map +1 -0
- package/dist/extract/project_loader.d.ts +5 -0
- package/dist/extract/project_loader.d.ts.map +1 -0
- package/dist/extract/project_loader.js +19 -0
- package/dist/extract/project_loader.js.map +1 -0
- package/dist/extract/semantic_extractor.d.ts +22 -0
- package/dist/extract/semantic_extractor.d.ts.map +1 -0
- package/dist/extract/semantic_extractor.js +254 -0
- package/dist/extract/semantic_extractor.js.map +1 -0
- package/dist/extract/structural_extractor.d.ts +18 -0
- package/dist/extract/structural_extractor.d.ts.map +1 -0
- package/dist/extract/structural_extractor.js +97 -0
- package/dist/extract/structural_extractor.js.map +1 -0
- package/dist/query/graph_query.d.ts +28 -0
- package/dist/query/graph_query.d.ts.map +1 -0
- package/dist/query/graph_query.js +93 -0
- package/dist/query/graph_query.js.map +1 -0
- package/dist/store/jsonl_reader.d.ts +11 -0
- package/dist/store/jsonl_reader.d.ts.map +1 -0
- package/dist/store/jsonl_reader.js +19 -0
- package/dist/store/jsonl_reader.js.map +1 -0
- package/dist/store/jsonl_store.d.ts +7 -0
- package/dist/store/jsonl_store.d.ts.map +1 -0
- package/dist/store/jsonl_store.js +13 -0
- package/dist/store/jsonl_store.js.map +1 -0
- package/dist/store/kuzu_store.d.ts +20 -0
- package/dist/store/kuzu_store.d.ts.map +1 -0
- package/dist/store/kuzu_store.js +66 -0
- package/dist/store/kuzu_store.js.map +1 -0
- package/package.json +6 -2
- package/skills/ts-knowledge-graph/SKILL.md +91 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find_command.d.ts","sourceRoot":"","sources":["../../src/commands/find_command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,qBAAa,WAAW;IACvB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAIvC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CommandHelpers } from './command_helpers.js';
|
|
2
|
+
export class FindCommand {
|
|
3
|
+
static register(program) {
|
|
4
|
+
CommandHelpers.registerSymbolQuery(program, 'find', '<pattern>', 'find symbols whose name contains <pattern>', (query, arg) => query.find(arg));
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=find_command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find_command.js","sourceRoot":"","sources":["../../src/commands/find_command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,OAAO,WAAW;IACvB,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC/B,cAAc,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAC7H,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnB,CAAC;CACD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Installs the bundled Claude Code skill into a target project so an agent can
|
|
4
|
+
* query the knowledge graph through the ts-knowledge-graph CLI.
|
|
5
|
+
*/
|
|
6
|
+
export declare class InstallCommand {
|
|
7
|
+
static register(program: Command): void;
|
|
8
|
+
private static run;
|
|
9
|
+
/**
|
|
10
|
+
* Resolves the bundled SKILL.md relative to this module. The `../../` prefix
|
|
11
|
+
* reaches the package root from both `src/commands` (run via tsx) and
|
|
12
|
+
* `dist/commands` (run from the built output).
|
|
13
|
+
*/
|
|
14
|
+
private static sourceSkillPath;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=install_command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install_command.d.ts","sourceRoot":"","sources":["../../src/commands/install_command.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC;;;GAGG;AACH,qBAAa,cAAc;IAC1B,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAWlB,GAAG;IAcxB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;CAI9B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
const SKILL_RELATIVE_PATH = 'skills/ts-knowledge-graph/SKILL.md';
|
|
6
|
+
/**
|
|
7
|
+
* Installs the bundled Claude Code skill into a target project so an agent can
|
|
8
|
+
* query the knowledge graph through the ts-knowledge-graph CLI.
|
|
9
|
+
*/
|
|
10
|
+
export class InstallCommand {
|
|
11
|
+
static register(program) {
|
|
12
|
+
program
|
|
13
|
+
.command('install')
|
|
14
|
+
.description('install the ts-knowledge-graph Claude Code skill into a project')
|
|
15
|
+
.argument('[destFolder]', 'project root to install the skill into', process.cwd())
|
|
16
|
+
.option('--force', 'overwrite an existing SKILL.md', false)
|
|
17
|
+
.action(async (destFolder, options) => {
|
|
18
|
+
await InstallCommand.run(destFolder, options);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
static async run(destFolder, options) {
|
|
22
|
+
const source = InstallCommand.sourceSkillPath();
|
|
23
|
+
const target = resolve(destFolder, SKILL_RELATIVE_PATH);
|
|
24
|
+
if (existsSync(target) === true && options.force === false) {
|
|
25
|
+
console.log(chalk.yellow(`✗ ${target} already exists — pass --force to overwrite`));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
29
|
+
copyFileSync(source, target);
|
|
30
|
+
console.log(chalk.green(`✓ installed skill -> ${target}`));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolves the bundled SKILL.md relative to this module. The `../../` prefix
|
|
34
|
+
* reaches the package root from both `src/commands` (run via tsx) and
|
|
35
|
+
* `dist/commands` (run from the built output).
|
|
36
|
+
*/
|
|
37
|
+
static sourceSkillPath() {
|
|
38
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
39
|
+
return resolve(here, '..', '..', SKILL_RELATIVE_PATH);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=install_command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install_command.js","sourceRoot":"","sources":["../../src/commands/install_command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,mBAAmB,GAAG,oCAAoC,CAAC;AAMjE;;;GAGG;AACH,MAAM,OAAO,cAAc;IAC1B,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC/B,OAAO;aACL,OAAO,CAAC,SAAS,CAAC;aAClB,WAAW,CAAC,iEAAiE,CAAC;aAC9E,QAAQ,CAAC,cAAc,EAAE,wCAAwC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;aACjF,MAAM,CAAC,SAAS,EAAE,gCAAgC,EAAE,KAAK,CAAC;aAC1D,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAAuB,EAAE,EAAE;YAC7D,MAAM,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAkB,EAAE,OAAuB;QACnE,MAAM,MAAM,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;QAExD,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,6CAA6C,CAAC,CAAC,CAAC;YACpF,OAAO;QACR,CAAC;QAED,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,eAAe;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACvD,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/commands/load.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,qBAAa,IAAI;IAChB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAWlB,GAAG;CAUxB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { JsonlReader } from '../store/jsonl_reader.js';
|
|
4
|
+
import { KuzuStore } from '../store/kuzu_store.js';
|
|
5
|
+
import { DEFAULT_DB_PATH, DEFAULT_GRAPH_DIR } from './command_helpers.js';
|
|
6
|
+
export class Load {
|
|
7
|
+
static register(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('load')
|
|
10
|
+
.description('load a JSONL graph into an embedded Kùzu database')
|
|
11
|
+
.argument('[graphDir]', 'directory holding nodes.jsonl and edges.jsonl', DEFAULT_GRAPH_DIR)
|
|
12
|
+
.option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
|
|
13
|
+
.action(async (graphDir, options) => {
|
|
14
|
+
await Load.run(graphDir, options.db);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
static async run(graphDir, dbPath) {
|
|
18
|
+
const resolvedDb = resolve(dbPath);
|
|
19
|
+
console.log(chalk.cyan(`Loading ${resolve(graphDir)} into ${resolvedDb} ...`));
|
|
20
|
+
const { nodes, edges } = await JsonlReader.read(resolve(graphDir));
|
|
21
|
+
const store = new KuzuStore(resolvedDb);
|
|
22
|
+
await store.initSchema();
|
|
23
|
+
await store.load(nodes, edges);
|
|
24
|
+
await store.close();
|
|
25
|
+
console.log(chalk.green(`✓ loaded ${nodes.length} nodes, ${edges.length} edges`));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/commands/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,OAAO,IAAI;IAChB,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC/B,OAAO;aACL,OAAO,CAAC,MAAM,CAAC;aACf,WAAW,CAAC,mDAAmD,CAAC;aAChE,QAAQ,CAAC,YAAY,EAAE,+CAA+C,EAAE,iBAAiB,CAAC;aAC1F,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,CAAC;aAChE,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAAuB,EAAE,EAAE;YAC3D,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,MAAc;QACxD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,QAAQ,CAAC,SAAS,UAAU,MAAM,CAAC,CAAC,CAAC;QAC/E,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/B,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;IACnF,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load_command.d.ts","sourceRoot":"","sources":["../../src/commands/load_command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,qBAAa,WAAW;IACvB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAWlB,GAAG;CAUxB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { JsonlReader } from '../store/jsonl_reader.js';
|
|
4
|
+
import { KuzuStore } from '../store/kuzu_store.js';
|
|
5
|
+
import { DEFAULT_DB_PATH, DEFAULT_GRAPH_DIR } from './command_helpers.js';
|
|
6
|
+
export class LoadCommand {
|
|
7
|
+
static register(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('load')
|
|
10
|
+
.description('load a JSONL graph into an embedded Kùzu database')
|
|
11
|
+
.argument('[graphDir]', 'directory holding nodes.jsonl and edges.jsonl', DEFAULT_GRAPH_DIR)
|
|
12
|
+
.option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
|
|
13
|
+
.action(async (graphDir, options) => {
|
|
14
|
+
await LoadCommand.run(graphDir, options.db);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
static async run(graphDir, dbPath) {
|
|
18
|
+
const resolvedDb = resolve(dbPath);
|
|
19
|
+
console.log(chalk.cyan(`Loading ${resolve(graphDir)} into ${resolvedDb} ...`));
|
|
20
|
+
const { nodes, edges } = await JsonlReader.read(resolve(graphDir));
|
|
21
|
+
const store = new KuzuStore(resolvedDb);
|
|
22
|
+
await store.initSchema();
|
|
23
|
+
await store.load(nodes, edges);
|
|
24
|
+
await store.close();
|
|
25
|
+
console.log(chalk.green(`✓ loaded ${nodes.length} nodes, ${edges.length} edges`));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=load_command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load_command.js","sourceRoot":"","sources":["../../src/commands/load_command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,OAAO,WAAW;IACvB,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC/B,OAAO;aACL,OAAO,CAAC,MAAM,CAAC;aACf,WAAW,CAAC,mDAAmD,CAAC;aAChE,QAAQ,CAAC,YAAY,EAAE,+CAA+C,EAAE,iBAAiB,CAAC;aAC1F,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,CAAC;aAChE,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAAuB,EAAE,EAAE;YAC3D,MAAM,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,MAAc;QACxD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,QAAQ,CAAC,SAAS,UAAU,MAAM,CAAC,CAAC,CAAC;QAC/E,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/B,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;IACnF,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neighbors.d.ts","sourceRoot":"","sources":["../../src/commands/neighbors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,qBAAa,SAAS;IACrB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAavC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CommandHelpers, DEFAULT_DB_PATH } from './command_helpers.js';
|
|
2
|
+
export class Neighbors {
|
|
3
|
+
static register(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('neighbors')
|
|
6
|
+
.description('show the one-hop neighbourhood of <id>')
|
|
7
|
+
.argument('<id>', 'node id to inspect')
|
|
8
|
+
.option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
|
|
9
|
+
.option('--json', 'emit raw JSON', false)
|
|
10
|
+
.action(async (id, options) => {
|
|
11
|
+
await CommandHelpers.withQuery(options.db, async (query) => {
|
|
12
|
+
CommandHelpers.printNeighbors(await query.neighborhood(id), options.json === true);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=neighbors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neighbors.js","sourceRoot":"","sources":["../../src/commands/neighbors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAgB,MAAM,sBAAsB,CAAC;AAErF,MAAM,OAAO,SAAS;IACrB,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC/B,OAAO;aACL,OAAO,CAAC,WAAW,CAAC;aACpB,WAAW,CAAC,wCAAwC,CAAC;aACrD,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;aACtC,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,CAAC;aAChE,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC;aACxC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAqB,EAAE,EAAE;YACnD,MAAM,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC1D,cAAc,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACpF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neighbors_command.d.ts","sourceRoot":"","sources":["../../src/commands/neighbors_command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,qBAAa,gBAAgB;IAC5B,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAavC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CommandHelpers, DEFAULT_DB_PATH } from './command_helpers.js';
|
|
2
|
+
export class NeighborsCommand {
|
|
3
|
+
static register(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('neighbors')
|
|
6
|
+
.description('show the one-hop neighbourhood of <id>')
|
|
7
|
+
.argument('<id>', 'node id to inspect')
|
|
8
|
+
.option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
|
|
9
|
+
.option('--json', 'emit raw JSON', false)
|
|
10
|
+
.action(async (id, options) => {
|
|
11
|
+
await CommandHelpers.withQuery(options.db, async (query) => {
|
|
12
|
+
CommandHelpers.printNeighbors(await query.neighborhood(id), options.json === true);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=neighbors_command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neighbors_command.js","sourceRoot":"","sources":["../../src/commands/neighbors_command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAgB,MAAM,sBAAsB,CAAC;AAErF,MAAM,OAAO,gBAAgB;IAC5B,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC/B,OAAO;aACL,OAAO,CAAC,WAAW,CAAC;aACpB,WAAW,CAAC,wCAAwC,CAAC;aACrD,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;aACtC,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,CAAC;aAChE,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC;aACxC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAqB,EAAE,EAAE;YACnD,MAAM,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC1D,cAAc,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACpF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../src/commands/optimize.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,qBAAa,QAAQ;IACpB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAalB,GAAG;CAsCxB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { AgentTools } from '../agent/agent_tools.js';
|
|
4
|
+
import { CodeEditor } from '../agent/code_editor.js';
|
|
5
|
+
import { OptimizerAgent } from '../agent/optimizer_agent.js';
|
|
6
|
+
import { CommandHelpers, DEFAULT_DB_PATH } from './command_helpers.js';
|
|
7
|
+
const DEFAULT_TASK = 'Find one genuinely dead exported symbol using dead_exports, confirm with references that it has zero inbound references, then remove it safely.';
|
|
8
|
+
export class Optimize {
|
|
9
|
+
static register(program) {
|
|
10
|
+
program
|
|
11
|
+
.command('optimize')
|
|
12
|
+
.description('run the autonomous optimization agent against the loaded graph')
|
|
13
|
+
.argument('[task]', 'what the agent should try to optimize', DEFAULT_TASK)
|
|
14
|
+
.option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
|
|
15
|
+
.option('-m, --model <name>', 'model name (defaults to OPENAI_MODEL)')
|
|
16
|
+
.option('--max-steps <n>', 'maximum agent steps', '12')
|
|
17
|
+
.action(async (task, options) => {
|
|
18
|
+
await Optimize.run(task, options);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
static async run(task, options) {
|
|
22
|
+
if (existsSync('.env') === true) {
|
|
23
|
+
process.loadEnvFile('.env');
|
|
24
|
+
}
|
|
25
|
+
if (process.env.OPENAI_API_KEY === undefined) {
|
|
26
|
+
console.log(chalk.red('Set OPENAI_API_KEY before running the optimizer — copy .env-sample to .env and pick a provider.'));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const model = options.model ?? process.env.OPENAI_MODEL;
|
|
30
|
+
if (model === undefined) {
|
|
31
|
+
console.log(chalk.red('Set OPENAI_MODEL in .env (or pass --model) — see .env-sample for per-provider examples.'));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const rootPath = process.cwd();
|
|
35
|
+
await CommandHelpers.withQuery(options.db, async (query) => {
|
|
36
|
+
const agent = new OptimizerAgent({
|
|
37
|
+
tools: new AgentTools(query, rootPath),
|
|
38
|
+
editor: new CodeEditor(rootPath),
|
|
39
|
+
rootPath,
|
|
40
|
+
model,
|
|
41
|
+
maxSteps: Number(options.maxSteps),
|
|
42
|
+
});
|
|
43
|
+
console.log(chalk.gray(`Model: ${model}${process.env.OPENAI_BASE_URL === undefined ? '' : ` @ ${process.env.OPENAI_BASE_URL}`}`));
|
|
44
|
+
console.log(chalk.cyan(`Task: ${task}\n`));
|
|
45
|
+
const outcome = await agent.run(task);
|
|
46
|
+
for (const line of outcome.transcript) {
|
|
47
|
+
console.log(chalk.gray(line));
|
|
48
|
+
}
|
|
49
|
+
console.log(chalk.bold(`\nApplied ${outcome.applied.length} verified edit(s):`));
|
|
50
|
+
for (const edit of outcome.applied) {
|
|
51
|
+
console.log(` ${chalk.green('✓')} ${edit.filePath} — ${edit.rationale}`);
|
|
52
|
+
}
|
|
53
|
+
if (outcome.applied.length === 0) {
|
|
54
|
+
console.log(chalk.yellow(' (none — the agent found no safe change, or reverted what it tried)'));
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=optimize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/commands/optimize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize_command.d.ts","sourceRoot":"","sources":["../../src/commands/optimize_command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,qBAAa,eAAe;IAC3B,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAalB,GAAG;CAsCxB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { AgentTools } from '../agent/agent_tools.js';
|
|
4
|
+
import { CodeEditor } from '../agent/code_editor.js';
|
|
5
|
+
import { OptimizerAgent } from '../agent/optimizer_agent.js';
|
|
6
|
+
import { CommandHelpers, DEFAULT_DB_PATH } from './command_helpers.js';
|
|
7
|
+
const DEFAULT_TASK = 'Find one genuinely dead exported symbol using dead_exports, confirm with references that it has zero inbound references, then remove it safely.';
|
|
8
|
+
export class OptimizeCommand {
|
|
9
|
+
static register(program) {
|
|
10
|
+
program
|
|
11
|
+
.command('optimize')
|
|
12
|
+
.description('run the autonomous optimization agent against the loaded graph')
|
|
13
|
+
.argument('[task]', 'what the agent should try to optimize', DEFAULT_TASK)
|
|
14
|
+
.option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
|
|
15
|
+
.option('-m, --model <name>', 'model name (defaults to OPENAI_MODEL)')
|
|
16
|
+
.option('--max-steps <n>', 'maximum agent steps', '12')
|
|
17
|
+
.action(async (task, options) => {
|
|
18
|
+
await OptimizeCommand.run(task, options);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
static async run(task, options) {
|
|
22
|
+
if (existsSync('.env') === true) {
|
|
23
|
+
process.loadEnvFile('.env');
|
|
24
|
+
}
|
|
25
|
+
if (process.env.OPENAI_API_KEY === undefined) {
|
|
26
|
+
console.log(chalk.red('Set OPENAI_API_KEY before running the optimizer — copy .env-sample to .env and pick a provider.'));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const model = options.model ?? process.env.OPENAI_MODEL;
|
|
30
|
+
if (model === undefined) {
|
|
31
|
+
console.log(chalk.red('Set OPENAI_MODEL in .env (or pass --model) — see .env-sample for per-provider examples.'));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const rootPath = process.cwd();
|
|
35
|
+
await CommandHelpers.withQuery(options.db, async (query) => {
|
|
36
|
+
const agent = new OptimizerAgent({
|
|
37
|
+
tools: new AgentTools(query, rootPath),
|
|
38
|
+
editor: new CodeEditor(rootPath),
|
|
39
|
+
rootPath,
|
|
40
|
+
model,
|
|
41
|
+
maxSteps: Number(options.maxSteps),
|
|
42
|
+
});
|
|
43
|
+
console.log(chalk.gray(`Model: ${model}${process.env.OPENAI_BASE_URL === undefined ? '' : ` @ ${process.env.OPENAI_BASE_URL}`}`));
|
|
44
|
+
console.log(chalk.cyan(`Task: ${task}\n`));
|
|
45
|
+
const outcome = await agent.run(task);
|
|
46
|
+
for (const line of outcome.transcript) {
|
|
47
|
+
console.log(chalk.gray(line));
|
|
48
|
+
}
|
|
49
|
+
console.log(chalk.bold(`\nApplied ${outcome.applied.length} verified edit(s):`));
|
|
50
|
+
for (const edit of outcome.applied) {
|
|
51
|
+
console.log(` ${chalk.green('✓')} ${edit.filePath} — ${edit.rationale}`);
|
|
52
|
+
}
|
|
53
|
+
if (outcome.applied.length === 0) {
|
|
54
|
+
console.log(chalk.yellow(' (none — the agent found no safe change, or reverted what it tried)'));
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=optimize_command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize_command.js","sourceRoot":"","sources":["../../src/commands/optimize_command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../src/commands/references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,qBAAa,UAAU;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAavC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CommandHelpers, DEFAULT_DB_PATH } from './command_helpers.js';
|
|
2
|
+
export class References {
|
|
3
|
+
static register(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('references')
|
|
6
|
+
.description('list everything that references <id> (calls, type usage, heritage, new)')
|
|
7
|
+
.argument('<id>', 'node id to inspect')
|
|
8
|
+
.option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
|
|
9
|
+
.option('--json', 'emit raw JSON', false)
|
|
10
|
+
.action(async (id, options) => {
|
|
11
|
+
await CommandHelpers.withQuery(options.db, async (query) => {
|
|
12
|
+
CommandHelpers.printNeighbors(await query.references(id), options.json === true);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/commands/references.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAgB,MAAM,sBAAsB,CAAC;AAErF,MAAM,OAAO,UAAU;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC/B,OAAO;aACL,OAAO,CAAC,YAAY,CAAC;aACrB,WAAW,CAAC,yEAAyE,CAAC;aACtF,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;aACtC,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,CAAC;aAChE,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC;aACxC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAqB,EAAE,EAAE;YACnD,MAAM,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC1D,cAAc,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references_command.d.ts","sourceRoot":"","sources":["../../src/commands/references_command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,qBAAa,iBAAiB;IAC7B,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAavC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CommandHelpers, DEFAULT_DB_PATH } from './command_helpers.js';
|
|
2
|
+
export class ReferencesCommand {
|
|
3
|
+
static register(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('references')
|
|
6
|
+
.description('list everything that references <id> (calls, type usage, heritage, new)')
|
|
7
|
+
.argument('<id>', 'node id to inspect')
|
|
8
|
+
.option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
|
|
9
|
+
.option('--json', 'emit raw JSON', false)
|
|
10
|
+
.action(async (id, options) => {
|
|
11
|
+
await CommandHelpers.withQuery(options.db, async (query) => {
|
|
12
|
+
CommandHelpers.printNeighbors(await query.references(id), options.json === true);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=references_command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references_command.js","sourceRoot":"","sources":["../../src/commands/references_command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAgB,MAAM,sBAAsB,CAAC;AAErF,MAAM,OAAO,iBAAiB;IAC7B,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC/B,OAAO;aACL,OAAO,CAAC,YAAY,CAAC;aACrB,WAAW,CAAC,yEAAyE,CAAC;aACtF,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;aACtC,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,CAAC;aAChE,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC;aACxC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAqB,EAAE,EAAE;YACnD,MAAM,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC1D,cAAc,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* `web` command — serves the knowledge graph database in an interactive web
|
|
4
|
+
* visualisation. The graph is read from Kùzu once at startup and injected into
|
|
5
|
+
* the page as `/data/graph_data.js`; all other assets are served statically
|
|
6
|
+
* from the contribs/web_visualisation/web directory.
|
|
7
|
+
*/
|
|
8
|
+
export declare class Web {
|
|
9
|
+
static register(program: Command): void;
|
|
10
|
+
private static run;
|
|
11
|
+
/**
|
|
12
|
+
* Reads every node and edge from the database and renders them as the
|
|
13
|
+
* `window.GRAPH_DATA` script the visualisation page loads on boot.
|
|
14
|
+
*/
|
|
15
|
+
private static buildDataScript;
|
|
16
|
+
private static handle;
|
|
17
|
+
private static notFound;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/commands/web.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC;;;;;GAKG;AACH,qBAAa,GAAG;IACf,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAWlB,GAAG;IAmBxB;;;OAGG;mBACkB,eAAe;mBAoCf,MAAM;IAwB3B,OAAO,CAAC,MAAM,CAAC,QAAQ;CAIvB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { createServer } from 'node:http';
|
|
4
|
+
import { extname, join, normalize, resolve, sep } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { KuzuStore } from '../store/kuzu_store.js';
|
|
8
|
+
import { DEFAULT_DB_PATH } from './command_helpers.js';
|
|
9
|
+
/**
|
|
10
|
+
* Static assets of the web visualisation, resolved relative to this module so
|
|
11
|
+
* the same path works from `src/` (tsx) and from `dist/` (published package).
|
|
12
|
+
*/
|
|
13
|
+
const WEB_ROOT = fileURLToPath(new URL('../../contribs/web_visualisation/web', import.meta.url));
|
|
14
|
+
const DATA_SCRIPT_PATH = '/data/graph_data.js';
|
|
15
|
+
const DEFAULT_PORT = '4173';
|
|
16
|
+
const MIME_TYPES = {
|
|
17
|
+
'.css': 'text/css; charset=utf-8',
|
|
18
|
+
'.html': 'text/html; charset=utf-8',
|
|
19
|
+
'.js': 'text/javascript; charset=utf-8',
|
|
20
|
+
'.json': 'application/json; charset=utf-8',
|
|
21
|
+
'.png': 'image/png',
|
|
22
|
+
'.svg': 'image/svg+xml',
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* `web` command — serves the knowledge graph database in an interactive web
|
|
26
|
+
* visualisation. The graph is read from Kùzu once at startup and injected into
|
|
27
|
+
* the page as `/data/graph_data.js`; all other assets are served statically
|
|
28
|
+
* from the contribs/web_visualisation/web directory.
|
|
29
|
+
*/
|
|
30
|
+
export class Web {
|
|
31
|
+
static register(program) {
|
|
32
|
+
program
|
|
33
|
+
.command('web')
|
|
34
|
+
.description('serve the knowledge graph database in a web visualisation')
|
|
35
|
+
.option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
|
|
36
|
+
.option('-p, --port <port>', 'HTTP port to listen on', DEFAULT_PORT)
|
|
37
|
+
.action(async (options) => {
|
|
38
|
+
await Web.run(options);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
static async run(options) {
|
|
42
|
+
const dbPath = resolve(options.db);
|
|
43
|
+
if (existsSync(dbPath) === false) {
|
|
44
|
+
console.error(chalk.red(`database not found at ${dbPath} — run \`extract\` then \`load\` first`));
|
|
45
|
+
process.exitCode = 1;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const dataScript = await Web.buildDataScript(dbPath);
|
|
49
|
+
const server = createServer((request, response) => {
|
|
50
|
+
void Web.handle(request, response, dataScript);
|
|
51
|
+
});
|
|
52
|
+
server.listen(Number(options.port), () => {
|
|
53
|
+
console.log(chalk.green(`✓ serving the knowledge graph at http://localhost:${options.port}/`));
|
|
54
|
+
console.log(chalk.gray(' press Ctrl+C to stop'));
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reads every node and edge from the database and renders them as the
|
|
59
|
+
* `window.GRAPH_DATA` script the visualisation page loads on boot.
|
|
60
|
+
*/
|
|
61
|
+
static async buildDataScript(dbPath) {
|
|
62
|
+
const store = new KuzuStore(dbPath);
|
|
63
|
+
await store.initSchema();
|
|
64
|
+
try {
|
|
65
|
+
const nodeRows = await store.run('MATCH (n:GraphNode) RETURN n.id AS id, n.kind AS kind, n.name AS name, n.filePath AS filePath, n.exported AS exported, n.startLine AS startLine, n.endLine AS endLine');
|
|
66
|
+
const edgeRows = await store.run('MATCH (f:GraphNode)-[e:Edge]->(t:GraphNode) RETURN f.id AS from, e.kind AS kind, t.id AS to');
|
|
67
|
+
const nodes = nodeRows.map((row) => ({
|
|
68
|
+
id: String(row.id),
|
|
69
|
+
kind: String(row.kind),
|
|
70
|
+
name: String(row.name),
|
|
71
|
+
filePath: String(row.filePath),
|
|
72
|
+
exported: row.exported === true,
|
|
73
|
+
range: {
|
|
74
|
+
startLine: Number(row.startLine),
|
|
75
|
+
startColumn: 0,
|
|
76
|
+
endLine: Number(row.endLine),
|
|
77
|
+
endColumn: 0,
|
|
78
|
+
},
|
|
79
|
+
}));
|
|
80
|
+
const edges = edgeRows.map((row, index) => ({
|
|
81
|
+
id: `e${index}`,
|
|
82
|
+
kind: String(row.kind),
|
|
83
|
+
from: String(row.from),
|
|
84
|
+
to: String(row.to),
|
|
85
|
+
}));
|
|
86
|
+
console.log(chalk.cyan(`loaded ${nodes.length} nodes, ${edges.length} edges from ${dbPath}`));
|
|
87
|
+
return `window.GRAPH_DATA = ${JSON.stringify({ nodes, edges })};\n`;
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await store.close();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
static async handle(request, response, dataScript) {
|
|
94
|
+
const url = new URL(request.url ?? '/', 'http://localhost');
|
|
95
|
+
const pathname = url.pathname === '/' ? '/index.html' : url.pathname;
|
|
96
|
+
if (pathname === DATA_SCRIPT_PATH) {
|
|
97
|
+
response.writeHead(200, { 'content-type': MIME_TYPES['.js'] });
|
|
98
|
+
response.end(dataScript);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const filePath = normalize(join(WEB_ROOT, pathname));
|
|
102
|
+
if (filePath.startsWith(WEB_ROOT + sep) === false) {
|
|
103
|
+
Web.notFound(response);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const content = await readFile(filePath);
|
|
108
|
+
response.writeHead(200, { 'content-type': MIME_TYPES[extname(filePath)] ?? 'application/octet-stream' });
|
|
109
|
+
response.end(content);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
Web.notFound(response);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
static notFound(response) {
|
|
116
|
+
response.writeHead(404, { 'content-type': 'text/plain; charset=utf-8' });
|
|
117
|
+
response.end('not found');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=web.js.map
|