feat(建問題模式): 審查留言改發到 issue、跳過舊留言處理並回貼 PR 連結

This commit is contained in:
Jeffery
2026-07-20 11:24:48 +08:00
parent af6b9a197f
commit 91fff79f22
4 changed files with 199 additions and 115 deletions
+48 -4
View File
@@ -302,7 +302,7 @@ function othersComment(findings) {
* @param {string} [params.prBody] - PR 描述原文;nullish 或 trim 後為空時輸出佔位文字。
* @returns {string} 完整 issue 本文 Markdown 字串(含 MARK 隱藏標記)。
* @remarks
* 使用情境:建問題模式下 `createIssueWithFindings`src/lib/review.js建立 issue 時,
* 使用情境:建問題模式下 `main()`src/index.js)的 `ensureIssueCreated` 建立 issue 時,
* 以「標題=PR 標題、本文=本函式輸出」呼叫 `gitea.createIssue`
* 讓 issue 讀者能從本文回溯到觸發審查的 PR,再從下方留言逐條查看問題明細。
*/
@@ -334,9 +334,9 @@ ${body || 'PR 無描述)'}
* @param {string} [finding.suggestedCode] - 建議寫法程式碼;有值才輸出「建議寫法」區塊。
* @returns {string} 完整留言 Markdown 字串(含 MARK 隱藏標記)。
* @remarks
* 使用情境:建問題模式下 `createIssueWithFindings`src/lib/review.js建立 issue 後,
* 把保留的 findings 依「檔案路徑→嚴重等級→起始行」排序,逐條以本函式產生留言內容、
* 經 `gitea.createCommentOnIssue` 發布到新 issue 上,作為問題明細的追蹤紀錄。
* 使用情境:建問題模式下 `review.postSevereToIssue`src/lib/review.js把每條嚴重 finding
* 以本函式產生留言內容、經 `gitea.createCommentOnIssue` 發布到追蹤 issue 上,
* 作為問題明細的追蹤紀錄。
*/
function issueFindingComment(finding) {
const emoji = SEVERITY_EMOJI[finding.severity] || '🔵';
@@ -383,6 +383,48 @@ function nothingToReviewComment(ignoredCount) {
本次 PR 套用 \`.reviewignore\` 後**沒有可審查的變更**${ignoredCount > 0 ? `${ignoredCount} 個檔案被排除)` : ''},視為審查通過。`;
}
/**
* 產生建問題模式(input: create-issue)下,回貼到「PR」的追蹤問題連結留言。
*
* 建問題模式把審查內容全部發到 issue、不留在 PR;本留言是 PR 上唯一的一則審查留言,
* 提供 issue 連結與問題數量統計,讓 PR 讀者一眼看到「本次審查結果在哪個 issue」。
*
* @param {Object} params - 解構參數。
* @param {number} params.issueNumber - 追蹤問題的 issue 編號;內插為 Markdown 連結文字。
* @param {string} params.issueUrl - 追蹤問題的 issue 網址;作為 Markdown 連結目標。
* @param {number} params.severeCount - 嚴重問題條數,顯示在統計。
* @param {number} params.otherCount - 警告+建議問題條數,顯示在統計。
* @returns {string} 完整留言 Markdown 字串(含 MARK 隱藏標記)。
* @remarks
* 使用情境:建問題模式下 `main()`src/index.js)在 issue 建立並寫入全部審查內容後,
* 以本函式對 PR 留一則連結留言,達成「問題關聯回 PR」;issue 內文另以
* {@link issueBody} 反向引用 `PR #N`,形成雙向交叉連結。
*/
function issueLinkComment({ issueNumber, issueUrl, severeCount, otherCount }) {
return `${MARK}
## 🔍 AI Code Review|已建立追蹤問題
本次審查結果已彙整到 issue [#${issueNumber}](${issueUrl})(🔴 嚴重 ${severeCount} 條、🟠🔵 警告+建議 ${otherCount} 條),請至該問題追蹤與討論。`;
}
/**
* 產生「已審查但無需保留問題」時,回貼到「PR」的審查通過留言。
*
* 建問題模式下,若防守方裁決後沒有任何保留問題(不值得為此開 issue),
* 以本留言在 PR 上告知審查通過,取代原本會發到 issue 的問題內容。
*
* @returns {string} 完整留言 Markdown 字串(含 MARK 隱藏標記)。
* @remarks
* 使用情境:建問題模式下 `main()`src/index.js)於防守方裁決後
* `kept.length === 0` 時呼叫;此情況不建立 issue,僅在 PR 留下本則通過提示。
*/
function noFindingsComment() {
return `${MARK}
## ✅ AI Code Review|審查通過
本次 AI Code Review 未發現需保留的問題,視為審查通過。`;
}
module.exports = {
MARK,
OUTDATED_PREFIX,
@@ -397,4 +439,6 @@ module.exports = {
issueBody,
issueFindingComment,
nothingToReviewComment,
issueLinkComment,
noFindingsComment,
};