feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #22
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#22
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.5b5264141c4f7eda12c0479604ac85cb4da6c3195📋 變更摘要(送審 git diff)
action.ymlreadme.mdsrc/index.jssrc/lib/agents.jssrc/lib/context.jssrc/lib/gitea.jssrc/lib/gitrepo.jssrc/lib/review.jssrc/lib/roles.jssrc/lib/templates.js⚔️ 攻擊方登場
🛡️ 防守方登場
🔴 嚴重|🗡️ Assassin
位置:
src/index.js第 409–415 行問題描述
建問題模式遇到嚴重問題時,把「PR 相依於追蹤 issue」當成唯一阻擋合併的防線,但 API 失敗時只記 WRN 後繼續。攻擊者只要讓目標 repo 未啟用 issue dependencies、token 權限不足,或 Gitea 版本不支援該 endpoint,就能讓含嚴重漏洞的 PR 仍以 exit 0 收場;若 exclusions.json 沒變更,後續也不一定會推出
[failure]結果 commit 觸發下一輪失敗檢查。這是合併門禁的 fail-open。修改建議
有嚴重問題時,若無法成功建立阻擋合併的相依關係,就必須 fail closed:直接拋錯或回傳失敗,不可只降級為警告。若仍想維持「下一輪讀結果 commit」模型,建問題模式也要保證嚴重問題時一定會產生可觸發 CI 的 failure marker。
建議寫法
🟠 警告|⚡ Rogue
位置:
src/index.js第 305–305 行問題描述
攻擊方沒有找出任何 finding 時,這裡還是照樣啟動防守方
runDefenders。空陣列沒有東西可裁決,卻會多跑一輪 AI CLI/sub agent、讀 exclusions/history、組 prompt;每個乾淨 PR 都被偷走 1 次防守方呼叫的 CPU、等待時間與 token。修改建議
在
findings.length === 0時直接略過防守方裁決,令kept/excluded都是空陣列,直接進入保存結果與收尾。這不是微優化,是整輪 AI 呼叫直接歸零。建議寫法
🟠 警告|🧪 Maya
位置:
src/index.js第 409–416 行問題描述
這次把「本輪有嚴重問題」的 exit code 從直接
1改成一律0,改由下一輪讀[failure]commit 才失敗,但 diff 沒看到測試固定這個兩階段失敗語意。這是 CI 成敗判定的關鍵行為,若沒有測試,很難確保嚴重 finding 仍會透過結果 commit 讓後續檢查失敗。修改建議
補測兩個路徑:一是本輪產生嚴重 finding 時,應 commit
[failure]並回傳 0;二是最新 commit subject 已是[ai-review-bot][failure]時,步驟 1 應直接回傳 1。斷言 commit message、commitAndPushFindings的result參數與main()回傳值。🟠 警告|⚡ Rogue
位置:
src/lib/gitrepo.js第 139–139 行問題描述
deepen HEAD用的是git fetch --deepen=1000 origin HEAD,這抓的是遠端預設 HEAD,不一定是 PR 目前的 head 分支。淺層 checkout 遇到 feature branch 時,這一步很可能沒有補到需要的歷史,接著就掉到成本最高的--unshallow,大型 repo 會白白多下載全史,網路與磁碟 I/O 都爆掉。修改建議
把 PR 的
headRef傳進resolveMergeBase,精準 deepen PR head 分支;不要用遠端預設 HEAD 猜。這樣在多數淺層 PR 上可以停在固定深度補抓,不必拉完整歷史。建議寫法
🔵 建議|🎼 Bard
位置:
src/lib/gitrepo.js第 310–310 行問題描述
pushWithCredential的參數名叫secret,但同一檔其他區段與呼叫端都稱它為token;同一個旋律忽然換調,讀者需要多花心力確認這是不是另一種憑證。修改建議
沿用既有命名,把
secret改成token,並同步調整 JSDoc 與Buffer.from內的引用。建議寫法
🔵 建議|🧰 Leo
位置:
src/lib/review.js第 31–46 行問題描述
agentFailureDetail的註解前後語意不一致:開頭寫「原始輸出預設隱藏」,但後段又說預設會附上遮罩後的 stderr/stdout;最後還提到用ACTIONS_STEP_DEBUG=true取得原始輸出,但程式碼沒有任何 debug flag 分支。這種文件與實作脫節,會讓未來維護者誤判 CI log 會暴露多少診斷內容。修改建議
把註解改成符合目前實作:預設輸出限長且遮罩後的 stderr/stdout;若要支援 debug 模式,再補實作分支。不要在註解承諾程式沒有做的行為。
🔵 建議|🎼 Bard
位置:
src/lib/templates.js第 337–340 行問題描述
issueFindingComment是一般 finding 留言模板,但註解只寫review.postSevereToIssue的嚴重問題用途;和主流程中「警告+建議也逐條發到 issue」的描述不一致,註解像只唱了半段副歌。修改建議
把 remarks 改成涵蓋嚴重、警告與建議的共用用途,避免後續維護者誤以為此模板只服務嚴重問題。
🧩 code-review-resolve 處理進度
本議題為 AI Code Review 建問題模式的追蹤議題。以
--issue all併同.gitea/ai-review/findings/逐條處理後結果如下(對照目前程式碼與exclusions.json):src/index.js第 409–415 行src/index.js第 305–305 行src/index.js第 409–416 行src/lib/gitrepo.js第 139–139 行src/lib/gitrepo.js第 310–310 行src/lib/review.js第 31–46 行src/lib/templates.js第 337–340 行小計:✅ 已解決 1 條、🚫 誤報(已列入 exclusions)2 條、⏭️ 待人工處理 4 條。
resolveMergeBase補抓策略調整、deepen PR HEAD改用 head SHA、留言閉包改名、push-tokeninput 移除等)。.gitea/ai-review/exclusions.json既有裁決等價,不重複新增排除條目。處理完成,依 code-review-resolve 流程關閉本議題。