feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #26
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#26
Reference in New Issue
Block a user
變更摘要
本 PR 將 ai-code-review action 分支的完整成果併入
develop,主要含四塊:create-issue: 'true'時,審查留言(工具/diff/角色/嚴重問題/警告+建議)全部改發到追蹤 issue、不再張貼到 PR;不執行「舊留言標過時/resolve」;issue 延後到「確定有保留問題」才建立;無保留問題或無可審查變更則不建 issue、PR 也完全不留言(靜默通過);有問題時最後在 PR 回貼一則 issue 連結並補掛標籤,形成雙向關聯。action.yml/src各模組文件、重建readme.md,新增.gitea/workflows/ci.yaml(多工具 code review 驗證)並啟用建問題模式。影響範圍
src/index.jsmain()依模式分流:留言去向、跳過 resolveOldComments、issue 延後建立、severe/others 導向 issue、有問題才在 PR 回貼連結src/lib/gitea.js新增addLabelsToIssuesrc/lib/templates.js新增issueLinkCommentsrc/lib/review.js新增postSevereToIssue,移除createIssueWithFindings、sortFindingsForIssuesrc/lib/gitrepo.js補抓淺層 checkout 的 base 歷史readme.md、action.yml、.gitea/workflows/ci.yaml、.gitea/workflows/readme.md風險與注意事項
readme.md尚未反映「建問題模式導向 issue」的最新行為與新/移除的函式,建議後續以 doc-funcs 重建文件。2026/07/17 18:49:58,未刷新。🤖 AI Code Review|審查工具
codexcodex-cli 0.144.6gpt-5.5e0ae6f886fa40a50137d215709ef52ee4b159680📋 變更摘要(送審 git diff)
action.ymlpackage.jsonreadme.mdsrc/index.jssrc/lib/agents.jssrc/lib/context.jssrc/lib/gitea.jssrc/lib/gitrepo.jssrc/lib/review.jssrc/lib/roles.jssrc/lib/templates.jstest/gitea.test.jstest/gitrepo.test.jstest/review.test.js🛡️ 防守方登場
⚔️ 攻擊方登場
🔴 嚴重|🗡️ Assassin
位置:
src/index.js第 384–405 行問題描述
建問題模式遇到嚴重 finding 時採取 fail-open:
addIssueDependency失敗只記 WRN 後繼續,而且若exclusions.json沒變更就略過 commit/push,最後本輪仍回傳 0。攻擊者只要讓目標 repo 未啟用 issue dependencies、token 權限不足,或讓相依 API 不可用,就能讓「嚴重資安問題」只留下 issue 連結,CI 檢查仍是綠燈,PR 可被合併。修改建議
嚴重問題不能依賴可選功能來阻擋。建問題模式下只要
severe.length > 0,應保證產生不可忽略的阻擋訊號:相依建立失敗時直接失敗,或一律 push[failure]結果 commit,或本輪直接return 1。不要在嚴重問題存在且阻擋機制失效時靜默通過。建議寫法
🟠 警告|🧰 Leo
位置:
src/lib/review.js第 13–78 行問題描述
agentFailureDetail與redactSecrets是新增的診斷/遮罩邏輯,但只透過review.__test這類測試後門暴露。這會把「內部函式」變成半公開 API:未來維護者看到module.exports.__test.agentFailureDetail時,很難判斷外部能不能依賴它,也容易在重構時誤傷測試或保留不該存在的匯出面。修改建議
把診斷格式化拆到專門的小模組,例如
src/lib/agent-diagnostics.js,正式匯出agentFailureDetail,由review.js和測試共同使用;或改成測試公開行為,不直接測內部私有函式。不要讓 production export 混入__test命名空間。🟠 警告|🔮 Mage
位置:
src/index.js第 235–238 行問題描述
createIssueAndFlushBufferedComments用Promise.all同時送出暫存的工具、diff、攻擊方、防守方留言。這些留言有明確流程順序,但 HTTP 請求完成順序不保證一致。最小重現:issueBuffer 依序為[工具, diff, 攻擊方, 防守方],若 diff 留言 API 延遲較高,Gitea 上可能先出現防守方登場再出現 diff 摘要,導致追蹤 issue 的審查脈絡錯序。修改建議
對有順序語義的情境留言改成逐筆
await。若後續 finding 明細真的不要求順序,再只對那些留言批次並行。建議寫法
🔵 建議|🎼 Bard
位置:
src/lib/review.js第 17–17 行問題描述
INPUT_LIMIT這個名字像一顆沒有調性的音符:它和PER_FILE_DIFF_LIMIT、TOTAL_DIFF_LIMIT並列在模組頂層,卻沒有說明自己只服務於 agent 失敗診斷。讀者掃過常數區時,會誤以為它是某種通用輸入上限。修改建議
將名稱收束到實際用途,和旁邊的
AGENT_DIAGNOSTIC_OUTPUT_LIMIT保持同一旋律,例如AGENT_DIAGNOSTIC_INPUT_LIMIT。建議寫法
🔵 建議|🎼 Bard
位置:
src/lib/review.js第 31–31 行問題描述
註解說「遮罩單行診斷文字」,但函式實際會接收任意文字、壓平換行與控制字元後再遮罩。這句說明比實作窄,讓文件的拍點稍微搶在程式前面。
修改建議
改成描述「將診斷文字正規化為單行並遮罩」,讓註解與實作同拍。
建議寫法
🟠 警告|🧪 Maya
位置:
src/index.js第 409–414 行問題描述
本輪審查改成無論是否有嚴重問題都回傳 0,失敗改靠
[failure]結果 commit 的下一輪快速回報;這是會直接影響 CI 狀態的行為,但目前沒有測試驗證severe.length > 0時本輪仍回傳 0、commit 訊息帶 failure,且下一輪讀到 failure bot commit 才回傳 1。修改建議
請補主流程測試把兩段行為分開驗證:第一段模擬本輪產生嚴重 finding,斷言
commitFindings/commitAndPushFindings收到 failure 訊息且main()回傳 0;第二段模擬latestCommitSubject()回傳含[ai-review-bot][failure]的 commit subject,斷言main()回傳 1。code-review-resolve 處理結果
[failure]結果 commit;即使問題相依 API 不支援,也會由下一輪 CI 快速回報失敗。review.__test測試後門src/lib/diagnostics.js模組,測試改用正式匯出。Promise.all可能打亂流程順序createIssueAndFlushBufferedComments已改回依序寫入,保留工具、diff、角色等情境留言順序。INPUT_LIMIT命名與用途不清AGENT_DIAGNOSTIC_INPUT_LIMIT並移到 diagnostics 模組。redactSecrets註解描述過窄resultFilesToCommit測試,覆蓋建問題模式嚴重/非嚴重情境。本 issue 解析出的 6 筆 finding 已全部處理;無只來自 issue 的待人工項目需要寫回 findings。