@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,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PR review handler — risk-scores a set of changed files against the graph.
|
|
4
|
+
*
|
|
5
|
+
* Each changed file gets a traffic-light verdict:
|
|
6
|
+
* GREEN — leaf node, no dependents, rating ≥ 7
|
|
7
|
+
* YELLOW — some dependents OR rating 5–7
|
|
8
|
+
* RED — god node with fragile dependents OR rating < 5
|
|
9
|
+
*
|
|
10
|
+
* Returns an overall risk summary plus per-file breakdown.
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.assessFile = assessFile;
|
|
47
|
+
exports.handlePRReview = handlePRReview;
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const child_process_1 = require("child_process");
|
|
50
|
+
const helpers_1 = require("../helpers");
|
|
51
|
+
const shared_1 = require("./shared");
|
|
52
|
+
const graph_algorithms_1 = require("../../graph/graph-algorithms");
|
|
53
|
+
function ratingMap(graph) {
|
|
54
|
+
const m = new Map();
|
|
55
|
+
for (const n of graph.nodes)
|
|
56
|
+
m.set(n.id, n.rating);
|
|
57
|
+
return m;
|
|
58
|
+
}
|
|
59
|
+
function assessFile(filePath, graph, revAdj, ratings) {
|
|
60
|
+
const rating = ratings.get(filePath) ?? null;
|
|
61
|
+
const impactSet = (0, graph_algorithms_1.getImpactSet)(filePath, revAdj, ratings, 2, 6);
|
|
62
|
+
const directDependents = impactSet.filter(e => e.severity === 'direct').length;
|
|
63
|
+
const fragileImpacted = impactSet.filter(e => e.fragile).length;
|
|
64
|
+
const reasons = [];
|
|
65
|
+
let verdict = 'GREEN';
|
|
66
|
+
if (rating !== null && rating < 5) {
|
|
67
|
+
verdict = 'RED';
|
|
68
|
+
reasons.push(`Low quality file (rating ${rating}/10)`);
|
|
69
|
+
}
|
|
70
|
+
else if (rating !== null && rating < 7) {
|
|
71
|
+
verdict = 'YELLOW';
|
|
72
|
+
reasons.push(`Below-threshold quality (rating ${rating}/10)`);
|
|
73
|
+
}
|
|
74
|
+
if (fragileImpacted >= 3) {
|
|
75
|
+
verdict = 'RED';
|
|
76
|
+
reasons.push(`${fragileImpacted} fragile dependents (rating<6) will be impacted`);
|
|
77
|
+
}
|
|
78
|
+
else if (fragileImpacted >= 1) {
|
|
79
|
+
if (verdict !== 'RED')
|
|
80
|
+
verdict = 'YELLOW';
|
|
81
|
+
reasons.push(`${fragileImpacted} fragile dependent(s) may be impacted`);
|
|
82
|
+
}
|
|
83
|
+
if (directDependents >= 10) {
|
|
84
|
+
verdict = 'RED';
|
|
85
|
+
reasons.push(`God node — ${directDependents} direct dependents`);
|
|
86
|
+
}
|
|
87
|
+
else if (directDependents >= 3) {
|
|
88
|
+
if (verdict !== 'RED')
|
|
89
|
+
verdict = 'YELLOW';
|
|
90
|
+
reasons.push(`${directDependents} direct dependents`);
|
|
91
|
+
}
|
|
92
|
+
if (reasons.length === 0) {
|
|
93
|
+
reasons.push(rating !== null ? `Healthy file (rating ${rating}/10)` : 'Not yet analyzed');
|
|
94
|
+
}
|
|
95
|
+
return { file: filePath, verdict, rating, directDependents, fragileImpacted, reasons };
|
|
96
|
+
}
|
|
97
|
+
function getChangedFilesFromGit(repo) {
|
|
98
|
+
const result = (0, child_process_1.spawnSync)('git', ['diff', '--name-only', 'HEAD~1', 'HEAD'], { cwd: repo, encoding: 'utf8', timeout: 5000 });
|
|
99
|
+
if (result.status !== 0)
|
|
100
|
+
return [];
|
|
101
|
+
return result.stdout
|
|
102
|
+
.split('\n')
|
|
103
|
+
.map(f => f.trim())
|
|
104
|
+
.filter(f => f && /\.(ts|tsx|js|jsx|cs)$/.test(f))
|
|
105
|
+
.map(f => path.join(repo, f));
|
|
106
|
+
}
|
|
107
|
+
async function handlePRReview(args) {
|
|
108
|
+
const repo = String(args.repo ?? (0, helpers_1.findGitRoot)(process.cwd()));
|
|
109
|
+
const encodedRepo = encodeURIComponent(repo);
|
|
110
|
+
// Resolve file list — explicit input takes precedence, fallback to git diff
|
|
111
|
+
let changedFiles;
|
|
112
|
+
if (Array.isArray(args.changed_files) && args.changed_files.length > 0) {
|
|
113
|
+
changedFiles = args.changed_files.map(f => {
|
|
114
|
+
const s = String(f);
|
|
115
|
+
return path.isAbsolute(s) ? s : path.join(repo, s);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
changedFiles = getChangedFilesFromGit(repo);
|
|
120
|
+
}
|
|
121
|
+
if (changedFiles.length === 0) {
|
|
122
|
+
return (0, shared_1.text)('No changed source files found. Pass changed_files[] or ensure HEAD~1 exists.');
|
|
123
|
+
}
|
|
124
|
+
const graphRaw = await (0, helpers_1.fetchDaemonApi)(`/api/graph?repo=${encodedRepo}`);
|
|
125
|
+
if (!graphRaw) {
|
|
126
|
+
return (0, shared_1.text)('Error: Gate Keeper daemon is not running. Start it with `npm run daemon` or `npm run dev`.');
|
|
127
|
+
}
|
|
128
|
+
const graph = graphRaw;
|
|
129
|
+
const revAdj = (0, graph_algorithms_1.buildReverseAdjacency)(graph.edges);
|
|
130
|
+
const ratings = ratingMap(graph);
|
|
131
|
+
const fileRisks = changedFiles.map(f => assessFile(f, graph, revAdj, ratings));
|
|
132
|
+
const redFiles = fileRisks.filter(r => r.verdict === 'RED').length;
|
|
133
|
+
const yellowFiles = fileRisks.filter(r => r.verdict === 'YELLOW').length;
|
|
134
|
+
const greenFiles = fileRisks.filter(r => r.verdict === 'GREEN').length;
|
|
135
|
+
const overallVerdict = redFiles > 0 ? 'RED' : yellowFiles > 0 ? 'YELLOW' : 'GREEN';
|
|
136
|
+
const recommendation = redFiles > 0
|
|
137
|
+
? `❌ **Request changes** — ${redFiles} high-risk file(s) need attention before merge.`
|
|
138
|
+
: yellowFiles > 0
|
|
139
|
+
? `⚠️ **Review carefully** — ${yellowFiles} medium-risk file(s). Verify downstream impact.`
|
|
140
|
+
: `✅ **Approve** — all changed files are low-risk (no fragile dependents, quality ≥ 7).`;
|
|
141
|
+
const icon = { GREEN: '🟢', YELLOW: '🟡', RED: '🔴' };
|
|
142
|
+
const lines = [
|
|
143
|
+
'## PR Risk Assessment',
|
|
144
|
+
`**Changed files:** ${changedFiles.length} | 🔴 Red: ${redFiles} | 🟡 Yellow: ${yellowFiles} | 🟢 Green: ${greenFiles}`,
|
|
145
|
+
'',
|
|
146
|
+
recommendation,
|
|
147
|
+
'',
|
|
148
|
+
'| File | Verdict | Rating | Dependents | Fragile Impact | Reason |',
|
|
149
|
+
'|------|---------|--------|------------|----------------|--------|',
|
|
150
|
+
];
|
|
151
|
+
for (const r of fileRisks) {
|
|
152
|
+
const rel = path.relative(repo, r.file);
|
|
153
|
+
const ratingStr = r.rating !== null ? `${r.rating}/10` : '?';
|
|
154
|
+
lines.push(`| ${rel} | ${icon[r.verdict]} ${r.verdict} | ${ratingStr} | ${r.directDependents} | ${r.fragileImpacted} | ${r.reasons[0]} |`);
|
|
155
|
+
}
|
|
156
|
+
const worstFiles = fileRisks.filter(r => r.verdict === 'RED');
|
|
157
|
+
if (worstFiles.length > 0) {
|
|
158
|
+
lines.push('', '**Action required for RED files:**');
|
|
159
|
+
for (const r of worstFiles) {
|
|
160
|
+
lines.push(`- **${path.basename(r.file)}**: ${r.reasons.join('; ')}`);
|
|
161
|
+
lines.push(` → Run \`suggest_refactoring("${r.file}")\` for fix instructions`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const result = {
|
|
165
|
+
overallVerdict, changedFiles: changedFiles.length,
|
|
166
|
+
redFiles, yellowFiles, greenFiles, fileRisks, recommendation,
|
|
167
|
+
};
|
|
168
|
+
return (0, shared_1.envelope)('pr_review', result, lines.join('\n'));
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=pr-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-review.js","sourceRoot":"","sources":["../../../src/mcp/handlers/pr-review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared MCP response helpers.
|
|
3
|
+
*
|
|
4
|
+
* `text()` builds a markdown-only response (used for errors and legacy handlers).
|
|
5
|
+
* `envelope()` builds a dual response: markdown for humans + structuredContent
|
|
6
|
+
* for autonomous agents. Per MCP spec rev 2025-03-26 — older clients ignore the
|
|
7
|
+
* extra field and continue parsing content[0].text.
|
|
8
|
+
*/
|
|
9
|
+
import { AgentResponseEnvelope } from '../../types';
|
|
10
|
+
export interface McpResponse {
|
|
11
|
+
content: Array<{
|
|
12
|
+
type: string;
|
|
13
|
+
text: string;
|
|
14
|
+
}>;
|
|
15
|
+
structuredContent?: AgentResponseEnvelope;
|
|
16
|
+
isError?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function text(content: string): McpResponse;
|
|
19
|
+
export declare function envelope<T>(tool: string, data: T, markdown: string): McpResponse;
|
|
20
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/mcp/handlers/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAEjD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAUhF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared MCP response helpers.
|
|
4
|
+
*
|
|
5
|
+
* `text()` builds a markdown-only response (used for errors and legacy handlers).
|
|
6
|
+
* `envelope()` builds a dual response: markdown for humans + structuredContent
|
|
7
|
+
* for autonomous agents. Per MCP spec rev 2025-03-26 — older clients ignore the
|
|
8
|
+
* extra field and continue parsing content[0].text.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.text = text;
|
|
12
|
+
exports.envelope = envelope;
|
|
13
|
+
function text(content) {
|
|
14
|
+
return { content: [{ type: 'text', text: content }] };
|
|
15
|
+
}
|
|
16
|
+
function envelope(tool, data, markdown) {
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: 'text', text: markdown }],
|
|
19
|
+
structuredContent: {
|
|
20
|
+
version: '1',
|
|
21
|
+
tool,
|
|
22
|
+
generatedAt: Date.now(),
|
|
23
|
+
data,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/mcp/handlers/shared.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAUH,oBAEC;AAED,4BAUC;AAdD,SAAgB,IAAI,CAAC,OAAe;IAClC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,SAAgB,QAAQ,CAAI,IAAY,EAAE,IAAO,EAAE,QAAgB;IACjE,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3C,iBAAiB,EAAE;YACjB,OAAO,EAAE,GAAG;YACZ,IAAI;YACJ,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;YACvB,IAAI;SACL;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { FileAnalysis } from '../../types';
|
|
2
|
+
export interface GraphNodeData {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
type: string;
|
|
6
|
+
rating: number;
|
|
7
|
+
size: number;
|
|
8
|
+
violations: Array<{
|
|
9
|
+
type: string;
|
|
10
|
+
severity: string;
|
|
11
|
+
message: string;
|
|
12
|
+
line?: number;
|
|
13
|
+
fix?: string;
|
|
14
|
+
}>;
|
|
15
|
+
metrics: {
|
|
16
|
+
linesOfCode: number;
|
|
17
|
+
cyclomaticComplexity: number;
|
|
18
|
+
numberOfMethods: number;
|
|
19
|
+
numberOfClasses: number;
|
|
20
|
+
importCount: number;
|
|
21
|
+
coveragePercent?: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface GraphEdgeData {
|
|
25
|
+
source: string;
|
|
26
|
+
target: string;
|
|
27
|
+
type: string;
|
|
28
|
+
strength: number;
|
|
29
|
+
}
|
|
30
|
+
export interface GraphResponse {
|
|
31
|
+
nodes: GraphNodeData[];
|
|
32
|
+
edges: GraphEdgeData[];
|
|
33
|
+
}
|
|
34
|
+
export interface FileDetailResponse {
|
|
35
|
+
analysis?: FileAnalysis;
|
|
36
|
+
ratingBreakdown?: Array<{
|
|
37
|
+
category: string;
|
|
38
|
+
deduction: number;
|
|
39
|
+
detail: string;
|
|
40
|
+
}>;
|
|
41
|
+
gitDiff?: {
|
|
42
|
+
added: number;
|
|
43
|
+
removed: number;
|
|
44
|
+
} | null;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/mcp/handlers/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpG,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACrD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mcp/handlers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Helpers
|
|
3
|
+
*
|
|
4
|
+
* Utility functions for file operations, formatting, and daemon communication.
|
|
5
|
+
*/
|
|
6
|
+
import { StringAnalysisResult } from '../analyzer/string-analyzer';
|
|
7
|
+
import { FileAnalysis } from '../types';
|
|
8
|
+
/**
|
|
9
|
+
* Reads the minimum rating threshold from the config file.
|
|
10
|
+
* Returns 7.0 if config doesn't exist or is invalid.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getMinRating(): number;
|
|
13
|
+
/**
|
|
14
|
+
* Fetch JSON from the Gate Keeper daemon HTTP API.
|
|
15
|
+
* Returns null if daemon is unreachable.
|
|
16
|
+
*/
|
|
17
|
+
export declare function fetchDaemonApi(urlPath: string): Promise<unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* Finds the git repository root directory from a starting path.
|
|
20
|
+
* Returns the original path if not in a git repo.
|
|
21
|
+
*/
|
|
22
|
+
export declare function findGitRoot(dir: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Recursively finds supported source files in a directory.
|
|
25
|
+
* Stops when maxFiles is reached.
|
|
26
|
+
*/
|
|
27
|
+
export declare function findSourceFiles(dir: string, maxFiles: number): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Formats a file analysis result as markdown for display.
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatAnalysisResult(analysis: FileAnalysis, minRating: number): string;
|
|
32
|
+
/**
|
|
33
|
+
* Formats an in-memory code analysis result as markdown.
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatStringResult(result: StringAnalysisResult, minRating: number): string;
|
|
36
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/mcp/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAkBxC;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAOrC;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYhE;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBvE;AAID;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAuCtF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAgC1F"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server Helpers
|
|
4
|
+
*
|
|
5
|
+
* Utility functions for file operations, formatting, and daemon communication.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.getMinRating = getMinRating;
|
|
42
|
+
exports.fetchDaemonApi = fetchDaemonApi;
|
|
43
|
+
exports.findGitRoot = findGitRoot;
|
|
44
|
+
exports.findSourceFiles = findSourceFiles;
|
|
45
|
+
exports.formatAnalysisResult = formatAnalysisResult;
|
|
46
|
+
exports.formatStringResult = formatStringResult;
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const http = __importStar(require("http"));
|
|
50
|
+
const child_process_1 = require("child_process");
|
|
51
|
+
const universal_analyzer_1 = require("../analyzer/universal-analyzer");
|
|
52
|
+
const fix_text_1 = require("../util/fix-text");
|
|
53
|
+
// ── Configuration ──────────────────────────────────────────
|
|
54
|
+
const GK_DIR = path.join(process.env.HOME ?? '/tmp', '.gate-keeper');
|
|
55
|
+
const CONFIG_FILE = path.join(GK_DIR, 'config.json');
|
|
56
|
+
const SKIP_DIRS = new Set([
|
|
57
|
+
'node_modules', '.git', 'dist', 'bin', 'obj', 'build', '.next',
|
|
58
|
+
'coverage', '.cache', '.turbo', 'out', 'target',
|
|
59
|
+
]);
|
|
60
|
+
// ── Shared instance ────────────────────────────────────────
|
|
61
|
+
const fileAnalyzer = new universal_analyzer_1.UniversalAnalyzer();
|
|
62
|
+
// ── Configuration Helpers ──────────────────────────────────
|
|
63
|
+
/**
|
|
64
|
+
* Reads the minimum rating threshold from the config file.
|
|
65
|
+
* Returns 7.0 if config doesn't exist or is invalid.
|
|
66
|
+
*/
|
|
67
|
+
function getMinRating() {
|
|
68
|
+
try {
|
|
69
|
+
const config = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
|
|
70
|
+
return config.minRating ?? 7.0;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return 7.0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ── Network Helpers ────────────────────────────────────────
|
|
77
|
+
const DAEMON_PORT = 5378;
|
|
78
|
+
/**
|
|
79
|
+
* Fetch JSON from the Gate Keeper daemon HTTP API.
|
|
80
|
+
* Returns null if daemon is unreachable.
|
|
81
|
+
*/
|
|
82
|
+
function fetchDaemonApi(urlPath) {
|
|
83
|
+
return new Promise((resolve) => {
|
|
84
|
+
const req = http.get(`http://127.0.0.1:${DAEMON_PORT}${urlPath}`, { timeout: 5000 }, (res) => {
|
|
85
|
+
let body = '';
|
|
86
|
+
res.on('data', (chunk) => { body += chunk; });
|
|
87
|
+
res.on('end', () => {
|
|
88
|
+
try {
|
|
89
|
+
resolve(JSON.parse(body));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
resolve(null);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
req.on('error', () => resolve(null));
|
|
97
|
+
req.on('timeout', () => { req.destroy(); resolve(null); });
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// ── File System Helpers ────────────────────────────────────
|
|
101
|
+
/**
|
|
102
|
+
* Finds the git repository root directory from a starting path.
|
|
103
|
+
* Returns the original path if not in a git repo.
|
|
104
|
+
*/
|
|
105
|
+
function findGitRoot(dir) {
|
|
106
|
+
const result = (0, child_process_1.spawnSync)('git', ['rev-parse', '--show-toplevel'], {
|
|
107
|
+
cwd: dir, encoding: 'utf8', timeout: 3000,
|
|
108
|
+
});
|
|
109
|
+
return result.status === 0 && result.stdout.trim() ? result.stdout.trim() : dir;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Recursively finds supported source files in a directory.
|
|
113
|
+
* Stops when maxFiles is reached.
|
|
114
|
+
*/
|
|
115
|
+
function findSourceFiles(dir, maxFiles) {
|
|
116
|
+
const files = [];
|
|
117
|
+
const walk = (d) => {
|
|
118
|
+
if (files.length >= maxFiles)
|
|
119
|
+
return;
|
|
120
|
+
let entries;
|
|
121
|
+
try {
|
|
122
|
+
entries = fs.readdirSync(d, { withFileTypes: true });
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
if (files.length >= maxFiles)
|
|
129
|
+
break;
|
|
130
|
+
const fullPath = path.join(d, entry.name);
|
|
131
|
+
if (entry.isDirectory()) {
|
|
132
|
+
if (!SKIP_DIRS.has(entry.name))
|
|
133
|
+
walk(fullPath);
|
|
134
|
+
}
|
|
135
|
+
else if (fileAnalyzer.isSupportedFile(fullPath)) {
|
|
136
|
+
files.push(fullPath);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
walk(dir);
|
|
141
|
+
return files;
|
|
142
|
+
}
|
|
143
|
+
// ── Formatting Helpers ─────────────────────────────────────
|
|
144
|
+
/**
|
|
145
|
+
* Formats a file analysis result as markdown for display.
|
|
146
|
+
*/
|
|
147
|
+
function formatAnalysisResult(analysis, minRating) {
|
|
148
|
+
const passed = analysis.rating >= minRating;
|
|
149
|
+
const icon = passed ? '✅' : '❌';
|
|
150
|
+
const status = passed ? 'PASSED' : 'NEEDS IMPROVEMENT';
|
|
151
|
+
const lines = [
|
|
152
|
+
`## ${path.basename(analysis.path)}`,
|
|
153
|
+
`**Rating: ${analysis.rating}/10** (minimum: ${minRating}) ${icon} ${status}`,
|
|
154
|
+
];
|
|
155
|
+
if (analysis.violations.length > 0) {
|
|
156
|
+
lines.push('', `### Violations (${analysis.violations.length})`);
|
|
157
|
+
for (const v of analysis.violations) {
|
|
158
|
+
const loc = v.line ? ` (line ${v.line})` : '';
|
|
159
|
+
lines.push(`- **${v.severity.toUpperCase()}** [${v.type}]${loc}: ${v.message}`);
|
|
160
|
+
const t = (0, fix_text_1.fixText)(v.fix);
|
|
161
|
+
if (t)
|
|
162
|
+
lines.push(` → Fix: ${t}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
lines.push('', '### Metrics', `- Lines of Code: ${analysis.metrics.linesOfCode}`, `- Cyclomatic Complexity: ${analysis.metrics.cyclomaticComplexity}`, `- Methods/Functions: ${analysis.metrics.numberOfMethods}`, `- Imports: ${analysis.metrics.importCount}`);
|
|
166
|
+
if (analysis.metrics.coveragePercent !== undefined) {
|
|
167
|
+
lines.push(`- Test Coverage: ${analysis.metrics.coveragePercent.toFixed(1)}%`);
|
|
168
|
+
}
|
|
169
|
+
if (!passed) {
|
|
170
|
+
lines.push('', '### Action Required', `Improve the code to reach the minimum rating of ${minRating}.`, 'Fix errors first (−1.5 pts each), then warnings (−0.5 pts each), then info hints (−0.1 pts each).');
|
|
171
|
+
}
|
|
172
|
+
return lines.join('\n');
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Formats an in-memory code analysis result as markdown.
|
|
176
|
+
*/
|
|
177
|
+
function formatStringResult(result, minRating) {
|
|
178
|
+
const passed = result.rating >= minRating;
|
|
179
|
+
const icon = passed ? '✅' : '❌';
|
|
180
|
+
const lines = [
|
|
181
|
+
`**Rating: ${result.rating}/10** (minimum: ${minRating}) ${icon} ${passed ? 'PASSED' : 'NEEDS IMPROVEMENT'}`,
|
|
182
|
+
];
|
|
183
|
+
if (result.violations.length > 0) {
|
|
184
|
+
lines.push('', `### Violations (${result.violations.length})`);
|
|
185
|
+
for (const v of result.violations) {
|
|
186
|
+
const loc = v.line ? ` (line ${v.line})` : '';
|
|
187
|
+
lines.push(`- **${v.severity.toUpperCase()}** [${v.type}]${loc}: ${v.message}`);
|
|
188
|
+
const t = (0, fix_text_1.fixText)(v.fix);
|
|
189
|
+
if (t)
|
|
190
|
+
lines.push(` → Fix: ${t}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
lines.push('', '### Metrics', `- Lines of Code: ${result.metrics.linesOfCode}`, `- Complexity: ${result.metrics.cyclomaticComplexity}`, `- Methods: ${result.metrics.numberOfMethods}`, `- Imports: ${result.metrics.importCount}`);
|
|
194
|
+
if (!passed) {
|
|
195
|
+
lines.push('', '### Action Required', `Improve the code to reach ${minRating}/10. Errors cost −1.5, warnings −0.5, info −0.1.`);
|
|
196
|
+
}
|
|
197
|
+
return lines.join('\n');
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/mcp/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform integration installer — generates config files that wire gate-keeper
|
|
3
|
+
* into various AI coding assistants.
|
|
4
|
+
*
|
|
5
|
+
* Each platform generator returns the target file path and content to write.
|
|
6
|
+
* The handler is responsible for actually writing to disk and checking conflicts.
|
|
7
|
+
*/
|
|
8
|
+
export type Platform = 'claude-code' | 'copilot' | 'cursor' | 'vscode' | 'github-action';
|
|
9
|
+
export interface PlatformConfig {
|
|
10
|
+
platform: Platform;
|
|
11
|
+
filePath: string;
|
|
12
|
+
content: string;
|
|
13
|
+
description: string;
|
|
14
|
+
append: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function claudeCodeConfig(repoRoot: string): PlatformConfig;
|
|
17
|
+
export declare function copilotConfig(repoRoot: string, mcpServerPath?: string): PlatformConfig;
|
|
18
|
+
export declare function cursorConfig(repoRoot: string): PlatformConfig;
|
|
19
|
+
export declare function vscodeConfig(repoRoot: string, gateKeeperPath?: string): PlatformConfig;
|
|
20
|
+
export declare function githubActionConfig(): PlatformConfig;
|
|
21
|
+
export declare function getPlatformConfig(platform: Platform, repoRoot: string, gateKeeperPath?: string): PlatformConfig;
|
|
22
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/mcp/installer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAC;AAEzF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAID,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAoBjE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,cAAc,CA0ItF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CA2B7D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,cAAc,CAmBtF;AAED,wBAAgB,kBAAkB,IAAI,cAAc,CAwEnD;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,GACtB,cAAc,CAQhB"}
|