ts-knowledge-graph 0.1.2 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/README.md +99 -41
  2. package/contribs/webview/README.md +83 -0
  3. package/contribs/webview/web/css/style.css +310 -0
  4. package/contribs/webview/web/index.html +109 -0
  5. package/contribs/webview/web/js/app.js +1249 -0
  6. package/contribs/webview/web/js_autogenerated/.gitignore +3 -0
  7. package/contribs/webview/web/js_autogenerated/kind_descriptions.js +39 -0
  8. package/contribs/webview/web/types/app_globals.d.ts +154 -0
  9. package/dist/benchmark/benchmark_stats.d.ts +41 -0
  10. package/dist/benchmark/benchmark_stats.d.ts.map +1 -0
  11. package/dist/benchmark/benchmark_stats.js +61 -0
  12. package/dist/benchmark/benchmark_stats.js.map +1 -0
  13. package/dist/benchmark/node_benchmark.d.ts +78 -0
  14. package/dist/benchmark/node_benchmark.d.ts.map +1 -0
  15. package/dist/benchmark/node_benchmark.js +112 -0
  16. package/dist/benchmark/node_benchmark.js.map +1 -0
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +16 -4
  19. package/dist/cli.js.map +1 -1
  20. package/dist/cluster/cluster_weights.d.ts +20 -0
  21. package/dist/cluster/cluster_weights.d.ts.map +1 -0
  22. package/dist/cluster/cluster_weights.js +32 -0
  23. package/dist/cluster/cluster_weights.js.map +1 -0
  24. package/dist/cluster/community_detector.d.ts +61 -0
  25. package/dist/cluster/community_detector.d.ts.map +1 -0
  26. package/dist/cluster/community_detector.js +120 -0
  27. package/dist/cluster/community_detector.js.map +1 -0
  28. package/dist/cluster/community_labeler.d.ts +84 -0
  29. package/dist/cluster/community_labeler.d.ts.map +1 -0
  30. package/dist/cluster/community_labeler.js +194 -0
  31. package/dist/cluster/community_labeler.js.map +1 -0
  32. package/dist/cluster/graph_clusterer.d.ts +47 -0
  33. package/dist/cluster/graph_clusterer.d.ts.map +1 -0
  34. package/dist/cluster/graph_clusterer.js +126 -0
  35. package/dist/cluster/graph_clusterer.js.map +1 -0
  36. package/dist/commands/benchmark_command.d.ts +11 -0
  37. package/dist/commands/benchmark_command.d.ts.map +1 -0
  38. package/dist/commands/benchmark_command.js +94 -0
  39. package/dist/commands/benchmark_command.js.map +1 -0
  40. package/dist/commands/blast_radius_command.d.ts.map +1 -1
  41. package/dist/commands/blast_radius_command.js +7 -6
  42. package/dist/commands/blast_radius_command.js.map +1 -1
  43. package/dist/commands/cluster_command.d.ts +7 -0
  44. package/dist/commands/cluster_command.d.ts.map +1 -0
  45. package/dist/commands/cluster_command.js +55 -0
  46. package/dist/commands/cluster_command.js.map +1 -0
  47. package/dist/commands/command_helpers.d.ts +9 -4
  48. package/dist/commands/command_helpers.d.ts.map +1 -1
  49. package/dist/commands/command_helpers.js +13 -8
  50. package/dist/commands/command_helpers.js.map +1 -1
  51. package/dist/commands/cost_command.d.ts +13 -0
  52. package/dist/commands/cost_command.d.ts.map +1 -0
  53. package/dist/commands/cost_command.js +139 -0
  54. package/dist/commands/cost_command.js.map +1 -0
  55. package/dist/commands/{load.d.ts → enrich_command.d.ts} +3 -2
  56. package/dist/commands/enrich_command.d.ts.map +1 -0
  57. package/dist/commands/enrich_command.js +64 -0
  58. package/dist/commands/enrich_command.js.map +1 -0
  59. package/dist/commands/extract_command.d.ts.map +1 -1
  60. package/dist/commands/extract_command.js +12 -6
  61. package/dist/commands/extract_command.js.map +1 -1
  62. package/dist/commands/hotspots_command.d.ts +7 -0
  63. package/dist/commands/hotspots_command.d.ts.map +1 -0
  64. package/dist/commands/hotspots_command.js +68 -0
  65. package/dist/commands/hotspots_command.js.map +1 -0
  66. package/dist/commands/install_command.d.ts +15 -6
  67. package/dist/commands/install_command.d.ts.map +1 -1
  68. package/dist/commands/install_command.js +62 -25
  69. package/dist/commands/install_command.js.map +1 -1
  70. package/dist/commands/load_command.d.ts.map +1 -1
  71. package/dist/commands/load_command.js +20 -13
  72. package/dist/commands/load_command.js.map +1 -1
  73. package/dist/commands/neighbors_command.d.ts.map +1 -1
  74. package/dist/commands/neighbors_command.js +6 -5
  75. package/dist/commands/neighbors_command.js.map +1 -1
  76. package/dist/commands/references_command.d.ts.map +1 -1
  77. package/dist/commands/references_command.js +6 -5
  78. package/dist/commands/references_command.js.map +1 -1
  79. package/dist/commands/report_command.d.ts +16 -0
  80. package/dist/commands/report_command.d.ts.map +1 -0
  81. package/dist/commands/report_command.js +115 -0
  82. package/dist/commands/report_command.js.map +1 -0
  83. package/dist/commands/verify_command.d.ts +8 -0
  84. package/dist/commands/verify_command.d.ts.map +1 -0
  85. package/dist/commands/verify_command.js +57 -0
  86. package/dist/commands/verify_command.js.map +1 -0
  87. package/dist/commands/web_command.d.ts +27 -0
  88. package/dist/commands/web_command.d.ts.map +1 -1
  89. package/dist/commands/web_command.js +109 -3
  90. package/dist/commands/web_command.js.map +1 -1
  91. package/dist/commands/webview_command.d.ts +36 -0
  92. package/dist/commands/webview_command.d.ts.map +1 -0
  93. package/dist/commands/webview_command.js +186 -0
  94. package/dist/commands/webview_command.js.map +1 -0
  95. package/dist/enrich/cpu_profile.d.ts +160 -0
  96. package/dist/enrich/cpu_profile.d.ts.map +1 -0
  97. package/dist/enrich/cpu_profile.js +185 -0
  98. package/dist/enrich/cpu_profile.js.map +1 -0
  99. package/dist/enrich/runtime_enricher.d.ts +64 -0
  100. package/dist/enrich/runtime_enricher.d.ts.map +1 -0
  101. package/dist/enrich/runtime_enricher.js +98 -0
  102. package/dist/enrich/runtime_enricher.js.map +1 -0
  103. package/dist/enrich/runtime_join.d.ts +124 -0
  104. package/dist/enrich/runtime_join.d.ts.map +1 -0
  105. package/dist/enrich/runtime_join.js +270 -0
  106. package/dist/enrich/runtime_join.js.map +1 -0
  107. package/dist/extract/api_extractor.d.ts +24 -0
  108. package/dist/extract/api_extractor.d.ts.map +1 -0
  109. package/dist/extract/api_extractor.js +71 -0
  110. package/dist/extract/api_extractor.js.map +1 -0
  111. package/dist/extract/config_extractor.d.ts +22 -0
  112. package/dist/extract/config_extractor.d.ts.map +1 -0
  113. package/dist/extract/config_extractor.js +61 -0
  114. package/dist/extract/config_extractor.js.map +1 -0
  115. package/dist/extract/endpoint_extractor.d.ts +36 -0
  116. package/dist/extract/endpoint_extractor.d.ts.map +1 -0
  117. package/dist/extract/endpoint_extractor.js +117 -0
  118. package/dist/extract/endpoint_extractor.js.map +1 -0
  119. package/dist/extract/git_source.d.ts +23 -0
  120. package/dist/extract/git_source.d.ts.map +1 -0
  121. package/dist/extract/git_source.js +75 -0
  122. package/dist/extract/git_source.js.map +1 -0
  123. package/dist/extract/graph_builder.d.ts +8 -0
  124. package/dist/extract/graph_builder.d.ts.map +1 -1
  125. package/dist/extract/graph_builder.js +23 -1
  126. package/dist/extract/graph_builder.js.map +1 -1
  127. package/dist/extract/node_id.d.ts +16 -0
  128. package/dist/extract/node_id.d.ts.map +1 -1
  129. package/dist/extract/node_id.js +22 -0
  130. package/dist/extract/node_id.js.map +1 -1
  131. package/dist/extract/scope_resolver.d.ts +22 -0
  132. package/dist/extract/scope_resolver.d.ts.map +1 -0
  133. package/dist/extract/scope_resolver.js +53 -0
  134. package/dist/extract/scope_resolver.js.map +1 -0
  135. package/dist/extract/semantic_extractor.d.ts +25 -0
  136. package/dist/extract/semantic_extractor.d.ts.map +1 -1
  137. package/dist/extract/semantic_extractor.js +96 -2
  138. package/dist/extract/semantic_extractor.js.map +1 -1
  139. package/dist/extract/structural_extractor.d.ts +6 -0
  140. package/dist/extract/structural_extractor.d.ts.map +1 -1
  141. package/dist/extract/structural_extractor.js +22 -12
  142. package/dist/extract/structural_extractor.js.map +1 -1
  143. package/dist/project_root.d.ts +7 -0
  144. package/dist/project_root.d.ts.map +1 -0
  145. package/dist/project_root.js +9 -0
  146. package/dist/project_root.js.map +1 -0
  147. package/dist/query/graph_query.d.ts +269 -0
  148. package/dist/query/graph_query.d.ts.map +1 -1
  149. package/dist/query/graph_query.js +585 -11
  150. package/dist/query/graph_query.js.map +1 -1
  151. package/dist/report/graph_report.d.ts +51 -0
  152. package/dist/report/graph_report.d.ts.map +1 -0
  153. package/dist/report/graph_report.js +312 -0
  154. package/dist/report/graph_report.js.map +1 -0
  155. package/dist/report/pdf_renderer.d.ts +22 -0
  156. package/dist/report/pdf_renderer.d.ts.map +1 -0
  157. package/dist/report/pdf_renderer.js +54 -0
  158. package/dist/report/pdf_renderer.js.map +1 -0
  159. package/dist/report/report_data.d.ts +128 -0
  160. package/dist/report/report_data.d.ts.map +1 -0
  161. package/dist/report/report_data.js +191 -0
  162. package/dist/report/report_data.js.map +1 -0
  163. package/dist/schema/edge.d.ts +40 -5
  164. package/dist/schema/edge.d.ts.map +1 -1
  165. package/dist/schema/edge.js +73 -0
  166. package/dist/schema/edge.js.map +1 -1
  167. package/dist/schema/node.d.ts +20 -5
  168. package/dist/schema/node.d.ts.map +1 -1
  169. package/dist/schema/node.js +36 -0
  170. package/dist/schema/node.js.map +1 -1
  171. package/dist/schema/runtime_manifest.d.ts +36 -0
  172. package/dist/schema/runtime_manifest.d.ts.map +1 -0
  173. package/dist/schema/runtime_manifest.js +23 -0
  174. package/dist/schema/runtime_manifest.js.map +1 -0
  175. package/dist/schema/source_manifest.d.ts +30 -0
  176. package/dist/schema/source_manifest.d.ts.map +1 -0
  177. package/dist/schema/source_manifest.js +21 -0
  178. package/dist/schema/source_manifest.js.map +1 -0
  179. package/dist/store/jsonl_reader.d.ts +4 -0
  180. package/dist/store/jsonl_reader.d.ts.map +1 -1
  181. package/dist/store/jsonl_reader.js +13 -1
  182. package/dist/store/jsonl_reader.js.map +1 -1
  183. package/dist/store/jsonl_store.d.ts +2 -1
  184. package/dist/store/jsonl_store.d.ts.map +1 -1
  185. package/dist/store/jsonl_store.js +4 -1
  186. package/dist/store/jsonl_store.js.map +1 -1
  187. package/dist/store/kuzu_store.d.ts +59 -0
  188. package/dist/store/kuzu_store.d.ts.map +1 -1
  189. package/dist/store/kuzu_store.js +124 -5
  190. package/dist/store/kuzu_store.js.map +1 -1
  191. package/dist/store/output_folder.d.ts +43 -0
  192. package/dist/store/output_folder.d.ts.map +1 -0
  193. package/dist/store/output_folder.js +61 -0
  194. package/dist/store/output_folder.js.map +1 -0
  195. package/dist/verify/project_verifier.d.ts +85 -0
  196. package/dist/verify/project_verifier.d.ts.map +1 -0
  197. package/dist/verify/project_verifier.js +138 -0
  198. package/dist/verify/project_verifier.js.map +1 -0
  199. package/dotclaude_folder/commands/code-graph-interview.md +123 -0
  200. package/dotclaude_folder/commands/code-graph-optimize.md +65 -0
  201. package/{skills/ts-knowledge-graph → dotclaude_folder/skills/code-graph-query}/SKILL.md +6 -6
  202. package/package.json +99 -10
  203. package/.env-sample +0 -34
  204. package/contribs/web_visualisation/README.md +0 -55
  205. package/contribs/web_visualisation/web/css/style.css +0 -115
  206. package/contribs/web_visualisation/web/data/.gitignore +0 -2
  207. package/contribs/web_visualisation/web/index.html +0 -58
  208. package/contribs/web_visualisation/web/js/app.js +0 -364
  209. package/dist/agent/agent-tools.d.ts +0 -13
  210. package/dist/agent/agent-tools.d.ts.map +0 -1
  211. package/dist/agent/agent-tools.js +0 -153
  212. package/dist/agent/agent-tools.js.map +0 -1
  213. package/dist/agent/agent_tools.d.ts +0 -13
  214. package/dist/agent/agent_tools.d.ts.map +0 -1
  215. package/dist/agent/agent_tools.js +0 -153
  216. package/dist/agent/agent_tools.js.map +0 -1
  217. package/dist/agent/code-editor.d.ts +0 -18
  218. package/dist/agent/code-editor.d.ts.map +0 -1
  219. package/dist/agent/code-editor.js +0 -43
  220. package/dist/agent/code-editor.js.map +0 -1
  221. package/dist/agent/code_editor.d.ts +0 -18
  222. package/dist/agent/code_editor.d.ts.map +0 -1
  223. package/dist/agent/code_editor.js +0 -43
  224. package/dist/agent/code_editor.js.map +0 -1
  225. package/dist/agent/optimizer-agent.d.ts +0 -30
  226. package/dist/agent/optimizer-agent.d.ts.map +0 -1
  227. package/dist/agent/optimizer-agent.js +0 -97
  228. package/dist/agent/optimizer-agent.js.map +0 -1
  229. package/dist/agent/optimizer_agent.d.ts +0 -30
  230. package/dist/agent/optimizer_agent.d.ts.map +0 -1
  231. package/dist/agent/optimizer_agent.js +0 -97
  232. package/dist/agent/optimizer_agent.js.map +0 -1
  233. package/dist/agent/verifier.d.ts +0 -9
  234. package/dist/agent/verifier.d.ts.map +0 -1
  235. package/dist/agent/verifier.js +0 -19
  236. package/dist/agent/verifier.js.map +0 -1
  237. package/dist/commands/blast-radius.d.ts +0 -5
  238. package/dist/commands/blast-radius.d.ts.map +0 -1
  239. package/dist/commands/blast-radius.js +0 -18
  240. package/dist/commands/blast-radius.js.map +0 -1
  241. package/dist/commands/blast_radius.d.ts +0 -5
  242. package/dist/commands/blast_radius.d.ts.map +0 -1
  243. package/dist/commands/blast_radius.js +0 -18
  244. package/dist/commands/blast_radius.js.map +0 -1
  245. package/dist/commands/calls.d.ts +0 -5
  246. package/dist/commands/calls.d.ts.map +0 -1
  247. package/dist/commands/calls.js +0 -7
  248. package/dist/commands/calls.js.map +0 -1
  249. package/dist/commands/command-helpers.d.ts +0 -15
  250. package/dist/commands/command-helpers.d.ts.map +0 -1
  251. package/dist/commands/command-helpers.js +0 -61
  252. package/dist/commands/command-helpers.js.map +0 -1
  253. package/dist/commands/dead-exports.d.ts +0 -5
  254. package/dist/commands/dead-exports.d.ts.map +0 -1
  255. package/dist/commands/dead-exports.js +0 -7
  256. package/dist/commands/dead-exports.js.map +0 -1
  257. package/dist/commands/dead_exports.d.ts +0 -5
  258. package/dist/commands/dead_exports.d.ts.map +0 -1
  259. package/dist/commands/dead_exports.js +0 -7
  260. package/dist/commands/dead_exports.js.map +0 -1
  261. package/dist/commands/extract.d.ts +0 -8
  262. package/dist/commands/extract.d.ts.map +0 -1
  263. package/dist/commands/extract.js +0 -49
  264. package/dist/commands/extract.js.map +0 -1
  265. package/dist/commands/find.d.ts +0 -5
  266. package/dist/commands/find.d.ts.map +0 -1
  267. package/dist/commands/find.js +0 -7
  268. package/dist/commands/find.js.map +0 -1
  269. package/dist/commands/load.d.ts.map +0 -1
  270. package/dist/commands/load.js +0 -28
  271. package/dist/commands/load.js.map +0 -1
  272. package/dist/commands/neighbors.d.ts +0 -5
  273. package/dist/commands/neighbors.d.ts.map +0 -1
  274. package/dist/commands/neighbors.js +0 -17
  275. package/dist/commands/neighbors.js.map +0 -1
  276. package/dist/commands/optimize.d.ts +0 -6
  277. package/dist/commands/optimize.d.ts.map +0 -1
  278. package/dist/commands/optimize.js +0 -59
  279. package/dist/commands/optimize.js.map +0 -1
  280. package/dist/commands/optimize_command.d.ts +0 -6
  281. package/dist/commands/optimize_command.d.ts.map +0 -1
  282. package/dist/commands/optimize_command.js +0 -59
  283. package/dist/commands/optimize_command.js.map +0 -1
  284. package/dist/commands/references.d.ts +0 -5
  285. package/dist/commands/references.d.ts.map +0 -1
  286. package/dist/commands/references.js +0 -17
  287. package/dist/commands/references.js.map +0 -1
  288. package/dist/commands/web.d.ts +0 -19
  289. package/dist/commands/web.d.ts.map +0 -1
  290. package/dist/commands/web.js +0 -120
  291. package/dist/commands/web.js.map +0 -1
  292. package/dist/commands/who-calls.d.ts +0 -5
  293. package/dist/commands/who-calls.d.ts.map +0 -1
  294. package/dist/commands/who-calls.js +0 -7
  295. package/dist/commands/who-calls.js.map +0 -1
  296. package/dist/commands/who_calls.d.ts +0 -5
  297. package/dist/commands/who_calls.d.ts.map +0 -1
  298. package/dist/commands/who_calls.js +0 -7
  299. package/dist/commands/who_calls.js.map +0 -1
  300. package/dist/extract/graph-builder.d.ts +0 -16
  301. package/dist/extract/graph-builder.d.ts.map +0 -1
  302. package/dist/extract/graph-builder.js +0 -39
  303. package/dist/extract/graph-builder.js.map +0 -1
  304. package/dist/extract/node-id.d.ts +0 -8
  305. package/dist/extract/node-id.d.ts.map +0 -1
  306. package/dist/extract/node-id.js +0 -22
  307. package/dist/extract/node-id.js.map +0 -1
  308. package/dist/extract/project-loader.d.ts +0 -5
  309. package/dist/extract/project-loader.d.ts.map +0 -1
  310. package/dist/extract/project-loader.js +0 -19
  311. package/dist/extract/project-loader.js.map +0 -1
  312. package/dist/extract/semantic-extractor.d.ts +0 -22
  313. package/dist/extract/semantic-extractor.d.ts.map +0 -1
  314. package/dist/extract/semantic-extractor.js +0 -254
  315. package/dist/extract/semantic-extractor.js.map +0 -1
  316. package/dist/extract/structural-extractor.d.ts +0 -18
  317. package/dist/extract/structural-extractor.d.ts.map +0 -1
  318. package/dist/extract/structural-extractor.js +0 -97
  319. package/dist/extract/structural-extractor.js.map +0 -1
  320. package/dist/query/graph-query.d.ts +0 -28
  321. package/dist/query/graph-query.d.ts.map +0 -1
  322. package/dist/query/graph-query.js +0 -93
  323. package/dist/query/graph-query.js.map +0 -1
  324. package/dist/store/jsonl-reader.d.ts +0 -11
  325. package/dist/store/jsonl-reader.d.ts.map +0 -1
  326. package/dist/store/jsonl-reader.js +0 -19
  327. package/dist/store/jsonl-reader.js.map +0 -1
  328. package/dist/store/jsonl-store.d.ts +0 -7
  329. package/dist/store/jsonl-store.d.ts.map +0 -1
  330. package/dist/store/jsonl-store.js +0 -13
  331. package/dist/store/jsonl-store.js.map +0 -1
  332. package/dist/store/kuzu-store.d.ts +0 -14
  333. package/dist/store/kuzu-store.d.ts.map +0 -1
  334. package/dist/store/kuzu-store.js +0 -52
  335. package/dist/store/kuzu-store.js.map +0 -1
