feat(ai-code-review): 建問題模式導向 issue,並整併流程調整、文件與 CI #20
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#20
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.53ef8a302911c60b9f71024e1f4b60e0d4578b8fd📋 變更摘要(送審 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–416 行問題描述
攻擊者只要送進含嚴重資安問題的 PR,就能賭這個 gate 不會在本輪失敗:程式現在即使
result === 'failure'也固定return 0,把失敗判定押在下一輪由結果 commit 觸發。但這不是安全邊界:使用自動 token、PAT 權限不足、CI 不重跑、push 被略過,或建問題模式下沒有可 commit 的 exclusions 變更時,branch protection 看到的就是通過的檢查。嚴重 finding 變成留言或 issue,而不是阻擋合併。修改建議
不要讓安全 gate 依賴下一輪 side effect。只要本輪偵測到嚴重問題,應直接回傳非 0;若仍需要結果 commit,可先嘗試 commit/push,再以
return 1收場。建問題模式也一樣,dependency API 只能當輔助,不能取代 CI 失敗。建議寫法
🟠 警告|🎼 Bard
位置:
src/index.js第 119–157 行問題描述
主流程的步驟編號像一首倒裝的曲子:註解先列步驟 2,卻說它延後到步驟 9 前才執行;後面程式碼也出現「步驟 2(延後執行)」插在步驟 8 之後。這種以數字命名但不照執行順序出現的寫法,讓讀者必須來回對拍,文件與流程的可讀性都變沉重。
修改建議
將「舊留言標記」改成具名階段而非硬塞為步驟 2,或把流程編號改成實際執行順序。若需要保留對外步驟名稱,建議在程式內用語採
resolveOldCommentsPhase/cleanupOldComments這類語意命名,減少數字倒敘造成的混亂。🟠 警告|⚡ Rogue
位置:
src/index.js第 369–370 行問題描述
建問題模式把所有警告/建議改成逐條發 issue 留言,這裡會把
others.length放大成 N 次遠端 POST;正常模式同一批資料只產生 1 則彙整表格留言。只要 AI 回出數十條警告,CI 時間就會被 API round-trip 線性吃掉,還更容易撞上 Gitea rate limit 或暫時性網路延遲。修改建議
警告/建議維持批次彙整成單一留言;只有嚴重問題需要逐條追蹤時再拆開。若產品需求一定要逐條回覆,至少在
postOthersToIssue內用有上限的並行池,不要一筆等一筆。建議寫法
🟠 警告|🔮 Mage
位置:
src/lib/gitrepo.js第 140–140 行問題描述
deepen HEAD策略實際執行的是git fetch --deepen=1000 origin HEAD,這裡的HEAD是遠端的預設分支符號,不是目前 checkout 的 PR head commit。最小重現:runner 淺層 checkout 停在 feature PR 的 detached HEAD,而origin/HEAD指向develop;unshallow失敗後,此策略只會加深預設分支,無法補到 feature 分支祖先,merge-base origin/<baseRef> HEAD仍會失敗。修改建議
補抓 PR head 時不要使用遠端符號
HEAD。將headRef或headSha傳入resolveMergeBase,用明確 refspec 加深 PR 來源分支,或直接要求 checkout 使用fetch-depth: 0並移除此誤導性的 fallback。🟠 警告|🎼 Bard
位置:
src/lib/review.js第 29–42 行問題描述
這段註解的旋律前後走調:標題說「原始輸出預設隱藏」,內文卻又說失敗時預設附上 stderr 與 stdout 片段。讀者會被兩個互相拉扯的敘述困住,不知道此函式到底偏向保守隱藏,還是偏向輸出遮罩後的診斷。
修改建議
讓摘要與實際行為同調,明確寫成「預設輸出遮罩後的診斷片段」,避免維護者誤會日誌策略。
建議寫法
🔵 建議|🎼 Bard
位置:
action.yml第 3–3 行問題描述
檔案標頭仍寫
更新時間:2026/07/17 18:49:58,但本次送審資訊標示此檔最後更新為 2026/07/20。時間戳若不能忠實反映變更,就像譜面上錯置的小節號,會讓讀者懷疑整份文件的新舊狀態。修改建議
同步更新時間戳,或乾脆移除人工維護的更新時間,避免每次變更都多一個容易走音的欄位。
🔵 建議|🎼 Bard
位置:
readme.md第 38–49 行問題描述
Mermaid 流程圖把 S8 接到 S2,再接 S9,視覺節奏突然回跳;即使這是在表達「延後執行」,節點編號仍讓閱讀者以為流程倒退。文件的譜面應該讓眼睛順著走,而不是靠註解猜節拍。
修改建議
把節點 ID 與顯示步驟拆開,或改用語意節點名稱,例如
ResolveOldComments[2 延後將舊留言標記解決...],讓圖的結構順序與閱讀順序一致。🔵 建議|🎼 Bard
位置:
src/index.js第 7–7 行問題描述
啟動 banner 的
更新時間與本次檔案實際更新日期不一致。執行日誌是維運者第一眼看到的旋律,若時間停在舊日期,會讓人誤判目前跑的版本是否真的是最新變更。修改建議
同步更新這個時間,或改由版本/commit SHA 取代人工日期,減少文件性欄位反覆失準。
🔵 建議|🎼 Bard
位置:
src/lib/templates.js第 334–341 行問題描述
issueFindingComment的註解只說它服務review.postSevereToIssue與「嚴重 finding」,但同次變更又引入了建問題模式下警告/建議逐條發到 issue 的描述。函式名稱是通用的 finding,註解卻只唱嚴重問題,語意不夠一致。修改建議
把註解改成涵蓋所有 severity,並同時提到嚴重與警告/建議的 issue 留言用途,讓模板職責與名稱保持同拍。
建議寫法
🧩 code-review-resolve 處理進度
本議題為 AI Code Review 建問題模式的追蹤議題。以
--issue all併同.gitea/ai-review/findings/逐條處理後結果如下(對照目前程式碼與exclusions.json):src/index.js第 409–416 行src/index.js第 119–157 行src/index.js第 369–370 行src/lib/gitrepo.js第 140–140 行src/lib/review.js第 29–42 行action.yml第 3–3 行readme.md第 38–49 行src/index.js第 7–7 行src/lib/templates.js第 334–341 行小計:✅ 已解決 1 條、🚫 誤報(已列入 exclusions)6 條、⏭️ 待人工處理 2 條。
resolveMergeBase補抓策略調整、deepen PR HEAD改用 head SHA、留言閉包改名、push-tokeninput 移除等)。.gitea/ai-review/exclusions.json既有裁決等價,不重複新增排除條目。處理完成,依 code-review-resolve 流程關閉本議題。