@reneturcios/greenlight 0.3.5 → 0.3.7
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 +16 -0
- package/dist/automate.d.ts +4 -0
- package/dist/automate.js +60 -3
- package/dist/automate.js.map +1 -1
- package/dist/cli.js +62 -0
- package/dist/cli.js.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/prep-detail.d.ts +125 -0
- package/dist/prep-detail.js +316 -0
- package/dist/prep-detail.js.map +1 -0
- package/dist/review-triage.d.ts +129 -0
- package/dist/review-triage.js +363 -0
- package/dist/review-triage.js.map +1 -0
- package/package.json +1 -1
- package/server.json +3 -3
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-response triage. Answers the question every contributor asks after
|
|
3
|
+
* pushing a PR: "which of these review comments actually need me?"
|
|
4
|
+
*
|
|
5
|
+
* The engine is deterministic (no LLM) and explainable by design: every
|
|
6
|
+
* finding carries the reason for its class and a ready-to-adapt reply
|
|
7
|
+
* draft. It never posts anything; the drafts are output only.
|
|
8
|
+
*
|
|
9
|
+
* Field cases it encodes, from the campaign's real review rounds:
|
|
10
|
+
*
|
|
11
|
+
* - bruno / CodeRabbit: a finding about `interpolateVars` where the
|
|
12
|
+
* anchored hunk matches the quoted token (`__proto__`) -> likely-real.
|
|
13
|
+
* - n8n / cubic: a P1 SSRF claim that the code "calls fetch directly"
|
|
14
|
+
* while the hunk shows the call going through `createAiProxyFetch`
|
|
15
|
+
* -> likely-noise ("premise contradicted by surrounding code").
|
|
16
|
+
* - A human maintainer asking "should this also apply to X?"
|
|
17
|
+
* -> needs-decision, never noise.
|
|
18
|
+
* - CodeRabbit's "## Walkthrough" summary -> noise bucket, not a finding.
|
|
19
|
+
*
|
|
20
|
+
* Rule order per actionable finding:
|
|
21
|
+
* 1. Human (non-bot) author, substantive: needs-decision. Human
|
|
22
|
+
* reviewers are never classified as noise.
|
|
23
|
+
* 2. Bot finding on a generated file, lockfile, or snapshot:
|
|
24
|
+
* likely-noise.
|
|
25
|
+
* 3. Bot finding asking a question: needs-decision.
|
|
26
|
+
* 4. Bot security claim whose premise is contradicted by the hunk:
|
|
27
|
+
* likely-noise ("premise contradicted by surrounding code").
|
|
28
|
+
* 5. Bot style nit whose flagged style is already the surrounding
|
|
29
|
+
* code's style: likely-noise ("contradicted by the surrounding code").
|
|
30
|
+
* 6. Bot finding whose quoted anchor token appears in the hunk:
|
|
31
|
+
* likely-real ("anchor matches").
|
|
32
|
+
* 7. Bot finding presenting a quoted token as present code, where the
|
|
33
|
+
* token is nowhere in the hunk: likely-noise ("anchor mismatch").
|
|
34
|
+
* 8. Anything mixed or unproven: needs-decision.
|
|
35
|
+
*
|
|
36
|
+
* Honest limits, stated up front:
|
|
37
|
+
* - GitHub's REST API does not expose per-thread resolved state
|
|
38
|
+
* (that is GraphQL-only). The closest proxy is used: findings whose
|
|
39
|
+
* parent review was DISMISSED count as resolved. A comment thread
|
|
40
|
+
* resolved without dismissing its review still reads as open here.
|
|
41
|
+
* - Anchor analysis runs on the diff hunk attached to each comment.
|
|
42
|
+
* A finding quoted as new code (a suggestion) is why rule 7 only
|
|
43
|
+
* fires when the comment presents the token as *present* code.
|
|
44
|
+
*/
|
|
45
|
+
import { apiGet, parsePullUrl } from "./github.js";
|
|
46
|
+
/** Known review-bot logins, without the [bot] suffix GitHub adds. */
|
|
47
|
+
const REVIEW_BOT_LOGINS = new Set([
|
|
48
|
+
"coderabbitai",
|
|
49
|
+
"cubic-dev-ai",
|
|
50
|
+
"greptile-apps",
|
|
51
|
+
"copilot-pull-request-reviewer",
|
|
52
|
+
"github-copilot",
|
|
53
|
+
]);
|
|
54
|
+
export function authorKindOf(login) {
|
|
55
|
+
return REVIEW_BOT_LOGINS.has(login.toLowerCase().replace(/\[bot\]$/, "")) ? "bot" : "human";
|
|
56
|
+
}
|
|
57
|
+
/** Comments that are documentation of the review, not findings. */
|
|
58
|
+
const NOISE_PATTERNS = [
|
|
59
|
+
// CodeRabbit's walkthrough and summary blocks.
|
|
60
|
+
/^#{1,3}\s*(summary|walkthrough|changes\s+requested|review\s+summary|file[- ]level\s+changes)/im,
|
|
61
|
+
/prompt for ai agents/i,
|
|
62
|
+
/###\s*File[- ]Level\s+Changes/i,
|
|
63
|
+
// Bot status pings ("I'll review this once CI passes", approvals with no finding).
|
|
64
|
+
/^(i'll review|reviewing now|approved this|nit-pick pass complete)[\s\S]{0,120}$/i,
|
|
65
|
+
// cubic's review-summary block (a per-review status header, not a finding).
|
|
66
|
+
/<!--\s*cubic:review-summary/i,
|
|
67
|
+
/\*\*\s*\d+\s+issues?\s+found\b/i,
|
|
68
|
+
/no issues? found\b/i,
|
|
69
|
+
// CodeRabbit's review-summary header.
|
|
70
|
+
/##\s*Summary by CodeRabbit/i,
|
|
71
|
+
// CodeRabbit's mechanical rollups: the "Actionable comments posted: N"
|
|
72
|
+
// checklist, review-stack entry summaries, and auto-generated replies.
|
|
73
|
+
/\*\*\s*Actionable comments posted:\s*\d+\s*\*\*/i,
|
|
74
|
+
/This is an auto-generated (comment|reply) by CodeRabbit/i,
|
|
75
|
+
/review_stack_entry_start/i,
|
|
76
|
+
];
|
|
77
|
+
/** Pure praise with no actionable content. */
|
|
78
|
+
const PRAISE_PATTERN = /^(looks good|great work|lgtm|nice|awesome|well done|perfect|ship it)\b/i;
|
|
79
|
+
export function isNoiseBody(body) {
|
|
80
|
+
const trimmed = body.trim();
|
|
81
|
+
if (NOISE_PATTERNS.some((re) => re.test(trimmed)))
|
|
82
|
+
return true;
|
|
83
|
+
if (trimmed.length < 120 && PRAISE_PATTERN.test(trimmed)) {
|
|
84
|
+
// Praise only counts as noise when it references no code.
|
|
85
|
+
if (!/`[^`]+`/.test(trimmed) && !/\S+\.\w{1,4}:\d+/.test(trimmed))
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
/** File shapes a bot's code finding is almost always wrong about. */
|
|
91
|
+
const GENERATED_PATH_PATTERNS = [
|
|
92
|
+
{ pattern: /(^|\/)(package-lock\.json|yarn\.lock|pnpm-lock\.yaml|Cargo\.lock|Gemfile\.lock|poetry\.lock)$/i, label: "lockfile" },
|
|
93
|
+
{ pattern: /(^|\/)(dist|build|out)\//i, label: "build output directory" },
|
|
94
|
+
{ pattern: /\.min\.(js|css)$/i, label: "minified bundle" },
|
|
95
|
+
{ pattern: /(^|\/)__snapshots__\//i, label: "test snapshot directory" },
|
|
96
|
+
{ pattern: /\.snap$/i, label: "test snapshot" },
|
|
97
|
+
{ pattern: /\.d\.ts$/i, label: "generated type declarations" },
|
|
98
|
+
];
|
|
99
|
+
const STYLE_WORDS = /prettier|eslint|format(?:ting|ter)?|indentation|indented|trailing comma|semicolon|quotes?|spacing/i;
|
|
100
|
+
/** Security-shaped claim language. */
|
|
101
|
+
const SECURITY_WORDS = /\b(SSRF|security|vulnerab|XSS|injection|P0|P1|unsafe)\b/i;
|
|
102
|
+
/** Language asserting the code makes a direct, unguarded call. */
|
|
103
|
+
const DIRECT_CALL_ASSERT = /\bdirectly\b|\bno proxy\b|\bwithout (a )?proxy\b|\braw fetch\b|\bunproxied\b/i;
|
|
104
|
+
/** Call-expression names that mean the fetch goes through a guard. */
|
|
105
|
+
const PROXY_HELPER = /\b([A-Za-z_$][\w$]*(?:proxy|Proxy|guard|Guard|sanitize|Sanitize|allowlist|Allowlist)[\w$]*)\s*\(/;
|
|
106
|
+
/**
|
|
107
|
+
* Backticked and double-quoted code tokens in the finding body, in order.
|
|
108
|
+
* Used for anchor matching: the comment's claim against the hunk's code.
|
|
109
|
+
*
|
|
110
|
+
* Pairing note: the regex allows 1-char spans in *matching* so backtick
|
|
111
|
+
* pairing stays aligned (a skipped 1-char span would re-pair the
|
|
112
|
+
* surrounding backticks into phantom tokens like " uses "); tokens
|
|
113
|
+
* shorter than 2 chars are dropped after matching. Newlines are excluded
|
|
114
|
+
* so fenced code blocks are never swallowed into one token.
|
|
115
|
+
*/
|
|
116
|
+
export function quotedTokens(body) {
|
|
117
|
+
const tokens = [];
|
|
118
|
+
const re = /`([^`\n]{1,80})`|"([A-Za-z_$][\w$.\-/]{1,60})"/g;
|
|
119
|
+
let m;
|
|
120
|
+
while ((m = re.exec(body)) !== null) {
|
|
121
|
+
const token = m[1] ?? m[2];
|
|
122
|
+
if (token && token.length >= 2 && !tokens.includes(token))
|
|
123
|
+
tokens.push(token);
|
|
124
|
+
}
|
|
125
|
+
return tokens;
|
|
126
|
+
}
|
|
127
|
+
/** First sentence, trimmed to a line. */
|
|
128
|
+
export function oneLineSummary(body) {
|
|
129
|
+
const flat = body.replace(/\s+/g, " ").trim();
|
|
130
|
+
const first = flat.split(/(?<=[.!?])\s/)[0] ?? flat;
|
|
131
|
+
return first.length > 140 ? `${first.slice(0, 137)}...` : first;
|
|
132
|
+
}
|
|
133
|
+
/** Diff-hunk lines that are pre-existing context (leading space), not added. */
|
|
134
|
+
function hunkContextLines(hunk) {
|
|
135
|
+
return hunk.split("\n").filter((l) => l.startsWith(" "));
|
|
136
|
+
}
|
|
137
|
+
/** Tokens the finding presents as *present* code ("uses `X`", "on line 3 `Y`"). */
|
|
138
|
+
function presentCodeTokens(body) {
|
|
139
|
+
const tokens = [];
|
|
140
|
+
const re = /\b(line|the code|uses?|calls?|assigns?|passes?|builds?|creates?|writes?)\s+`([^`]{2,60})`/gi;
|
|
141
|
+
let m;
|
|
142
|
+
while ((m = re.exec(body)) !== null) {
|
|
143
|
+
if (!tokens.includes(m[2]))
|
|
144
|
+
tokens.push(m[2]);
|
|
145
|
+
}
|
|
146
|
+
return tokens;
|
|
147
|
+
}
|
|
148
|
+
function draftForReal(summary) {
|
|
149
|
+
return `Good catch. Fixed in <next commit>: ${summary}`;
|
|
150
|
+
}
|
|
151
|
+
function draftForNoise(reason, path, line) {
|
|
152
|
+
const anchor = path && line ? ` (${path}:${line})` : "";
|
|
153
|
+
return `Thanks for the review. I don't think this applies here: ${reason}${anchor}. Let me know if I'm missing something.`;
|
|
154
|
+
}
|
|
155
|
+
function draftForDecision(summary) {
|
|
156
|
+
return `Good question. The tradeoff I see: ${summary}. Would you like me to go with that, or do you prefer the other direction?`;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Classify one actionable finding. Pure: all evidence comes from the
|
|
160
|
+
* candidate itself (author kind, body, anchor, hunk).
|
|
161
|
+
*/
|
|
162
|
+
export function classifyFinding(c) {
|
|
163
|
+
const kind = authorKindOf(c.author);
|
|
164
|
+
const summary = oneLineSummary(c.body);
|
|
165
|
+
const tokens = quotedTokens(c.body);
|
|
166
|
+
const build = (cls, reason, draft) => ({
|
|
167
|
+
author: c.author,
|
|
168
|
+
authorKind: kind,
|
|
169
|
+
path: c.path,
|
|
170
|
+
line: c.line,
|
|
171
|
+
summary,
|
|
172
|
+
class: cls,
|
|
173
|
+
reason,
|
|
174
|
+
draft,
|
|
175
|
+
});
|
|
176
|
+
// Rule 1: humans are never noise; substantive human comments need a decision.
|
|
177
|
+
if (kind === "human") {
|
|
178
|
+
return build("needs-decision", "a human reviewer raised this; only the author can weigh it", draftForDecision(summary));
|
|
179
|
+
}
|
|
180
|
+
// Rule 2: generated files, lockfiles, snapshots.
|
|
181
|
+
if (c.path) {
|
|
182
|
+
for (const { pattern, label } of GENERATED_PATH_PATTERNS) {
|
|
183
|
+
if (pattern.test(c.path)) {
|
|
184
|
+
const reason = `comment is on a ${label}, which is generated; the finding targets build output, not source`;
|
|
185
|
+
return build("likely-noise", reason, draftForNoise(reason, c.path, c.line));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Rule 3: bot questions are decisions for the author.
|
|
190
|
+
if (/\?/.test(c.body)) {
|
|
191
|
+
return build("needs-decision", "the finding is phrased as a question, so it asks the author to choose", draftForDecision(summary));
|
|
192
|
+
}
|
|
193
|
+
const hunk = c.diffHunk ?? "";
|
|
194
|
+
// Rule 4: security claim whose premise the hunk contradicts.
|
|
195
|
+
if (SECURITY_WORDS.test(c.body) && DIRECT_CALL_ASSERT.test(c.body)) {
|
|
196
|
+
const helper = PROXY_HELPER.exec(hunk);
|
|
197
|
+
if (helper) {
|
|
198
|
+
const reason = `premise contradicted by surrounding code: the hunk shows the call going through ${helper[1]}, not a direct fetch`;
|
|
199
|
+
return build("likely-noise", reason, draftForNoise(reason, c.path, c.line));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Rule 5: style nit the surrounding code already contradicts.
|
|
203
|
+
if (STYLE_WORDS.test(c.body) && hunk) {
|
|
204
|
+
for (const token of tokens) {
|
|
205
|
+
if (hunkContextLines(hunk).some((l) => l.includes(token))) {
|
|
206
|
+
const reason = `style nit contradicted by the surrounding code: the context lines already use ${token}`;
|
|
207
|
+
return build("likely-noise", reason, draftForNoise(reason, c.path, c.line));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Rule 6: anchor match — the quoted token is in the hunk.
|
|
212
|
+
if (hunk && tokens.some((t) => hunk.includes(t))) {
|
|
213
|
+
const matched = tokens.find((t) => hunk.includes(t));
|
|
214
|
+
const reason = `anchor matches: the comment's quoted token ${matched} is present in the anchored hunk`;
|
|
215
|
+
return build("likely-real", reason, draftForReal(summary));
|
|
216
|
+
}
|
|
217
|
+
// Rule 7: anchor mismatch — presented as present code, but absent.
|
|
218
|
+
for (const token of presentCodeTokens(c.body)) {
|
|
219
|
+
if (hunk && !hunk.includes(token)) {
|
|
220
|
+
const reason = `anchor mismatch: the comment presents ${token} as present code, but the anchored hunk does not contain it`;
|
|
221
|
+
return build("likely-noise", reason, draftForNoise(reason, c.path, c.line));
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Rule 8: mixed or unproven — leave it to the author.
|
|
225
|
+
return build("needs-decision", "no deterministic signal either way; the finding needs the author's judgment", draftForDecision(summary));
|
|
226
|
+
}
|
|
227
|
+
/** Roll up per-finding classes into the verdict line. */
|
|
228
|
+
export function reviewVerdict(findings) {
|
|
229
|
+
if (findings.length === 0)
|
|
230
|
+
return "NO FINDINGS";
|
|
231
|
+
if (findings.some((f) => f.class === "likely-real"))
|
|
232
|
+
return "HAS LIKELY-REAL";
|
|
233
|
+
if (findings.some((f) => f.class === "needs-decision"))
|
|
234
|
+
return "NEEDS DECISIONS";
|
|
235
|
+
return "ALL NOISE";
|
|
236
|
+
}
|
|
237
|
+
function emptyCounts() {
|
|
238
|
+
return { likelyReal: 0, likelyNoise: 0, needsDecision: 0, noise: 0, resolved: 0 };
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* The pure engine: split noise, the author's own comments, and resolved
|
|
242
|
+
* comments off, classify the rest, roll up. Noise bodies (summaries,
|
|
243
|
+
* walkthroughs, praise) and findings on dismissed reviews never become
|
|
244
|
+
* findings. The author's own comments count as noise: they are the
|
|
245
|
+
* author's replies, not incoming review feedback.
|
|
246
|
+
*/
|
|
247
|
+
export function classifyReviewTriage(input) {
|
|
248
|
+
const counts = emptyCounts();
|
|
249
|
+
const findings = [];
|
|
250
|
+
for (const c of input.candidates) {
|
|
251
|
+
if (input.prAuthor && c.author.toLowerCase() === input.prAuthor.toLowerCase()) {
|
|
252
|
+
counts.noise += 1;
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
if (c.reviewState === "DISMISSED") {
|
|
256
|
+
counts.resolved += 1;
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (isNoiseBody(c.body)) {
|
|
260
|
+
counts.noise += 1;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const f = classifyFinding(c);
|
|
264
|
+
if (f.class === "likely-real")
|
|
265
|
+
counts.likelyReal += 1;
|
|
266
|
+
else if (f.class === "likely-noise")
|
|
267
|
+
counts.likelyNoise += 1;
|
|
268
|
+
else
|
|
269
|
+
counts.needsDecision += 1;
|
|
270
|
+
findings.push(f);
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
pr: input.prUrl,
|
|
274
|
+
title: input.prTitle,
|
|
275
|
+
findings,
|
|
276
|
+
counts,
|
|
277
|
+
verdict: reviewVerdict(findings),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
/** Cap per source so one noisy PR cannot burn the whole rate budget. */
|
|
281
|
+
const PER_SOURCE_LIMIT = 100;
|
|
282
|
+
async function paged(base) {
|
|
283
|
+
const out = [];
|
|
284
|
+
for (let page = 1; page <= 2; page++) {
|
|
285
|
+
const data = (await apiGet(`${base}?per_page=${PER_SOURCE_LIMIT}&page=${page}`));
|
|
286
|
+
out.push(...(data ?? []));
|
|
287
|
+
if ((data ?? []).length < PER_SOURCE_LIMIT)
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
return out;
|
|
291
|
+
}
|
|
292
|
+
async function defaultFetchPull(owner, repo, number) {
|
|
293
|
+
const p = (await apiGet(`/repos/${owner}/${repo}/pulls/${number}`));
|
|
294
|
+
return { title: String(p.title ?? ""), author: loginOf(p.user) };
|
|
295
|
+
}
|
|
296
|
+
async function defaultFetchReviews(owner, repo, number) {
|
|
297
|
+
return paged(`/repos/${owner}/${repo}/pulls/${number}/reviews`);
|
|
298
|
+
}
|
|
299
|
+
async function defaultFetchReviewComments(owner, repo, number) {
|
|
300
|
+
return paged(`/repos/${owner}/${repo}/pulls/${number}/comments`);
|
|
301
|
+
}
|
|
302
|
+
async function defaultFetchIssueComments(owner, repo, number) {
|
|
303
|
+
return paged(`/repos/${owner}/${repo}/issues/${number}/comments`);
|
|
304
|
+
}
|
|
305
|
+
const loginOf = (u) => String(u?.login ?? "unknown");
|
|
306
|
+
const strOr = (v, fallback = "") => (typeof v === "string" ? v : fallback);
|
|
307
|
+
const numOr = (v) => (typeof v === "number" ? v : undefined);
|
|
308
|
+
/**
|
|
309
|
+
* Full triage for a PR URL. Best-effort: a source that cannot be read
|
|
310
|
+
* degrades to "no findings from that source" rather than an error.
|
|
311
|
+
*/
|
|
312
|
+
export async function triageReview(prUrl, deps = {}) {
|
|
313
|
+
const { owner, repo, number } = parsePullUrl(prUrl);
|
|
314
|
+
const fetchPull = deps.fetchPull ?? defaultFetchPull;
|
|
315
|
+
const fetchReviews = deps.fetchReviews ?? defaultFetchReviews;
|
|
316
|
+
const fetchReviewComments = deps.fetchReviewComments ?? defaultFetchReviewComments;
|
|
317
|
+
const fetchIssueComments = deps.fetchIssueComments ?? defaultFetchIssueComments;
|
|
318
|
+
const pull = await fetchPull(owner, repo, number).catch(() => ({ title: "", author: "" }));
|
|
319
|
+
const reviews = await fetchReviews(owner, repo, number).catch(() => []);
|
|
320
|
+
const reviewComments = await fetchReviewComments(owner, repo, number).catch(() => []);
|
|
321
|
+
const issueComments = await fetchIssueComments(owner, repo, number).catch(() => []);
|
|
322
|
+
const reviewStateById = new Map();
|
|
323
|
+
for (const r of reviews) {
|
|
324
|
+
const id = numOr(r.id);
|
|
325
|
+
if (id !== undefined)
|
|
326
|
+
reviewStateById.set(id, String(r.state ?? ""));
|
|
327
|
+
}
|
|
328
|
+
const candidates = [];
|
|
329
|
+
for (const c of reviewComments) {
|
|
330
|
+
const body = strOr(c.body);
|
|
331
|
+
if (!body.trim())
|
|
332
|
+
continue;
|
|
333
|
+
const reviewId = numOr(c.pull_request_review_id);
|
|
334
|
+
candidates.push({
|
|
335
|
+
author: loginOf(c.user),
|
|
336
|
+
body,
|
|
337
|
+
path: strOr(c.path) || undefined,
|
|
338
|
+
line: numOr(c.line) ?? numOr(c.original_line),
|
|
339
|
+
diffHunk: strOr(c.diff_hunk) || undefined,
|
|
340
|
+
reviewState: reviewId !== undefined ? reviewStateById.get(reviewId) : undefined,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
// Review-level bodies (CHANGES_REQUESTED summaries, per-review notes).
|
|
344
|
+
for (const r of reviews) {
|
|
345
|
+
const body = strOr(r.body);
|
|
346
|
+
if (!body.trim())
|
|
347
|
+
continue;
|
|
348
|
+
candidates.push({ author: loginOf(r.user), body, reviewState: String(r.state ?? "") });
|
|
349
|
+
}
|
|
350
|
+
// Bot issue comments (review summaries some bots post on the issue).
|
|
351
|
+
// Only known review bots; human issue comments are conversation, not review.
|
|
352
|
+
for (const c of issueComments) {
|
|
353
|
+
const author = loginOf(c.user);
|
|
354
|
+
if (authorKindOf(author) !== "bot")
|
|
355
|
+
continue;
|
|
356
|
+
const body = strOr(c.body);
|
|
357
|
+
if (!body.trim())
|
|
358
|
+
continue;
|
|
359
|
+
candidates.push({ author, body });
|
|
360
|
+
}
|
|
361
|
+
return classifyReviewTriage({ prUrl, prTitle: pull.title, prAuthor: pull.author, candidates });
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=review-triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-triage.js","sourceRoot":"","sources":["../src/review-triage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/server.json
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
"url": "https://github.com/CloudCorpRecords/greenlight",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.3.
|
|
9
|
+
"version": "0.3.7",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
14
14
|
"identifier": "@reneturcios/greenlight",
|
|
15
|
-
"version": "0.3.
|
|
15
|
+
"version": "0.3.7",
|
|
16
16
|
"runtimeHint": "npx",
|
|
17
17
|
"packageArguments": [
|
|
18
18
|
{
|
|
@@ -25,4 +25,4 @@
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
]
|
|
28
|
-
}
|
|
28
|
+
}
|