feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #30
Notifications
Due Date
No due date set.
Blocks
#6 feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI
node-actions/ai-code-review
Reference: node-actions/ai-code-review#30
Reference in New Issue
Block a user
變更摘要
本分支持續處理 AI Code Review findings,最新推送新增以下修正:
[failure]結果 commit,主流程直接回傳 1,避免嚴重問題 fail-open。appendRedactedOutput,統一agentFailureDetail的 stderr/stdout 遮罩與限長處理。pushWithCredential正文註解,避免和 JSDoc 重複。resolveOldIssueLinkComments單元測試。影響範圍
src/index.js:建問題模式 fallback、failure commit 保證、舊追蹤連結處理。src/lib/review.js:新增舊追蹤 issue 連結標註 helper。src/lib/diagnostics.js:共用失敗輸出附加 helper。src/lib/gitrepo.js:推送註解整理。test/review.test.js:新增舊追蹤連結標註測試。.gitea/ai-review/findings/*.json:移除本輪已處理 findings。驗證
npm test通過:11 tests / 0 failed。git diff --check通過。風險與注意事項
🤖 AI Code Review|審查工具
codexcodex-cli 0.144.6gpt-5.543ad2b56d27429aa3c812522dc1d4fedce4a9b76📋 變更摘要(送審 git diff)
action.ymlpackage.jsonreadme.mdsrc/index.jssrc/lib/agents.jssrc/lib/context.jssrc/lib/diagnostics.jssrc/lib/gitea.jssrc/lib/gitref.jssrc/lib/gitrepo.jssrc/lib/review.jssrc/lib/roles.jssrc/lib/templates.jstest/gitea.test.jstest/gitrepo.test.jstest/review.test.js⚔️ 攻擊方登場
🛡️ 防守方登場
🔴 嚴重|🔮 Mage
位置:
src/index.js第 134–139 行問題描述
這裡把「本輪審查」改成即使找到嚴重 finding 也回傳 0,並依賴後續
[ai-review-bot][failure]結果 commit 觸發下一輪才讓檢查失敗。最小重現情境:PR 內有 1 條嚴重問題,但commitFindings()因分支保護、token 無 push 權限、遠端競態或 PAT 無法觸發 CI 而回傳 false;本輪仍成功結束,且沒有下一輪 failure commit 可被步驟 1 讀到,嚴重問題就被靜默放行。未驗證「結果 commit 一定成功且一定觸發下一輪」這個假設時,它就是流程成敗判定的單點失效。修改建議
嚴重 finding 已確認後,若 failure 結果 commit/push 沒有成功產生,就應在本輪直接回傳 1;只有在確認 failure commit 已成功推送時,才可把失敗狀態交給下一輪快速回報。也就是:
severe.length > 0 && !resultCommitPushed必須阻擋。建議寫法
🟠 警告|🔮 Mage
位置:
src/index.js第 201–209 行問題描述
createIssueAndFlushBufferedComments()先建立trackingIssue,再逐則寫入暫存留言;但只要其中一則留言失敗,外層 catch 會呼叫fallbackToPrComments(),把整批pendingIssueCommentBodies全部改貼回 PR。最小重現情境:追蹤 issue 建立成功,第一則工具留言也成功寫入 issue,第二則 diff 留言 API 回 500;流程降級後 PR 會收到全部暫存留言,而已建立的 issue 仍殘留第一則留言、沒有後續 finding、也可能沒有 PR 連結或相依關係。這會留下部分成功、部分降級的不一致狀態。修改建議
flush 時應在每則留言成功後立刻從 pending 佇列移除,並明確處理「issue 已建立但 flush 失敗」的狀態:要嘛繼續沿用已建立 issue 並讓後續失敗冒泡,要嘛在降級前補一則 PR 診斷/連結並避免重貼已成功寫入 issue 的留言。
建議寫法
🔵 建議|🎼 Bard
位置:
action.yml第 3–3 行問題描述
手動維護的「更新時間」已與本次檔案標示的最後更新時間不同步;樂譜開頭的拍號一錯,讀者後面每段註解都會多一分懷疑。同樣的不協調也出現在
readme.md與src/index.js的 banner/文件時間。修改建議
移除這類容易走調的手動時間戳,或改由發布流程自動產生。若一定要保留,請讓所有檔案的時間標示與本次變更一致。
🔵 建議|🎼 Bard
位置:
src/index.js第 199–199 行問題描述
createIssueAndFlushBufferedComments這個名稱把「建立 issue」與「flush 暫存留言」兩個實作細節硬串在一起,像一句過長的歌詞;呼叫點讀起來偏機械,沒有清楚表達業務意圖。修改建議
改成較語意化的命名,例如
openTrackingIssue或createTrackingIssueWithContext,讓讀者先理解目的,再從函式內容看見 flush 的細節。🔵 建議|🧪 Maya
位置:
src/lib/gitref.js第 12–24 行問題描述
assertSafeBranchRef 目前只測了一個正常分支與一個 ../../ 路徑穿越案例;但這個函式承擔 refspec 安全邊界,新增的空值、前後斜線、反斜線、以及 git check-ref-format 拒絕的格式都沒有案例。邊界沒被驗證時,未來調整條件很容易放過不合法 ref。
修改建議
補上表格測試,至少涵蓋空字串、純空白、/feature、feature/、feature\x、feature..x、feature.lock、feature@{x},並斷言錯誤訊息能區分「不安全」與「不合法 git 分支名稱」。
如果沒有權限,不管有沒有嚴重問題,都讓工作流失敗
處理結果
已處理本 issue 的 5 筆 findings:
驗證
回寫
已自 findings wrapper 移除本 issue 對應 5 筆 finding,並同步移除本輪修正涵蓋的舊時間戳 finding。
目前本地剩餘 findings:27 筆(警告 18、建議 9)。