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.
Files changed (172) hide show
  1. package/README.md +34 -13
  2. package/contribs/web_visualisation/README.md +55 -0
  3. package/contribs/web_visualisation/web/css/style.css +115 -0
  4. package/contribs/web_visualisation/web/data/.gitignore +2 -0
  5. package/contribs/web_visualisation/web/index.html +58 -0
  6. package/contribs/web_visualisation/web/js/app.js +364 -0
  7. package/dist/agent/agent_tools.d.ts +13 -0
  8. package/dist/agent/agent_tools.d.ts.map +1 -0
  9. package/dist/agent/agent_tools.js +153 -0
  10. package/dist/agent/agent_tools.js.map +1 -0
  11. package/dist/agent/code_editor.d.ts +18 -0
  12. package/dist/agent/code_editor.d.ts.map +1 -0
  13. package/dist/agent/code_editor.js +43 -0
  14. package/dist/agent/code_editor.js.map +1 -0
  15. package/dist/agent/optimizer_agent.d.ts +30 -0
  16. package/dist/agent/optimizer_agent.d.ts.map +1 -0
  17. package/dist/agent/optimizer_agent.js +97 -0
  18. package/dist/agent/optimizer_agent.js.map +1 -0
  19. package/dist/cli.d.ts +0 -9
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +24 -208
  22. package/dist/cli.js.map +1 -1
  23. package/dist/commands/blast-radius.d.ts +5 -0
  24. package/dist/commands/blast-radius.d.ts.map +1 -0
  25. package/dist/commands/blast-radius.js +18 -0
  26. package/dist/commands/blast-radius.js.map +1 -0
  27. package/dist/commands/blast_radius.d.ts +5 -0
  28. package/dist/commands/blast_radius.d.ts.map +1 -0
  29. package/dist/commands/blast_radius.js +18 -0
  30. package/dist/commands/blast_radius.js.map +1 -0
  31. package/dist/commands/blast_radius_command.d.ts +5 -0
  32. package/dist/commands/blast_radius_command.d.ts.map +1 -0
  33. package/dist/commands/blast_radius_command.js +18 -0
  34. package/dist/commands/blast_radius_command.js.map +1 -0
  35. package/dist/commands/calls.d.ts +5 -0
  36. package/dist/commands/calls.d.ts.map +1 -0
  37. package/dist/commands/calls.js +7 -0
  38. package/dist/commands/calls.js.map +1 -0
  39. package/dist/commands/calls_command.d.ts +5 -0
  40. package/dist/commands/calls_command.d.ts.map +1 -0
  41. package/dist/commands/calls_command.js +7 -0
  42. package/dist/commands/calls_command.js.map +1 -0
  43. package/dist/commands/command-helpers.d.ts +15 -0
  44. package/dist/commands/command-helpers.d.ts.map +1 -0
  45. package/dist/commands/command-helpers.js +61 -0
  46. package/dist/commands/command-helpers.js.map +1 -0
  47. package/dist/commands/command_helpers.d.ts +15 -0
  48. package/dist/commands/command_helpers.d.ts.map +1 -0
  49. package/dist/commands/command_helpers.js +61 -0
  50. package/dist/commands/command_helpers.js.map +1 -0
  51. package/dist/commands/dead-exports.d.ts +5 -0
  52. package/dist/commands/dead-exports.d.ts.map +1 -0
  53. package/dist/commands/dead-exports.js +7 -0
  54. package/dist/commands/dead-exports.js.map +1 -0
  55. package/dist/commands/dead_exports.d.ts +5 -0
  56. package/dist/commands/dead_exports.d.ts.map +1 -0
  57. package/dist/commands/dead_exports.js +7 -0
  58. package/dist/commands/dead_exports.js.map +1 -0
  59. package/dist/commands/dead_exports_command.d.ts +5 -0
  60. package/dist/commands/dead_exports_command.d.ts.map +1 -0
  61. package/dist/commands/dead_exports_command.js +7 -0
  62. package/dist/commands/dead_exports_command.js.map +1 -0
  63. package/dist/commands/extract.d.ts +8 -0
  64. package/dist/commands/extract.d.ts.map +1 -0
  65. package/dist/commands/extract.js +49 -0
  66. package/dist/commands/extract.js.map +1 -0
  67. package/dist/commands/extract_command.d.ts +8 -0
  68. package/dist/commands/extract_command.d.ts.map +1 -0
  69. package/dist/commands/extract_command.js +49 -0
  70. package/dist/commands/extract_command.js.map +1 -0
  71. package/dist/commands/find.d.ts +5 -0
  72. package/dist/commands/find.d.ts.map +1 -0
  73. package/dist/commands/find.js +7 -0
  74. package/dist/commands/find.js.map +1 -0
  75. package/dist/commands/find_command.d.ts +5 -0
  76. package/dist/commands/find_command.d.ts.map +1 -0
  77. package/dist/commands/find_command.js +7 -0
  78. package/dist/commands/find_command.js.map +1 -0
  79. package/dist/commands/install_command.d.ts +16 -0
  80. package/dist/commands/install_command.d.ts.map +1 -0
  81. package/dist/commands/install_command.js +42 -0
  82. package/dist/commands/install_command.js.map +1 -0
  83. package/dist/commands/load.d.ts +6 -0
  84. package/dist/commands/load.d.ts.map +1 -0
  85. package/dist/commands/load.js +28 -0
  86. package/dist/commands/load.js.map +1 -0
  87. package/dist/commands/load_command.d.ts +6 -0
  88. package/dist/commands/load_command.d.ts.map +1 -0
  89. package/dist/commands/load_command.js +28 -0
  90. package/dist/commands/load_command.js.map +1 -0
  91. package/dist/commands/neighbors.d.ts +5 -0
  92. package/dist/commands/neighbors.d.ts.map +1 -0
  93. package/dist/commands/neighbors.js +17 -0
  94. package/dist/commands/neighbors.js.map +1 -0
  95. package/dist/commands/neighbors_command.d.ts +5 -0
  96. package/dist/commands/neighbors_command.d.ts.map +1 -0
  97. package/dist/commands/neighbors_command.js +17 -0
  98. package/dist/commands/neighbors_command.js.map +1 -0
  99. package/dist/commands/optimize.d.ts +6 -0
  100. package/dist/commands/optimize.d.ts.map +1 -0
  101. package/dist/commands/optimize.js +59 -0
  102. package/dist/commands/optimize.js.map +1 -0
  103. package/dist/commands/optimize_command.d.ts +6 -0
  104. package/dist/commands/optimize_command.d.ts.map +1 -0
  105. package/dist/commands/optimize_command.js +59 -0
  106. package/dist/commands/optimize_command.js.map +1 -0
  107. package/dist/commands/references.d.ts +5 -0
  108. package/dist/commands/references.d.ts.map +1 -0
  109. package/dist/commands/references.js +17 -0
  110. package/dist/commands/references.js.map +1 -0
  111. package/dist/commands/references_command.d.ts +5 -0
  112. package/dist/commands/references_command.d.ts.map +1 -0
  113. package/dist/commands/references_command.js +17 -0
  114. package/dist/commands/references_command.js.map +1 -0
  115. package/dist/commands/web.d.ts +19 -0
  116. package/dist/commands/web.d.ts.map +1 -0
  117. package/dist/commands/web.js +120 -0
  118. package/dist/commands/web.js.map +1 -0
  119. package/dist/commands/web_command.d.ts +19 -0
  120. package/dist/commands/web_command.d.ts.map +1 -0
  121. package/dist/commands/web_command.js +120 -0
  122. package/dist/commands/web_command.js.map +1 -0
  123. package/dist/commands/who-calls.d.ts +5 -0
  124. package/dist/commands/who-calls.d.ts.map +1 -0
  125. package/dist/commands/who-calls.js +7 -0
  126. package/dist/commands/who-calls.js.map +1 -0
  127. package/dist/commands/who_calls.d.ts +5 -0
  128. package/dist/commands/who_calls.d.ts.map +1 -0
  129. package/dist/commands/who_calls.js +7 -0
  130. package/dist/commands/who_calls.js.map +1 -0
  131. package/dist/commands/who_calls_command.d.ts +5 -0
  132. package/dist/commands/who_calls_command.d.ts.map +1 -0
  133. package/dist/commands/who_calls_command.js +7 -0
  134. package/dist/commands/who_calls_command.js.map +1 -0
  135. package/dist/extract/graph_builder.d.ts +16 -0
  136. package/dist/extract/graph_builder.d.ts.map +1 -0
  137. package/dist/extract/graph_builder.js +39 -0
  138. package/dist/extract/graph_builder.js.map +1 -0
  139. package/dist/extract/node_id.d.ts +8 -0
  140. package/dist/extract/node_id.d.ts.map +1 -0
  141. package/dist/extract/node_id.js +22 -0
  142. package/dist/extract/node_id.js.map +1 -0
  143. package/dist/extract/project_loader.d.ts +5 -0
  144. package/dist/extract/project_loader.d.ts.map +1 -0
  145. package/dist/extract/project_loader.js +19 -0
  146. package/dist/extract/project_loader.js.map +1 -0
  147. package/dist/extract/semantic_extractor.d.ts +22 -0
  148. package/dist/extract/semantic_extractor.d.ts.map +1 -0
  149. package/dist/extract/semantic_extractor.js +254 -0
  150. package/dist/extract/semantic_extractor.js.map +1 -0
  151. package/dist/extract/structural_extractor.d.ts +18 -0
  152. package/dist/extract/structural_extractor.d.ts.map +1 -0
  153. package/dist/extract/structural_extractor.js +97 -0
  154. package/dist/extract/structural_extractor.js.map +1 -0
  155. package/dist/query/graph_query.d.ts +28 -0
  156. package/dist/query/graph_query.d.ts.map +1 -0
  157. package/dist/query/graph_query.js +93 -0
  158. package/dist/query/graph_query.js.map +1 -0
  159. package/dist/store/jsonl_reader.d.ts +11 -0
  160. package/dist/store/jsonl_reader.d.ts.map +1 -0
  161. package/dist/store/jsonl_reader.js +19 -0
  162. package/dist/store/jsonl_reader.js.map +1 -0
  163. package/dist/store/jsonl_store.d.ts +7 -0
  164. package/dist/store/jsonl_store.d.ts.map +1 -0
  165. package/dist/store/jsonl_store.js +13 -0
  166. package/dist/store/jsonl_store.js.map +1 -0
  167. package/dist/store/kuzu_store.d.ts +20 -0
  168. package/dist/store/kuzu_store.d.ts.map +1 -0
  169. package/dist/store/kuzu_store.js +66 -0
  170. package/dist/store/kuzu_store.js.map +1 -0
  171. package/package.json +6 -2
  172. 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,6 @@
