Skip to content
Source
Sign inSign up

pullRequestReviewGuideInput.ts

40 lines1.3 KB

1import type { PullRequestActivity, PullRequestDetail } from "@t3tools/contracts";
2import type { ReviewGuideGenerationInput } from "@t3tools/provider-core/server/textGeneration";
3​
4const SETTLED_REMARK_CHARS = 200;
5​
6function oneLine(text: string): string {
7 const flat = text
8 .replace(/<!--[\s\S]*?-->/g, "")
9 .replace(/\s+/g, " ")
10 .trim();
11 return flat.length > SETTLED_REMARK_CHARS ? `${flat.slice(0, SETTLED_REMARK_CHARS)}…` : flat;
13​
14function settledReviewSummary(activity: PullRequestActivity): string {
15 return activity.reviewThreads
16 .filter((thread) => thread.isResolved || thread.isOutdated)
17 .flatMap((thread) => {
18 const opener = thread.comments[0];
19 if (opener === undefined) return [];
20 const who = opener.author?.login ?? "ghost";
21 const state = thread.isResolved ? "resolved" : "outdated";
22 return [`- ${thread.path} (${state}, ${who}): ${oneLine(opener.body)}`];
23 })
24 .join("\n");
26​
27export function reviewGuideInputFromPullRequest(
28 detail: PullRequestDetail,
29 activity: PullRequestActivity,
30 baseCommit: string,
31): Omit<ReviewGuideGenerationInput, "cwd" | "modelSelection"> {
32 return {
33 number: detail.number,
34 title: detail.title,
35 description: detail.body,
36 baseBranch: detail.baseBranch,
37 baseCommit,
38 settledReview: settledReviewSummary(activity),
39 };