@bugsbunnycodes1998/cartographer-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/dist/__tests__/pipeline.test.d.ts +2 -0
  2. package/dist/__tests__/pipeline.test.d.ts.map +1 -0
  3. package/dist/__tests__/pipeline.test.js +58 -0
  4. package/dist/__tests__/pipeline.test.js.map +1 -0
  5. package/dist/analysis/call-graph.d.ts +13 -0
  6. package/dist/analysis/call-graph.d.ts.map +1 -0
  7. package/dist/analysis/call-graph.js +133 -0
  8. package/dist/analysis/call-graph.js.map +1 -0
  9. package/dist/analysis/dependency-graph.d.ts +8 -0
  10. package/dist/analysis/dependency-graph.d.ts.map +1 -0
  11. package/dist/analysis/dependency-graph.js +101 -0
  12. package/dist/analysis/dependency-graph.js.map +1 -0
  13. package/dist/analysis/git/archaeology.d.ts +20 -0
  14. package/dist/analysis/git/archaeology.d.ts.map +1 -0
  15. package/dist/analysis/git/archaeology.js +61 -0
  16. package/dist/analysis/git/archaeology.js.map +1 -0
  17. package/dist/analysis/git/bus-factor.d.ts +17 -0
  18. package/dist/analysis/git/bus-factor.d.ts.map +1 -0
  19. package/dist/analysis/git/bus-factor.js +90 -0
  20. package/dist/analysis/git/bus-factor.js.map +1 -0
  21. package/dist/analysis/git/churn.d.ts +26 -0
  22. package/dist/analysis/git/churn.d.ts.map +1 -0
  23. package/dist/analysis/git/churn.js +127 -0
  24. package/dist/analysis/git/churn.js.map +1 -0
  25. package/dist/analysis/git/contributors.d.ts +14 -0
  26. package/dist/analysis/git/contributors.d.ts.map +1 -0
  27. package/dist/analysis/git/contributors.js +60 -0
  28. package/dist/analysis/git/contributors.js.map +1 -0
  29. package/dist/analysis/git/evolution.d.ts +10 -0
  30. package/dist/analysis/git/evolution.d.ts.map +1 -0
  31. package/dist/analysis/git/evolution.js +127 -0
  32. package/dist/analysis/git/evolution.js.map +1 -0
  33. package/dist/analysis/git/index.d.ts +6 -0
  34. package/dist/analysis/git/index.d.ts.map +1 -0
  35. package/dist/analysis/git/index.js +6 -0
  36. package/dist/analysis/git/index.js.map +1 -0
  37. package/dist/analysis/go-visitor.d.ts +4 -0
  38. package/dist/analysis/go-visitor.d.ts.map +1 -0
  39. package/dist/analysis/go-visitor.js +295 -0
  40. package/dist/analysis/go-visitor.js.map +1 -0
  41. package/dist/analysis/health/indicators.d.ts +25 -0
  42. package/dist/analysis/health/indicators.d.ts.map +1 -0
  43. package/dist/analysis/health/indicators.js +53 -0
  44. package/dist/analysis/health/indicators.js.map +1 -0
  45. package/dist/analysis/health/scorer.d.ts +26 -0
  46. package/dist/analysis/health/scorer.d.ts.map +1 -0
  47. package/dist/analysis/health/scorer.js +97 -0
  48. package/dist/analysis/health/scorer.js.map +1 -0
  49. package/dist/analysis/health/test-coverage.d.ts +19 -0
  50. package/dist/analysis/health/test-coverage.d.ts.map +1 -0
  51. package/dist/analysis/health/test-coverage.js +67 -0
  52. package/dist/analysis/health/test-coverage.js.map +1 -0
  53. package/dist/analysis/import-resolver.d.ts +10 -0
  54. package/dist/analysis/import-resolver.d.ts.map +1 -0
  55. package/dist/analysis/import-resolver.js +353 -0
  56. package/dist/analysis/import-resolver.js.map +1 -0
  57. package/dist/analysis/index.d.ts +22 -0
  58. package/dist/analysis/index.d.ts.map +1 -0
  59. package/dist/analysis/index.js +24 -0
  60. package/dist/analysis/index.js.map +1 -0
  61. package/dist/analysis/java-visitor.d.ts +4 -0
  62. package/dist/analysis/java-visitor.d.ts.map +1 -0
  63. package/dist/analysis/java-visitor.js +257 -0
  64. package/dist/analysis/java-visitor.js.map +1 -0
  65. package/dist/analysis/metrics.d.ts +19 -0
  66. package/dist/analysis/metrics.d.ts.map +1 -0
  67. package/dist/analysis/metrics.js +70 -0
  68. package/dist/analysis/metrics.js.map +1 -0
  69. package/dist/analysis/module-detector.d.ts +3 -0
  70. package/dist/analysis/module-detector.d.ts.map +1 -0
  71. package/dist/analysis/module-detector.js +257 -0
  72. package/dist/analysis/module-detector.js.map +1 -0
  73. package/dist/analysis/parser.d.ts +13 -0
  74. package/dist/analysis/parser.d.ts.map +1 -0
  75. package/dist/analysis/parser.js +92 -0
  76. package/dist/analysis/parser.js.map +1 -0
  77. package/dist/analysis/python-visitor.d.ts +4 -0
  78. package/dist/analysis/python-visitor.d.ts.map +1 -0
  79. package/dist/analysis/python-visitor.js +306 -0
  80. package/dist/analysis/python-visitor.js.map +1 -0
  81. package/dist/analysis/rust-visitor.d.ts +4 -0
  82. package/dist/analysis/rust-visitor.d.ts.map +1 -0
  83. package/dist/analysis/rust-visitor.js +318 -0
  84. package/dist/analysis/rust-visitor.js.map +1 -0
  85. package/dist/analysis/semantic/cache.d.ts +16 -0
  86. package/dist/analysis/semantic/cache.d.ts.map +1 -0
  87. package/dist/analysis/semantic/cache.js +26 -0
  88. package/dist/analysis/semantic/cache.js.map +1 -0
  89. package/dist/analysis/semantic/openai-client.d.ts +21 -0
  90. package/dist/analysis/semantic/openai-client.d.ts.map +1 -0
  91. package/dist/analysis/semantic/openai-client.js +73 -0
  92. package/dist/analysis/semantic/openai-client.js.map +1 -0
  93. package/dist/analysis/semantic/prompts.d.ts +32 -0
  94. package/dist/analysis/semantic/prompts.d.ts.map +1 -0
  95. package/dist/analysis/semantic/prompts.js +134 -0
  96. package/dist/analysis/semantic/prompts.js.map +1 -0
  97. package/dist/analysis/semantic/summarizer.d.ts +36 -0
  98. package/dist/analysis/semantic/summarizer.d.ts.map +1 -0
  99. package/dist/analysis/semantic/summarizer.js +229 -0
  100. package/dist/analysis/semantic/summarizer.js.map +1 -0
  101. package/dist/analysis/ts-js-visitor.d.ts +4 -0
  102. package/dist/analysis/ts-js-visitor.d.ts.map +1 -0
  103. package/dist/analysis/ts-js-visitor.js +390 -0
  104. package/dist/analysis/ts-js-visitor.js.map +1 -0
  105. package/dist/analysis/visitor-registry.d.ts +5 -0
  106. package/dist/analysis/visitor-registry.d.ts.map +1 -0
  107. package/dist/analysis/visitor-registry.js +17 -0
  108. package/dist/analysis/visitor-registry.js.map +1 -0
  109. package/dist/analysis/visitor-utils.d.ts +38 -0
  110. package/dist/analysis/visitor-utils.d.ts.map +1 -0
  111. package/dist/analysis/visitor-utils.js +110 -0
  112. package/dist/analysis/visitor-utils.js.map +1 -0
  113. package/dist/errors.d.ts +20 -0
  114. package/dist/errors.d.ts.map +1 -0
  115. package/dist/errors.js +39 -0
  116. package/dist/errors.js.map +1 -0
  117. package/dist/expeditions/custom.d.ts +11 -0
  118. package/dist/expeditions/custom.d.ts.map +1 -0
  119. package/dist/expeditions/custom.js +61 -0
  120. package/dist/expeditions/custom.js.map +1 -0
  121. package/dist/expeditions/danger-zones.d.ts +9 -0
  122. package/dist/expeditions/danger-zones.d.ts.map +1 -0
  123. package/dist/expeditions/danger-zones.js +42 -0
  124. package/dist/expeditions/danger-zones.js.map +1 -0
  125. package/dist/expeditions/generator.d.ts +21 -0
  126. package/dist/expeditions/generator.d.ts.map +1 -0
  127. package/dist/expeditions/generator.js +78 -0
  128. package/dist/expeditions/generator.js.map +1 -0
  129. package/dist/expeditions/grand-tour.d.ts +10 -0
  130. package/dist/expeditions/grand-tour.d.ts.map +1 -0
  131. package/dist/expeditions/grand-tour.js +96 -0
  132. package/dist/expeditions/grand-tour.js.map +1 -0
  133. package/dist/expeditions/request-flow.d.ts +11 -0
  134. package/dist/expeditions/request-flow.d.ts.map +1 -0
  135. package/dist/expeditions/request-flow.js +138 -0
  136. package/dist/expeditions/request-flow.js.map +1 -0
  137. package/dist/grammars/tree-sitter-go.wasm +0 -0
  138. package/dist/grammars/tree-sitter-java.wasm +0 -0
  139. package/dist/grammars/tree-sitter-javascript.wasm +0 -0
  140. package/dist/grammars/tree-sitter-python.wasm +0 -0
  141. package/dist/grammars/tree-sitter-rust.wasm +0 -0
  142. package/dist/grammars/tree-sitter-tsx.wasm +0 -0
  143. package/dist/grammars/tree-sitter-typescript.wasm +0 -0
  144. package/dist/graph/builder.d.ts +23 -0
  145. package/dist/graph/builder.d.ts.map +1 -0
  146. package/dist/graph/builder.js +131 -0
  147. package/dist/graph/builder.js.map +1 -0
  148. package/dist/graph/exporter.d.ts +5 -0
  149. package/dist/graph/exporter.d.ts.map +1 -0
  150. package/dist/graph/exporter.js +20 -0
  151. package/dist/graph/exporter.js.map +1 -0
  152. package/dist/graph/layout.d.ts +3 -0
  153. package/dist/graph/layout.d.ts.map +1 -0
  154. package/dist/graph/layout.js +257 -0
  155. package/dist/graph/layout.js.map +1 -0
  156. package/dist/graph/store.d.ts +13 -0
  157. package/dist/graph/store.d.ts.map +1 -0
  158. package/dist/graph/store.js +145 -0
  159. package/dist/graph/store.js.map +1 -0
  160. package/dist/index.d.ts +17 -0
  161. package/dist/index.d.ts.map +1 -0
  162. package/dist/index.js +12 -0
  163. package/dist/index.js.map +1 -0
  164. package/dist/ingestion/cloner.d.ts +18 -0
  165. package/dist/ingestion/cloner.d.ts.map +1 -0
  166. package/dist/ingestion/cloner.js +62 -0
  167. package/dist/ingestion/cloner.js.map +1 -0
  168. package/dist/ingestion/file-tree.d.ts +3 -0
  169. package/dist/ingestion/file-tree.d.ts.map +1 -0
  170. package/dist/ingestion/file-tree.js +85 -0
  171. package/dist/ingestion/file-tree.js.map +1 -0
  172. package/dist/ingestion/index.d.ts +5 -0
  173. package/dist/ingestion/index.d.ts.map +1 -0
  174. package/dist/ingestion/index.js +5 -0
  175. package/dist/ingestion/index.js.map +1 -0
  176. package/dist/ingestion/language-detector.d.ts +8 -0
  177. package/dist/ingestion/language-detector.d.ts.map +1 -0
  178. package/dist/ingestion/language-detector.js +37 -0
  179. package/dist/ingestion/language-detector.js.map +1 -0
  180. package/dist/ingestion/path-resolver.d.ts +7 -0
  181. package/dist/ingestion/path-resolver.d.ts.map +1 -0
  182. package/dist/ingestion/path-resolver.js +30 -0
  183. package/dist/ingestion/path-resolver.js.map +1 -0
  184. package/dist/logger.d.ts +3 -0
  185. package/dist/logger.d.ts.map +1 -0
  186. package/dist/logger.js +11 -0
  187. package/dist/logger.js.map +1 -0
  188. package/dist/pipeline.d.ts +3 -0
  189. package/dist/pipeline.d.ts.map +1 -0
  190. package/dist/pipeline.js +223 -0
  191. package/dist/pipeline.js.map +1 -0
  192. package/dist/types/analysis.d.ts +51 -0
  193. package/dist/types/analysis.d.ts.map +1 -0
  194. package/dist/types/analysis.js +2 -0
  195. package/dist/types/analysis.js.map +1 -0
  196. package/dist/types/config.d.ts +19 -0
  197. package/dist/types/config.d.ts.map +1 -0
  198. package/dist/types/config.js +2 -0
  199. package/dist/types/config.js.map +1 -0
  200. package/dist/types/edges.d.ts +8 -0
  201. package/dist/types/edges.d.ts.map +1 -0
  202. package/dist/types/edges.js +2 -0
  203. package/dist/types/edges.js.map +1 -0
  204. package/dist/types/expeditions.d.ts +19 -0
  205. package/dist/types/expeditions.d.ts.map +1 -0
  206. package/dist/types/expeditions.js +2 -0
  207. package/dist/types/expeditions.js.map +1 -0
  208. package/dist/types/graph.d.ts +29 -0
  209. package/dist/types/graph.d.ts.map +1 -0
  210. package/dist/types/graph.js +2 -0
  211. package/dist/types/graph.js.map +1 -0
  212. package/dist/types/index.d.ts +7 -0
  213. package/dist/types/index.d.ts.map +1 -0
  214. package/dist/types/index.js +2 -0
  215. package/dist/types/index.js.map +1 -0
  216. package/dist/types/nodes.d.ts +35 -0
  217. package/dist/types/nodes.d.ts.map +1 -0
  218. package/dist/types/nodes.js +2 -0
  219. package/dist/types/nodes.js.map +1 -0
  220. package/package.json +36 -0
