@mohantn/gate-keeper 2.2.0 → 2.2.1
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/README.md +82 -46
- package/package.json +1 -1
- package/dist/cli/query-repl.d.ts +0 -37
- package/dist/cli/query-repl.d.ts.map +0 -1
- package/dist/cli/query-repl.js +0 -298
- package/dist/cli/query-repl.js.map +0 -1
- package/dist/cli/repl-algorithms.d.ts +0 -49
- package/dist/cli/repl-algorithms.d.ts.map +0 -1
- package/dist/cli/repl-algorithms.js +0 -147
- package/dist/cli/repl-algorithms.js.map +0 -1
- package/dist/cli/setup-core.d.ts +0 -38
- package/dist/cli/setup-core.d.ts.map +0 -1
- package/dist/cli/setup-core.js +0 -427
- package/dist/cli/setup-core.js.map +0 -1
- package/dist/cli/setup.d.ts +0 -25
- package/dist/cli/setup.d.ts.map +0 -1
- package/dist/cli/setup.js +0 -159
- package/dist/cli/setup.js.map +0 -1
- package/dist/github/app.d.ts +0 -34
- package/dist/github/app.d.ts.map +0 -1
- package/dist/github/app.js +0 -261
- package/dist/github/app.js.map +0 -1
- package/dist/github/commenter.d.ts +0 -67
- package/dist/github/commenter.d.ts.map +0 -1
- package/dist/github/commenter.js +0 -155
- package/dist/github/commenter.js.map +0 -1
- package/dist/hooks/git-hooks.d.ts +0 -30
- package/dist/hooks/git-hooks.d.ts.map +0 -1
- package/dist/hooks/git-hooks.js +0 -179
- package/dist/hooks/git-hooks.js.map +0 -1
- package/dist/mcp/cache-preload.d.ts +0 -29
- package/dist/mcp/cache-preload.d.ts.map +0 -1
- package/dist/mcp/cache-preload.js +0 -103
- package/dist/mcp/cache-preload.js.map +0 -1
- package/dist/mcp/handlers/context.d.ts +0 -25
- package/dist/mcp/handlers/context.d.ts.map +0 -1
- package/dist/mcp/handlers/context.js +0 -382
- package/dist/mcp/handlers/context.js.map +0 -1
- package/dist/mcp/handlers/graph-intelligence.d.ts +0 -26
- package/dist/mcp/handlers/graph-intelligence.d.ts.map +0 -1
- package/dist/mcp/handlers/graph-intelligence.js +0 -371
- package/dist/mcp/handlers/graph-intelligence.js.map +0 -1
- package/dist/mcp/handlers/graph-query.d.ts +0 -25
- package/dist/mcp/handlers/graph-query.d.ts.map +0 -1
- package/dist/mcp/handlers/graph-query.js +0 -410
- package/dist/mcp/handlers/graph-query.js.map +0 -1
- package/dist/mcp/handlers/impact.d.ts +0 -4
- package/dist/mcp/handlers/impact.d.ts.map +0 -1
- package/dist/mcp/handlers/impact.js +0 -139
- package/dist/mcp/handlers/impact.js.map +0 -1
- package/dist/mcp/handlers/improvement.d.ts +0 -4
- package/dist/mcp/handlers/improvement.d.ts.map +0 -1
- package/dist/mcp/handlers/improvement.js +0 -136
- package/dist/mcp/handlers/improvement.js.map +0 -1
- package/dist/mcp/handlers/platform-installer.d.ts +0 -10
- package/dist/mcp/handlers/platform-installer.d.ts.map +0 -1
- package/dist/mcp/handlers/platform-installer.js +0 -168
- package/dist/mcp/handlers/platform-installer.js.map +0 -1
- package/dist/mcp/handlers/pr-review.d.ts +0 -33
- package/dist/mcp/handlers/pr-review.d.ts.map +0 -1
- package/dist/mcp/handlers/pr-review.js +0 -170
- package/dist/mcp/handlers/pr-review.js.map +0 -1
- package/dist/mcp/token-tracker.d.ts +0 -47
- package/dist/mcp/token-tracker.d.ts.map +0 -1
- package/dist/mcp/token-tracker.js +0 -93
- package/dist/mcp/token-tracker.js.map +0 -1
- package/dist/quality-loop/file-lock.d.ts +0 -12
- package/dist/quality-loop/file-lock.d.ts.map +0 -1
- package/dist/quality-loop/file-lock.js +0 -38
- package/dist/quality-loop/file-lock.js.map +0 -1
- package/dist/quality-loop/fix-worker.d.ts +0 -44
- package/dist/quality-loop/fix-worker.d.ts.map +0 -1
- package/dist/quality-loop/fix-worker.js +0 -414
- package/dist/quality-loop/fix-worker.js.map +0 -1
- package/dist/quality-loop/orchestrator.d.ts +0 -137
- package/dist/quality-loop/orchestrator.d.ts.map +0 -1
- package/dist/quality-loop/orchestrator.js +0 -894
- package/dist/quality-loop/orchestrator.js.map +0 -1
- package/dist/quality-loop/queue-manager.d.ts +0 -45
- package/dist/quality-loop/queue-manager.d.ts.map +0 -1
- package/dist/quality-loop/queue-manager.js +0 -173
- package/dist/quality-loop/queue-manager.js.map +0 -1
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Graph-aware MCP handlers — graphify-style token-efficient queries.
|
|
4
|
-
*
|
|
5
|
-
* Each handler returns a compact structured JSON response instead of prose,
|
|
6
|
-
* allowing agents to understand the impact of a change using 50–300 tokens
|
|
7
|
-
* rather than reading raw files (typically 5 000+ tokens each).
|
|
8
|
-
*
|
|
9
|
-
* Tools:
|
|
10
|
-
* get_impact_set — depth-bounded BFS over dependents
|
|
11
|
-
* get_centrality_rank — most-connected nodes (high blast-radius files)
|
|
12
|
-
* trace_path — shortest import path between two files
|
|
13
|
-
* summarize_file — structured file summary (no raw content)
|
|
14
|
-
* find_callers — grep-like search for a function/symbol across analyzed files
|
|
15
|
-
* check_pre_edit_safety — go/warn/block pre-edit safety assessment
|
|
16
|
-
* get_session_metrics — cumulative token savings for this MCP session
|
|
17
|
-
*/
|
|
18
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
-
if (k2 === undefined) k2 = k;
|
|
20
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
-
}
|
|
24
|
-
Object.defineProperty(o, k2, desc);
|
|
25
|
-
}) : (function(o, m, k, k2) {
|
|
26
|
-
if (k2 === undefined) k2 = k;
|
|
27
|
-
o[k2] = m[k];
|
|
28
|
-
}));
|
|
29
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
-
}) : function(o, v) {
|
|
32
|
-
o["default"] = v;
|
|
33
|
-
});
|
|
34
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
-
var ownKeys = function(o) {
|
|
36
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
-
var ar = [];
|
|
38
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
-
return ar;
|
|
40
|
-
};
|
|
41
|
-
return ownKeys(o);
|
|
42
|
-
};
|
|
43
|
-
return function (mod) {
|
|
44
|
-
if (mod && mod.__esModule) return mod;
|
|
45
|
-
var result = {};
|
|
46
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
-
__setModuleDefault(result, mod);
|
|
48
|
-
return result;
|
|
49
|
-
};
|
|
50
|
-
})();
|
|
51
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
-
exports.handleGetImpactSet = handleGetImpactSet;
|
|
53
|
-
exports.handleGetCentralityRank = handleGetCentralityRank;
|
|
54
|
-
exports.handleTracePath = handleTracePath;
|
|
55
|
-
exports.handleSummarizeFile = handleSummarizeFile;
|
|
56
|
-
exports.handleFindCallers = handleFindCallers;
|
|
57
|
-
exports.handleCheckPreEditSafety = handleCheckPreEditSafety;
|
|
58
|
-
exports.handleGetSessionMetrics = handleGetSessionMetrics;
|
|
59
|
-
const path = __importStar(require("path"));
|
|
60
|
-
const fs = __importStar(require("fs"));
|
|
61
|
-
const helpers_1 = require("../helpers");
|
|
62
|
-
const shared_1 = require("./shared");
|
|
63
|
-
const token_tracker_1 = require("../token-tracker");
|
|
64
|
-
const graph_algorithms_1 = require("../../graph/graph-algorithms");
|
|
65
|
-
const FRAGILE_THRESHOLD = 6.0;
|
|
66
|
-
// ── Helpers ────────────────────────────────────────────────
|
|
67
|
-
function ratingMap(graph) {
|
|
68
|
-
const m = new Map();
|
|
69
|
-
for (const n of graph.nodes)
|
|
70
|
-
m.set(n.id, n.rating);
|
|
71
|
-
return m;
|
|
72
|
-
}
|
|
73
|
-
function daemonError() {
|
|
74
|
-
return (0, shared_1.text)('Error: Gate Keeper daemon is not running. Start it with `npm run daemon` or `npm run dev`.');
|
|
75
|
-
}
|
|
76
|
-
// ── Handlers ───────────────────────────────────────────────
|
|
77
|
-
async function handleGetImpactSet(args) {
|
|
78
|
-
const filePath = String(args.file_path ?? '');
|
|
79
|
-
if (!filePath)
|
|
80
|
-
return (0, shared_1.text)('Error: file_path is required.');
|
|
81
|
-
const depth = Math.min(Number(args.depth ?? 2), 5);
|
|
82
|
-
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(path.dirname(filePath)));
|
|
83
|
-
const encodedRepo = encodeURIComponent(repo);
|
|
84
|
-
const graphRaw = await (0, helpers_1.fetchDaemonApi)(`/api/graph?repo=${encodedRepo}`);
|
|
85
|
-
if (!graphRaw)
|
|
86
|
-
return daemonError();
|
|
87
|
-
const graph = graphRaw;
|
|
88
|
-
const revAdj = (0, graph_algorithms_1.buildReverseAdjacency)(graph.edges);
|
|
89
|
-
const ratings = ratingMap(graph);
|
|
90
|
-
const affected = (0, graph_algorithms_1.getImpactSet)(filePath, revAdj, ratings, depth, FRAGILE_THRESHOLD);
|
|
91
|
-
const fragile = affected.filter(e => e.fragile);
|
|
92
|
-
const riskScore = fragile.length > 0
|
|
93
|
-
? Math.min(10, Math.round(fragile.length * 2 + (fragile.reduce((s, e) => s + (6 - e.rating), 0) / fragile.length)))
|
|
94
|
-
: 0;
|
|
95
|
-
const lines = [
|
|
96
|
-
`## Impact Set: ${path.basename(filePath)}`,
|
|
97
|
-
`**Depth:** ${depth} | **Affected:** ${affected.length} files | **Fragile (rating<6):** ${fragile.length} | **Risk Score:** ${riskScore}/10`,
|
|
98
|
-
];
|
|
99
|
-
if (affected.length > 0) {
|
|
100
|
-
lines.push('', `| Severity | File | Rating | Fragile |`);
|
|
101
|
-
lines.push(`|----------|------|--------|---------|`);
|
|
102
|
-
for (const e of affected.slice(0, 20)) {
|
|
103
|
-
const rel = path.relative(repo, e.path);
|
|
104
|
-
lines.push(`| ${e.severity} | ${rel} | ${e.rating} | ${e.fragile ? '⚠️ yes' : 'no'} |`);
|
|
105
|
-
}
|
|
106
|
-
if (affected.length > 20)
|
|
107
|
-
lines.push(`... and ${affected.length - 20} more`);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
lines.push('', 'No dependents found. This file is a leaf node — safe to change freely.');
|
|
111
|
-
}
|
|
112
|
-
const data = { filePath, depth, affected, riskScore, fragileCount: fragile.length };
|
|
113
|
-
token_tracker_1.tokenTracker.record('get_impact_set', affected.length, lines.join('\n'));
|
|
114
|
-
return (0, shared_1.envelope)('get_impact_set', data, lines.join('\n'));
|
|
115
|
-
}
|
|
116
|
-
async function handleGetCentralityRank(args) {
|
|
117
|
-
const limit = Math.min(Number(args.limit ?? 10), 50);
|
|
118
|
-
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(process.cwd()));
|
|
119
|
-
const encodedRepo = encodeURIComponent(repo);
|
|
120
|
-
const graphRaw = await (0, helpers_1.fetchDaemonApi)(`/api/graph?repo=${encodedRepo}`);
|
|
121
|
-
if (!graphRaw)
|
|
122
|
-
return daemonError();
|
|
123
|
-
const graph = graphRaw;
|
|
124
|
-
const ranked = (0, graph_algorithms_1.computeCentrality)(graph.nodes, graph.edges).slice(0, limit);
|
|
125
|
-
const lines = [
|
|
126
|
-
`## Centrality Rank — Top ${limit} Most-Connected Files`,
|
|
127
|
-
`**Total files:** ${graph.nodes.length} | **Total edges:** ${graph.edges.length}`,
|
|
128
|
-
'',
|
|
129
|
-
`| Rank | File | In | Out | Total | Rating |`,
|
|
130
|
-
`|------|------|----|-----|-------|--------|`,
|
|
131
|
-
];
|
|
132
|
-
for (let i = 0; i < ranked.length; i++) {
|
|
133
|
-
const e = ranked[i];
|
|
134
|
-
const rel = path.relative(repo, e.path);
|
|
135
|
-
lines.push(`| ${i + 1} | ${rel} | ${e.inDegree} | ${e.outDegree} | ${e.totalDegree} | ${e.rating} |`);
|
|
136
|
-
}
|
|
137
|
-
lines.push('', '_High in-degree = many files depend on this (dangerous to break). High out-degree = this file depends on many (fragile itself)._');
|
|
138
|
-
const data = { repo, nodes: ranked };
|
|
139
|
-
token_tracker_1.tokenTracker.record('get_centrality_rank', graph.nodes.length, lines.join('\n'));
|
|
140
|
-
return (0, shared_1.envelope)('get_centrality_rank', data, lines.join('\n'));
|
|
141
|
-
}
|
|
142
|
-
async function handleTracePath(args) {
|
|
143
|
-
const source = String(args.source ?? '');
|
|
144
|
-
const target = String(args.target ?? '');
|
|
145
|
-
if (!source || !target)
|
|
146
|
-
return (0, shared_1.text)('Error: source and target file paths are required.');
|
|
147
|
-
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(path.dirname(source)));
|
|
148
|
-
const encodedRepo = encodeURIComponent(repo);
|
|
149
|
-
const graphRaw = await (0, helpers_1.fetchDaemonApi)(`/api/graph?repo=${encodedRepo}`);
|
|
150
|
-
if (!graphRaw)
|
|
151
|
-
return daemonError();
|
|
152
|
-
const graph = graphRaw;
|
|
153
|
-
const adj = (0, graph_algorithms_1.buildAdjacency)(graph.edges);
|
|
154
|
-
const ratings = ratingMap(graph);
|
|
155
|
-
const found = (0, graph_algorithms_1.tracePath)(source, target, adj, ratings);
|
|
156
|
-
if (!found) {
|
|
157
|
-
const revAdj = (0, graph_algorithms_1.buildReverseAdjacency)(graph.edges);
|
|
158
|
-
const reverse = (0, graph_algorithms_1.tracePath)(target, source, revAdj, ratings);
|
|
159
|
-
if (reverse) {
|
|
160
|
-
const lines = [
|
|
161
|
-
`## Path: ${path.basename(source)} → ${path.basename(target)}`,
|
|
162
|
-
`No forward dependency path. Found reverse path (target imports source, length ${reverse.length - 1}):`,
|
|
163
|
-
reverse.map(e => `${path.relative(repo, e.path)} (${e.rating})`).join(' → '),
|
|
164
|
-
];
|
|
165
|
-
const data = { source, target, found: false, reversePath: reverse };
|
|
166
|
-
token_tracker_1.tokenTracker.record('trace_path', 0, lines.join('\n'));
|
|
167
|
-
return (0, shared_1.envelope)('trace_path', data, lines.join('\n'));
|
|
168
|
-
}
|
|
169
|
-
const noPathLines = [
|
|
170
|
-
`## Path: ${path.basename(source)} → ${path.basename(target)}`,
|
|
171
|
-
'No dependency path found between these files. They are architecturally independent.',
|
|
172
|
-
];
|
|
173
|
-
const data = { source, target, found: false, path: null };
|
|
174
|
-
token_tracker_1.tokenTracker.record('trace_path', 0, noPathLines.join('\n'));
|
|
175
|
-
return (0, shared_1.envelope)('trace_path', data, noPathLines.join('\n'));
|
|
176
|
-
}
|
|
177
|
-
const bottlenecks = found.filter(e => e.rating < FRAGILE_THRESHOLD);
|
|
178
|
-
const lines = [
|
|
179
|
-
`## Path: ${path.basename(source)} → ${path.basename(target)}`,
|
|
180
|
-
`**Length:** ${found.length - 1} hops | **Bottlenecks (rating<6):** ${bottlenecks.length}`,
|
|
181
|
-
'',
|
|
182
|
-
found.map(e => `\`${path.relative(repo, e.path)}\` (${e.rating})`).join(' → '),
|
|
183
|
-
];
|
|
184
|
-
if (bottlenecks.length > 0) {
|
|
185
|
-
lines.push('', '**Fragile nodes on path:**');
|
|
186
|
-
for (const b of bottlenecks) {
|
|
187
|
-
lines.push(`- ${path.relative(repo, b.path)} — rating ${b.rating}/10`);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
const data = { source, target, found: true, path: found, bottlenecks };
|
|
191
|
-
token_tracker_1.tokenTracker.record('trace_path', 0, lines.join('\n'));
|
|
192
|
-
return (0, shared_1.envelope)('trace_path', data, lines.join('\n'));
|
|
193
|
-
}
|
|
194
|
-
async function handleSummarizeFile(args) {
|
|
195
|
-
const filePath = String(args.file_path ?? '');
|
|
196
|
-
if (!filePath)
|
|
197
|
-
return (0, shared_1.text)('Error: file_path is required.');
|
|
198
|
-
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(path.dirname(filePath)));
|
|
199
|
-
const encodedFile = encodeURIComponent(filePath);
|
|
200
|
-
const encodedRepo = encodeURIComponent(repo);
|
|
201
|
-
const [graphRaw, detailRaw] = await Promise.all([
|
|
202
|
-
(0, helpers_1.fetchDaemonApi)(`/api/graph?repo=${encodedRepo}`),
|
|
203
|
-
(0, helpers_1.fetchDaemonApi)(`/api/file-detail?file=${encodedFile}&repo=${encodedRepo}`),
|
|
204
|
-
]);
|
|
205
|
-
if (!graphRaw)
|
|
206
|
-
return daemonError();
|
|
207
|
-
const graph = graphRaw;
|
|
208
|
-
const detail = detailRaw;
|
|
209
|
-
const node = graph.nodes.find(n => n.id === filePath);
|
|
210
|
-
if (!node && !detail?.analysis) {
|
|
211
|
-
return (0, shared_1.text)(`File not analyzed yet. Run \`analyze_file\` on ${filePath} first.`);
|
|
212
|
-
}
|
|
213
|
-
const analysis = detail?.analysis;
|
|
214
|
-
const rating = node?.rating ?? analysis?.rating ?? 0;
|
|
215
|
-
const metrics = node?.metrics ?? analysis?.metrics;
|
|
216
|
-
const violations = node?.violations ?? analysis?.violations ?? [];
|
|
217
|
-
const imports = graph.edges.filter(e => e.source === filePath).map(e => ({
|
|
218
|
-
path: path.relative(repo, e.target),
|
|
219
|
-
type: e.type,
|
|
220
|
-
}));
|
|
221
|
-
const dependents = graph.edges.filter(e => e.target === filePath).map(e => ({
|
|
222
|
-
path: path.relative(repo, e.source),
|
|
223
|
-
rating: graph.nodes.find(n => n.id === e.source)?.rating ?? null,
|
|
224
|
-
}));
|
|
225
|
-
const violationSummary = violations.reduce((acc, v) => {
|
|
226
|
-
acc[v.severity] = (acc[v.severity] ?? 0) + 1;
|
|
227
|
-
return acc;
|
|
228
|
-
}, {});
|
|
229
|
-
const lines = [
|
|
230
|
-
`## Summary: ${path.basename(filePath)}`,
|
|
231
|
-
`**Rating:** ${rating}/10 | **LOC:** ${metrics?.linesOfCode ?? '?'} | **Complexity:** ${metrics?.cyclomaticComplexity ?? '?'} | **Imports:** ${imports.length} | **Depended on by:** ${dependents.length}`,
|
|
232
|
-
];
|
|
233
|
-
if (Object.keys(violationSummary).length > 0) {
|
|
234
|
-
const parts = Object.entries(violationSummary).map(([k, v]) => `${v} ${k}(s)`);
|
|
235
|
-
lines.push(`**Violations:** ${parts.join(', ')}`);
|
|
236
|
-
}
|
|
237
|
-
if (imports.length > 0) {
|
|
238
|
-
lines.push('', `**Imports (${imports.length}):** ${imports.map(i => i.path).join(', ')}`);
|
|
239
|
-
}
|
|
240
|
-
if (dependents.length > 0) {
|
|
241
|
-
const fragile = dependents.filter(d => d.rating !== null && d.rating < FRAGILE_THRESHOLD);
|
|
242
|
-
lines.push(`**Used by (${dependents.length}):** ${dependents.map(d => `${d.path}(${d.rating ?? '?'})`).join(', ')}`);
|
|
243
|
-
if (fragile.length > 0) {
|
|
244
|
-
lines.push(`⚠️ **${fragile.length} fragile dependents** (rating<6) — changes here are high-risk`);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
const data = {
|
|
248
|
-
filePath,
|
|
249
|
-
rating,
|
|
250
|
-
metrics,
|
|
251
|
-
imports,
|
|
252
|
-
dependents,
|
|
253
|
-
violationSummary,
|
|
254
|
-
topViolations: violations.slice(0, 5).map(v => ({ type: v.type, severity: v.severity, line: v.line })),
|
|
255
|
-
};
|
|
256
|
-
token_tracker_1.tokenTracker.record('summarize_file', 1, lines.join('\n'));
|
|
257
|
-
return (0, shared_1.envelope)('summarize_file', data, lines.join('\n'));
|
|
258
|
-
}
|
|
259
|
-
async function handleFindCallers(args) {
|
|
260
|
-
const symbolName = String(args.symbol_name ?? '');
|
|
261
|
-
if (!symbolName)
|
|
262
|
-
return (0, shared_1.text)('Error: symbol_name is required.');
|
|
263
|
-
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(process.cwd()));
|
|
264
|
-
const encodedRepo = encodeURIComponent(repo);
|
|
265
|
-
const graphRaw = await (0, helpers_1.fetchDaemonApi)(`/api/graph?repo=${encodedRepo}`);
|
|
266
|
-
if (!graphRaw)
|
|
267
|
-
return daemonError();
|
|
268
|
-
const graph = graphRaw;
|
|
269
|
-
const analyzedFiles = graph.nodes.map(n => n.id);
|
|
270
|
-
// Search for call patterns: symbolName( or symbolName.call( etc.
|
|
271
|
-
const patterns = [
|
|
272
|
-
new RegExp(`\\b${escapeRegex(symbolName)}\\s*\\(`, 'g'),
|
|
273
|
-
new RegExp(`\\.${escapeRegex(symbolName)}\\s*\\(`, 'g'),
|
|
274
|
-
];
|
|
275
|
-
const callers = [];
|
|
276
|
-
const MAX_RESULTS = 50;
|
|
277
|
-
for (const filePath of analyzedFiles) {
|
|
278
|
-
if (callers.length >= MAX_RESULTS)
|
|
279
|
-
break;
|
|
280
|
-
let content;
|
|
281
|
-
try {
|
|
282
|
-
content = fs.readFileSync(filePath, 'utf8');
|
|
283
|
-
}
|
|
284
|
-
catch {
|
|
285
|
-
continue;
|
|
286
|
-
}
|
|
287
|
-
const lines = content.split('\n');
|
|
288
|
-
const isTest = filePath.includes('.test.') || filePath.includes('.spec.');
|
|
289
|
-
for (let i = 0; i < lines.length && callers.length < MAX_RESULTS; i++) {
|
|
290
|
-
const line = lines[i];
|
|
291
|
-
if (patterns.some(p => { p.lastIndex = 0; return p.test(line); })) {
|
|
292
|
-
callers.push({
|
|
293
|
-
file: path.relative(repo, filePath),
|
|
294
|
-
line: i + 1,
|
|
295
|
-
column: line.indexOf(symbolName) + 1,
|
|
296
|
-
snippet: line.trim().slice(0, 120),
|
|
297
|
-
isTest,
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
const prodCallers = callers.filter(c => !c.isTest);
|
|
303
|
-
const testCallers = callers.filter(c => c.isTest);
|
|
304
|
-
const mdLines = [
|
|
305
|
-
`## Callers of \`${symbolName}\``,
|
|
306
|
-
`**Found:** ${callers.length} call site(s) in ${analyzedFiles.length} analyzed files | **Production:** ${prodCallers.length} | **Tests:** ${testCallers.length}`,
|
|
307
|
-
];
|
|
308
|
-
if (callers.length > 0) {
|
|
309
|
-
mdLines.push('', '| File | Line | Test? | Snippet |');
|
|
310
|
-
mdLines.push('|------|------|-------|---------|');
|
|
311
|
-
for (const c of callers) {
|
|
312
|
-
mdLines.push(`| ${c.file} | ${c.line} | ${c.isTest ? '✓' : ''} | \`${c.snippet}\` |`);
|
|
313
|
-
}
|
|
314
|
-
if (callers.length >= MAX_RESULTS) {
|
|
315
|
-
mdLines.push(`_Results capped at ${MAX_RESULTS}. Refine the symbol name to narrow results._`);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
mdLines.push('', `No call sites found for \`${symbolName}\` in analyzed files.`);
|
|
320
|
-
}
|
|
321
|
-
const data = { symbolName, callers, prodCount: prodCallers.length, testCount: testCallers.length };
|
|
322
|
-
token_tracker_1.tokenTracker.record('find_callers', analyzedFiles.length - callers.length, mdLines.join('\n'));
|
|
323
|
-
return (0, shared_1.envelope)('find_callers', data, mdLines.join('\n'));
|
|
324
|
-
}
|
|
325
|
-
async function handleCheckPreEditSafety(args) {
|
|
326
|
-
const filePath = String(args.file_path ?? '');
|
|
327
|
-
if (!filePath)
|
|
328
|
-
return (0, shared_1.text)('Error: file_path is required.');
|
|
329
|
-
const changeDescription = String(args.change_description ?? 'unspecified change');
|
|
330
|
-
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(path.dirname(filePath)));
|
|
331
|
-
const encodedRepo = encodeURIComponent(repo);
|
|
332
|
-
const graphRaw = await (0, helpers_1.fetchDaemonApi)(`/api/graph?repo=${encodedRepo}`);
|
|
333
|
-
if (!graphRaw)
|
|
334
|
-
return daemonError();
|
|
335
|
-
const graph = graphRaw;
|
|
336
|
-
const revAdj = (0, graph_algorithms_1.buildReverseAdjacency)(graph.edges);
|
|
337
|
-
const ratings = ratingMap(graph);
|
|
338
|
-
const affected = (0, graph_algorithms_1.getImpactSet)(filePath, revAdj, ratings, 3, FRAGILE_THRESHOLD);
|
|
339
|
-
const fileNode = graph.nodes.find(n => n.id === filePath);
|
|
340
|
-
const fileRating = fileNode?.rating ?? null;
|
|
341
|
-
const fragile = affected.filter(e => e.fragile);
|
|
342
|
-
const directFragile = fragile.filter(e => e.severity === 'direct');
|
|
343
|
-
let verdict;
|
|
344
|
-
let reason;
|
|
345
|
-
if (fragile.length === 0 && affected.length < 5) {
|
|
346
|
-
verdict = 'safe';
|
|
347
|
-
reason = `Low blast radius (${affected.length} affected files, none fragile).`;
|
|
348
|
-
}
|
|
349
|
-
else if (directFragile.length >= 3 || fragile.length >= 5) {
|
|
350
|
-
verdict = 'block';
|
|
351
|
-
reason = `${fragile.length} fragile dependents (${directFragile.length} direct). High risk of cascading failures.`;
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
verdict = 'warn';
|
|
355
|
-
reason = `${fragile.length} fragile dependent(s) — verify after change.`;
|
|
356
|
-
}
|
|
357
|
-
const suggestions = [];
|
|
358
|
-
if (verdict !== 'safe') {
|
|
359
|
-
if (fileRating !== null && fileRating >= 7) {
|
|
360
|
-
suggestions.push('Source file is healthy — changes are lower risk if interface is preserved.');
|
|
361
|
-
}
|
|
362
|
-
if (fragile.length > 0) {
|
|
363
|
-
suggestions.push(`Fix fragile dependents first: ${fragile.slice(0, 3).map(e => path.basename(e.path)).join(', ')}`);
|
|
364
|
-
}
|
|
365
|
-
suggestions.push('Use `get_impact_set` with depth=1 to see direct dependents only.');
|
|
366
|
-
suggestions.push('Use `summarize_file` on each fragile dependent to understand coupling.');
|
|
367
|
-
}
|
|
368
|
-
const icon = verdict === 'safe' ? '✅' : verdict === 'warn' ? '⚠️' : '🛑';
|
|
369
|
-
const mdLines = [
|
|
370
|
-
`## Pre-Edit Safety: ${path.basename(filePath)}`,
|
|
371
|
-
`**Change:** ${changeDescription}`,
|
|
372
|
-
`**Verdict:** ${icon} ${verdict.toUpperCase()} — ${reason}`,
|
|
373
|
-
`**File rating:** ${fileRating ?? 'not analyzed'}/10 | **Affected:** ${affected.length} | **Fragile:** ${fragile.length}`,
|
|
374
|
-
];
|
|
375
|
-
if (suggestions.length > 0) {
|
|
376
|
-
mdLines.push('', '**Suggestions:**');
|
|
377
|
-
suggestions.forEach(s => mdLines.push(`- ${s}`));
|
|
378
|
-
}
|
|
379
|
-
const data = { filePath, changeDescription, verdict, reason, affected, fragileCount: fragile.length, fileRating, suggestions };
|
|
380
|
-
token_tracker_1.tokenTracker.record('check_pre_edit_safety', affected.length, mdLines.join('\n'));
|
|
381
|
-
return (0, shared_1.envelope)('check_pre_edit_safety', data, mdLines.join('\n'));
|
|
382
|
-
}
|
|
383
|
-
function handleGetSessionMetrics() {
|
|
384
|
-
const budget = token_tracker_1.tokenTracker.getContextBudget();
|
|
385
|
-
const mdLines = [
|
|
386
|
-
'## Gate Keeper — Context Budget',
|
|
387
|
-
`**Graph queries:** ${budget.totalQueries} | **Files not read:** ${budget.totalFilesNotRead}`,
|
|
388
|
-
`**Estimated naive tokens:** ${budget.estimatedNaiveTokens.toLocaleString()}`,
|
|
389
|
-
`**Actual tokens used:** ${budget.actualResponseTokens.toLocaleString()}`,
|
|
390
|
-
`**Tokens saved:** ${budget.savingsTokens.toLocaleString()} (~${budget.savingsPercent}% reduction)`,
|
|
391
|
-
];
|
|
392
|
-
if (budget.perTool.length > 0) {
|
|
393
|
-
mdLines.push('', '| Tool | Calls | Files avoided | Tokens saved |');
|
|
394
|
-
mdLines.push('|------|-------|---------------|--------------|');
|
|
395
|
-
for (const t of budget.perTool) {
|
|
396
|
-
mdLines.push(`| ${t.tool} | ${t.calls} | ${t.filesAvoided} | ~${t.tokensSaved.toLocaleString()} |`);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
if (budget.recommendations.length > 0) {
|
|
400
|
-
mdLines.push('', '**Recommendations:**');
|
|
401
|
-
for (const r of budget.recommendations) {
|
|
402
|
-
mdLines.push(`- ${r}`);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
return (0, shared_1.envelope)('get_session_metrics', budget, mdLines.join('\n'));
|
|
406
|
-
}
|
|
407
|
-
function escapeRegex(s) {
|
|
408
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
409
|
-
}
|
|
410
|
-
//# sourceMappingURL=graph-query.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graph-query.js","sourceRoot":"","sources":["../../../src/mcp/handlers/graph-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { McpResponse } from './shared';
|
|
2
|
-
export declare function handleImpactAnalysis(args: Record<string, unknown>): Promise<McpResponse>;
|
|
3
|
-
export declare function handlePredictImpactWithRemediation(args: Record<string, unknown>): Promise<McpResponse>;
|
|
4
|
-
//# sourceMappingURL=impact.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../../../src/mcp/handlers/impact.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkB,WAAW,EAAE,MAAM,UAAU,CAAC;AAyCvD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,WAAW,CAAC,CA0CtB;AAED,wBAAsB,kCAAkC,CACtD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,WAAW,CAAC,CAwCtB"}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.handleImpactAnalysis = handleImpactAnalysis;
|
|
37
|
-
exports.handlePredictImpactWithRemediation = handlePredictImpactWithRemediation;
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
const helpers_1 = require("../helpers");
|
|
40
|
-
const shared_1 = require("./shared");
|
|
41
|
-
const impact_format_1 = require("./impact-format");
|
|
42
|
-
// ── Graph traversal helpers ─────────────────────────────────
|
|
43
|
-
function buildReverseAdjacency(graph) {
|
|
44
|
-
const reverseAdj = new Map();
|
|
45
|
-
for (const edge of graph.edges) {
|
|
46
|
-
const sources = reverseAdj.get(edge.target) ?? [];
|
|
47
|
-
sources.push(edge.source);
|
|
48
|
-
reverseAdj.set(edge.target, sources);
|
|
49
|
-
}
|
|
50
|
-
return reverseAdj;
|
|
51
|
-
}
|
|
52
|
-
function collectTransitiveDependents(reverseAdj, filePath) {
|
|
53
|
-
const direct = new Set(reverseAdj.get(filePath) ?? []);
|
|
54
|
-
const all = new Set();
|
|
55
|
-
const stack = [...direct];
|
|
56
|
-
while (stack.length > 0) {
|
|
57
|
-
const current = stack.pop();
|
|
58
|
-
if (all.has(current))
|
|
59
|
-
continue;
|
|
60
|
-
all.add(current);
|
|
61
|
-
for (const next of reverseAdj.get(current) ?? []) {
|
|
62
|
-
if (!all.has(next))
|
|
63
|
-
stack.push(next);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return { direct, all };
|
|
67
|
-
}
|
|
68
|
-
// ── Handlers ───────────────────────────────────────────────
|
|
69
|
-
async function handleImpactAnalysis(args) {
|
|
70
|
-
const filePath = String(args.file_path ?? '');
|
|
71
|
-
if (!filePath)
|
|
72
|
-
return (0, shared_1.text)('Error: file_path is required.');
|
|
73
|
-
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(path.dirname(filePath)));
|
|
74
|
-
const encodedRepo = encodeURIComponent(repo);
|
|
75
|
-
const graphRaw = await (0, helpers_1.fetchDaemonApi)(`/api/graph?repo=${encodedRepo}`);
|
|
76
|
-
if (!graphRaw) {
|
|
77
|
-
return (0, shared_1.text)('Error: Gate Keeper daemon is not running. Start it with `npm run daemon` or `npm run dev`.');
|
|
78
|
-
}
|
|
79
|
-
const graph = graphRaw;
|
|
80
|
-
const reverseAdj = buildReverseAdjacency(graph);
|
|
81
|
-
const { direct: directDeps, all: allDeps } = collectTransitiveDependents(reverseAdj, filePath);
|
|
82
|
-
const transitiveDeps = [...allDeps].filter(d => !directDeps.has(d));
|
|
83
|
-
const lines = [
|
|
84
|
-
`## Impact Analysis: ${path.basename(filePath)}`,
|
|
85
|
-
`**Path:** ${filePath}`,
|
|
86
|
-
`**Direct dependents:** ${directDeps.size} | **Total affected (transitive):** ${allDeps.size}`,
|
|
87
|
-
'',
|
|
88
|
-
...(0, impact_format_1.renderDirectDependents)(graph, directDeps, repo),
|
|
89
|
-
...(0, impact_format_1.renderTransitiveDependents)(graph, transitiveDeps, repo),
|
|
90
|
-
...(0, impact_format_1.renderAtRiskDependents)(graph, allDeps, repo),
|
|
91
|
-
];
|
|
92
|
-
if (allDeps.size === 0) {
|
|
93
|
-
lines.push('No other files depend on this file. Changes here have no downstream impact.');
|
|
94
|
-
}
|
|
95
|
-
const affectedNodes = graph.nodes.filter(n => allDeps.has(n.id));
|
|
96
|
-
const atRisk = affectedNodes.filter(n => n.rating < 6).sort((a, b) => a.rating - b.rating);
|
|
97
|
-
const data = {
|
|
98
|
-
filePath,
|
|
99
|
-
direct: [...directDeps],
|
|
100
|
-
transitive: transitiveDeps,
|
|
101
|
-
atRisk,
|
|
102
|
-
};
|
|
103
|
-
return (0, shared_1.envelope)('get_impact_analysis', data, lines.join('\n'));
|
|
104
|
-
}
|
|
105
|
-
async function handlePredictImpactWithRemediation(args) {
|
|
106
|
-
const filePath = String(args.file_path ?? '');
|
|
107
|
-
if (!filePath)
|
|
108
|
-
return (0, shared_1.text)('Error: file_path is required.');
|
|
109
|
-
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(path.dirname(filePath)));
|
|
110
|
-
const encodedRepo = encodeURIComponent(repo);
|
|
111
|
-
const [graphRaw, cyclesRaw] = await Promise.all([
|
|
112
|
-
(0, helpers_1.fetchDaemonApi)(`/api/graph?repo=${encodedRepo}`),
|
|
113
|
-
(0, helpers_1.fetchDaemonApi)(`/api/cycles?repo=${encodedRepo}`),
|
|
114
|
-
]);
|
|
115
|
-
if (!graphRaw) {
|
|
116
|
-
return (0, shared_1.text)('Error: Gate Keeper daemon is not running. Start it with `npm run daemon` or `npm run dev`.');
|
|
117
|
-
}
|
|
118
|
-
const graph = graphRaw;
|
|
119
|
-
const cycles = (cyclesRaw ?? []);
|
|
120
|
-
const reverseAdj = buildReverseAdjacency(graph);
|
|
121
|
-
const { direct: directDeps, all: allDeps } = collectTransitiveDependents(reverseAdj, filePath);
|
|
122
|
-
const transitiveDeps = [...allDeps].filter(d => !directDeps.has(d));
|
|
123
|
-
const remediation = await (0, impact_format_1.renderRemediationPlan)(graph, allDeps, cycles, repo);
|
|
124
|
-
const plan = await (0, impact_format_1.buildRemediationPlan)(filePath, graph, directDeps, allDeps);
|
|
125
|
-
const lines = [
|
|
126
|
-
`## Impact + Remediation: ${path.basename(filePath)}`,
|
|
127
|
-
`**Path:** ${filePath}`,
|
|
128
|
-
`**Direct dependents:** ${directDeps.size} | **Total affected (transitive):** ${allDeps.size}`,
|
|
129
|
-
'',
|
|
130
|
-
...(0, impact_format_1.renderDirectDependents)(graph, directDeps, repo),
|
|
131
|
-
...(0, impact_format_1.renderTransitiveDependents)(graph, transitiveDeps, repo),
|
|
132
|
-
...remediation,
|
|
133
|
-
];
|
|
134
|
-
if (allDeps.size === 0) {
|
|
135
|
-
lines.push('No other files depend on this file. Changes here have no downstream impact.');
|
|
136
|
-
}
|
|
137
|
-
return (0, shared_1.envelope)('predict_impact_with_remediation', plan, lines.join('\n'));
|
|
138
|
-
}
|
|
139
|
-
//# sourceMappingURL=impact.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"impact.js","sourceRoot":"","sources":["../../../src/mcp/handlers/impact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { McpResponse } from './shared';
|
|
2
|
-
export declare function handleSuggestRefactoring(args: Record<string, unknown>): Promise<McpResponse>;
|
|
3
|
-
export declare function handleViolationPatterns(args: Record<string, unknown>): Promise<McpResponse>;
|
|
4
|
-
//# sourceMappingURL=improvement.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"improvement.d.ts","sourceRoot":"","sources":["../../../src/mcp/handlers/improvement.ts"],"names":[],"mappings":"AAQA,OAAO,EAAkB,WAAW,EAAE,MAAM,UAAU,CAAC;AAUvD,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAiDlG;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CA4DjG"}
|