1
+ import { Command } from 'commander';
2
+ export declare class Load {
3
+ static register(program: Command): void;
4
+ private static run;
5
+ }
6
+ //# sourceMappingURL=load.d.ts.map
@@ -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,6 @@
1
+ import { Command } from 'commander';
2
+ export declare class LoadCommand {
3
+ static register(program: Command): void;
4
+ private static run;
5
+ }
6
+ //# sourceMappingURL=load_command.d.ts.map
@@ -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,5 @@
1
+ import { Command } from 'commander';
2
+ export declare class Neighbors {
3
+ static register(program: Command): void;
4
+ }
5
+ //# sourceMappingURL=neighbors.d.ts.map
@@ -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,5 @@
1
+ import { Command } from 'commander';
2
+ export declare class NeighborsCommand {
3
+ static register(program: Command): void;
4
+ }
5
+ //# sourceMappingURL=neighbors_command.d.ts.map
@@ -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,6 @@
1
+ import { Command } from 'commander';
2
+ export declare class Optimize {
3
+ static register(program: Command): void;
4
+ private static run;
5
+ }
6
+ //# sourceMappingURL=optimize.d.ts.map
@@ -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,6 @@
1
+ import { Command } from 'commander';
2
+ export declare class OptimizeCommand {
3
+ static register(program: Command): void;
4
+ private static run;
5
+ }
6
+ //# sourceMappingURL=optimize_command.d.ts.map
@@ -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,5 @@
1
+ import { Command } from 'commander';
2
+ export declare class References {
3
+ static register(program: Command): void;
4
+ }
5
+ //# sourceMappingURL=references.d.ts.map
@@ -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,5 @@
1
+ import { Command } from 'commander';
2
+ export declare class ReferencesCommand {
3
+ static register(program: Command): void;
4
+ }
5
+ //# sourceMappingURL=references_command.d.ts.map
@@ -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