@nxuss/lemma 0.9.1 → 0.9.3
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 +74 -10
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +52 -1
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +878 -0
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/pr-review/PRReviewEngine.d.ts +4 -0
- package/dist/cjs/pr-review/PRReviewEngine.d.ts.map +1 -0
- package/dist/cjs/pr-review/PRReviewEngine.js +203 -0
- package/dist/cjs/pr-review/PRReviewEngine.js.map +1 -0
- package/dist/cjs/pr-review/ReviewStore.d.ts +9 -0
- package/dist/cjs/pr-review/ReviewStore.d.ts.map +1 -0
- package/dist/cjs/pr-review/ReviewStore.js +29 -0
- package/dist/cjs/pr-review/ReviewStore.js.map +1 -0
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.d.ts +18 -0
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.d.ts.map +1 -0
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.js +156 -0
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.js.map +1 -0
- package/dist/cjs/pr-review/adapters/GitHubAdapter.d.ts +18 -0
- package/dist/cjs/pr-review/adapters/GitHubAdapter.d.ts.map +1 -0
- package/dist/cjs/pr-review/adapters/GitHubAdapter.js +106 -0
- package/dist/cjs/pr-review/adapters/GitHubAdapter.js.map +1 -0
- package/dist/cjs/pr-review/adapters/GitLabAdapter.d.ts +19 -0
- package/dist/cjs/pr-review/adapters/GitLabAdapter.d.ts.map +1 -0
- package/dist/cjs/pr-review/adapters/GitLabAdapter.js +137 -0
- package/dist/cjs/pr-review/adapters/GitLabAdapter.js.map +1 -0
- package/dist/cjs/pr-review/adapters/GitPlatformAdapter.d.ts +14 -0
- package/dist/cjs/pr-review/adapters/GitPlatformAdapter.d.ts.map +1 -0
- package/dist/cjs/pr-review/adapters/GitPlatformAdapter.js +3 -0
- package/dist/cjs/pr-review/adapters/GitPlatformAdapter.js.map +1 -0
- package/dist/cjs/pr-review/adapters/index.d.ts +5 -0
- package/dist/cjs/pr-review/adapters/index.d.ts.map +1 -0
- package/dist/cjs/pr-review/adapters/index.js +10 -0
- package/dist/cjs/pr-review/adapters/index.js.map +1 -0
- package/dist/cjs/pr-review/analyzers/QualityGrader.d.ts +7 -0
- package/dist/cjs/pr-review/analyzers/QualityGrader.d.ts.map +1 -0
- package/dist/cjs/pr-review/analyzers/QualityGrader.js +154 -0
- package/dist/cjs/pr-review/analyzers/QualityGrader.js.map +1 -0
- package/dist/cjs/pr-review/analyzers/RegressionDetector.d.ts +7 -0
- package/dist/cjs/pr-review/analyzers/RegressionDetector.d.ts.map +1 -0
- package/dist/cjs/pr-review/analyzers/RegressionDetector.js +151 -0
- package/dist/cjs/pr-review/analyzers/RegressionDetector.js.map +1 -0
- package/dist/cjs/pr-review/analyzers/SecurityScanner.d.ts +7 -0
- package/dist/cjs/pr-review/analyzers/SecurityScanner.d.ts.map +1 -0
- package/dist/cjs/pr-review/analyzers/SecurityScanner.js +110 -0
- package/dist/cjs/pr-review/analyzers/SecurityScanner.js.map +1 -0
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.d.ts +7 -0
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.d.ts.map +1 -0
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.js +237 -0
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.js.map +1 -0
- package/dist/cjs/pr-review/analyzers/index.d.ts +9 -0
- package/dist/cjs/pr-review/analyzers/index.d.ts.map +1 -0
- package/dist/cjs/pr-review/analyzers/index.js +12 -0
- package/dist/cjs/pr-review/analyzers/index.js.map +1 -0
- package/dist/cjs/pr-review/bridge/BrainBridge.d.ts +23 -0
- package/dist/cjs/pr-review/bridge/BrainBridge.d.ts.map +1 -0
- package/dist/cjs/pr-review/bridge/BrainBridge.js +100 -0
- package/dist/cjs/pr-review/bridge/BrainBridge.js.map +1 -0
- package/dist/cjs/pr-review/bridge/index.d.ts +2 -0
- package/dist/cjs/pr-review/bridge/index.d.ts.map +1 -0
- package/dist/cjs/pr-review/bridge/index.js +6 -0
- package/dist/cjs/pr-review/bridge/index.js.map +1 -0
- package/dist/cjs/pr-review/index.d.ts +5 -0
- package/dist/cjs/pr-review/index.d.ts.map +1 -0
- package/dist/cjs/pr-review/index.js +12 -0
- package/dist/cjs/pr-review/index.js.map +1 -0
- package/dist/cjs/pr-review/reviewRunner.d.ts +25 -0
- package/dist/cjs/pr-review/reviewRunner.d.ts.map +1 -0
- package/dist/cjs/pr-review/reviewRunner.js +97 -0
- package/dist/cjs/pr-review/reviewRunner.js.map +1 -0
- package/dist/cjs/pr-review/types.d.ts +80 -0
- package/dist/cjs/pr-review/types.d.ts.map +1 -0
- package/dist/cjs/pr-review/types.js +3 -0
- package/dist/cjs/pr-review/types.js.map +1 -0
- package/dist/cjs/pr-review/webhook/WebhookServer.d.ts +3 -0
- package/dist/cjs/pr-review/webhook/WebhookServer.d.ts.map +1 -0
- package/dist/cjs/pr-review/webhook/WebhookServer.js +114 -0
- package/dist/cjs/pr-review/webhook/WebhookServer.js.map +1 -0
- package/dist/cjs/pr-review/webhook/index.d.ts +2 -0
- package/dist/cjs/pr-review/webhook/index.d.ts.map +1 -0
- package/dist/cjs/pr-review/webhook/index.js +6 -0
- package/dist/cjs/pr-review/webhook/index.js.map +1 -0
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +52 -1
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +878 -0
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/pr-review/PRReviewEngine.d.ts +4 -0
- package/dist/esm/pr-review/PRReviewEngine.d.ts.map +1 -0
- package/dist/esm/pr-review/PRReviewEngine.js +199 -0
- package/dist/esm/pr-review/PRReviewEngine.js.map +1 -0
- package/dist/esm/pr-review/ReviewStore.d.ts +9 -0
- package/dist/esm/pr-review/ReviewStore.d.ts.map +1 -0
- package/dist/esm/pr-review/ReviewStore.js +26 -0
- package/dist/esm/pr-review/ReviewStore.js.map +1 -0
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts +18 -0
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts.map +1 -0
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js +149 -0
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js.map +1 -0
- package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts +18 -0
- package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts.map +1 -0
- package/dist/esm/pr-review/adapters/GitHubAdapter.js +99 -0
- package/dist/esm/pr-review/adapters/GitHubAdapter.js.map +1 -0
- package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts +19 -0
- package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts.map +1 -0
- package/dist/esm/pr-review/adapters/GitLabAdapter.js +130 -0
- package/dist/esm/pr-review/adapters/GitLabAdapter.js.map +1 -0
- package/dist/esm/pr-review/adapters/GitPlatformAdapter.d.ts +14 -0
- package/dist/esm/pr-review/adapters/GitPlatformAdapter.d.ts.map +1 -0
- package/dist/esm/pr-review/adapters/GitPlatformAdapter.js +2 -0
- package/dist/esm/pr-review/adapters/GitPlatformAdapter.js.map +1 -0
- package/dist/esm/pr-review/adapters/index.d.ts +5 -0
- package/dist/esm/pr-review/adapters/index.d.ts.map +1 -0
- package/dist/esm/pr-review/adapters/index.js +4 -0
- package/dist/esm/pr-review/adapters/index.js.map +1 -0
- package/dist/esm/pr-review/analyzers/QualityGrader.d.ts +7 -0
- package/dist/esm/pr-review/analyzers/QualityGrader.d.ts.map +1 -0
- package/dist/esm/pr-review/analyzers/QualityGrader.js +151 -0
- package/dist/esm/pr-review/analyzers/QualityGrader.js.map +1 -0
- package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts +7 -0
- package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts.map +1 -0
- package/dist/esm/pr-review/analyzers/RegressionDetector.js +145 -0
- package/dist/esm/pr-review/analyzers/RegressionDetector.js.map +1 -0
- package/dist/esm/pr-review/analyzers/SecurityScanner.d.ts +7 -0
- package/dist/esm/pr-review/analyzers/SecurityScanner.d.ts.map +1 -0
- package/dist/esm/pr-review/analyzers/SecurityScanner.js +107 -0
- package/dist/esm/pr-review/analyzers/SecurityScanner.js.map +1 -0
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts +7 -0
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts.map +1 -0
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.js +201 -0
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.js.map +1 -0
- package/dist/esm/pr-review/analyzers/index.d.ts +9 -0
- package/dist/esm/pr-review/analyzers/index.d.ts.map +1 -0
- package/dist/esm/pr-review/analyzers/index.js +5 -0
- package/dist/esm/pr-review/analyzers/index.js.map +1 -0
- package/dist/esm/pr-review/bridge/BrainBridge.d.ts +23 -0
- package/dist/esm/pr-review/bridge/BrainBridge.d.ts.map +1 -0
- package/dist/esm/pr-review/bridge/BrainBridge.js +93 -0
- package/dist/esm/pr-review/bridge/BrainBridge.js.map +1 -0
- package/dist/esm/pr-review/bridge/index.d.ts +2 -0
- package/dist/esm/pr-review/bridge/index.d.ts.map +1 -0
- package/dist/esm/pr-review/bridge/index.js +2 -0
- package/dist/esm/pr-review/bridge/index.js.map +1 -0
- package/dist/esm/pr-review/index.d.ts +5 -0
- package/dist/esm/pr-review/index.d.ts.map +1 -0
- package/dist/esm/pr-review/index.js +3 -0
- package/dist/esm/pr-review/index.js.map +1 -0
- package/dist/esm/pr-review/reviewRunner.d.ts +25 -0
- package/dist/esm/pr-review/reviewRunner.d.ts.map +1 -0
- package/dist/esm/pr-review/reviewRunner.js +92 -0
- package/dist/esm/pr-review/reviewRunner.js.map +1 -0
- package/dist/esm/pr-review/types.d.ts +80 -0
- package/dist/esm/pr-review/types.d.ts.map +1 -0
- package/dist/esm/pr-review/types.js +2 -0
- package/dist/esm/pr-review/types.js.map +1 -0
- package/dist/esm/pr-review/webhook/WebhookServer.d.ts +3 -0
- package/dist/esm/pr-review/webhook/WebhookServer.d.ts.map +1 -0
- package/dist/esm/pr-review/webhook/WebhookServer.js +108 -0
- package/dist/esm/pr-review/webhook/WebhookServer.js.map +1 -0
- package/dist/esm/pr-review/webhook/index.d.ts +2 -0
- package/dist/esm/pr-review/webhook/index.d.ts.map +1 -0
- package/dist/esm/pr-review/webhook/index.js +2 -0
- package/dist/esm/pr-review/webhook/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { analyzeStatic } from "./analyzers/StaticAnalyzer";
|
|
2
|
+
import { analyzeQuality } from "./analyzers/QualityGrader";
|
|
3
|
+
import { analyzeSecurity } from "./analyzers/SecurityScanner";
|
|
4
|
+
import { analyzeRegression } from "./analyzers/RegressionDetector";
|
|
5
|
+
const DEFAULT_WEIGHTS = {
|
|
6
|
+
static: 0.25,
|
|
7
|
+
security: 0.30,
|
|
8
|
+
regression: 0.25,
|
|
9
|
+
quality: 0.20,
|
|
10
|
+
};
|
|
11
|
+
function classifyFindings(findings) {
|
|
12
|
+
const critical = [];
|
|
13
|
+
const high = [];
|
|
14
|
+
const medium = [];
|
|
15
|
+
const low = [];
|
|
16
|
+
for (const f of findings) {
|
|
17
|
+
switch (f.severity) {
|
|
18
|
+
case "CRITICAL":
|
|
19
|
+
critical.push(f);
|
|
20
|
+
break;
|
|
21
|
+
case "HIGH":
|
|
22
|
+
high.push(f);
|
|
23
|
+
break;
|
|
24
|
+
case "MEDIUM":
|
|
25
|
+
medium.push(f);
|
|
26
|
+
break;
|
|
27
|
+
case "LOW":
|
|
28
|
+
low.push(f);
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { critical, high, medium, low };
|
|
33
|
+
}
|
|
34
|
+
function buildSummary(weightedScore, allFindings, verdict) {
|
|
35
|
+
const { critical, high, medium, low } = classifyFindings(allFindings);
|
|
36
|
+
const parts = [];
|
|
37
|
+
parts.push(`## PR Review Results\n`);
|
|
38
|
+
parts.push(`**Score:** ${Math.round(weightedScore)}/100 | **Verdict:** ${verdict}`);
|
|
39
|
+
parts.push(``);
|
|
40
|
+
parts.push(`### Summary`);
|
|
41
|
+
parts.push(`| Severity | Count |`);
|
|
42
|
+
parts.push(`|----------|-------|`);
|
|
43
|
+
parts.push(`| 🔴 CRITICAL | ${critical.length} |`);
|
|
44
|
+
parts.push(`| 🟠 HIGH | ${high.length} |`);
|
|
45
|
+
parts.push(`| 🟡 MEDIUM | ${medium.length} |`);
|
|
46
|
+
parts.push(`| ⚪ LOW | ${low.length} |`);
|
|
47
|
+
parts.push(``);
|
|
48
|
+
if (allFindings.length > 0) {
|
|
49
|
+
parts.push(`### Findings\n`);
|
|
50
|
+
for (const f of allFindings.slice(0, 20)) {
|
|
51
|
+
parts.push(`**${f.severity}** | ${f.category.toUpperCase()} | ${f.filePath}${f.line ? `:${f.line}` : ""}`);
|
|
52
|
+
parts.push(`> ${f.message}`);
|
|
53
|
+
if (f.suggestion) {
|
|
54
|
+
parts.push(`> 💡 *${f.suggestion}*`);
|
|
55
|
+
}
|
|
56
|
+
parts.push(``);
|
|
57
|
+
}
|
|
58
|
+
if (allFindings.length > 20) {
|
|
59
|
+
parts.push(`*...and ${allFindings.length - 20} more findings*`);
|
|
60
|
+
parts.push(``);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
parts.push(`✅ No issues found.`);
|
|
65
|
+
parts.push(``);
|
|
66
|
+
}
|
|
67
|
+
return parts.join("\n");
|
|
68
|
+
}
|
|
69
|
+
function determineVerdict(score, config) {
|
|
70
|
+
if (score >= config.threshold)
|
|
71
|
+
return "APPROVED";
|
|
72
|
+
if (score >= 70)
|
|
73
|
+
return "NEUTRAL";
|
|
74
|
+
return "CHANGES_REQUESTED";
|
|
75
|
+
}
|
|
76
|
+
export function runAnalysis(diffFiles, config, workspaceRoot, baseBranch) {
|
|
77
|
+
const modules = [];
|
|
78
|
+
const staticResult = analyzeStatic(diffFiles);
|
|
79
|
+
modules.push({
|
|
80
|
+
module: "static",
|
|
81
|
+
findings: staticResult.findings,
|
|
82
|
+
rawScore: staticResult.score,
|
|
83
|
+
weight: DEFAULT_WEIGHTS.static,
|
|
84
|
+
});
|
|
85
|
+
const securityResult = analyzeSecurity(diffFiles);
|
|
86
|
+
modules.push({
|
|
87
|
+
module: "security",
|
|
88
|
+
findings: securityResult.findings,
|
|
89
|
+
rawScore: securityResult.score,
|
|
90
|
+
weight: DEFAULT_WEIGHTS.security,
|
|
91
|
+
});
|
|
92
|
+
const regressionResult = analyzeRegression(diffFiles, workspaceRoot, baseBranch);
|
|
93
|
+
modules.push({
|
|
94
|
+
module: "regression",
|
|
95
|
+
findings: regressionResult.findings,
|
|
96
|
+
rawScore: regressionResult.score,
|
|
97
|
+
weight: DEFAULT_WEIGHTS.regression,
|
|
98
|
+
});
|
|
99
|
+
const qualityResult = analyzeQuality(diffFiles, workspaceRoot);
|
|
100
|
+
modules.push({
|
|
101
|
+
module: "quality",
|
|
102
|
+
findings: qualityResult.findings,
|
|
103
|
+
rawScore: qualityResult.score,
|
|
104
|
+
weight: DEFAULT_WEIGHTS.quality,
|
|
105
|
+
});
|
|
106
|
+
const weightedScore = modules.reduce((sum, m) => sum + m.rawScore * m.weight, 0);
|
|
107
|
+
const allFindings = modules.flatMap(m => m.findings);
|
|
108
|
+
const verdict = determineVerdict(weightedScore, config);
|
|
109
|
+
const summary = buildSummary(weightedScore, allFindings, verdict);
|
|
110
|
+
return {
|
|
111
|
+
score: Math.round(weightedScore),
|
|
112
|
+
verdict,
|
|
113
|
+
findings: allFindings,
|
|
114
|
+
summary,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export function parseDiff(diffContent) {
|
|
118
|
+
const files = [];
|
|
119
|
+
const lines = diffContent.split("\n");
|
|
120
|
+
let currentFile = null;
|
|
121
|
+
let currentPatch = [];
|
|
122
|
+
let currentContent = [];
|
|
123
|
+
let inHunk = false;
|
|
124
|
+
for (const line of lines) {
|
|
125
|
+
const diffHeader = line.match(/^diff --git a\/(.+?) b\/(.+?)$/);
|
|
126
|
+
if (diffHeader) {
|
|
127
|
+
if (currentFile && currentFile.path) {
|
|
128
|
+
currentFile.patch = currentPatch.join("\n");
|
|
129
|
+
currentFile.content = currentContent.join("\n");
|
|
130
|
+
files.push(currentFile);
|
|
131
|
+
}
|
|
132
|
+
currentFile = { path: diffHeader[2] };
|
|
133
|
+
currentPatch = [];
|
|
134
|
+
currentContent = [];
|
|
135
|
+
inHunk = false;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const newFileMode = line.match(/^new file mode/);
|
|
139
|
+
if (newFileMode && currentFile) {
|
|
140
|
+
currentFile.status = "added";
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const deletedFile = line.match(/^deleted file mode/);
|
|
144
|
+
if (deletedFile && currentFile) {
|
|
145
|
+
currentFile.status = "deleted";
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const renameFrom = line.match(/^rename from (.+)$/);
|
|
149
|
+
if (renameFrom && currentFile) {
|
|
150
|
+
currentFile.status = "renamed";
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const hunkHeader = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
|
|
154
|
+
if (hunkHeader) {
|
|
155
|
+
inHunk = true;
|
|
156
|
+
currentPatch.push(line);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (line.startsWith("--- a/") || line.startsWith("+++ b/")) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const indexLine = line.match(/^index /);
|
|
163
|
+
if (indexLine)
|
|
164
|
+
continue;
|
|
165
|
+
if (currentFile && !currentFile.status) {
|
|
166
|
+
currentFile.status = "modified";
|
|
167
|
+
}
|
|
168
|
+
if (inHunk && currentFile) {
|
|
169
|
+
currentPatch.push(line);
|
|
170
|
+
if (line.startsWith("+") && !line.startsWith("+++")) {
|
|
171
|
+
currentContent.push(line.substring(1));
|
|
172
|
+
}
|
|
173
|
+
else if (line.startsWith(" ") && !line.startsWith("---") && !line.startsWith("+++")) {
|
|
174
|
+
currentContent.push(line.substring(1));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (currentFile && currentFile.path) {
|
|
179
|
+
currentFile.patch = currentPatch.join("\n");
|
|
180
|
+
currentFile.content = currentContent.join("\n");
|
|
181
|
+
files.push(currentFile);
|
|
182
|
+
}
|
|
183
|
+
for (const f of files) {
|
|
184
|
+
if (f.patch) {
|
|
185
|
+
let added = 0;
|
|
186
|
+
let removed = 0;
|
|
187
|
+
for (const l of f.patch.split("\n")) {
|
|
188
|
+
if (l.startsWith("+") && !l.startsWith("+++"))
|
|
189
|
+
added++;
|
|
190
|
+
else if (l.startsWith("-") && !l.startsWith("---"))
|
|
191
|
+
removed++;
|
|
192
|
+
}
|
|
193
|
+
f.additions = added;
|
|
194
|
+
f.deletions = removed;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return files;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=PRReviewEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PRReviewEngine.js","sourceRoot":"","sources":["../../../src/pr-review/PRReviewEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { PRReviewResult } from "./types";
|
|
2
|
+
export declare const ReviewStore: {
|
|
3
|
+
create(partial: Omit<PRReviewResult, "reviewId" | "timestamp">): PRReviewResult;
|
|
4
|
+
get(reviewId: string): PRReviewResult | undefined;
|
|
5
|
+
findByPR(repo: string, prNumber: number): PRReviewResult | undefined;
|
|
6
|
+
getAll(): PRReviewResult[];
|
|
7
|
+
clear(): void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=ReviewStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewStore.d.ts","sourceRoot":"","sources":["../../../src/pr-review/ReviewStore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIzC,eAAO,MAAM,WAAW;oBACN,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,WAAW,CAAC,GAAG,cAAc;kBAUjE,MAAM,GAAG,cAAc,GAAG,SAAS;mBAIlC,MAAM,YAAY,MAAM,GAAG,cAAc,GAAG,SAAS;cAM1D,cAAc,EAAE;aAIjB,IAAI;CAGd,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from "uuid";
|
|
2
|
+
const reviews = new Map();
|
|
3
|
+
export const ReviewStore = {
|
|
4
|
+
create(partial) {
|
|
5
|
+
const review = {
|
|
6
|
+
...partial,
|
|
7
|
+
reviewId: uuidv4(),
|
|
8
|
+
timestamp: new Date().toISOString(),
|
|
9
|
+
};
|
|
10
|
+
reviews.set(review.reviewId, review);
|
|
11
|
+
return review;
|
|
12
|
+
},
|
|
13
|
+
get(reviewId) {
|
|
14
|
+
return reviews.get(reviewId);
|
|
15
|
+
},
|
|
16
|
+
findByPR(repo, prNumber) {
|
|
17
|
+
return Array.from(reviews.values()).find(r => r.metadata?.repo === repo && r.metadata?.prNumber === prNumber);
|
|
18
|
+
},
|
|
19
|
+
getAll() {
|
|
20
|
+
return Array.from(reviews.values());
|
|
21
|
+
},
|
|
22
|
+
clear() {
|
|
23
|
+
reviews.clear();
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=ReviewStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewStore.js","sourceRoot":"","sources":["../../../src/pr-review/ReviewStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAGpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;AAElD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,CAAC,OAAuD;QAC5D,MAAM,MAAM,GAAmB;YAC7B,GAAG,OAAO;YACV,QAAQ,EAAE,MAAM,EAAE;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,QAAgB;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CACtC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CACpE,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK;QACH,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { DiffFile, PRMetadata, ReviewEvent, StatusState, WorkflowConfig } from "../types";
|
|
2
|
+
import { GitPlatformAdapter } from "./GitPlatformAdapter";
|
|
3
|
+
export declare class AzureDevOpsAdapter implements GitPlatformAdapter {
|
|
4
|
+
private token;
|
|
5
|
+
private orgUrl;
|
|
6
|
+
constructor(token: string, orgUrl?: string);
|
|
7
|
+
validateCredentials(): Promise<boolean>;
|
|
8
|
+
getPRDiff(owner: string, repo: string, prNumber: number): Promise<DiffFile[]>;
|
|
9
|
+
getPRMetadata(owner: string, repo: string, prNumber: number): Promise<PRMetadata>;
|
|
10
|
+
getChangedFiles(owner: string, repo: string, prNumber: number): Promise<string[]>;
|
|
11
|
+
getBaseBranch(owner: string, repo: string, prNumber: number): Promise<string>;
|
|
12
|
+
postComment(owner: string, repo: string, prNumber: number, body: string): Promise<void>;
|
|
13
|
+
postReviewComment(owner: string, repo: string, prNumber: number, body: string, commitId: string, path: string, line: number): Promise<void>;
|
|
14
|
+
submitReview(owner: string, repo: string, prNumber: number, event: ReviewEvent, body: string): Promise<void>;
|
|
15
|
+
setStatus(owner: string, repo: string, sha: string, state: StatusState, description: string): Promise<void>;
|
|
16
|
+
generateWorkflowYaml(config: WorkflowConfig): string;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=AzureDevOpsAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AzureDevOpsAdapter.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/adapters/AzureDevOpsAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,qBAAa,kBAAmB,YAAW,kBAAkB;IAC3D,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;gBAEX,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAKpC,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAWvC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAc7E,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAwBjF,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWjF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7E,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevF,iBAAiB,CACrB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAC7C,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GACzD,OAAO,CAAC,IAAI,CAAC;IAuBV,YAAY,CAChB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAC7C,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;IAmBV,SAAS,CACb,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EACxC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GACtC,OAAO,CAAC,IAAI,CAAC;IAyBhB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CA2BrD"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { parseDiff } from "../PRReviewEngine";
|
|
3
|
+
export class AzureDevOpsAdapter {
|
|
4
|
+
constructor(token, orgUrl) {
|
|
5
|
+
this.token = token;
|
|
6
|
+
this.orgUrl = orgUrl || "https://dev.azure.com";
|
|
7
|
+
}
|
|
8
|
+
async validateCredentials() {
|
|
9
|
+
try {
|
|
10
|
+
const res = await axios.get(this.orgUrl, {
|
|
11
|
+
headers: { Authorization: `Basic ${Buffer.from(`:${this.token}`).toString("base64")}` },
|
|
12
|
+
});
|
|
13
|
+
return res.status === 200;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async getPRDiff(owner, repo, prNumber) {
|
|
20
|
+
const [org, project] = owner.split("/");
|
|
21
|
+
const res = await axios.get(`${this.orgUrl}/${org}/${project}/_apis/git/repositories/${repo}/pullrequests/${prNumber}/changes?api-version=7.0`, {
|
|
22
|
+
headers: { Authorization: `Basic ${Buffer.from(`:${this.token}`).toString("base64")}` },
|
|
23
|
+
});
|
|
24
|
+
const diffContent = res.data?.changeEntries?.map((c) => `diff --git a/${c.item.path} b/${c.item.path}\n${c.item.path}`).join("\n") || "";
|
|
25
|
+
return parseDiff(diffContent);
|
|
26
|
+
}
|
|
27
|
+
async getPRMetadata(owner, repo, prNumber) {
|
|
28
|
+
const [org, project] = owner.split("/");
|
|
29
|
+
const res = await axios.get(`${this.orgUrl}/${org}/${project}/_apis/git/repositories/${repo}/pullrequests/${prNumber}?api-version=7.0`, {
|
|
30
|
+
headers: { Authorization: `Basic ${Buffer.from(`:${this.token}`).toString("base64")}` },
|
|
31
|
+
});
|
|
32
|
+
const pr = res.data;
|
|
33
|
+
return {
|
|
34
|
+
owner,
|
|
35
|
+
repo,
|
|
36
|
+
prNumber,
|
|
37
|
+
title: pr.title,
|
|
38
|
+
description: pr.description,
|
|
39
|
+
baseBranch: pr.targetRefName?.replace("refs/heads/", ""),
|
|
40
|
+
headBranch: pr.sourceRefName?.replace("refs/heads/", ""),
|
|
41
|
+
headSha: pr.lastMergeSourceCommit?.commitId || "",
|
|
42
|
+
author: pr.createdBy?.displayName || "unknown",
|
|
43
|
+
createdAt: pr.creationDate,
|
|
44
|
+
updatedAt: pr.creationDate,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async getChangedFiles(owner, repo, prNumber) {
|
|
48
|
+
const [org, project] = owner.split("/");
|
|
49
|
+
const res = await axios.get(`${this.orgUrl}/${org}/${project}/_apis/git/repositories/${repo}/pullrequests/${prNumber}/changes?api-version=7.0`, {
|
|
50
|
+
headers: { Authorization: `Basic ${Buffer.from(`:${this.token}`).toString("base64")}` },
|
|
51
|
+
});
|
|
52
|
+
return res.data?.changeEntries?.map((c) => c.item.path) || [];
|
|
53
|
+
}
|
|
54
|
+
async getBaseBranch(owner, repo, prNumber) {
|
|
55
|
+
const meta = await this.getPRMetadata(owner, repo, prNumber);
|
|
56
|
+
return meta.baseBranch;
|
|
57
|
+
}
|
|
58
|
+
async postComment(owner, repo, prNumber, body) {
|
|
59
|
+
const [org, project] = owner.split("/");
|
|
60
|
+
const threadBody = {
|
|
61
|
+
comments: [{ content: body, commentType: 1 }],
|
|
62
|
+
status: 1,
|
|
63
|
+
};
|
|
64
|
+
await axios.post(`${this.orgUrl}/${org}/${project}/_apis/git/repositories/${repo}/pullrequests/${prNumber}/threads?api-version=7.0`, threadBody, {
|
|
65
|
+
headers: { Authorization: `Basic ${Buffer.from(`:${this.token}`).toString("base64")}` },
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async postReviewComment(owner, repo, prNumber, body, commitId, path, line) {
|
|
69
|
+
const [org, project] = owner.split("/");
|
|
70
|
+
await axios.post(`${this.orgUrl}/${org}/${project}/_apis/git/repositories/${repo}/pullrequests/${prNumber}/threads?api-version=7.0`, {
|
|
71
|
+
comments: [{
|
|
72
|
+
content: body,
|
|
73
|
+
commentType: 1,
|
|
74
|
+
parentCommentId: 0,
|
|
75
|
+
}],
|
|
76
|
+
status: 1,
|
|
77
|
+
threadContext: {
|
|
78
|
+
filePath: path,
|
|
79
|
+
rightFileEnd: { line, offset: 1 },
|
|
80
|
+
rightFileStart: { line, offset: 1 },
|
|
81
|
+
},
|
|
82
|
+
}, {
|
|
83
|
+
headers: { Authorization: `Basic ${Buffer.from(`:${this.token}`).toString("base64")}` },
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async submitReview(owner, repo, prNumber, event, body) {
|
|
87
|
+
const [org, project] = owner.split("/");
|
|
88
|
+
const voteMap = {
|
|
89
|
+
APPROVE: 10,
|
|
90
|
+
COMMENT: 5,
|
|
91
|
+
REQUEST_CHANGES: -10,
|
|
92
|
+
};
|
|
93
|
+
await axios.post(`${this.orgUrl}/${org}/${project}/_apis/git/repositories/${repo}/pullrequests/${prNumber}/reviewers?api-version=7.0`, { vote: voteMap[event] }, {
|
|
94
|
+
headers: { Authorization: `Basic ${Buffer.from(`:${this.token}`).toString("base64")}` },
|
|
95
|
+
});
|
|
96
|
+
if (body) {
|
|
97
|
+
await this.postComment(owner, repo, prNumber, body);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async setStatus(owner, repo, sha, state, description) {
|
|
101
|
+
const [org, project] = owner.split("/");
|
|
102
|
+
const statusMap = {
|
|
103
|
+
pending: "notSet",
|
|
104
|
+
success: "succeeded",
|
|
105
|
+
failure: "failed",
|
|
106
|
+
error: "error",
|
|
107
|
+
};
|
|
108
|
+
try {
|
|
109
|
+
await axios.post(`${this.orgUrl}/${org}/${project}/_apis/git/repositories/${repo}/commits/${sha}/statuses?api-version=7.0`, {
|
|
110
|
+
state: statusMap[state],
|
|
111
|
+
description,
|
|
112
|
+
context: { name: "Lemma PR Review", genre: "lemma" },
|
|
113
|
+
}, {
|
|
114
|
+
headers: { Authorization: `Basic ${Buffer.from(`:${this.token}`).toString("base64")}` },
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Azure DevOps status API may not be available on all versions
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
generateWorkflowYaml(config) {
|
|
122
|
+
return [
|
|
123
|
+
`trigger: none`,
|
|
124
|
+
`pr:`,
|
|
125
|
+
` branches:`,
|
|
126
|
+
` include:`,
|
|
127
|
+
` - '*'`,
|
|
128
|
+
``,
|
|
129
|
+
`pool:`,
|
|
130
|
+
` vmImage: ubuntu-latest`,
|
|
131
|
+
``,
|
|
132
|
+
`steps:`,
|
|
133
|
+
` - checkout: self`,
|
|
134
|
+
` fetchDepth: 0`,
|
|
135
|
+
` - task: NodeTool@0`,
|
|
136
|
+
` inputs:`,
|
|
137
|
+
` versionSpec: '18'`,
|
|
138
|
+
` - script: npm install -g @nxuss/lemma`,
|
|
139
|
+
` - script: lemma pr-review`,
|
|
140
|
+
` env:`,
|
|
141
|
+
` LEMMA_LICENSE_KEY: \$(LEMMA_LICENSE_KEY)`,
|
|
142
|
+
` LEMMA_PLATFORM: azure`,
|
|
143
|
+
` LEMMA_REPO: \$(Build.Repository.Name)`,
|
|
144
|
+
` LEMMA_PR_NUMBER: \$(System.PullRequest.PullRequestId)`,
|
|
145
|
+
` AZURE_DEVOPS_TOKEN: \$(AZURE_DEVOPS_TOKEN)`,
|
|
146
|
+
].join("\n");
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=AzureDevOpsAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AzureDevOpsAdapter.js","sourceRoot":"","sources":["../../../../src/pr-review/adapters/AzureDevOpsAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { DiffFile, PRMetadata, ReviewEvent, StatusState, WorkflowConfig } from "../types";
|
|
2
|
+
import { GitPlatformAdapter } from "./GitPlatformAdapter";
|
|
3
|
+
export declare class GitHubAdapter implements GitPlatformAdapter {
|
|
4
|
+
private token;
|
|
5
|
+
private baseUrl;
|
|
6
|
+
constructor(token: string, baseUrl?: string);
|
|
7
|
+
validateCredentials(): Promise<boolean>;
|
|
8
|
+
getPRDiff(owner: string, repo: string, prNumber: number): Promise<DiffFile[]>;
|
|
9
|
+
getPRMetadata(owner: string, repo: string, prNumber: number): Promise<PRMetadata>;
|
|
10
|
+
getChangedFiles(owner: string, repo: string, prNumber: number): Promise<string[]>;
|
|
11
|
+
getBaseBranch(owner: string, repo: string, prNumber: number): Promise<string>;
|
|
12
|
+
postComment(owner: string, repo: string, prNumber: number, body: string): Promise<void>;
|
|
13
|
+
postReviewComment(owner: string, repo: string, prNumber: number, body: string, commitId: string, path: string, line: number): Promise<void>;
|
|
14
|
+
submitReview(owner: string, repo: string, prNumber: number, event: ReviewEvent, body: string): Promise<void>;
|
|
15
|
+
setStatus(owner: string, repo: string, sha: string, state: StatusState, description: string): Promise<void>;
|
|
16
|
+
generateWorkflowYaml(config: WorkflowConfig): string;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=GitHubAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubAdapter.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/adapters/GitHubAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,qBAAa,aAAc,YAAW,kBAAkB;IACtD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAKrC,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAWvC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAa7E,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBjF,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAUjF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7E,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvF,iBAAiB,CACrB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAC7C,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GACzD,OAAO,CAAC,IAAI,CAAC;IAQV,YAAY,CAChB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAC7C,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;IAQV,SAAS,CACb,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EACxC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GACtC,OAAO,CAAC,IAAI,CAAC;IAYhB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CAyBrD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { parseDiff } from "../PRReviewEngine";
|
|
3
|
+
export class GitHubAdapter {
|
|
4
|
+
constructor(token, baseUrl) {
|
|
5
|
+
this.token = token;
|
|
6
|
+
this.baseUrl = baseUrl || "https://api.github.com";
|
|
7
|
+
}
|
|
8
|
+
async validateCredentials() {
|
|
9
|
+
try {
|
|
10
|
+
const res = await axios.get(`${this.baseUrl}/user`, {
|
|
11
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
12
|
+
});
|
|
13
|
+
return res.status === 200;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async getPRDiff(owner, repo, prNumber) {
|
|
20
|
+
const res = await axios.get(`${this.baseUrl}/repos/${owner}/${repo}/pulls/${prNumber}`, {
|
|
21
|
+
headers: {
|
|
22
|
+
Authorization: `Bearer ${this.token}`,
|
|
23
|
+
Accept: "application/vnd.github.v3.diff",
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
return parseDiff(res.data);
|
|
27
|
+
}
|
|
28
|
+
async getPRMetadata(owner, repo, prNumber) {
|
|
29
|
+
const res = await axios.get(`${this.baseUrl}/repos/${owner}/${repo}/pulls/${prNumber}`, {
|
|
30
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
31
|
+
});
|
|
32
|
+
const pr = res.data;
|
|
33
|
+
return {
|
|
34
|
+
owner,
|
|
35
|
+
repo,
|
|
36
|
+
prNumber,
|
|
37
|
+
title: pr.title,
|
|
38
|
+
description: pr.body,
|
|
39
|
+
baseBranch: pr.base.ref,
|
|
40
|
+
headBranch: pr.head.ref,
|
|
41
|
+
headSha: pr.head.sha,
|
|
42
|
+
author: pr.user?.login || "unknown",
|
|
43
|
+
createdAt: pr.created_at,
|
|
44
|
+
updatedAt: pr.updated_at,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async getChangedFiles(owner, repo, prNumber) {
|
|
48
|
+
const res = await axios.get(`${this.baseUrl}/repos/${owner}/${repo}/pulls/${prNumber}/files`, {
|
|
49
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
50
|
+
});
|
|
51
|
+
return res.data.map((f) => f.filename);
|
|
52
|
+
}
|
|
53
|
+
async getBaseBranch(owner, repo, prNumber) {
|
|
54
|
+
const meta = await this.getPRMetadata(owner, repo, prNumber);
|
|
55
|
+
return meta.baseBranch;
|
|
56
|
+
}
|
|
57
|
+
async postComment(owner, repo, prNumber, body) {
|
|
58
|
+
await axios.post(`${this.baseUrl}/repos/${owner}/${repo}/issues/${prNumber}/comments`, { body }, { headers: { Authorization: `Bearer ${this.token}` } });
|
|
59
|
+
}
|
|
60
|
+
async postReviewComment(owner, repo, prNumber, body, commitId, path, line) {
|
|
61
|
+
await axios.post(`${this.baseUrl}/repos/${owner}/${repo}/pulls/${prNumber}/comments`, { body, commit_id: commitId, path, line }, { headers: { Authorization: `Bearer ${this.token}` } });
|
|
62
|
+
}
|
|
63
|
+
async submitReview(owner, repo, prNumber, event, body) {
|
|
64
|
+
await axios.post(`${this.baseUrl}/repos/${owner}/${repo}/pulls/${prNumber}/reviews`, { body, event }, { headers: { Authorization: `Bearer ${this.token}` } });
|
|
65
|
+
}
|
|
66
|
+
async setStatus(owner, repo, sha, state, description) {
|
|
67
|
+
await axios.post(`${this.baseUrl}/repos/${owner}/${repo}/statuses/${sha}`, {
|
|
68
|
+
state,
|
|
69
|
+
description,
|
|
70
|
+
context: "Lemma PR Review",
|
|
71
|
+
}, { headers: { Authorization: `Bearer ${this.token}` } });
|
|
72
|
+
}
|
|
73
|
+
generateWorkflowYaml(config) {
|
|
74
|
+
return [
|
|
75
|
+
`name: Lemma PR Review`,
|
|
76
|
+
`on:`,
|
|
77
|
+
` pull_request:`,
|
|
78
|
+
` types: [opened, synchronize]`,
|
|
79
|
+
``,
|
|
80
|
+
`jobs:`,
|
|
81
|
+
` lemma-review:`,
|
|
82
|
+
` runs-on: ubuntu-latest`,
|
|
83
|
+
` steps:`,
|
|
84
|
+
` - uses: actions/checkout@v4`,
|
|
85
|
+
` with:`,
|
|
86
|
+
` fetch-depth: 0`,
|
|
87
|
+
` - uses: actions/setup-node@v4`,
|
|
88
|
+
` - run: npm install -g @nxuss/lemma`,
|
|
89
|
+
` - run: lemma pr-review`,
|
|
90
|
+
` env:`,
|
|
91
|
+
` LEMMA_LICENSE_KEY: \${{ secrets.LEMMA_LICENSE_KEY }}`,
|
|
92
|
+
` LEMMA_PLATFORM: github`,
|
|
93
|
+
` LEMMA_REPO: \${{ github.repository }}`,
|
|
94
|
+
` LEMMA_PR_NUMBER: \${{ github.event.pull_request.number }}`,
|
|
95
|
+
` GITHUB_TOKEN: \${{ secrets.GITHUB_TOKEN }}`,
|
|
96
|
+
].join("\n");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=GitHubAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubAdapter.js","sourceRoot":"","sources":["../../../../src/pr-review/adapters/GitHubAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DiffFile, PRMetadata, ReviewEvent, StatusState, WorkflowConfig } from "../types";
|
|
2
|
+
import { GitPlatformAdapter } from "./GitPlatformAdapter";
|
|
3
|
+
export declare class GitLabAdapter implements GitPlatformAdapter {
|
|
4
|
+
private token;
|
|
5
|
+
private baseUrl;
|
|
6
|
+
constructor(token: string, baseUrl?: string);
|
|
7
|
+
validateCredentials(): Promise<boolean>;
|
|
8
|
+
private getProjectId;
|
|
9
|
+
getPRDiff(owner: string, repo: string, prNumber: number): Promise<DiffFile[]>;
|
|
10
|
+
getPRMetadata(owner: string, repo: string, prNumber: number): Promise<PRMetadata>;
|
|
11
|
+
getChangedFiles(owner: string, repo: string, prNumber: number): Promise<string[]>;
|
|
12
|
+
getBaseBranch(owner: string, repo: string, prNumber: number): Promise<string>;
|
|
13
|
+
postComment(owner: string, repo: string, prNumber: number, body: string): Promise<void>;
|
|
14
|
+
postReviewComment(owner: string, repo: string, prNumber: number, body: string, commitId: string, path: string, line: number): Promise<void>;
|
|
15
|
+
submitReview(owner: string, repo: string, prNumber: number, event: ReviewEvent, body: string): Promise<void>;
|
|
16
|
+
setStatus(owner: string, repo: string, sha: string, state: StatusState, description: string): Promise<void>;
|
|
17
|
+
generateWorkflowYaml(config: WorkflowConfig): string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=GitLabAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitLabAdapter.d.ts","sourceRoot":"","sources":["../../../../src/pr-review/adapters/GitLabAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,qBAAa,aAAc,YAAW,kBAAkB;IACtD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAKrC,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAW7C,OAAO,CAAC,YAAY;IAId,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAe7E,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAwBjF,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWjF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7E,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASvF,iBAAiB,CACrB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAC7C,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GACzD,OAAO,CAAC,IAAI,CAAC;IAoBV,YAAY,CAChB,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAC7C,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;IAeV,SAAS,CACb,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EACxC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GACtC,OAAO,CAAC,IAAI,CAAC;IAuBhB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CAmBrD"}
|