@@ -0,0 +1,131 @@
1
+ import { relative } from "node:path";
2
+ function normalizePath(p) {
3
+ return p.replace(/\\/g, "/");
4
+ }
5
+ function makeDefaultNode(id, kind, name) {
6
+ return {
7
+ id,
8
+ kind,
9
+ name,
10
+ path: null,
11
+ parentId: null,
12
+ loc: 0,
13
+ complexity: 0,
14
+ healthScore: 50,
15
+ createdAt: null,
16
+ lastModified: null,
17
+ totalCommits: 0,
18
+ busFactor: 0,
19
+ primaryOwner: null,
20
+ churnScore: 0,
21
+ summary: null,
22
+ explanation: null,
23
+ layer: null,
24
+ tags: [],
25
+ position: { x: 0, y: 0, z: 0 },
26
+ dimensions: { width: 1, height: 1, depth: 1 },
27
+ };
28
+ }
29
+ export function buildGraph(opts) {
30
+ const { modules, analyses, moduleEdges, fileMetrics, moduleMetrics, rootDir, gitResult, healthScores, summarization, callGraphResult, } = opts;
31
+ const nodes = [];
32
+ // Create module nodes
33
+ for (const mod of modules) {
34
+ const metrics = moduleMetrics.get(mod.id);
35
+ const node = makeDefaultNode(mod.id, "module", mod.name);
36
+ node.loc = metrics?.totalLoc ?? 0;
37
+ node.complexity = metrics?.totalComplexity ?? 0;
38
+ // Git data: bus factor
39
+ if (gitResult?.busFactorMap.has(mod.id)) {
40
+ const bf = gitResult.busFactorMap.get(mod.id);
41
+ node.busFactor = bf.busFactor;
42
+ node.primaryOwner = bf.primaryOwner;
43
+ }
44
+ // Health score: weighted average of child files (computed after file nodes)
45
+ // LLM summary
46
+ if (summarization?.moduleSummaries.has(mod.id)) {
47
+ const ms = summarization.moduleSummaries.get(mod.id);
48
+ node.summary = ms.summary;
49
+ node.explanation = ms.explanation;
50
+ node.layer = ms.layer;
51
+ node.tags = ms.tags;
52
+ }
53
+ nodes.push(node);
54
+ }
55
+ // Create file nodes
56
+ for (const analysis of analyses) {
57
+ const relPath = normalizePath(relative(rootDir, analysis.filePath));
58
+ const fileId = `file:${relPath}`;
59
+ const fileName = relPath.split("/").pop() ?? relPath;
60
+ // Find parent module
61
+ let parentId = null;
62
+ for (const mod of modules) {
63
+ if (mod.files.includes(relPath)) {
64
+ parentId = mod.id;
65
+ break;
66
+ }
67
+ }
68
+ const fm = fileMetrics.get(analysis.filePath);
69
+ const node = makeDefaultNode(fileId, "file", fileName);
70
+ node.path = relPath;
71
+ node.parentId = parentId;
72
+ node.loc = analysis.loc;
73
+ node.complexity = fm?.complexity ?? 0;
74
+ // Health score
75
+ if (healthScores) {
76
+ const score = healthScores.get(analysis.filePath) ?? healthScores.get(relPath);
77
+ if (score !== undefined) {
78
+ node.healthScore = score;
79
+ }
80
+ }
81
+ // Git data
82
+ if (gitResult?.churnMap.has(relPath)) {
83
+ const cd = gitResult.churnMap.get(relPath);
84
+ node.churnScore = cd.churnScore;
85
+ node.totalCommits = cd.totalCommits;
86
+ node.createdAt = cd.createdAt;
87
+ node.lastModified = cd.lastModified;
88
+ node.primaryOwner = cd.primaryAuthor;
89
+ }
90
+ // Bus factor from module-level data
91
+ if (parentId && gitResult?.busFactorMap.has(parentId)) {
92
+ node.busFactor = gitResult.busFactorMap.get(parentId).busFactor;
93
+ }
94
+ // LLM summary
95
+ if (summarization?.fileSummaries.has(relPath)) {
96
+ const fs = summarization.fileSummaries.get(relPath);
97
+ node.summary = fs.summary;
98
+ node.explanation = fs.explanation;
99
+ node.layer = fs.layer;
100
+ node.tags = fs.tags;
101
+ }
102
+ nodes.push(node);
103
+ }
104
+ // Add function nodes and call edges from call graph analysis
105
+ if (callGraphResult) {
106
+ for (const fnNode of callGraphResult.functionNodes) {
107
+ nodes.push(fnNode);
108
+ }
109
+ }
110
+ // Compute module health scores as weighted average of child files
111
+ for (const modNode of nodes.filter((n) => n.kind === "module")) {
112
+ const childFiles = nodes.filter((n) => n.kind === "file" && n.parentId === modNode.id);
113
+ if (childFiles.length > 0) {
114
+ const totalLoc = childFiles.reduce((sum, f) => sum + f.loc, 0);
115
+ if (totalLoc > 0) {
116
+ modNode.healthScore = Math.round(childFiles.reduce((sum, f) => sum + f.healthScore * f.loc, 0) / totalLoc);
117
+ }
118
+ // Aggregate churn
119
+ const churnFiles = childFiles.filter((f) => f.churnScore > 0);
120
+ if (churnFiles.length > 0) {
121
+ modNode.churnScore = churnFiles.reduce((sum, f) => sum + f.churnScore, 0) / churnFiles.length;
122
+ }
123
+ }
124
+ }
125
+ const edges = [...moduleEdges];
126
+ if (callGraphResult) {
127
+ edges.push(...callGraphResult.callEdges);
128
+ }
129
+ return { nodes, edges };
130
+ }
131
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/graph/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAOrC,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAoBD,SAAS,eAAe,CAAC,EAAU,EAAE,IAAuB,EAAE,IAAY;IACxE,OAAO;QACL,EAAE;QACF,IAAI;QACJ,IAAI;QACJ,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,CAAC;QACN,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,CAAC;QACb,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAC9B,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAuB;IAChD,MAAM,EACJ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAC1D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,GACjE,GAAG,IAAI,CAAC;IAET,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,sBAAsB;IACtB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,QAAQ,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,eAAe,IAAI,CAAC,CAAC;QAEhD,uBAAuB;QACvB,IAAI,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;YAC/C,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC;QACtC,CAAC;QAED,4EAA4E;QAC5E,cAAc;QACd,IAAI,aAAa,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;YACtD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC;YAClC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,KAA2B,CAAC;YAC5C,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;QACtB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,oBAAoB;IACpB,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,QAAQ,OAAO,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC;QAErD,qBAAqB;QACrB,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC;gBAClB,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,EAAE,EAAE,UAAU,IAAI,CAAC,CAAC;QAEtC,eAAe;QACf,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,WAAW;QACX,IAAI,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACrC,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;YAC5C,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC;YACpC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,aAAa,CAAC;QACvC,CAAC;QACD,oCAAoC;QACpC,IAAI,QAAQ,IAAI,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,SAAS,CAAC;QACnE,CAAC;QAED,cAAc;QACd,IAAI,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,MAAM,EAAE,GAAG,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;YACrD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC;YAClC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,KAA2B,CAAC;YAC5C,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;QACtB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,6DAA6D;IAC7D,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,MAAM,MAAM,IAAI,eAAe,CAAC,aAAa,EAAE,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;QACvF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC/D,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAC9B,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,QAAQ,CACzE,CAAC;YACJ,CAAC;YACD,kBAAkB;YAClB,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAC9D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;YAChG,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAgB,CAAC,GAAG,WAAW,CAAC,CAAC;IAC5C,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { CartographerGraph, GraphMeta } from "../types/index.js";
3
+ export declare function exportGraph(db: Database.Database, meta: GraphMeta): CartographerGraph;
4
+ export declare function writeGraphJSON(graph: CartographerGraph, outputPath: string): void;
5
+ //# sourceMappingURL=exporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../src/graph/exporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGtE,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,GAAG,iBAAiB,CAYrF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAGjF"}
@@ -0,0 +1,20 @@
1
+ import { writeFileSync, mkdirSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { getAllNodes, getAllEdges, getAllExpeditions } from "./store.js";
4
+ export function exportGraph(db, meta) {
5
+ const nodes = getAllNodes(db);
6
+ const edges = getAllEdges(db);
7
+ const expeditions = getAllExpeditions(db);
8
+ return {
9
+ meta,
10
+ nodes,
11
+ edges,
12
+ expeditions,
13
+ evolution: [],
14
+ };
15
+ }
16
+ export function writeGraphJSON(graph, outputPath) {
17
+ mkdirSync(dirname(outputPath), { recursive: true });
18
+ writeFileSync(outputPath, JSON.stringify(graph, null, 2), "utf-8");
19
+ }
20
+ //# sourceMappingURL=exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../src/graph/exporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,UAAU,WAAW,CAAC,EAAqB,EAAE,IAAe;IAChE,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAE1C,OAAO;QACL,IAAI;QACJ,KAAK;QACL,KAAK;QACL,WAAW;QACX,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAwB,EAAE,UAAkB;IACzE,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { GraphNode, GraphEdge } from "../types/index.js";
2
+ export declare function computeLayout(nodes: GraphNode[], edges: GraphEdge[]): void;
3
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/graph/layout.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAiC9D,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAuC1E"}
@@ -0,0 +1,257 @@
1
+ import { hierarchy, treemap, treemapSquarify, } from "d3-hierarchy";
2
+ import { forceSimulation, forceManyBody, forceLink, forceCenter, forceCollide, forceX, forceY, } from "d3-force";
3
+ import { logger } from "../logger.js";
4
+ // Layout constants
5
+ const TREEMAP_SIZE = 100;
6
+ const MODULE_PADDING = 2;
7
+ const BUILDING_GAP = 1.0;
8
+ const SCALE_FACTOR = 0.5;
9
+ const HEIGHT_FACTOR = 1.5;
10
+ const LOC_HEIGHT_FACTOR = 0.15;
11
+ const MIN_BUILDING_SIZE = 1.5;
12
+ const MIN_BUILDING_HEIGHT = 1.0;
13
+ const MAX_BUILDING_HEIGHT = 20;
14
+ const FORCE_ITERATIONS = 300;
15
+ // Seeded PRNG (LCG)
16
+ function lcg(seed) {
17
+ let s = seed;
18
+ return () => {
19
+ s = (s * 1664525 + 1013904223) & 0xffffffff;
20
+ return (s >>> 0) / 0xffffffff;
21
+ };
22
+ }
23
+ export function computeLayout(nodes, edges) {
24
+ const modules = nodes.filter((n) => n.kind === "module");
25
+ const files = nodes.filter((n) => n.kind === "file");
26
+ if (modules.length === 0)
27
+ return;
28
+ // Step 1: Treemap for initial module sizes (proportional rectangles)
29
+ const moduleRects = computeTreemap(modules);
30
+ // Step 2: Force-directed layout using both import edges AND directory proximity
31
+ layoutWithForce(moduleRects, edges, modules);
32
+ // Step 3: Assign module positions and dimensions
33
+ for (const rect of moduleRects) {
34
+ const mod = modules.find((m) => m.id === rect.id);
35
+ if (!mod)
36
+ continue;
37
+ const width = rect.x1 - rect.x0;
38
+ const depth = rect.y1 - rect.y0;
39
+ mod.position = {
40
+ x: rect.x0 + width / 2 - TREEMAP_SIZE / 2,
41
+ y: 0,
42
+ z: rect.y0 + depth / 2 - TREEMAP_SIZE / 2,
43
+ };
44
+ mod.dimensions = { width, height: 0.1, depth };
45
+ }
46
+ // Step 4: Place files within their module rectangles
47
+ for (const rect of moduleRects) {
48
+ const moduleFiles = files
49
+ .filter((f) => f.parentId === rect.id)
50
+ .sort((a, b) => b.loc - a.loc);
51
+ if (moduleFiles.length === 0)
52
+ continue;
53
+ placeBuildings(moduleFiles, rect);
54
+ }
55
+ logger.debug(`Layout computed for ${modules.length} modules, ${files.length} files`);
56
+ }
57
+ function computeTreemap(modules) {
58
+ const data = {
59
+ name: "root",
60
+ children: modules.map((m) => ({
61
+ name: m.id,
62
+ value: Math.max(m.loc, 10),
63
+ })),
64
+ };
65
+ const root = hierarchy(data)
66
+ .sum((d) => d.value ?? 0)
67
+ .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));
68
+ const layout = treemap()
69
+ .size([TREEMAP_SIZE, TREEMAP_SIZE])
70
+ .tile(treemapSquarify)
71
+ .padding(MODULE_PADDING)
72
+ .round(true);
73
+ const rectRoot = layout(root);
74
+ return (rectRoot.leaves() ?? []).map((leaf) => ({
75
+ id: leaf.data.name,
76
+ x0: leaf.x0,
77
+ y0: leaf.y0,
78
+ x1: leaf.x1,
79
+ y1: leaf.y1,
80
+ totalLoc: leaf.value ?? 0,
81
+ }));
82
+ }
83
+ // Compute directory-based proximity links between modules
84
+ // Modules sharing a parent directory get a synthetic attraction link
85
+ function computeDirectoryLinks(modules) {
86
+ const links = [];
87
+ const seen = new Set();
88
+ for (let i = 0; i < modules.length; i++) {
89
+ for (let j = i + 1; j < modules.length; j++) {
90
+ const a = modules[i];
91
+ const b = modules[j];
92
+ // Extract directory paths from module names/file paths
93
+ // Module names like "git", "health", "semantic" share parent "analysis"
94
+ // We check if the file paths of their children share a common ancestor
95
+ const aName = a.name;
96
+ const bName = b.name;
97
+ // Simple heuristic: check if module IDs share a common path prefix
98
+ const aId = a.id.replace("mod:", "");
99
+ const bId = b.id.replace("mod:", "");
100
+ // Check shared prefix in directory-like structure
101
+ const aParts = aId.split(/[/\\]/);
102
+ const bParts = bId.split(/[/\\]/);
103
+ // If they share any parent directory parts, they're related
104
+ if (aParts.length > 1 || bParts.length > 1) {
105
+ const commonDepth = countCommonPrefix(aParts, bParts);
106
+ if (commonDepth > 0) {
107
+ const key = [a.id, b.id].sort().join(":");
108
+ if (!seen.has(key)) {
109
+ seen.add(key);
110
+ links.push({ source: a.id, target: b.id, strength: 0.5 + commonDepth * 0.3 });
111
+ }
112
+ }
113
+ }
114
+ }
115
+ }
116
+ return links;
117
+ }
118
+ function countCommonPrefix(a, b) {
119
+ let count = 0;
120
+ for (let i = 0; i < Math.min(a.length - 1, b.length - 1); i++) {
121
+ if (a[i] === b[i])
122
+ count++;
123
+ else
124
+ break;
125
+ }
126
+ return count;
127
+ }
128
+ function layoutWithForce(rects, edges, modules) {
129
+ if (rects.length <= 1)
130
+ return;
131
+ // Compute directory groups for each module
132
+ function getGroup(moduleId) {
133
+ const mod = modules.find((m) => m.id === moduleId);
134
+ if (!mod)
135
+ return "root";
136
+ // Find file paths to determine the common parent
137
+ const name = mod.name;
138
+ // For now, use the module name's first path segment as group
139
+ return name;
140
+ }
141
+ const forceNodes = rects.map((r, i) => ({
142
+ id: r.id,
143
+ rectIndex: i,
144
+ x: (r.x0 + r.x1) / 2,
145
+ y: (r.y0 + r.y1) / 2,
146
+ width: r.x1 - r.x0,
147
+ height: r.y1 - r.y0,
148
+ group: getGroup(r.id),
149
+ }));
150
+ const nodeIdMap = new Map(forceNodes.map((n) => [n.id, n]));
151
+ // Import-based links (strong attraction)
152
+ const importLinks = edges
153
+ .filter((e) => nodeIdMap.has(e.sourceId) && nodeIdMap.has(e.targetId))
154
+ .map((e) => ({
155
+ source: nodeIdMap.get(e.sourceId),
156
+ target: nodeIdMap.get(e.targetId),
157
+ strength: Math.min(0.8, 0.3 + e.weight * 0.1), // stronger for more imports
158
+ }));
159
+ // Directory proximity links (weaker but consistent grouping)
160
+ const dirLinks = computeDirectoryLinks(modules);
161
+ const dirForceLinks = dirLinks
162
+ .filter((l) => nodeIdMap.has(l.source) && nodeIdMap.has(l.target))
163
+ .map((l) => ({
164
+ source: nodeIdMap.get(l.source),
165
+ target: nodeIdMap.get(l.target),
166
+ strength: l.strength * 0.4,
167
+ }));
168
+ const allLinks = [...importLinks, ...dirForceLinks];
169
+ const simulation = forceSimulation(forceNodes)
170
+ // Repulsion: push unconnected modules apart
171
+ .force("charge", forceManyBody().strength(-80).distanceMax(TREEMAP_SIZE))
172
+ // Attraction: pull linked modules together
173
+ .force("link", forceLink(allLinks)
174
+ .distance((d) => {
175
+ // Connected modules should be close
176
+ const s = d.source;
177
+ const t = d.target;
178
+ return Math.max(s.width, s.height) / 2 + Math.max(t.width, t.height) / 2 + 3;
179
+ })
180
+ .strength((d) => d.strength ?? 0.5))
181
+ // Keep everything centered
182
+ .force("center", forceCenter(TREEMAP_SIZE / 2, TREEMAP_SIZE / 2))
183
+ // Prevent overlap
184
+ .force("collision", forceCollide()
185
+ .radius((d) => Math.max(d.width, d.height) / 2 + 2)
186
+ .strength(0.8))
187
+ .alpha(0.8)
188
+ .alphaDecay(0.01)
189
+ .stop();
190
+ for (let i = 0; i < FORCE_ITERATIONS; i++) {
191
+ simulation.tick();
192
+ }
193
+ // Apply refined positions back to rects
194
+ for (const fNode of forceNodes) {
195
+ const rect = rects[fNode.rectIndex];
196
+ const w = rect.x1 - rect.x0;
197
+ const h = rect.y1 - rect.y0;
198
+ const cx = fNode.x ?? (rect.x0 + rect.x1) / 2;
199
+ const cy = fNode.y ?? (rect.y0 + rect.y1) / 2;
200
+ rect.x0 = cx - w / 2;
201
+ rect.x1 = cx + w / 2;
202
+ rect.y0 = cy - h / 2;
203
+ rect.y1 = cy + h / 2;
204
+ }
205
+ }
206
+ function computeBuildingDimensions(loc) {
207
+ const size = Math.max(MIN_BUILDING_SIZE, Math.sqrt(loc) * SCALE_FACTOR);
208
+ const height = Math.min(MAX_BUILDING_HEIGHT, Math.max(MIN_BUILDING_HEIGHT, Math.sqrt(loc) * LOC_HEIGHT_FACTOR * HEIGHT_FACTOR));
209
+ return { width: size, height, depth: size };
210
+ }
211
+ function placeBuildings(files, rect) {
212
+ const innerPadding = 1.0;
213
+ const areaWidth = (rect.x1 - rect.x0) - innerPadding * 2;
214
+ const areaDepth = (rect.y1 - rect.y0) - innerPadding * 2;
215
+ if (areaWidth <= 0 || areaDepth <= 0) {
216
+ for (let i = 0; i < files.length; i++) {
217
+ const f = files[i];
218
+ const dims = computeBuildingDimensions(f.loc);
219
+ f.dimensions = dims;
220
+ f.position = {
221
+ x: rect.x0 + (rect.x1 - rect.x0) / 2 - TREEMAP_SIZE / 2,
222
+ y: dims.height / 2,
223
+ z: rect.y0 + (rect.y1 - rect.y0) / 2 - TREEMAP_SIZE / 2,
224
+ };
225
+ }
226
+ return;
227
+ }
228
+ const fileDims = files.map((f) => computeBuildingDimensions(f.loc));
229
+ const maxBuildingWidth = Math.max(...fileDims.map((d) => d.width));
230
+ const cols = Math.max(1, Math.floor(areaWidth / (maxBuildingWidth + BUILDING_GAP)));
231
+ let currentX = 0;
232
+ let currentZ = 0;
233
+ let rowMaxDepth = 0;
234
+ let col = 0;
235
+ for (let i = 0; i < files.length; i++) {
236
+ const file = files[i];
237
+ const dims = fileDims[i];
238
+ file.dimensions = dims;
239
+ if (col >= cols) {
240
+ col = 0;
241
+ currentX = 0;
242
+ currentZ += rowMaxDepth + BUILDING_GAP;
243
+ rowMaxDepth = 0;
244
+ }
245
+ const offsetX = rect.x0 + innerPadding + currentX + dims.width / 2;
246
+ const offsetZ = rect.y0 + innerPadding + currentZ + dims.depth / 2;
247
+ file.position = {
248
+ x: offsetX - TREEMAP_SIZE / 2,
249
+ y: dims.height / 2,
250
+ z: offsetZ - TREEMAP_SIZE / 2,
251
+ };
252
+ currentX += dims.width + BUILDING_GAP;
253
+ rowMaxDepth = Math.max(rowMaxDepth, dims.depth);
254
+ col++;
255
+ }
256
+ }
257
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/graph/layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import Database from "better-sqlite3";
2
+ import type { GraphNode, GraphEdge, Position3D, Expedition } from "../types/index.js";
3
+ export declare function createDatabase(dbPath: string): Database.Database;
4
+ export declare function insertNodes(db: Database.Database, nodes: GraphNode[]): void;
5
+ export declare function insertEdges(db: Database.Database, edges: GraphEdge[]): void;
6
+ export declare function getAllNodes(db: Database.Database): GraphNode[];
7
+ export declare function getAllEdges(db: Database.Database): GraphEdge[];
8
+ export declare function updateNodePosition(db: Database.Database, id: string, position: Position3D): void;
9
+ export declare function getLlmCache(db: Database.Database, hash: string, promptType: string): string | null;
10
+ export declare function setLlmCache(db: Database.Database, hash: string, model: string, promptType: string, result: string, tokensUsed: number): void;
11
+ export declare function insertExpeditions(db: Database.Database, expeditions: Expedition[]): void;
12
+ export declare function getAllExpeditions(db: Database.Database): Expedition[];
13
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/graph/store.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAkB,MAAM,mBAAmB,CAAC;AAkBtG,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAShE;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CA+B3E;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAa3E;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,EAAE,CAG9D;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,SAAS,EAAE,CAQ9D;AAED,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,UAAU,GACnB,IAAI,CAIN;AAED,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAMf;AAED,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,IAAI,CAKN;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAoBxF;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,UAAU,EAAE,CAarE"}
@@ -0,0 +1,145 @@
1
+ import Database from "better-sqlite3";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { GraphError } from "../errors.js";
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ function findSchemaFile() {
8
+ // Compiled: dist/graph/schema.sql (doesn't exist — SQL isn't copied by tsc)
9
+ // So always resolve from src/graph/schema.sql relative to package root
10
+ const here = join(__dirname, "schema.sql");
11
+ if (existsSync(here))
12
+ return here;
13
+ const packageRoot = resolve(__dirname, "..", "..");
14
+ const srcSchema = join(packageRoot, "src", "graph", "schema.sql");
15
+ if (existsSync(srcSchema))
16
+ return srcSchema;
17
+ return here; // fallback
18
+ }
19
+ export function createDatabase(dbPath) {
20
+ const db = new Database(dbPath);
21
+ db.pragma("journal_mode = WAL");
22
+ db.pragma("foreign_keys = ON");
23
+ const schema = readFileSync(findSchemaFile(), "utf-8");
24
+ db.exec(schema);
25
+ return db;
26
+ }
27
+ export function insertNodes(db, nodes) {
28
+ const stmt = db.prepare(`
29
+ INSERT OR REPLACE INTO nodes (
30
+ id, kind, name, path, parent_id,
31
+ loc, complexity, health_score,
32
+ created_at, last_modified, total_commits, bus_factor, primary_owner, churn_score,
33
+ summary, explanation, layer, tags,
34
+ pos_x, pos_y, pos_z, dim_width, dim_height, dim_depth
35
+ ) VALUES (
36
+ ?, ?, ?, ?, ?,
37
+ ?, ?, ?,
38
+ ?, ?, ?, ?, ?, ?,
39
+ ?, ?, ?, ?,
40
+ ?, ?, ?, ?, ?, ?
41
+ )
42
+ `);
43
+ const insertAll = db.transaction((nodesToInsert) => {
44
+ for (const node of nodesToInsert) {
45
+ stmt.run(node.id, node.kind, node.name, node.path, node.parentId, node.loc, node.complexity, node.healthScore, node.createdAt, node.lastModified, node.totalCommits, node.busFactor, node.primaryOwner, node.churnScore, node.summary, node.explanation, node.layer, JSON.stringify(node.tags), node.position.x, node.position.y, node.position.z, node.dimensions.width, node.dimensions.height, node.dimensions.depth);
46
+ }
47
+ });
48
+ insertAll(nodes);
49
+ }
50
+ export function insertEdges(db, edges) {
51
+ const stmt = db.prepare(`
52
+ INSERT OR REPLACE INTO edges (source_id, target_id, kind, weight)
53
+ VALUES (?, ?, ?, ?)
54
+ `);
55
+ const insertAll = db.transaction((edgesToInsert) => {
56
+ for (const edge of edgesToInsert) {
57
+ stmt.run(edge.sourceId, edge.targetId, edge.kind, edge.weight);
58
+ }
59
+ });
60
+ insertAll(edges);
61
+ }
62
+ export function getAllNodes(db) {
63
+ const rows = db.prepare("SELECT * FROM nodes").all();
64
+ return rows.map(rowToNode);
65
+ }
66
+ export function getAllEdges(db) {
67
+ const rows = db.prepare("SELECT * FROM edges").all();
68
+ return rows.map((row) => ({
69
+ sourceId: row["source_id"],
70
+ targetId: row["target_id"],
71
+ kind: row["kind"],
72
+ weight: row["weight"],
73
+ }));
74
+ }
75
+ export function updateNodePosition(db, id, position) {
76
+ db.prepare("UPDATE nodes SET pos_x = ?, pos_y = ?, pos_z = ? WHERE id = ?").run(position.x, position.y, position.z, id);
77
+ }
78
+ export function getLlmCache(db, hash, promptType) {
79
+ const row = db
80
+ .prepare("SELECT result FROM llm_cache WHERE content_hash = ? AND prompt_type = ?")
81
+ .get(hash, promptType);
82
+ return row?.result ?? null;
83
+ }
84
+ export function setLlmCache(db, hash, model, promptType, result, tokensUsed) {
85
+ db.prepare(`INSERT OR REPLACE INTO llm_cache (content_hash, model, prompt_type, result, tokens_used)
86
+ VALUES (?, ?, ?, ?, ?)`).run(hash, model, promptType, result, tokensUsed);
87
+ }
88
+ export function insertExpeditions(db, expeditions) {
89
+ const stmt = db.prepare(`
90
+ INSERT OR REPLACE INTO expeditions (id, title, description, kind, estimated_min, steps)
91
+ VALUES (?, ?, ?, ?, ?, ?)
92
+ `);
93
+ const insertAll = db.transaction((exps) => {
94
+ for (const exp of exps) {
95
+ stmt.run(exp.id, exp.title, exp.description, exp.kind, exp.estimatedMinutes, JSON.stringify(exp.steps));
96
+ }
97
+ });
98
+ insertAll(expeditions);
99
+ }
100
+ export function getAllExpeditions(db) {
101
+ const rows = db
102
+ .prepare("SELECT * FROM expeditions")
103
+ .all();
104
+ return rows.map((row) => ({
105
+ id: row["id"],
106
+ title: row["title"],
107
+ description: row["description"] ?? "",
108
+ kind: row["kind"],
109
+ estimatedMinutes: row["estimated_min"],
110
+ steps: JSON.parse(row["steps"] ?? "[]"),
111
+ }));
112
+ }
113
+ function rowToNode(row) {
114
+ return {
115
+ id: row["id"],
116
+ kind: row["kind"],
117
+ name: row["name"],
118
+ path: row["path"] ?? null,
119
+ parentId: row["parent_id"] ?? null,
120
+ loc: row["loc"],
121
+ complexity: row["complexity"],
122
+ healthScore: row["health_score"],
123
+ createdAt: row["created_at"] ?? null,
124
+ lastModified: row["last_modified"] ?? null,
125
+ totalCommits: row["total_commits"],
126
+ busFactor: row["bus_factor"],
127
+ primaryOwner: row["primary_owner"] ?? null,
128
+ churnScore: row["churn_score"],
129
+ summary: row["summary"] ?? null,
130
+ explanation: row["explanation"] ?? null,
131
+ layer: row["layer"] ?? null,
132
+ tags: JSON.parse(row["tags"] ?? "[]"),
133
+ position: {
134
+ x: row["pos_x"],
135
+ y: row["pos_y"],
136
+ z: row["pos_z"],
137
+ },
138
+ dimensions: {
139
+ width: row["dim_width"],
140
+ height: row["dim_height"],
141
+ depth: row["dim_depth"],
142
+ },
143
+ };
144
+ }
145
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/graph/store.ts"],"names":[],"mappings":"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"}