@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.
- package/dist/__tests__/pipeline.test.d.ts +2 -0
- package/dist/__tests__/pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline.test.js +58 -0
- package/dist/__tests__/pipeline.test.js.map +1 -0
- package/dist/analysis/call-graph.d.ts +13 -0
- package/dist/analysis/call-graph.d.ts.map +1 -0
- package/dist/analysis/call-graph.js +133 -0
- package/dist/analysis/call-graph.js.map +1 -0
- package/dist/analysis/dependency-graph.d.ts +8 -0
- package/dist/analysis/dependency-graph.d.ts.map +1 -0
- package/dist/analysis/dependency-graph.js +101 -0
- package/dist/analysis/dependency-graph.js.map +1 -0
- package/dist/analysis/git/archaeology.d.ts +20 -0
- package/dist/analysis/git/archaeology.d.ts.map +1 -0
- package/dist/analysis/git/archaeology.js +61 -0
- package/dist/analysis/git/archaeology.js.map +1 -0
- package/dist/analysis/git/bus-factor.d.ts +17 -0
- package/dist/analysis/git/bus-factor.d.ts.map +1 -0
- package/dist/analysis/git/bus-factor.js +90 -0
- package/dist/analysis/git/bus-factor.js.map +1 -0
- package/dist/analysis/git/churn.d.ts +26 -0
- package/dist/analysis/git/churn.d.ts.map +1 -0
- package/dist/analysis/git/churn.js +127 -0
- package/dist/analysis/git/churn.js.map +1 -0
- package/dist/analysis/git/contributors.d.ts +14 -0
- package/dist/analysis/git/contributors.d.ts.map +1 -0
- package/dist/analysis/git/contributors.js +60 -0
- package/dist/analysis/git/contributors.js.map +1 -0
- package/dist/analysis/git/evolution.d.ts +10 -0
- package/dist/analysis/git/evolution.d.ts.map +1 -0
- package/dist/analysis/git/evolution.js +127 -0
- package/dist/analysis/git/evolution.js.map +1 -0
- package/dist/analysis/git/index.d.ts +6 -0
- package/dist/analysis/git/index.d.ts.map +1 -0
- package/dist/analysis/git/index.js +6 -0
- package/dist/analysis/git/index.js.map +1 -0
- package/dist/analysis/go-visitor.d.ts +4 -0
- package/dist/analysis/go-visitor.d.ts.map +1 -0
- package/dist/analysis/go-visitor.js +295 -0
- package/dist/analysis/go-visitor.js.map +1 -0
- package/dist/analysis/health/indicators.d.ts +25 -0
- package/dist/analysis/health/indicators.d.ts.map +1 -0
- package/dist/analysis/health/indicators.js +53 -0
- package/dist/analysis/health/indicators.js.map +1 -0
- package/dist/analysis/health/scorer.d.ts +26 -0
- package/dist/analysis/health/scorer.d.ts.map +1 -0
- package/dist/analysis/health/scorer.js +97 -0
- package/dist/analysis/health/scorer.js.map +1 -0
- package/dist/analysis/health/test-coverage.d.ts +19 -0
- package/dist/analysis/health/test-coverage.d.ts.map +1 -0
- package/dist/analysis/health/test-coverage.js +67 -0
- package/dist/analysis/health/test-coverage.js.map +1 -0
- package/dist/analysis/import-resolver.d.ts +10 -0
- package/dist/analysis/import-resolver.d.ts.map +1 -0
- package/dist/analysis/import-resolver.js +353 -0
- package/dist/analysis/import-resolver.js.map +1 -0
- package/dist/analysis/index.d.ts +22 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +24 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/java-visitor.d.ts +4 -0
- package/dist/analysis/java-visitor.d.ts.map +1 -0
- package/dist/analysis/java-visitor.js +257 -0
- package/dist/analysis/java-visitor.js.map +1 -0
- package/dist/analysis/metrics.d.ts +19 -0
- package/dist/analysis/metrics.d.ts.map +1 -0
- package/dist/analysis/metrics.js +70 -0
- package/dist/analysis/metrics.js.map +1 -0
- package/dist/analysis/module-detector.d.ts +3 -0
- package/dist/analysis/module-detector.d.ts.map +1 -0
- package/dist/analysis/module-detector.js +257 -0
- package/dist/analysis/module-detector.js.map +1 -0
- package/dist/analysis/parser.d.ts +13 -0
- package/dist/analysis/parser.d.ts.map +1 -0
- package/dist/analysis/parser.js +92 -0
- package/dist/analysis/parser.js.map +1 -0
- package/dist/analysis/python-visitor.d.ts +4 -0
- package/dist/analysis/python-visitor.d.ts.map +1 -0
- package/dist/analysis/python-visitor.js +306 -0
- package/dist/analysis/python-visitor.js.map +1 -0
- package/dist/analysis/rust-visitor.d.ts +4 -0
- package/dist/analysis/rust-visitor.d.ts.map +1 -0
- package/dist/analysis/rust-visitor.js +318 -0
- package/dist/analysis/rust-visitor.js.map +1 -0
- package/dist/analysis/semantic/cache.d.ts +16 -0
- package/dist/analysis/semantic/cache.d.ts.map +1 -0
- package/dist/analysis/semantic/cache.js +26 -0
- package/dist/analysis/semantic/cache.js.map +1 -0
- package/dist/analysis/semantic/openai-client.d.ts +21 -0
- package/dist/analysis/semantic/openai-client.d.ts.map +1 -0
- package/dist/analysis/semantic/openai-client.js +73 -0
- package/dist/analysis/semantic/openai-client.js.map +1 -0
- package/dist/analysis/semantic/prompts.d.ts +32 -0
- package/dist/analysis/semantic/prompts.d.ts.map +1 -0
- package/dist/analysis/semantic/prompts.js +134 -0
- package/dist/analysis/semantic/prompts.js.map +1 -0
- package/dist/analysis/semantic/summarizer.d.ts +36 -0
- package/dist/analysis/semantic/summarizer.d.ts.map +1 -0
- package/dist/analysis/semantic/summarizer.js +229 -0
- package/dist/analysis/semantic/summarizer.js.map +1 -0
- package/dist/analysis/ts-js-visitor.d.ts +4 -0
- package/dist/analysis/ts-js-visitor.d.ts.map +1 -0
- package/dist/analysis/ts-js-visitor.js +390 -0
- package/dist/analysis/ts-js-visitor.js.map +1 -0
- package/dist/analysis/visitor-registry.d.ts +5 -0
- package/dist/analysis/visitor-registry.d.ts.map +1 -0
- package/dist/analysis/visitor-registry.js +17 -0
- package/dist/analysis/visitor-registry.js.map +1 -0
- package/dist/analysis/visitor-utils.d.ts +38 -0
- package/dist/analysis/visitor-utils.d.ts.map +1 -0
- package/dist/analysis/visitor-utils.js +110 -0
- package/dist/analysis/visitor-utils.js.map +1 -0
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +39 -0
- package/dist/errors.js.map +1 -0
- package/dist/expeditions/custom.d.ts +11 -0
- package/dist/expeditions/custom.d.ts.map +1 -0
- package/dist/expeditions/custom.js +61 -0
- package/dist/expeditions/custom.js.map +1 -0
- package/dist/expeditions/danger-zones.d.ts +9 -0
- package/dist/expeditions/danger-zones.d.ts.map +1 -0
- package/dist/expeditions/danger-zones.js +42 -0
- package/dist/expeditions/danger-zones.js.map +1 -0
- package/dist/expeditions/generator.d.ts +21 -0
- package/dist/expeditions/generator.d.ts.map +1 -0
- package/dist/expeditions/generator.js +78 -0
- package/dist/expeditions/generator.js.map +1 -0
- package/dist/expeditions/grand-tour.d.ts +10 -0
- package/dist/expeditions/grand-tour.d.ts.map +1 -0
- package/dist/expeditions/grand-tour.js +96 -0
- package/dist/expeditions/grand-tour.js.map +1 -0
- package/dist/expeditions/request-flow.d.ts +11 -0
- package/dist/expeditions/request-flow.d.ts.map +1 -0
- package/dist/expeditions/request-flow.js +138 -0
- package/dist/expeditions/request-flow.js.map +1 -0
- package/dist/grammars/tree-sitter-go.wasm +0 -0
- package/dist/grammars/tree-sitter-java.wasm +0 -0
- package/dist/grammars/tree-sitter-javascript.wasm +0 -0
- package/dist/grammars/tree-sitter-python.wasm +0 -0
- package/dist/grammars/tree-sitter-rust.wasm +0 -0
- package/dist/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/graph/builder.d.ts +23 -0
- package/dist/graph/builder.d.ts.map +1 -0
- package/dist/graph/builder.js +131 -0
- package/dist/graph/builder.js.map +1 -0
- package/dist/graph/exporter.d.ts +5 -0
- package/dist/graph/exporter.d.ts.map +1 -0
- package/dist/graph/exporter.js +20 -0
- package/dist/graph/exporter.js.map +1 -0
- package/dist/graph/layout.d.ts +3 -0
- package/dist/graph/layout.d.ts.map +1 -0
- package/dist/graph/layout.js +257 -0
- package/dist/graph/layout.js.map +1 -0
- package/dist/graph/store.d.ts +13 -0
- package/dist/graph/store.d.ts.map +1 -0
- package/dist/graph/store.js +145 -0
- package/dist/graph/store.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/ingestion/cloner.d.ts +18 -0
- package/dist/ingestion/cloner.d.ts.map +1 -0
- package/dist/ingestion/cloner.js +62 -0
- package/dist/ingestion/cloner.js.map +1 -0
- package/dist/ingestion/file-tree.d.ts +3 -0
- package/dist/ingestion/file-tree.d.ts.map +1 -0
- package/dist/ingestion/file-tree.js +85 -0
- package/dist/ingestion/file-tree.js.map +1 -0
- package/dist/ingestion/index.d.ts +5 -0
- package/dist/ingestion/index.d.ts.map +1 -0
- package/dist/ingestion/index.js +5 -0
- package/dist/ingestion/index.js.map +1 -0
- package/dist/ingestion/language-detector.d.ts +8 -0
- package/dist/ingestion/language-detector.d.ts.map +1 -0
- package/dist/ingestion/language-detector.js +37 -0
- package/dist/ingestion/language-detector.js.map +1 -0
- package/dist/ingestion/path-resolver.d.ts +7 -0
- package/dist/ingestion/path-resolver.d.ts.map +1 -0
- package/dist/ingestion/path-resolver.js +30 -0
- package/dist/ingestion/path-resolver.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +11 -0
- package/dist/logger.js.map +1 -0
- package/dist/pipeline.d.ts +3 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +223 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/types/analysis.d.ts +51 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +2 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/config.d.ts +19 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/edges.d.ts +8 -0
- package/dist/types/edges.d.ts.map +1 -0
- package/dist/types/edges.js +2 -0
- package/dist/types/edges.js.map +1 -0
- package/dist/types/expeditions.d.ts +19 -0
- package/dist/types/expeditions.d.ts.map +1 -0
- package/dist/types/expeditions.js +2 -0
- package/dist/types/expeditions.js.map +1 -0
- package/dist/types/graph.d.ts +29 -0
- package/dist/types/graph.d.ts.map +1 -0
- package/dist/types/graph.js +2 -0
- package/dist/types/graph.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/nodes.d.ts +35 -0
- package/dist/types/nodes.d.ts.map +1 -0
- package/dist/types/nodes.js +2 -0
- package/dist/types/nodes.js.map +1 -0
- 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 @@
|
|
|
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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"}
|