@mohantn/gate-keeper 2.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/.github/instructions/dotnet-api-integration.instructions.md +416 -0
- package/.github/instructions/dotnet-development.instructions.md +353 -0
- package/.github/instructions/dotnet-testing.instructions.md +406 -0
- package/.github/instructions/gate-keeper.instructions.md +91 -0
- package/.github/instructions/react-development.instructions.md +315 -0
- package/.github/instructions/react-testing-optimization.instructions.md +373 -0
- package/.github/instructions/uiux.instructions.md +261 -0
- package/LICENSE +21 -0
- package/README.md +181 -0
- package/dist/analyzer/coverage-analyzer.d.ts +126 -0
- package/dist/analyzer/coverage-analyzer.d.ts.map +1 -0
- package/dist/analyzer/coverage-analyzer.js +633 -0
- package/dist/analyzer/coverage-analyzer.js.map +1 -0
- package/dist/analyzer/csharp-analyzer.d.ts +28 -0
- package/dist/analyzer/csharp-analyzer.d.ts.map +1 -0
- package/dist/analyzer/csharp-analyzer.js +437 -0
- package/dist/analyzer/csharp-analyzer.js.map +1 -0
- package/dist/analyzer/pattern-detector.d.ts +5 -0
- package/dist/analyzer/pattern-detector.d.ts.map +1 -0
- package/dist/analyzer/pattern-detector.js +74 -0
- package/dist/analyzer/pattern-detector.js.map +1 -0
- package/dist/analyzer/refactoring-advisor.d.ts +7 -0
- package/dist/analyzer/refactoring-advisor.d.ts.map +1 -0
- package/dist/analyzer/refactoring-advisor.js +280 -0
- package/dist/analyzer/refactoring-advisor.js.map +1 -0
- package/dist/analyzer/sonar-eslint-runner.d.ts +3 -0
- package/dist/analyzer/sonar-eslint-runner.d.ts.map +1 -0
- package/dist/analyzer/sonar-eslint-runner.js +136 -0
- package/dist/analyzer/sonar-eslint-runner.js.map +1 -0
- package/dist/analyzer/sonar-rule-map.d.ts +19 -0
- package/dist/analyzer/sonar-rule-map.d.ts.map +1 -0
- package/dist/analyzer/sonar-rule-map.js +67 -0
- package/dist/analyzer/sonar-rule-map.js.map +1 -0
- package/dist/analyzer/string-analyzer.d.ts +27 -0
- package/dist/analyzer/string-analyzer.d.ts.map +1 -0
- package/dist/analyzer/string-analyzer.js +274 -0
- package/dist/analyzer/string-analyzer.js.map +1 -0
- package/dist/analyzer/typescript-analyzer.d.ts +27 -0
- package/dist/analyzer/typescript-analyzer.d.ts.map +1 -0
- package/dist/analyzer/typescript-analyzer.js +437 -0
- package/dist/analyzer/typescript-analyzer.js.map +1 -0
- package/dist/analyzer/universal-analyzer.d.ts +10 -0
- package/dist/analyzer/universal-analyzer.d.ts.map +1 -0
- package/dist/analyzer/universal-analyzer.js +155 -0
- package/dist/analyzer/universal-analyzer.js.map +1 -0
- package/dist/cache/quality-cache.d.ts +119 -0
- package/dist/cache/quality-cache.d.ts.map +1 -0
- package/dist/cache/quality-cache.js +130 -0
- package/dist/cache/quality-cache.js.map +1 -0
- package/dist/cache/sqlite-cache.d.ts +43 -0
- package/dist/cache/sqlite-cache.d.ts.map +1 -0
- package/dist/cache/sqlite-cache.js +346 -0
- package/dist/cache/sqlite-cache.js.map +1 -0
- package/dist/cli/query-repl.d.ts +37 -0
- package/dist/cli/query-repl.d.ts.map +1 -0
- package/dist/cli/query-repl.js +298 -0
- package/dist/cli/query-repl.js.map +1 -0
- package/dist/cli/repl-algorithms.d.ts +49 -0
- package/dist/cli/repl-algorithms.d.ts.map +1 -0
- package/dist/cli/repl-algorithms.js +147 -0
- package/dist/cli/repl-algorithms.js.map +1 -0
- package/dist/cli/setup-core.d.ts +38 -0
- package/dist/cli/setup-core.d.ts.map +1 -0
- package/dist/cli/setup-core.js +427 -0
- package/dist/cli/setup-core.js.map +1 -0
- package/dist/cli/setup.d.ts +25 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +159 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli-entry.d.ts +19 -0
- package/dist/cli-entry.d.ts.map +1 -0
- package/dist/cli-entry.js +178 -0
- package/dist/cli-entry.js.map +1 -0
- package/dist/daemon/watch-mode.d.ts +41 -0
- package/dist/daemon/watch-mode.d.ts.map +1 -0
- package/dist/daemon/watch-mode.js +163 -0
- package/dist/daemon/watch-mode.js.map +1 -0
- package/dist/daemon.d.ts +24 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +357 -0
- package/dist/daemon.js.map +1 -0
- package/dist/github/app.d.ts +34 -0
- package/dist/github/app.d.ts.map +1 -0
- package/dist/github/app.js +261 -0
- package/dist/github/app.js.map +1 -0
- package/dist/github/commenter.d.ts +67 -0
- package/dist/github/commenter.d.ts.map +1 -0
- package/dist/github/commenter.js +155 -0
- package/dist/github/commenter.js.map +1 -0
- package/dist/graph/dependency-graph.d.ts +28 -0
- package/dist/graph/dependency-graph.d.ts.map +1 -0
- package/dist/graph/dependency-graph.js +198 -0
- package/dist/graph/dependency-graph.js.map +1 -0
- package/dist/graph/global-graph.d.ts +65 -0
- package/dist/graph/global-graph.d.ts.map +1 -0
- package/dist/graph/global-graph.js +153 -0
- package/dist/graph/global-graph.js.map +1 -0
- package/dist/graph/graph-algorithms.d.ts +90 -0
- package/dist/graph/graph-algorithms.d.ts.map +1 -0
- package/dist/graph/graph-algorithms.js +180 -0
- package/dist/graph/graph-algorithms.js.map +1 -0
- package/dist/graph/graph-export.d.ts +68 -0
- package/dist/graph/graph-export.d.ts.map +1 -0
- package/dist/graph/graph-export.js +264 -0
- package/dist/graph/graph-export.js.map +1 -0
- package/dist/graph/graph-report.d.ts +34 -0
- package/dist/graph/graph-report.d.ts.map +1 -0
- package/dist/graph/graph-report.js +136 -0
- package/dist/graph/graph-report.js.map +1 -0
- package/dist/graph/graph-summary.d.ts +68 -0
- package/dist/graph/graph-summary.d.ts.map +1 -0
- package/dist/graph/graph-summary.js +213 -0
- package/dist/graph/graph-summary.js.map +1 -0
- package/dist/graph/graphify-ignore.d.ts +32 -0
- package/dist/graph/graphify-ignore.d.ts.map +1 -0
- package/dist/graph/graphify-ignore.js +124 -0
- package/dist/graph/graphify-ignore.js.map +1 -0
- package/dist/graph/question-suggester.d.ts +30 -0
- package/dist/graph/question-suggester.d.ts.map +1 -0
- package/dist/graph/question-suggester.js +113 -0
- package/dist/graph/question-suggester.js.map +1 -0
- package/dist/graph/relationship-extractor.d.ts +40 -0
- package/dist/graph/relationship-extractor.d.ts.map +1 -0
- package/dist/graph/relationship-extractor.js +254 -0
- package/dist/graph/relationship-extractor.js.map +1 -0
- package/dist/graph/relationship-types.d.ts +24 -0
- package/dist/graph/relationship-types.d.ts.map +1 -0
- package/dist/graph/relationship-types.js +21 -0
- package/dist/graph/relationship-types.js.map +1 -0
- package/dist/graph/surprising-connections.d.ts +39 -0
- package/dist/graph/surprising-connections.d.ts.map +1 -0
- package/dist/graph/surprising-connections.js +127 -0
- package/dist/graph/surprising-connections.js.map +1 -0
- package/dist/hook-pre-tool-use.d.ts +14 -0
- package/dist/hook-pre-tool-use.d.ts.map +1 -0
- package/dist/hook-pre-tool-use.js +167 -0
- package/dist/hook-pre-tool-use.js.map +1 -0
- package/dist/hook-receiver.d.ts +29 -0
- package/dist/hook-receiver.d.ts.map +1 -0
- package/dist/hook-receiver.js +327 -0
- package/dist/hook-receiver.js.map +1 -0
- package/dist/hooks/git-hooks.d.ts +30 -0
- package/dist/hooks/git-hooks.d.ts.map +1 -0
- package/dist/hooks/git-hooks.js +179 -0
- package/dist/hooks/git-hooks.js.map +1 -0
- package/dist/mcp/cache-preload.d.ts +29 -0
- package/dist/mcp/cache-preload.d.ts.map +1 -0
- package/dist/mcp/cache-preload.js +103 -0
- package/dist/mcp/cache-preload.js.map +1 -0
- package/dist/mcp/handlers/analysis.d.ts +4 -0
- package/dist/mcp/handlers/analysis.d.ts.map +1 -0
- package/dist/mcp/handlers/analysis.js +196 -0
- package/dist/mcp/handlers/analysis.js.map +1 -0
- package/dist/mcp/handlers/context.d.ts +25 -0
- package/dist/mcp/handlers/context.d.ts.map +1 -0
- package/dist/mcp/handlers/context.js +382 -0
- package/dist/mcp/handlers/context.js.map +1 -0
- package/dist/mcp/handlers/graph-intelligence.d.ts +26 -0
- package/dist/mcp/handlers/graph-intelligence.d.ts.map +1 -0
- package/dist/mcp/handlers/graph-intelligence.js +371 -0
- package/dist/mcp/handlers/graph-intelligence.js.map +1 -0
- package/dist/mcp/handlers/graph-query.d.ts +25 -0
- package/dist/mcp/handlers/graph-query.d.ts.map +1 -0
- package/dist/mcp/handlers/graph-query.js +410 -0
- package/dist/mcp/handlers/graph-query.js.map +1 -0
- package/dist/mcp/handlers/graph.d.ts +5 -0
- package/dist/mcp/handlers/graph.d.ts.map +1 -0
- package/dist/mcp/handlers/graph.js +283 -0
- package/dist/mcp/handlers/graph.js.map +1 -0
- package/dist/mcp/handlers/impact-format.d.ts +9 -0
- package/dist/mcp/handlers/impact-format.d.ts.map +1 -0
- package/dist/mcp/handlers/impact-format.js +189 -0
- package/dist/mcp/handlers/impact-format.js.map +1 -0
- package/dist/mcp/handlers/impact.d.ts +4 -0
- package/dist/mcp/handlers/impact.d.ts.map +1 -0
- package/dist/mcp/handlers/impact.js +139 -0
- package/dist/mcp/handlers/impact.js.map +1 -0
- package/dist/mcp/handlers/improvement.d.ts +4 -0
- package/dist/mcp/handlers/improvement.d.ts.map +1 -0
- package/dist/mcp/handlers/improvement.js +136 -0
- package/dist/mcp/handlers/improvement.js.map +1 -0
- package/dist/mcp/handlers/index.d.ts +14 -0
- package/dist/mcp/handlers/index.d.ts.map +1 -0
- package/dist/mcp/handlers/index.js +36 -0
- package/dist/mcp/handlers/index.js.map +1 -0
- package/dist/mcp/handlers/platform-installer.d.ts +10 -0
- package/dist/mcp/handlers/platform-installer.d.ts.map +1 -0
- package/dist/mcp/handlers/platform-installer.js +168 -0
- package/dist/mcp/handlers/platform-installer.js.map +1 -0
- package/dist/mcp/handlers/pr-review.d.ts +33 -0
- package/dist/mcp/handlers/pr-review.d.ts.map +1 -0
- package/dist/mcp/handlers/pr-review.js +170 -0
- package/dist/mcp/handlers/pr-review.js.map +1 -0
- package/dist/mcp/handlers/shared.d.ts +20 -0
- package/dist/mcp/handlers/shared.d.ts.map +1 -0
- package/dist/mcp/handlers/shared.js +27 -0
- package/dist/mcp/handlers/shared.js.map +1 -0
- package/dist/mcp/handlers/types.d.ts +46 -0
- package/dist/mcp/handlers/types.d.ts.map +1 -0
- package/dist/mcp/handlers/types.js +3 -0
- package/dist/mcp/handlers/types.js.map +1 -0
- package/dist/mcp/helpers.d.ts +36 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +199 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/installer.d.ts +22 -0
- package/dist/mcp/installer.d.ts.map +1 -0
- package/dist/mcp/installer.js +341 -0
- package/dist/mcp/installer.js.map +1 -0
- package/dist/mcp/server.d.ts +111 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +216 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/token-tracker.d.ts +47 -0
- package/dist/mcp/token-tracker.d.ts.map +1 -0
- package/dist/mcp/token-tracker.js +93 -0
- package/dist/mcp/token-tracker.js.map +1 -0
- package/dist/quality-loop/file-lock.d.ts +12 -0
- package/dist/quality-loop/file-lock.d.ts.map +1 -0
- package/dist/quality-loop/file-lock.js +38 -0
- package/dist/quality-loop/file-lock.js.map +1 -0
- package/dist/quality-loop/fix-worker.d.ts +44 -0
- package/dist/quality-loop/fix-worker.d.ts.map +1 -0
- package/dist/quality-loop/fix-worker.js +414 -0
- package/dist/quality-loop/fix-worker.js.map +1 -0
- package/dist/quality-loop/orchestrator.d.ts +137 -0
- package/dist/quality-loop/orchestrator.d.ts.map +1 -0
- package/dist/quality-loop/orchestrator.js +894 -0
- package/dist/quality-loop/orchestrator.js.map +1 -0
- package/dist/quality-loop/queue-manager.d.ts +45 -0
- package/dist/quality-loop/queue-manager.d.ts.map +1 -0
- package/dist/quality-loop/queue-manager.js +173 -0
- package/dist/quality-loop/queue-manager.js.map +1 -0
- package/dist/rating/rating-calculator.d.ts +15 -0
- package/dist/rating/rating-calculator.d.ts.map +1 -0
- package/dist/rating/rating-calculator.js +136 -0
- package/dist/rating/rating-calculator.js.map +1 -0
- package/dist/types/agent.d.ts +49 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +7 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types.d.ts +156 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/util/fix-text.d.ts +7 -0
- package/dist/util/fix-text.d.ts.map +1 -0
- package/dist/util/fix-text.js +13 -0
- package/dist/util/fix-text.js.map +1 -0
- package/dist/viz/graph-viz.d.ts +40 -0
- package/dist/viz/graph-viz.d.ts.map +1 -0
- package/dist/viz/graph-viz.js +332 -0
- package/dist/viz/graph-viz.js.map +1 -0
- package/dist/viz/viz-helpers.d.ts +13 -0
- package/dist/viz/viz-helpers.d.ts.map +1 -0
- package/dist/viz/viz-helpers.js +134 -0
- package/dist/viz/viz-helpers.js.map +1 -0
- package/dist/viz/viz-routes.d.ts +28 -0
- package/dist/viz/viz-routes.d.ts.map +1 -0
- package/dist/viz/viz-routes.js +333 -0
- package/dist/viz/viz-routes.js.map +1 -0
- package/dist/viz/viz-scanner.d.ts +20 -0
- package/dist/viz/viz-scanner.d.ts.map +1 -0
- package/dist/viz/viz-scanner.js +241 -0
- package/dist/viz/viz-scanner.js.map +1 -0
- package/dist/viz/viz-server.d.ts +38 -0
- package/dist/viz/viz-server.d.ts.map +1 -0
- package/dist/viz/viz-server.js +240 -0
- package/dist/viz/viz-server.js.map +1 -0
- package/package.json +89 -0
- package/scripts/postinstall.js +28 -0
- package/scripts/setup.sh +113 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Global graph — persistent cross-repo index stored at ~/.gate-keeper/global-graph.json.
|
|
4
|
+
*
|
|
5
|
+
* Merges per-repo graph JSONs into a single index. Detects shared library
|
|
6
|
+
* dependencies across repos and provides a cross-repo query interface.
|
|
7
|
+
*
|
|
8
|
+
* Storage format:
|
|
9
|
+
* {
|
|
10
|
+
* version: "1.0",
|
|
11
|
+
* repos: [{ path, label, lastIndexedAt }],
|
|
12
|
+
* nodes: [...merged nodes],
|
|
13
|
+
* edges: [...merged edges],
|
|
14
|
+
* crossRepoImports: [{ source, target, fromRepo, toRepo }],
|
|
15
|
+
* }
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.loadGlobalGraph = loadGlobalGraph;
|
|
52
|
+
exports.saveGlobalGraph = saveGlobalGraph;
|
|
53
|
+
exports.indexRepo = indexRepo;
|
|
54
|
+
exports.queryGlobalGraph = queryGlobalGraph;
|
|
55
|
+
exports.getGlobalGraphPath = getGlobalGraphPath;
|
|
56
|
+
const fs = __importStar(require("fs"));
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
const graph_export_1 = require("./graph-export");
|
|
59
|
+
const GK_DIR = path.join(process.env.HOME ?? '/tmp', '.gate-keeper');
|
|
60
|
+
const GLOBAL_GRAPH_FILE = path.join(GK_DIR, 'global-graph.json');
|
|
61
|
+
// ── Load / Save ────────────────────────────────────────────
|
|
62
|
+
function loadGlobalGraph() {
|
|
63
|
+
try {
|
|
64
|
+
if (fs.existsSync(GLOBAL_GRAPH_FILE)) {
|
|
65
|
+
return JSON.parse(fs.readFileSync(GLOBAL_GRAPH_FILE, 'utf8'));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Corrupt or missing — return fresh
|
|
70
|
+
}
|
|
71
|
+
return emptyGlobalGraph();
|
|
72
|
+
}
|
|
73
|
+
function saveGlobalGraph(data) {
|
|
74
|
+
fs.mkdirSync(GK_DIR, { recursive: true });
|
|
75
|
+
data.generatedAt = Date.now();
|
|
76
|
+
fs.writeFileSync(GLOBAL_GRAPH_FILE, JSON.stringify(data, null, 2), 'utf8');
|
|
77
|
+
}
|
|
78
|
+
function emptyGlobalGraph() {
|
|
79
|
+
return {
|
|
80
|
+
version: '1.0',
|
|
81
|
+
generatedAt: Date.now(),
|
|
82
|
+
repos: [],
|
|
83
|
+
nodes: [],
|
|
84
|
+
edges: [],
|
|
85
|
+
crossRepoImports: [],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// ── Index a repo's graph into the global index ────────────
|
|
89
|
+
function indexRepo(repoPath, repoLabel, localNodes, localEdges) {
|
|
90
|
+
const global = loadGlobalGraph();
|
|
91
|
+
// Update or add the repo entry
|
|
92
|
+
const existingRepo = global.repos.find(r => r.path === repoPath);
|
|
93
|
+
if (existingRepo) {
|
|
94
|
+
existingRepo.lastIndexedAt = Date.now();
|
|
95
|
+
existingRepo.nodeCount = localNodes.length;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
global.repos.push({
|
|
99
|
+
path: repoPath, label: repoLabel,
|
|
100
|
+
lastIndexedAt: Date.now(), nodeCount: localNodes.length,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Merge nodes (prefix IDs to avoid collision — e.g. "repo-id:actual-id")
|
|
104
|
+
const prefix = repoLabel.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
105
|
+
const prefixedNodes = localNodes.map(n => ({
|
|
106
|
+
...n,
|
|
107
|
+
id: `${prefix}:${n.id}`,
|
|
108
|
+
}));
|
|
109
|
+
const prefixedEdges = localEdges.map(e => ({
|
|
110
|
+
source: `${prefix}:${e.source}`,
|
|
111
|
+
target: `${prefix}:${e.target}`,
|
|
112
|
+
type: e.type,
|
|
113
|
+
}));
|
|
114
|
+
// Union-merge with existing global; GNode/GEdge have optional fields so
|
|
115
|
+
// the narrower global types are structurally compatible with the expected shape.
|
|
116
|
+
const merged = (0, graph_export_1.mergeGraphs)({ nodes: global.nodes, edges: global.edges }, { nodes: prefixedNodes, edges: prefixedEdges });
|
|
117
|
+
global.nodes = merged.nodes;
|
|
118
|
+
global.edges = merged.edges;
|
|
119
|
+
global.generatedAt = Date.now();
|
|
120
|
+
saveGlobalGraph(global);
|
|
121
|
+
return { added: localNodes.length, conflicts: merged.conflicts.length };
|
|
122
|
+
}
|
|
123
|
+
// ── Query ──────────────────────────────────────────────────
|
|
124
|
+
function queryGlobalGraph(query) {
|
|
125
|
+
const global = loadGlobalGraph();
|
|
126
|
+
const q = query.toLowerCase();
|
|
127
|
+
const results = [];
|
|
128
|
+
if (q.includes('repo') || q.includes('how many')) {
|
|
129
|
+
results.push(`Indexed ${global.repos.length} repos with ${global.nodes.length} total nodes and ${global.edges.length} edges.`);
|
|
130
|
+
}
|
|
131
|
+
if (q.includes('shared') || q.includes('cross')) {
|
|
132
|
+
results.push(global.crossRepoImports.length > 0
|
|
133
|
+
? `${global.crossRepoImports.length} cross-repo import(s) detected.`
|
|
134
|
+
: 'No cross-repo imports tracked yet.');
|
|
135
|
+
}
|
|
136
|
+
if (q.includes('worst') || q.includes('low')) {
|
|
137
|
+
const sorted = [...global.nodes].sort((a, b) => a.rating - b.rating).slice(0, 5);
|
|
138
|
+
if (sorted.length > 0) {
|
|
139
|
+
results.push('Worst-rated nodes:', sorted.map(n => ` ${n.label} — ${n.rating}/10`).join('\n'));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
repos: global.repos,
|
|
144
|
+
nodeCount: global.nodes.length,
|
|
145
|
+
edgeCount: global.edges.length,
|
|
146
|
+
answer: results.length > 0 ? results.join('\n') : `No answer for "${query}". Try: repos, cross-repo, worst-rated.`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** Path to the global graph on disk */
|
|
150
|
+
function getGlobalGraphPath() {
|
|
151
|
+
return GLOBAL_GRAPH_FILE;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=global-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-graph.js","sourceRoot":"","sources":["../../src/graph/global-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure graph traversal algorithms used by graph-aware MCP tools.
|
|
3
|
+
*
|
|
4
|
+
* All functions operate on adjacency maps built from GraphResponse data,
|
|
5
|
+
* keeping them free of I/O and daemon dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export interface NodeData {
|
|
8
|
+
id: string;
|
|
9
|
+
rating: number;
|
|
10
|
+
linesOfCode?: number;
|
|
11
|
+
}
|
|
12
|
+
/** Build adjacency: source → [targets] */
|
|
13
|
+
export declare function buildAdjacency(edges: ReadonlyArray<{
|
|
14
|
+
source: string;
|
|
15
|
+
target: string;
|
|
16
|
+
}>): Map<string, string[]>;
|
|
17
|
+
/** Build reverse adjacency: target → [sources] (who imports me) */
|
|
18
|
+
export declare function buildReverseAdjacency(edges: ReadonlyArray<{
|
|
19
|
+
source: string;
|
|
20
|
+
target: string;
|
|
21
|
+
}>): Map<string, string[]>;
|
|
22
|
+
export interface ImpactEntry {
|
|
23
|
+
path: string;
|
|
24
|
+
depth: number;
|
|
25
|
+
severity: 'direct' | 'indirect';
|
|
26
|
+
rating: number;
|
|
27
|
+
fragile: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* BFS over reverse adjacency (dependents) up to `maxDepth` hops.
|
|
31
|
+
* Returns entries ordered by depth then by rating asc (fragile first).
|
|
32
|
+
*/
|
|
33
|
+
export declare function getImpactSet(filePath: string, reverseAdj: Map<string, string[]>, ratingByNode: Map<string, number>, maxDepth: number, fragileThreshold: number): ImpactEntry[];
|
|
34
|
+
export interface PathEntry {
|
|
35
|
+
path: string;
|
|
36
|
+
rating: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* BFS shortest dependency path from source to target.
|
|
40
|
+
* Follows forward adjacency (import direction).
|
|
41
|
+
* Returns null if no path exists.
|
|
42
|
+
*/
|
|
43
|
+
export declare function tracePath(source: string, target: string, adj: Map<string, string[]>, ratingByNode: Map<string, number>): PathEntry[] | null;
|
|
44
|
+
export interface CentralityEntry {
|
|
45
|
+
path: string;
|
|
46
|
+
inDegree: number;
|
|
47
|
+
outDegree: number;
|
|
48
|
+
totalDegree: number;
|
|
49
|
+
rating: number;
|
|
50
|
+
label: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Compute degree centrality for all nodes.
|
|
54
|
+
* Higher totalDegree = more connected = higher blast radius.
|
|
55
|
+
*/
|
|
56
|
+
export declare function computeCentrality(nodes: ReadonlyArray<{
|
|
57
|
+
id: string;
|
|
58
|
+
label: string;
|
|
59
|
+
rating: number;
|
|
60
|
+
}>, edges: ReadonlyArray<{
|
|
61
|
+
source: string;
|
|
62
|
+
target: string;
|
|
63
|
+
}>): CentralityEntry[];
|
|
64
|
+
export interface BetweennessEntry {
|
|
65
|
+
path: string;
|
|
66
|
+
betweenness: number;
|
|
67
|
+
normalizedBetweenness: number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Compute betweenness centrality using the Brandes algorithm.
|
|
71
|
+
* Betweenness(v) = Σ_{s≠v≠t} σ(s,t|v) / σ(s,t)
|
|
72
|
+
* where σ(s,t) = number of shortest paths from s to t, σ(s,t|v) = those passing through v.
|
|
73
|
+
*
|
|
74
|
+
* Time complexity: O(V·E).
|
|
75
|
+
* Normalised by (n-1)(n-2) for directed graphs, so values are in [0,1].
|
|
76
|
+
*
|
|
77
|
+
* Files that score high here are "bridge" nodes — removing them would most
|
|
78
|
+
* disrupt information flow across the codebase.
|
|
79
|
+
*/
|
|
80
|
+
export declare function computeBetweennessCentrality(nodes: ReadonlyArray<{
|
|
81
|
+
id: string;
|
|
82
|
+
}>, edges: ReadonlyArray<{
|
|
83
|
+
source: string;
|
|
84
|
+
target: string;
|
|
85
|
+
}>): BetweennessEntry[];
|
|
86
|
+
/** Estimate token count for a raw text block (rough: 4 chars ≈ 1 token) */
|
|
87
|
+
export declare function estimateTokens(text: string): number;
|
|
88
|
+
/** Estimate tokens saved by not reading N source files */
|
|
89
|
+
export declare function estimateSavings(filesNotRead: number, avgFileSizeTokens?: number): number;
|
|
90
|
+
//# sourceMappingURL=graph-algorithms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-algorithms.d.ts","sourceRoot":"","sources":["../../src/graph/graph-algorithms.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,0CAA0C;AAC1C,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAM9G;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAMrH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACjC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,GACvB,WAAW,EAAE,CA2Bf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC1B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,SAAS,EAAE,GAAG,IAAI,CAoBpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EACnE,KAAK,EAAE,aAAa,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GACvD,eAAe,EAAE,CAqBnB;AAID,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,aAAa,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,EACpC,KAAK,EAAE,aAAa,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GACvD,gBAAgB,EAAE,CAkDpB;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,iBAAiB,SAAO,GAAG,MAAM,CAEtF"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pure graph traversal algorithms used by graph-aware MCP tools.
|
|
4
|
+
*
|
|
5
|
+
* All functions operate on adjacency maps built from GraphResponse data,
|
|
6
|
+
* keeping them free of I/O and daemon dependencies.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.buildAdjacency = buildAdjacency;
|
|
10
|
+
exports.buildReverseAdjacency = buildReverseAdjacency;
|
|
11
|
+
exports.getImpactSet = getImpactSet;
|
|
12
|
+
exports.tracePath = tracePath;
|
|
13
|
+
exports.computeCentrality = computeCentrality;
|
|
14
|
+
exports.computeBetweennessCentrality = computeBetweennessCentrality;
|
|
15
|
+
exports.estimateTokens = estimateTokens;
|
|
16
|
+
exports.estimateSavings = estimateSavings;
|
|
17
|
+
/** Build adjacency: source → [targets] */
|
|
18
|
+
function buildAdjacency(edges) {
|
|
19
|
+
const adj = new Map();
|
|
20
|
+
for (const e of edges) {
|
|
21
|
+
(adj.get(e.source) ?? adj.set(e.source, []).get(e.source)).push(e.target);
|
|
22
|
+
}
|
|
23
|
+
return adj;
|
|
24
|
+
}
|
|
25
|
+
/** Build reverse adjacency: target → [sources] (who imports me) */
|
|
26
|
+
function buildReverseAdjacency(edges) {
|
|
27
|
+
const rev = new Map();
|
|
28
|
+
for (const e of edges) {
|
|
29
|
+
(rev.get(e.target) ?? rev.set(e.target, []).get(e.target)).push(e.source);
|
|
30
|
+
}
|
|
31
|
+
return rev;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* BFS over reverse adjacency (dependents) up to `maxDepth` hops.
|
|
35
|
+
* Returns entries ordered by depth then by rating asc (fragile first).
|
|
36
|
+
*/
|
|
37
|
+
function getImpactSet(filePath, reverseAdj, ratingByNode, maxDepth, fragileThreshold) {
|
|
38
|
+
const visited = new Set();
|
|
39
|
+
const queue = [{ id: filePath, depth: 0 }];
|
|
40
|
+
const result = [];
|
|
41
|
+
while (queue.length > 0) {
|
|
42
|
+
const { id, depth } = queue.shift();
|
|
43
|
+
if (depth > maxDepth)
|
|
44
|
+
continue;
|
|
45
|
+
if (id !== filePath) {
|
|
46
|
+
const rating = ratingByNode.get(id) ?? 10;
|
|
47
|
+
result.push({
|
|
48
|
+
path: id,
|
|
49
|
+
depth,
|
|
50
|
+
severity: depth === 1 ? 'direct' : 'indirect',
|
|
51
|
+
rating,
|
|
52
|
+
fragile: rating < fragileThreshold,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
for (const dependent of reverseAdj.get(id) ?? []) {
|
|
56
|
+
if (!visited.has(dependent) && dependent !== filePath) {
|
|
57
|
+
visited.add(dependent);
|
|
58
|
+
if (depth < maxDepth)
|
|
59
|
+
queue.push({ id: dependent, depth: depth + 1 });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return result.sort((a, b) => a.depth - b.depth || a.rating - b.rating);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* BFS shortest dependency path from source to target.
|
|
67
|
+
* Follows forward adjacency (import direction).
|
|
68
|
+
* Returns null if no path exists.
|
|
69
|
+
*/
|
|
70
|
+
function tracePath(source, target, adj, ratingByNode) {
|
|
71
|
+
if (source === target)
|
|
72
|
+
return [{ path: source, rating: ratingByNode.get(source) ?? 10 }];
|
|
73
|
+
const visited = new Set([source]);
|
|
74
|
+
const queue = [{ id: source, trail: [source] }];
|
|
75
|
+
while (queue.length > 0) {
|
|
76
|
+
const { id, trail } = queue.shift();
|
|
77
|
+
for (const next of adj.get(id) ?? []) {
|
|
78
|
+
if (visited.has(next))
|
|
79
|
+
continue;
|
|
80
|
+
const newTrail = [...trail, next];
|
|
81
|
+
if (next === target) {
|
|
82
|
+
return newTrail.map(p => ({ path: p, rating: ratingByNode.get(p) ?? 10 }));
|
|
83
|
+
}
|
|
84
|
+
visited.add(next);
|
|
85
|
+
queue.push({ id: next, trail: newTrail });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Compute degree centrality for all nodes.
|
|
92
|
+
* Higher totalDegree = more connected = higher blast radius.
|
|
93
|
+
*/
|
|
94
|
+
function computeCentrality(nodes, edges) {
|
|
95
|
+
const inDeg = new Map();
|
|
96
|
+
const outDeg = new Map();
|
|
97
|
+
for (const n of nodes) {
|
|
98
|
+
inDeg.set(n.id, 0);
|
|
99
|
+
outDeg.set(n.id, 0);
|
|
100
|
+
}
|
|
101
|
+
for (const e of edges) {
|
|
102
|
+
outDeg.set(e.source, (outDeg.get(e.source) ?? 0) + 1);
|
|
103
|
+
inDeg.set(e.target, (inDeg.get(e.target) ?? 0) + 1);
|
|
104
|
+
}
|
|
105
|
+
return nodes.map(n => ({
|
|
106
|
+
path: n.id,
|
|
107
|
+
label: n.label,
|
|
108
|
+
inDegree: inDeg.get(n.id) ?? 0,
|
|
109
|
+
outDegree: outDeg.get(n.id) ?? 0,
|
|
110
|
+
totalDegree: (inDeg.get(n.id) ?? 0) + (outDeg.get(n.id) ?? 0),
|
|
111
|
+
rating: n.rating,
|
|
112
|
+
})).sort((a, b) => b.totalDegree - a.totalDegree);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Compute betweenness centrality using the Brandes algorithm.
|
|
116
|
+
* Betweenness(v) = Σ_{s≠v≠t} σ(s,t|v) / σ(s,t)
|
|
117
|
+
* where σ(s,t) = number of shortest paths from s to t, σ(s,t|v) = those passing through v.
|
|
118
|
+
*
|
|
119
|
+
* Time complexity: O(V·E).
|
|
120
|
+
* Normalised by (n-1)(n-2) for directed graphs, so values are in [0,1].
|
|
121
|
+
*
|
|
122
|
+
* Files that score high here are "bridge" nodes — removing them would most
|
|
123
|
+
* disrupt information flow across the codebase.
|
|
124
|
+
*/
|
|
125
|
+
function computeBetweennessCentrality(nodes, edges) {
|
|
126
|
+
const adj = buildAdjacency(edges);
|
|
127
|
+
const nodeList = nodes.map(n => n.id);
|
|
128
|
+
const betweenness = new Map(nodeList.map(id => [id, 0]));
|
|
129
|
+
for (const s of nodeList) {
|
|
130
|
+
const stack = [];
|
|
131
|
+
const predecessors = new Map(nodeList.map(id => [id, []]));
|
|
132
|
+
const sigma = new Map(nodeList.map(id => [id, 0]));
|
|
133
|
+
sigma.set(s, 1);
|
|
134
|
+
const dist = new Map(nodeList.map(id => [id, -1]));
|
|
135
|
+
dist.set(s, 0);
|
|
136
|
+
const queue = [s];
|
|
137
|
+
let qi = 0;
|
|
138
|
+
while (qi < queue.length) {
|
|
139
|
+
const v = queue[qi++];
|
|
140
|
+
stack.push(v);
|
|
141
|
+
for (const w of adj.get(v) ?? []) {
|
|
142
|
+
if (dist.get(w) === -1) {
|
|
143
|
+
queue.push(w);
|
|
144
|
+
dist.set(w, dist.get(v) + 1);
|
|
145
|
+
}
|
|
146
|
+
if (dist.get(w) === dist.get(v) + 1) {
|
|
147
|
+
sigma.set(w, sigma.get(w) + sigma.get(v));
|
|
148
|
+
predecessors.get(w).push(v);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const delta = new Map(nodeList.map(id => [id, 0]));
|
|
153
|
+
while (stack.length > 0) {
|
|
154
|
+
const w = stack.pop();
|
|
155
|
+
for (const v of predecessors.get(w)) {
|
|
156
|
+
const coeff = (sigma.get(v) / sigma.get(w)) * (1 + delta.get(w));
|
|
157
|
+
delta.set(v, delta.get(v) + coeff);
|
|
158
|
+
}
|
|
159
|
+
if (w !== s) {
|
|
160
|
+
betweenness.set(w, betweenness.get(w) + delta.get(w));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const n = nodeList.length;
|
|
165
|
+
const norm = n > 2 ? (n - 1) * (n - 2) : 1;
|
|
166
|
+
return nodeList.map(id => ({
|
|
167
|
+
path: id,
|
|
168
|
+
betweenness: betweenness.get(id),
|
|
169
|
+
normalizedBetweenness: betweenness.get(id) / norm,
|
|
170
|
+
})).sort((a, b) => b.betweenness - a.betweenness);
|
|
171
|
+
}
|
|
172
|
+
/** Estimate token count for a raw text block (rough: 4 chars ≈ 1 token) */
|
|
173
|
+
function estimateTokens(text) {
|
|
174
|
+
return Math.ceil(text.length / 4);
|
|
175
|
+
}
|
|
176
|
+
/** Estimate tokens saved by not reading N source files */
|
|
177
|
+
function estimateSavings(filesNotRead, avgFileSizeTokens = 5000) {
|
|
178
|
+
return filesNotRead * avgFileSizeTokens;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=graph-algorithms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-algorithms.js","sourceRoot":"","sources":["../../src/graph/graph-algorithms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph export engine — produces graphify-compatible JSON, GraphML, and Neo4j Cypher.
|
|
3
|
+
*
|
|
4
|
+
* All formats capture the full node+edge structure so external tools (graph
|
|
5
|
+
* databases, visualizers, other repos) can consume gate-keeper analysis.
|
|
6
|
+
*/
|
|
7
|
+
interface GNode {
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
rating: number;
|
|
11
|
+
metrics?: {
|
|
12
|
+
linesOfCode?: number;
|
|
13
|
+
cyclomaticComplexity?: number;
|
|
14
|
+
importCount?: number;
|
|
15
|
+
};
|
|
16
|
+
violations?: Array<{
|
|
17
|
+
type: string;
|
|
18
|
+
severity: string;
|
|
19
|
+
message: string;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
interface GEdge {
|
|
23
|
+
source: string;
|
|
24
|
+
target: string;
|
|
25
|
+
type?: string;
|
|
26
|
+
strength?: number;
|
|
27
|
+
}
|
|
28
|
+
interface CycleInfo {
|
|
29
|
+
nodes: string[];
|
|
30
|
+
}
|
|
31
|
+
export type ExportFormat = 'json' | 'graphml' | 'neo4j' | 'svg';
|
|
32
|
+
export interface ExportOptions {
|
|
33
|
+
format: ExportFormat;
|
|
34
|
+
repoRoot?: string;
|
|
35
|
+
overallRating?: number | null;
|
|
36
|
+
}
|
|
37
|
+
export declare function exportToJson(nodes: ReadonlyArray<GNode>, edges: ReadonlyArray<GEdge>, cycles: ReadonlyArray<CycleInfo>, opts: ExportOptions): string;
|
|
38
|
+
export declare function exportToGraphML(nodes: ReadonlyArray<GNode>, edges: ReadonlyArray<GEdge>): string;
|
|
39
|
+
export declare function exportToNeo4j(nodes: ReadonlyArray<GNode>, edges: ReadonlyArray<GEdge>): string;
|
|
40
|
+
/**
|
|
41
|
+
* Render the graph as SVG using a circular node layout.
|
|
42
|
+
* Nodes are placed evenly around a circle; edges are straight lines.
|
|
43
|
+
* Node colour encodes rating; node radius encodes in-degree.
|
|
44
|
+
*/
|
|
45
|
+
export declare function exportToSvg(nodes: ReadonlyArray<GNode>, edges: ReadonlyArray<GEdge>, opts?: {
|
|
46
|
+
width?: number;
|
|
47
|
+
height?: number;
|
|
48
|
+
}): string;
|
|
49
|
+
export interface MergeResult {
|
|
50
|
+
nodes: GNode[];
|
|
51
|
+
edges: GEdge[];
|
|
52
|
+
conflicts: Array<{
|
|
53
|
+
id: string;
|
|
54
|
+
ratingA: number;
|
|
55
|
+
ratingB: number;
|
|
56
|
+
resolved: number;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
export declare function mergeGraphs(graphA: {
|
|
60
|
+
nodes: GNode[];
|
|
61
|
+
edges: GEdge[];
|
|
62
|
+
}, graphB: {
|
|
63
|
+
nodes: GNode[];
|
|
64
|
+
edges: GEdge[];
|
|
65
|
+
}): MergeResult;
|
|
66
|
+
export declare function exportGraph(nodes: ReadonlyArray<GNode>, edges: ReadonlyArray<GEdge>, cycles: ReadonlyArray<CycleInfo>, opts: ExportOptions): string;
|
|
67
|
+
export {};
|
|
68
|
+
//# sourceMappingURL=graph-export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-export.d.ts","sourceRoot":"","sources":["../../src/graph/graph-export.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxF,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE;AAED,UAAU,KAAK;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AACpF,UAAU,SAAS;IAAG,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE;AAEvC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAID,wBAAgB,YAAY,CAC1B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,EAChC,IAAI,EAAE,aAAa,GAClB,MAAM,CA+CR;AAID,wBAAgB,eAAe,CAC7B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,GAC1B,MAAM,CAkCR;AAID,wBAAgB,aAAa,CAC3B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,GAC1B,MAAM,CAgCR;AAID;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,MAAM,CA6GR;AAID,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtF;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE;IAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAAC,KAAK,EAAE,KAAK,EAAE,CAAA;CAAE,EAC1C,MAAM,EAAE;IAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAAC,KAAK,EAAE,KAAK,EAAE,CAAA;CAAE,GACzC,WAAW,CA8Bb;AAID,wBAAgB,WAAW,CACzB,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,EAChC,IAAI,EAAE,aAAa,GAClB,MAAM,CAOR"}
|