@@ -0,0 +1,115 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { writeFile } from 'node:fs/promises';
3
+ import { basename } from 'node:path';
4
+ import chalk from 'chalk';
5
+ import { GraphQuery } from '../query/graph_query.js';
6
+ import { GraphReport } from '../report/graph_report.js';
7
+ import { ReportData } from '../report/report_data.js';
8
+ import { PdfRenderer, PdfUnavailableError } from '../report/pdf_renderer.js';
9
+ import { KuzuStore } from '../store/kuzu_store.js';
10
+ import { OutputFolder } from '../store/output_folder.js';
11
+ import { CommandHelpers } from './command_helpers.js';
12
+ const FORMATS = ['markdown', 'pdf', 'json'];
13
+ const EXTENSION = { markdown: 'md', pdf: 'pdf', json: 'json' };
14
+ const DEFAULT_LIMIT = 10;
15
+ const MAX_LIMIT = 100;
16
+ /**
17
+ * `report` command — gathers a {@link GraphReportData} from the loaded graph and
18
+ * writes a CODEBASE_BRIEF in the chosen format. `markdown` and `json` come
19
+ * straight from the pure {@link GraphReport} renderer; `pdf` renders the visual
20
+ * HTML and converts it through the optional {@link PdfRenderer}, falling back to
21
+ * the HTML when no engine is installed.
22
+ */
23
+ export class ReportCommand {
24
+ static register(program) {
25
+ const command = program
26
+ .command('report')
27
+ .description('generate a CODEBASE_BRIEF summarising structure, impact, runtime, and boundary');
28
+ CommandHelpers.addOutputFolderOption(command)
29
+ .option('--format <format>', `output format: ${FORMATS.join(', ')}`, 'markdown')
30
+ .option('--output <file>', 'output file (default: <output-folder>/CODEBASE_BRIEF.<ext>)')
31
+ .option('--limit <n>', 'maximum rows per ranking', String(DEFAULT_LIMIT))
32
+ .option('--stdout', 'write to stdout instead of a file (markdown/json only)', false)
33
+ .action(async (options) => {
34
+ await ReportCommand.run(options);
35
+ });
36
+ }
37
+ static async run(options) {
38
+ if (FORMATS.includes(options.format) === false) {
39
+ console.error(chalk.red(`unknown format '${options.format}' — choose one of: ${FORMATS.join(', ')}`));
40
+ process.exitCode = 1;
41
+ return;
42
+ }
43
+ const format = options.format;
44
+ const folder = new OutputFolder(options.outputFolder);
45
+ if (existsSync(folder.dbPath) === false) {
46
+ console.error(chalk.red(`database not found at ${folder.dbPath} — run \`extract\` then \`load\` first`));
47
+ process.exitCode = 1;
48
+ return;
49
+ }
50
+ const data = await ReportCommand.gather(folder, options);
51
+ if (format === 'pdf') {
52
+ await ReportCommand.emitPdf(data, folder, options);
53
+ return;
54
+ }
55
+ const content = GraphReport.render(data, format);
56
+ if (options.stdout === true) {
57
+ console.log(content);
58
+ return;
59
+ }
60
+ const outPath = options.output ?? folder.reportPath(EXTENSION[format]);
61
+ await writeFile(outPath, content, 'utf8');
62
+ console.log(chalk.green(`✓ wrote ${outPath}`));
63
+ }
64
+ static async gather(folder, options) {
65
+ const store = new KuzuStore(folder.dbPath);
66
+ await store.initSchema();
67
+ try {
68
+ const query = new GraphQuery(store);
69
+ return await ReportData.gather(store, query, {
70
+ generatedAt: new Date().toISOString().slice(0, 10),
71
+ project: basename(folder.path),
72
+ outputFolder: options.outputFolder,
73
+ limit: ReportCommand.clampLimit(options.limit),
74
+ });
75
+ }
76
+ finally {
77
+ await store.close();
78
+ }
79
+ }
80
+ static async emitPdf(data, folder, options) {
81
+ if (options.stdout === true) {
82
+ console.error(chalk.red('--stdout is not supported for --format pdf — choose markdown or json, or drop --stdout'));
83
+ process.exitCode = 1;
84
+ return;
85
+ }
86
+ const outPath = options.output ?? folder.reportPath('pdf');
87
+ const html = GraphReport.renderVisualHtml(data);
88
+ try {
89
+ const pdf = await PdfRenderer.fromHtml(html);
90
+ await writeFile(outPath, pdf);
91
+ console.log(chalk.green(`✓ wrote ${outPath}`));
92
+ }
93
+ catch (error) {
94
+ if (error instanceof PdfUnavailableError === false) {
95
+ throw error;
96
+ }
97
+ const htmlPath = outPath.replace(/\.pdf$/, '.html');
98
+ await writeFile(htmlPath, html, 'utf8');
99
+ console.warn(chalk.yellow(`! ${error.message}`));
100
+ console.warn(chalk.yellow(` wrote the HTML layout to ${htmlPath} — open it and print to PDF, or install the engine for direct PDF output.`));
101
+ }
102
+ }
103
+ static clampLimit(value) {
104
+ const parsed = Number(value);
105
+ if (Number.isFinite(parsed) === false) {
106
+ return DEFAULT_LIMIT;
107
+ }
108
+ const floored = Math.floor(parsed);
109
+ if (floored < 1) {
110
+ return DEFAULT_LIMIT;
111
+ }
112
+ return floored > MAX_LIMIT ? MAX_LIMIT : floored;
113
+ }
114
+ }
115
+ //# sourceMappingURL=report_command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report_command.js","sourceRoot":"","sources":["../../src/commands/report_command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ export declare class VerifyCommand {
3
+ static register(program: Command): void;
4
+ private static print;
5
+ private static printCheck;
6
+ private static printFailureOutput;
7
+ }
8
+ //# sourceMappingURL=verify_command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify_command.d.ts","sourceRoot":"","sources":["../../src/commands/verify_command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,qBAAa,aAAa;IACzB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAuBvC,OAAO,CAAC,MAAM,CAAC,KAAK;IAapB,OAAO,CAAC,MAAM,CAAC,UAAU;IAUzB,OAAO,CAAC,MAAM,CAAC,kBAAkB;CASjC"}
@@ -0,0 +1,57 @@
1
+ import chalk from 'chalk';
2
+ import { ProjectVerifier } from '../verify/project_verifier.js';
3
+ export class VerifyCommand {
4
+ static register(program) {
5
+ program
6
+ .command('verify')
7
+ .description('run the project type-check + test gates and return one keep/revert verdict for an edit')
8
+ .option('-C, --cwd <path>', 'project directory whose package.json scripts are run', process.cwd())
9
+ .option('--typecheck-script <name>', 'npm script for the type-check gate', 'typecheck')
10
+ .option('--test-script <name>', 'npm script for the test gate', 'test')
11
+ .option('--skip-typecheck', 'skip the type-check gate', false)
12
+ .option('--skip-tests', 'skip the test gate (degrades to type-check-only)', false)
13
+ .option('--json', 'emit the verdict as JSON', false)
14
+ .action(async (options) => {
15
+ const report = await ProjectVerifier.verify({
16
+ cwd: options.cwd,
17
+ typecheckScript: options.typecheckScript,
18
+ testScript: options.testScript,
19
+ skipTypecheck: options.skipTypecheck === true,
20
+ skipTests: options.skipTests === true,
21
+ });
22
+ VerifyCommand.print(report, options.json === true);
23
+ process.exitCode = report.ok === true ? 0 : 1;
24
+ });
25
+ }
26
+ static print(report, json) {
27
+ if (json === true) {
28
+ console.log(JSON.stringify(report, null, 2));
29
+ return;
30
+ }
31
+ for (const check of report.checks) {
32
+ VerifyCommand.printCheck(check);
33
+ }
34
+ const verdict = report.ok === true ? chalk.green('✓') : chalk.red('✗');
35
+ console.log(`\n${verdict} ${report.summary}`);
36
+ VerifyCommand.printFailureOutput(report);
37
+ }
38
+ static printCheck(check) {
39
+ if (check.status === 'skipped') {
40
+ console.log(`${chalk.yellow('•')} ${chalk.bold(check.name.padEnd(10))} ${chalk.yellow('skipped')} ${chalk.gray(check.skippedReason ?? '')}`);
41
+ return;
42
+ }
43
+ const mark = check.status === 'pass' ? chalk.green('✓') : chalk.red('✗');
44
+ const timing = chalk.gray(`${(check.durationMs / 1000).toFixed(1)}s`);
45
+ console.log(`${mark} ${chalk.bold(check.name.padEnd(10))} ${chalk.gray(check.command ?? '')} ${timing}`);
46
+ }
47
+ static printFailureOutput(report) {
48
+ if (report.ok === true) {
49
+ return;
50
+ }
51
+ for (const check of report.checks.filter((candidate) => candidate.status === 'fail')) {
52
+ console.log(chalk.bold(`\n— ${check.name} output (tail) —`));
53
+ console.log(check.output.trimEnd());
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=verify_command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify_command.js","sourceRoot":"","sources":["../../src/commands/verify_command.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,33 @@ export declare class WebCommand {
13
13
  * `window.GRAPH_DATA` script the visualisation page loads on boot.
14
14
  */
15
15
  private static buildDataScript;
16
+ /**
17
+ * Decodes the JSON `metadata` column into a record so the visualisation can
18
+ * read `metadata.runtime`. A missing, empty (`{}`), or malformed value yields
19
+ * `undefined`, which `JSON.stringify` omits — keeping the payload small and
20
+ * letting un-enriched nodes simply carry no metadata.
21
+ */
22
+ private static decodeMetadata;
23
+ /**
24
+ * Renders the `window.GRAPH_SOURCE` script that lets the visualisation link
25
+ * file paths to GitHub. Returns an empty string when `sourceDir` is not a
26
+ * GitHub work tree, so the page falls back to plain-text file paths.
27
+ */
28
+ private static buildSourceScript;
29
+ /**
30
+ * Detects the GitHub repository, HEAD commit, and in-repo path prefix for the
31
+ * directory the graph was extracted from. Returns `undefined` when `sourceDir`
32
+ * is not a Git work tree, has no GitHub `origin` remote, or Git is unavailable.
33
+ */
34
+ private static detectGitHubSource;
35
+ /**
36
+ * Normalises a Git `origin` URL to its GitHub web base
37
+ * (`https://<host>/<owner>/<repo>`), or `undefined` for non-GitHub remotes.
38
+ * Handles the SCP-like (`git@host:owner/repo.git`), `https://`, `git://`, and
39
+ * `ssh://` forms, with or without a trailing `.git`. The host is kept as-is so
40
+ * GitHub Enterprise remotes resolve to their own domain.
41
+ */
42
+ static githubBaseUrl(remoteUrl: string): string | undefined;
16
43
  private static handle;
17
44
  private static notFound;
18
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"web_command.d.ts","sourceRoot":"","sources":["../../src/commands/web_command.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC;;;;;GAKG;AACH,qBAAa,UAAU;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAWlB,GAAG;IAmBxB;;;OAGG;mBACkB,eAAe;mBAoCf,MAAM;IAwB3B,OAAO,CAAC,MAAM,CAAC,QAAQ;CAIvB"}
1
+ {"version":3,"file":"web_command.d.ts","sourceRoot":"","sources":["../../src/commands/web_command.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4CpC;;;;;GAKG;AACH,qBAAa,UAAU;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAYlB,GAAG;IAoBxB;;;OAGG;mBACkB,eAAe;IAsCpC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAe7B;;;;OAIG;mBACkB,iBAAiB;IAUtC;;;;OAIG;mBACkB,kBAAkB;IAsBvC;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;mBA8BtC,MAAM;IAwB3B,OAAO,CAAC,MAAM,CAAC,QAAQ;CAIvB"}
@@ -1,11 +1,14 @@
1
+ import { execFile } from 'node:child_process';
1
2
  import { existsSync } from 'node:fs';
2
3
  import { readFile } from 'node:fs/promises';
3
4
  import { createServer } from 'node:http';
4
5
  import { extname, join, normalize, resolve, sep } from 'node:path';
5
6
  import { fileURLToPath } from 'node:url';
7
+ import { promisify } from 'node:util';
6
8
  import chalk from 'chalk';
7
9
  import { KuzuStore } from '../store/kuzu_store.js';
8
10
  import { DEFAULT_DB_PATH } from './command_helpers.js';
11
+ const execFileAsync = promisify(execFile);
9
12
  /**
10
13
  * Static assets of the web visualisation, resolved relative to this module so
11
14
  * the same path works from `src/` (tsx) and from `dist/` (published package).
@@ -34,6 +37,7 @@ export class WebCommand {
34
37
  .description('serve the knowledge graph database in a web visualisation')
35
38
  .option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
36
39
  .option('-p, --port <port>', 'HTTP port to listen on', DEFAULT_PORT)
40
+ .option('-s, --source <dir>', 'project root the graph was extracted from, used to link files to GitHub', '.')
37
41
  .action(async (options) => {
38
42
  await WebCommand.run(options);
39
43
  });
@@ -45,7 +49,8 @@ export class WebCommand {
45
49
  process.exitCode = 1;
46
50
  return;
47
51
  }
48
- const dataScript = await WebCommand.buildDataScript(dbPath);
52
+ const sourceScript = await WebCommand.buildSourceScript(resolve(options.source));
53
+ const dataScript = sourceScript + await WebCommand.buildDataScript(dbPath);
49
54
  const server = createServer((request, response) => {
50
55
  void WebCommand.handle(request, response, dataScript);
51
56
  });
@@ -62,8 +67,8 @@ export class WebCommand {
62
67
  const store = new KuzuStore(dbPath);
63
68
  await store.initSchema();
64
69
  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');
70
+ 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, n.metadata AS metadata');
71
+ 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, e.metadata AS metadata');
67
72
  const nodes = nodeRows.map((row) => ({
68
73
  id: String(row.id),
69
74
  kind: String(row.kind),
@@ -76,12 +81,14 @@ export class WebCommand {
76
81
  endLine: Number(row.endLine),
77
82
  endColumn: 0,
78
83
  },
84
+ metadata: WebCommand.decodeMetadata(row.metadata),
79
85
  }));
80
86
  const edges = edgeRows.map((row, index) => ({
81
87
  id: `e${index}`,
82
88
  kind: String(row.kind),
83
89
  from: String(row.from),
84
90
  to: String(row.to),
91
+ metadata: WebCommand.decodeMetadata(row.metadata),
85
92
  }));
86
93
  console.log(chalk.cyan(`loaded ${nodes.length} nodes, ${edges.length} edges from ${dbPath}`));
87
94
  return `window.GRAPH_DATA = ${JSON.stringify({ nodes, edges })};\n`;
@@ -90,6 +97,105 @@ export class WebCommand {
90
97
  await store.close();
91
98
  }
92
99
  }
100
+ /**
101
+ * Decodes the JSON `metadata` column into a record so the visualisation can
102
+ * read `metadata.runtime`. A missing, empty (`{}`), or malformed value yields
103
+ * `undefined`, which `JSON.stringify` omits — keeping the payload small and
104
+ * letting un-enriched nodes simply carry no metadata.
105
+ */
106
+ static decodeMetadata(value) {
107
+ if (typeof value !== 'string' || value.length === 0) {
108
+ return undefined;
109
+ }
110
+ try {
111
+ const parsed = JSON.parse(value);
112
+ if (typeof parsed === 'object' && parsed !== null && Object.keys(parsed).length > 0) {
113
+ return parsed;
114
+ }
115
+ return undefined;
116
+ }
117
+ catch {
118
+ return undefined;
119
+ }
120
+ }
121
+ /**
122
+ * Renders the `window.GRAPH_SOURCE` script that lets the visualisation link
123
+ * file paths to GitHub. Returns an empty string when `sourceDir` is not a
124
+ * GitHub work tree, so the page falls back to plain-text file paths.
125
+ */
126
+ static async buildSourceScript(sourceDir) {
127
+ const github = await WebCommand.detectGitHubSource(sourceDir);
128
+ if (github === undefined) {
129
+ console.log(chalk.gray('no GitHub remote detected — file paths will not link to source'));
130
+ return '';
131
+ }
132
+ console.log(chalk.cyan(`linking files to ${github.baseUrl} @ ${github.commit.slice(0, 7)}`));
133
+ return `window.GRAPH_SOURCE = ${JSON.stringify({ github })};\n`;
134
+ }
135
+ /**
136
+ * Detects the GitHub repository, HEAD commit, and in-repo path prefix for the
137
+ * directory the graph was extracted from. Returns `undefined` when `sourceDir`
138
+ * is not a Git work tree, has no GitHub `origin` remote, or Git is unavailable.
139
+ */
140
+ static async detectGitHubSource(sourceDir) {
141
+ const git = async (...args) => {
142
+ try {
143
+ const { stdout } = await execFileAsync('git', ['-C', sourceDir, ...args]);
144
+ return stdout.trim();
145
+ }
146
+ catch {
147
+ return undefined;
148
+ }
149
+ };
150
+ if (await git('rev-parse', '--is-inside-work-tree') !== 'true') {
151
+ return undefined;
152
+ }
153
+ const remoteUrl = await git('remote', 'get-url', 'origin');
154
+ const commit = await git('rev-parse', 'HEAD');
155
+ const baseUrl = remoteUrl === undefined ? undefined : WebCommand.githubBaseUrl(remoteUrl);
156
+ if (baseUrl === undefined || commit === undefined) {
157
+ return undefined;
158
+ }
159
+ return { baseUrl, commit, prefix: await git('rev-parse', '--show-prefix') ?? '' };
160
+ }
161
+ /**
162
+ * Normalises a Git `origin` URL to its GitHub web base
163
+ * (`https://<host>/<owner>/<repo>`), or `undefined` for non-GitHub remotes.
164
+ * Handles the SCP-like (`git@host:owner/repo.git`), `https://`, `git://`, and
165
+ * `ssh://` forms, with or without a trailing `.git`. The host is kept as-is so
166
+ * GitHub Enterprise remotes resolve to their own domain.
167
+ */
168
+ static githubBaseUrl(remoteUrl) {
169
+ const trimmed = remoteUrl.trim();
170
+ let host;
171
+ let path;
172
+ if (trimmed.includes('://') === true) {
173
+ try {
174
+ const parsed = new URL(trimmed);
175
+ host = parsed.host;
176
+ path = parsed.pathname;
177
+ }
178
+ catch {
179
+ return undefined;
180
+ }
181
+ }
182
+ else {
183
+ const scpMatch = trimmed.match(/^[^@]+@([^:]+):(.+)$/);
184
+ if (scpMatch === null) {
185
+ return undefined;
186
+ }
187
+ host = scpMatch[1];
188
+ path = scpMatch[2];
189
+ }
190
+ if (host.toLowerCase().includes('github') === false) {
191
+ return undefined;
192
+ }
193
+ const segments = path.replace(/\.git$/, '').split('/').filter((segment) => segment.length > 0);
194
+ if (segments.length < 2) {
195
+ return undefined;
196
+ }
197
+ return `https://${host}/${segments[0]}/${segments[1]}`;
198
+ }
93
199
  static async handle(request, response, dataScript) {
94
200
  const url = new URL(request.url ?? '/', 'http://localhost');
95
201
  const pathname = url.pathname === '/' ? '/index.html' : url.pathname;
@@ -1 +1 @@
1
- {"version":3,"file":"web_command.js","sourceRoot":"","sources":["../../src/commands/web_command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web_command.js","sourceRoot":"","sources":["../../src/commands/web_command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * `webview` 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 `/js_autogenerated/graph_data.js`; all other assets are served statically
6
+ * from the contribs/webview/web directory.
7
+ */
8
+ export declare class WebviewCommand {
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
+ /**
17
+ * Decodes the JSON `metadata` column into a record so the visualisation can
18
+ * read `metadata.runtime`. A missing, empty (`{}`), or malformed value yields
19
+ * `undefined`, which `JSON.stringify` omits — keeping the payload small and
20
+ * letting un-enriched nodes simply carry no metadata.
21
+ */
22
+ private static decodeMetadata;
23
+ /**
24
+ * Resolves the GitHub source for the served graph. Prefers the provenance
25
+ * `extract` recorded in the database — it pins the exact commit and in-repo
26
+ * `prefix` that was parsed — and falls back to detecting it live from
27
+ * `sourceDir` for graphs built before provenance was captured. Returns
28
+ * `undefined` when neither is available, so the page shows plain-text paths.
29
+ */
30
+ private static resolveGitHubSource;
31
+ /** Reads the source provenance `load` stored in the database, or `undefined` when absent or malformed. */
32
+ private static readStoredSource;
33
+ private static handle;
34
+ private static notFound;
35
+ }
36
+ //# sourceMappingURL=webview_command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webview_command.d.ts","sourceRoot":"","sources":["../../src/commands/webview_command.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC;;;;;GAKG;AACH,qBAAa,cAAc;IAC1B,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAYlB,GAAG;IAqBxB;;;OAGG;mBACkB,eAAe;IAsCpC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAe7B;;;;;;OAMG;mBACkB,mBAAmB;IAexC,0GAA0G;mBACrF,gBAAgB;mBAehB,MAAM;IAwB3B,OAAO,CAAC,MAAM,CAAC,QAAQ;CAIvB"}