import { type ReviewPayload, reviewMarker } from "./github.ts"; import type { ReportLanguage } from "./language.ts"; import type { Finding, ReviewResult } from "./types.ts"; const FOOTER = "This review is AI-generated by pi-code-review."; function findingBody(finding: Finding, language: ReportLanguage): string { const evidence = language === "zh-CN" ? "证据" : "Evidence"; const suggestion = language === "zh-CN" ? "修复建议" : "Suggested fix"; let body = `**${finding.title}**\n\n${finding.description}\n\n${evidence}: ${finding.evidence}`; if (finding.suggestion) body += `\n\n${suggestion}:\n\n${finding.suggestion}`; return body; } function permanentLink( result: ReviewResult, finding: Finding, ): string | undefined { const snapshot = result.snapshot; if (!snapshot || !finding.path) return undefined; const encodedPath = finding.path.split("/").map(encodeURIComponent).join("/"); return `https://github.com/${snapshot.owner}/${snapshot.repo}/blob/${snapshot.headSha}/${encodedPath}`; } export function buildReviewPayload( result: ReviewResult, language: ReportLanguage = "en", ): ReviewPayload { if (result.status !== "complete" || !result.snapshot) throw new Error("Only complete reviews may be published"); const inline = result.findings.filter((finding) => finding.kind === "code"); const summaryOnly = result.findings.filter( (finding) => finding.kind === "task-omission", ); let body = language === "zh-CN" ? "## 代码审查" : "## Code review"; if (result.findings.length === 0) { body += language === "zh-CN" ? "\n\n未发现问题。已检查任务完成度、变更范围、缺陷、回归、权限与安全风险、维护风险,以及 AGENTS.md 合规性。" : "\n\nNo issues found. Checked task completion, scope, bugs, regressions, permission and security risks, maintenance risks, and AGENTS.md compliance."; } else if (summaryOnly.length > 0) { body += `\n\n${summaryOnly .map((finding, index) => { const link = permanentLink(result, finding); return `${index + 1}. ${findingBody(finding, language)}${link ? `\n\n${link}` : ""}`; }) .join("\n\n")}`; } else { body += language === "zh-CN" ? `\n\n发现 ${inline.length} 个高置信行内问题。` : `\n\nFound ${inline.length} high-confidence inline issue${inline.length === 1 ? "" : "s"}.`; } body += result.findings.length === 0 ? language === "zh-CN" ? "\n\n**合并结论:从本次代码审查结果看,建议合并。**" : "\n\n**Merge recommendation: Merge based on this code review.**" : language === "zh-CN" ? "\n\n**合并结论:不建议当前合并,请先解决上述高置信问题。**" : "\n\n**Merge recommendation: Do not merge until the high-confidence issues above are resolved.**"; body += `\n\n${FOOTER}\n\n${reviewMarker(result.snapshot.headSha)}`; return { commit_id: result.snapshot.headSha, event: "COMMENT", body, comments: inline.map((finding) => ({ path: finding.path, line: finding.line, side: finding.side, ...(finding.startLine === undefined ? {} : { start_line: finding.startLine, start_side: finding.side }), body: findingBody(finding, language), })), }; }