@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,139 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.js","sourceRoot":"","sources":["../../../src/mcp/handlers/impact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
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.handleSuggestRefactoring = handleSuggestRefactoring;
|
|
37
|
+
exports.handleViolationPatterns = handleViolationPatterns;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const universal_analyzer_1 = require("../../analyzer/universal-analyzer");
|
|
41
|
+
const refactoring_advisor_1 = require("../../analyzer/refactoring-advisor");
|
|
42
|
+
const pattern_detector_1 = require("../../analyzer/pattern-detector");
|
|
43
|
+
const helpers_1 = require("../helpers");
|
|
44
|
+
const shared_1 = require("./shared");
|
|
45
|
+
// ── Shared instances ───────────────────────────────────────
|
|
46
|
+
const fileAnalyzer = new universal_analyzer_1.UniversalAnalyzer();
|
|
47
|
+
const refactoringAdvisor = new refactoring_advisor_1.RefactoringAdvisor();
|
|
48
|
+
const patternDetector = new pattern_detector_1.PatternDetector();
|
|
49
|
+
// ── Handlers ───────────────────────────────────────────────
|
|
50
|
+
async function handleSuggestRefactoring(args) {
|
|
51
|
+
const filePath = String(args.file_path ?? '');
|
|
52
|
+
if (!filePath)
|
|
53
|
+
return (0, shared_1.text)('Error: file_path is required.');
|
|
54
|
+
if (!fs.existsSync(filePath))
|
|
55
|
+
return (0, shared_1.text)(`Error: File not found: ${filePath}`);
|
|
56
|
+
if (!fileAnalyzer.isSupportedFile(filePath)) {
|
|
57
|
+
return (0, shared_1.text)('Error: Unsupported file type. Supported: .ts, .tsx, .jsx, .js, .cs');
|
|
58
|
+
}
|
|
59
|
+
const analysis = await fileAnalyzer.analyze(filePath);
|
|
60
|
+
if (!analysis)
|
|
61
|
+
return (0, shared_1.text)('Error: Analysis returned no results.');
|
|
62
|
+
const repo = (0, helpers_1.findGitRoot)(path.dirname(filePath));
|
|
63
|
+
const encodedRepo = encodeURIComponent(repo);
|
|
64
|
+
const cyclesRaw = await (0, helpers_1.fetchDaemonApi)(`/api/cycles?repo=${encodedRepo}`);
|
|
65
|
+
const cycles = (cyclesRaw ?? []);
|
|
66
|
+
const hints = refactoringAdvisor.suggest(analysis, cycles);
|
|
67
|
+
if (hints.length === 0) {
|
|
68
|
+
return (0, shared_1.envelope)('suggest_refactoring', { file: analysis, hints: [], rating: analysis.rating, totalPotentialGain: 0 }, `## Refactoring Suggestions: ${path.basename(filePath)}\n\nNo refactoring hints — file looks clean!`);
|
|
69
|
+
}
|
|
70
|
+
const lines = [
|
|
71
|
+
`## Refactoring Suggestions: ${path.basename(filePath)}`,
|
|
72
|
+
`**Current Rating: ${analysis.rating}/10** | **${hints.length} hint(s) found**`,
|
|
73
|
+
`**Total Potential Gain: +${Math.round(hints.reduce((s, h) => s + h.estimatedRatingGain, 0) * 10) / 10} pts**`,
|
|
74
|
+
'',
|
|
75
|
+
];
|
|
76
|
+
hints.forEach((hint, i) => {
|
|
77
|
+
const priorityIcon = hint.priority === 'high' ? '🔴' : hint.priority === 'medium' ? '🟡' : '🟢';
|
|
78
|
+
lines.push(`### ${i + 1}. ${hint.patternName} ${priorityIcon}`);
|
|
79
|
+
lines.push(`**Pattern:** \`${hint.violationType}\` | **Estimated Gain:** +${hint.estimatedRatingGain} pts`);
|
|
80
|
+
lines.push(`**Why:** ${hint.rationale}`);
|
|
81
|
+
lines.push('**Steps:**');
|
|
82
|
+
hint.steps.forEach((step, j) => lines.push(`${j + 1}. ${step}`));
|
|
83
|
+
lines.push('');
|
|
84
|
+
});
|
|
85
|
+
const totalPotentialGain = Math.round(hints.reduce((s, h) => s + h.estimatedRatingGain, 0) * 10) / 10;
|
|
86
|
+
return (0, shared_1.envelope)('suggest_refactoring', { file: analysis, hints, rating: analysis.rating, totalPotentialGain }, lines.join('\n'));
|
|
87
|
+
}
|
|
88
|
+
async function handleViolationPatterns(args) {
|
|
89
|
+
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(process.cwd()));
|
|
90
|
+
const encodedRepo = encodeURIComponent(repo);
|
|
91
|
+
let reports = null;
|
|
92
|
+
const daemonRaw = await (0, helpers_1.fetchDaemonApi)(`/api/patterns?repo=${encodedRepo}`);
|
|
93
|
+
if (daemonRaw && Array.isArray(daemonRaw)) {
|
|
94
|
+
reports = daemonRaw;
|
|
95
|
+
}
|
|
96
|
+
if (!reports) {
|
|
97
|
+
const files = (0, helpers_1.findSourceFiles)(repo, 200);
|
|
98
|
+
const analyses = [];
|
|
99
|
+
for (const f of files) {
|
|
100
|
+
const a = await fileAnalyzer.analyze(f);
|
|
101
|
+
if (a)
|
|
102
|
+
analyses.push(a);
|
|
103
|
+
}
|
|
104
|
+
reports = patternDetector.detect(analyses);
|
|
105
|
+
}
|
|
106
|
+
if (reports.length === 0) {
|
|
107
|
+
return (0, shared_1.envelope)('get_violation_patterns', { repo, patterns: [], totalGain: 0, fixOrder: [] }, '## Violation Patterns\n\nNo violations found across the codebase. Everything looks clean!');
|
|
108
|
+
}
|
|
109
|
+
const totalGain = Math.round(reports.reduce((s, r) => s + r.estimatedRatingGain, 0) * 10) / 10;
|
|
110
|
+
const lines = [
|
|
111
|
+
`## Violation Patterns — ${path.basename(repo)}`,
|
|
112
|
+
`**${reports.length} distinct violation types** across the codebase | **Total estimated gain if all fixed: +${totalGain} pts**`,
|
|
113
|
+
'',
|
|
114
|
+
'| Rank | Pattern | Severity | Files | Occurrences | Est. Gain |',
|
|
115
|
+
'|------|---------|----------|-------|-------------|-----------|',
|
|
116
|
+
];
|
|
117
|
+
reports.forEach((r, i) => {
|
|
118
|
+
const sev = r.severity === 'error' ? '🔴 error' : r.severity === 'warning' ? '🟡 warning' : '🟢 info';
|
|
119
|
+
lines.push(`| ${i + 1} | \`${r.violationType}\` | ${sev} | ${r.fileCount} | ${r.totalOccurrences} | +${r.estimatedRatingGain} |`);
|
|
120
|
+
});
|
|
121
|
+
lines.push('');
|
|
122
|
+
lines.push('### Module-Wide Fix Suggestions (top 5 by impact)');
|
|
123
|
+
for (const r of reports.slice(0, 5)) {
|
|
124
|
+
lines.push(`**\`${r.violationType}\`** — ${r.moduleSuggestion}`);
|
|
125
|
+
lines.push(` Affects: ${r.affectedFiles.slice(0, 3).map(f => path.relative(repo, f)).join(', ')}${r.fileCount > 3 ? ` ... and ${r.fileCount - 3} more` : ''}`);
|
|
126
|
+
lines.push('');
|
|
127
|
+
}
|
|
128
|
+
// Aggregate files across all patterns to give the queue a single fix order.
|
|
129
|
+
const fileSet = new Set();
|
|
130
|
+
for (const r of reports)
|
|
131
|
+
for (const f of r.affectedFiles)
|
|
132
|
+
fileSet.add(f);
|
|
133
|
+
const fixOrder = [...fileSet];
|
|
134
|
+
return (0, shared_1.envelope)('get_violation_patterns', { repo, patterns: reports, totalGain, fixOrder }, lines.join('\n'));
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=improvement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"improvement.js","sourceRoot":"","sources":["../../../src/mcp/handlers/improvement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Handlers — barrel module
|
|
3
|
+
*
|
|
4
|
+
* Re-exports handler functions and provides the tool-call router
|
|
5
|
+
* used by the JSON-RPC message handler.
|
|
6
|
+
*/
|
|
7
|
+
import { text, McpResponse } from './shared';
|
|
8
|
+
import { handleCodebaseHealth, handleQualityRules } from './analysis';
|
|
9
|
+
import { handleFileContext, handleDependencyGraph, handleGraphSummary } from './graph';
|
|
10
|
+
export { text };
|
|
11
|
+
export { handleCodebaseHealth, handleQualityRules };
|
|
12
|
+
export { handleFileContext, handleDependencyGraph, handleGraphSummary };
|
|
13
|
+
export declare function handleToolCall(name: string, args: Record<string, unknown>): Promise<McpResponse>;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,IAAI,EAAE,CAAC;AAChB,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC;AAExE,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,WAAW,CAAC,CAetB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Tool Handlers — barrel module
|
|
4
|
+
*
|
|
5
|
+
* Re-exports handler functions and provides the tool-call router
|
|
6
|
+
* used by the JSON-RPC message handler.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.handleGraphSummary = exports.handleDependencyGraph = exports.handleFileContext = exports.handleQualityRules = exports.handleCodebaseHealth = exports.text = void 0;
|
|
10
|
+
exports.handleToolCall = handleToolCall;
|
|
11
|
+
const shared_1 = require("./shared");
|
|
12
|
+
Object.defineProperty(exports, "text", { enumerable: true, get: function () { return shared_1.text; } });
|
|
13
|
+
const analysis_1 = require("./analysis");
|
|
14
|
+
Object.defineProperty(exports, "handleCodebaseHealth", { enumerable: true, get: function () { return analysis_1.handleCodebaseHealth; } });
|
|
15
|
+
Object.defineProperty(exports, "handleQualityRules", { enumerable: true, get: function () { return analysis_1.handleQualityRules; } });
|
|
16
|
+
const graph_1 = require("./graph");
|
|
17
|
+
Object.defineProperty(exports, "handleFileContext", { enumerable: true, get: function () { return graph_1.handleFileContext; } });
|
|
18
|
+
Object.defineProperty(exports, "handleDependencyGraph", { enumerable: true, get: function () { return graph_1.handleDependencyGraph; } });
|
|
19
|
+
Object.defineProperty(exports, "handleGraphSummary", { enumerable: true, get: function () { return graph_1.handleGraphSummary; } });
|
|
20
|
+
async function handleToolCall(name, args) {
|
|
21
|
+
switch (name) {
|
|
22
|
+
case 'get_codebase_health':
|
|
23
|
+
return (0, analysis_1.handleCodebaseHealth)(args);
|
|
24
|
+
case 'get_quality_rules':
|
|
25
|
+
return (0, analysis_1.handleQualityRules)();
|
|
26
|
+
case 'get_file_context':
|
|
27
|
+
return (0, graph_1.handleFileContext)(args);
|
|
28
|
+
case 'get_dependency_graph':
|
|
29
|
+
return (0, graph_1.handleDependencyGraph)(args);
|
|
30
|
+
case 'get_graph_summary':
|
|
31
|
+
return (0, graph_1.handleGraphSummary)(args);
|
|
32
|
+
default:
|
|
33
|
+
return (0, shared_1.text)(`Unknown tool: ${name}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/handlers/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAiBH,wCAkBC;AAjCD,qCAA6C;AAWpC,qFAXA,aAAI,OAWA;AAVb,yCAGoB;AAQX,qGAVP,+BAAoB,OAUO;AAAE,mGAT7B,6BAAkB,OAS6B;AAPjD,mCAIiB;AAIR,kGAPP,yBAAiB,OAOO;AAAE,sGAN1B,6BAAqB,OAM0B;AAAE,mGALjD,0BAAkB,OAKiD;AAE9D,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,IAA6B;IAE7B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,qBAAqB;YACxB,OAAO,IAAA,+BAAoB,EAAC,IAAI,CAAC,CAAC;QACpC,KAAK,mBAAmB;YACtB,OAAO,IAAA,6BAAkB,GAAE,CAAC;QAC9B,KAAK,kBAAkB;YACrB,OAAO,IAAA,yBAAiB,EAAC,IAAI,CAAC,CAAC;QACjC,KAAK,sBAAsB;YACzB,OAAO,IAAA,6BAAqB,EAAC,IAAI,CAAC,CAAC;QACrC,KAAK,mBAAmB;YACtB,OAAO,IAAA,0BAAkB,EAAC,IAAI,CAAC,CAAC;QAClC;YACE,OAAO,IAAA,aAAI,EAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP handlers for platform integration and git hook installation.
|
|
3
|
+
*
|
|
4
|
+
* install_platform — writes AI assistant config files (CLAUDE.md, copilot-instructions.md, etc.)
|
|
5
|
+
* install_git_hooks — installs post-commit / post-checkout hooks into .git/hooks/
|
|
6
|
+
*/
|
|
7
|
+
import { McpResponse } from './shared';
|
|
8
|
+
export declare function handleInstallPlatform(args: Record<string, unknown>): Promise<McpResponse>;
|
|
9
|
+
export declare function handleInstallGitHooks(args: Record<string, unknown>): Promise<McpResponse>;
|
|
10
|
+
//# sourceMappingURL=platform-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-installer.d.ts","sourceRoot":"","sources":["../../../src/mcp/handlers/platform-installer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAkB,WAAW,EAAE,MAAM,UAAU,CAAC;AAQvD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAyD/F;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAwC/F"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP handlers for platform integration and git hook installation.
|
|
4
|
+
*
|
|
5
|
+
* install_platform — writes AI assistant config files (CLAUDE.md, copilot-instructions.md, etc.)
|
|
6
|
+
* install_git_hooks — installs post-commit / post-checkout hooks into .git/hooks/
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.handleInstallPlatform = handleInstallPlatform;
|
|
43
|
+
exports.handleInstallGitHooks = handleInstallGitHooks;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const helpers_1 = require("../helpers");
|
|
47
|
+
const shared_1 = require("./shared");
|
|
48
|
+
const installer_1 = require("../installer");
|
|
49
|
+
const git_hooks_1 = require("../../hooks/git-hooks");
|
|
50
|
+
const GATE_KEEPER_DIR = path.join(__dirname, '..', '..', '..');
|
|
51
|
+
const SUPPORTED_PLATFORMS = ['claude-code', 'copilot', 'cursor', 'vscode', 'github-action'];
|
|
52
|
+
async function handleInstallPlatform(args) {
|
|
53
|
+
const platform = String(args.platform ?? '');
|
|
54
|
+
if (!SUPPORTED_PLATFORMS.includes(platform)) {
|
|
55
|
+
return (0, shared_1.text)(`Error: unknown platform "${platform}". ` +
|
|
56
|
+
`Supported: ${SUPPORTED_PLATFORMS.join(', ')}.`);
|
|
57
|
+
}
|
|
58
|
+
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(process.cwd()));
|
|
59
|
+
const force = Boolean(args.force ?? false);
|
|
60
|
+
const gkPath = String(args.gate_keeper_path ?? GATE_KEEPER_DIR);
|
|
61
|
+
const config = (0, installer_1.getPlatformConfig)(platform, repo, gkPath);
|
|
62
|
+
const targetPath = config.filePath;
|
|
63
|
+
const exists = fs.existsSync(targetPath);
|
|
64
|
+
if (exists && !force && !config.append) {
|
|
65
|
+
return (0, shared_1.text)(`File already exists: ${targetPath}\n` +
|
|
66
|
+
`Pass force=true to overwrite, or use append mode if available.`);
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const dir = path.dirname(targetPath);
|
|
70
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
71
|
+
if (config.append && exists) {
|
|
72
|
+
const current = fs.readFileSync(targetPath, 'utf8');
|
|
73
|
+
if (current.includes('Gate Keeper')) {
|
|
74
|
+
return (0, shared_1.text)(`Gate Keeper section already present in ${targetPath}. No changes made.`);
|
|
75
|
+
}
|
|
76
|
+
fs.appendFileSync(targetPath, config.content, 'utf8');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
fs.writeFileSync(targetPath, config.content, 'utf8');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
84
|
+
return (0, shared_1.text)(`Error writing ${targetPath}: ${msg}`);
|
|
85
|
+
}
|
|
86
|
+
const action = config.append ? 'appended to' : (exists ? 'updated' : 'created');
|
|
87
|
+
const lines = [
|
|
88
|
+
`## Platform Integration: ${platform}`,
|
|
89
|
+
`**${action}:** ${targetPath}`,
|
|
90
|
+
`**Description:** ${config.description}`,
|
|
91
|
+
'',
|
|
92
|
+
config.append
|
|
93
|
+
? `Content appended to existing file.`
|
|
94
|
+
: `File written (${config.content.length} bytes).`,
|
|
95
|
+
'',
|
|
96
|
+
'**Next steps:**',
|
|
97
|
+
...nextSteps(platform, repo),
|
|
98
|
+
];
|
|
99
|
+
return (0, shared_1.envelope)('install_platform', { platform, filePath: targetPath, action }, lines.join('\n'));
|
|
100
|
+
}
|
|
101
|
+
async function handleInstallGitHooks(args) {
|
|
102
|
+
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(process.cwd()));
|
|
103
|
+
const force = Boolean(args.force ?? false);
|
|
104
|
+
const gkPath = String(args.gate_keeper_path ?? GATE_KEEPER_DIR);
|
|
105
|
+
let results;
|
|
106
|
+
try {
|
|
107
|
+
results = (0, git_hooks_1.installGitHooks)(repo, gkPath, force);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
111
|
+
return (0, shared_1.text)(`Error installing git hooks: ${msg}`);
|
|
112
|
+
}
|
|
113
|
+
const created = results.filter(r => r.action === 'created').length;
|
|
114
|
+
const updated = results.filter(r => r.action === 'updated').length;
|
|
115
|
+
const skipped = results.filter(r => r.action === 'skipped').length;
|
|
116
|
+
const lines = [
|
|
117
|
+
'## Git Hooks Installation',
|
|
118
|
+
`**Repository:** ${repo}`,
|
|
119
|
+
`**Created:** ${created} | **Updated:** ${updated} | **Skipped:** ${skipped}`,
|
|
120
|
+
'',
|
|
121
|
+
'| Hook | Path | Action |',
|
|
122
|
+
'|------|------|--------|',
|
|
123
|
+
...results.map(r => `| ${r.hook} | ${path.relative(repo, r.path)} | ${r.action} |`),
|
|
124
|
+
'',
|
|
125
|
+
'**Merge driver (optional):**',
|
|
126
|
+
'To prevent merge conflicts in graph.json, add to .gitattributes:',
|
|
127
|
+
'```',
|
|
128
|
+
(0, git_hooks_1.gitAttributesEntry)().trim(),
|
|
129
|
+
'```',
|
|
130
|
+
'And to .git/config:',
|
|
131
|
+
'```',
|
|
132
|
+
(0, git_hooks_1.gitConfigEntry)(gkPath).trim(),
|
|
133
|
+
'```',
|
|
134
|
+
'',
|
|
135
|
+
'_Hooks run non-blocking after commits/checkouts — they do not slow down git operations._',
|
|
136
|
+
];
|
|
137
|
+
return (0, shared_1.envelope)('install_git_hooks', { repo, results }, lines.join('\n'));
|
|
138
|
+
}
|
|
139
|
+
function nextSteps(platform, repo) {
|
|
140
|
+
switch (platform) {
|
|
141
|
+
case 'claude-code':
|
|
142
|
+
return [
|
|
143
|
+
'- Restart Claude Code to load the updated CLAUDE.md.',
|
|
144
|
+
'- The session-start protocol will now automatically call `get_graph_report`.',
|
|
145
|
+
];
|
|
146
|
+
case 'copilot':
|
|
147
|
+
return [
|
|
148
|
+
'- GitHub Copilot will read .github/copilot-instructions.md automatically.',
|
|
149
|
+
'- Ensure the gate-keeper MCP server is running: `npm run mcp`.',
|
|
150
|
+
];
|
|
151
|
+
case 'cursor':
|
|
152
|
+
return [
|
|
153
|
+
'- Cursor reads .cursorrules automatically on project open.',
|
|
154
|
+
'- Ensure the gate-keeper MCP server is registered in Cursor settings.',
|
|
155
|
+
];
|
|
156
|
+
case 'vscode':
|
|
157
|
+
return [
|
|
158
|
+
'- Open VS Code and accept the MCP server popup.',
|
|
159
|
+
'- Or run: `npm run mcp` and check the MCP panel.',
|
|
160
|
+
];
|
|
161
|
+
case 'github-action':
|
|
162
|
+
return [
|
|
163
|
+
`- Commit .github/workflows/gate-keeper.yml to activate the workflow.`,
|
|
164
|
+
'- The workflow runs on push and PR, posting quality summaries as comments.',
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=platform-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-installer.js","sourceRoot":"","sources":["../../../src/mcp/handlers/platform-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR review handler — risk-scores a set of changed files against the graph.
|
|
3
|
+
*
|
|
4
|
+
* Each changed file gets a traffic-light verdict:
|
|
5
|
+
* GREEN — leaf node, no dependents, rating ≥ 7
|
|
6
|
+
* YELLOW — some dependents OR rating 5–7
|
|
7
|
+
* RED — god node with fragile dependents OR rating < 5
|
|
8
|
+
*
|
|
9
|
+
* Returns an overall risk summary plus per-file breakdown.
|
|
10
|
+
*/
|
|
11
|
+
import { GraphResponse } from './types';
|
|
12
|
+
import { McpResponse } from './shared';
|
|
13
|
+
export type FileVerdict = 'GREEN' | 'YELLOW' | 'RED';
|
|
14
|
+
export interface FileRisk {
|
|
15
|
+
file: string;
|
|
16
|
+
verdict: FileVerdict;
|
|
17
|
+
rating: number | null;
|
|
18
|
+
directDependents: number;
|
|
19
|
+
fragileImpacted: number;
|
|
20
|
+
reasons: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface PRReviewResult {
|
|
23
|
+
overallVerdict: FileVerdict;
|
|
24
|
+
changedFiles: number;
|
|
25
|
+
redFiles: number;
|
|
26
|
+
yellowFiles: number;
|
|
27
|
+
greenFiles: number;
|
|
28
|
+
fileRisks: FileRisk[];
|
|
29
|
+
recommendation: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function assessFile(filePath: string, graph: GraphResponse, revAdj: Map<string, string[]>, ratings: Map<string, number>): FileRisk;
|
|
32
|
+
export declare function handlePRReview(args: Record<string, unknown>): Promise<McpResponse>;
|
|
33
|
+
//# sourceMappingURL=pr-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-review.d.ts","sourceRoot":"","sources":["../../../src/mcp/handlers/pr-review.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAkB,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAErD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,WAAW,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAQD,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC7B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,QAAQ,CAsCV;AAgBD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CA6ExF"}
|